音声合成LSIを使ってみました

お仕事の関係でワークショップを見学する機会があり、IchigoJam(イチゴジャム)という子ども用パソコンの存在を知りました。そこで音声合成LSIのことを教わりましたので、早速使ってみることにしました。 IchigoJam自体は安価ですが、周辺機器を一式そろえるとそこそこお値段がしますので、まずは音声合成LSIをArduino(アルドゥイーノ)で制御することにしました。その際こちらの記事を参考にしました。

ATP3011の各ピンとArduinoはこのように接続しました。
2: RX <-> Arduino D10(SoftwareSerial TX)
3: TX <-> Arduino D9(SoftwareSerial RX)
7: VCC <-> 5V
8: GND <-> GND
12: AOUT <-> スピーカーの+

#include <SoftwareSerial.h>

SoftwareSerial softSerial(9,10); //RX, TX

void setup() {
  Serial1.begin(9600);
  softSerial.begin(9600);
  softSerial.print("?");
}

void loop() {
  softSerial.print("ohayo-gozaimasu.kyo-'wa/kugatuniju-sanniti,kinnyo-bi,syu-bunnohidesune.mina'sama,kyo-'mo/itiniti,goanzenni.");
  softSerial.print("\r");
  delay(2000);
}

以前mp3プレイヤー等でシリアル通信を使用しましたので、比較的簡単に再生することができました。ただ、一度に再生できる文字数に制限があり、連続再生の方法が分かりませんでしたので、別のマイコンから制御することにしました。せっかくですので、LSIとマイコンも1台ずつ追加しました。マイコンの制御方法はこちらの記事を参考にしました。

・【電子工作】複数のArduinoを接続しシリアル通信で制御してみる! | ぶらり@web走り書き
https://burariweb.info/electronic-work/multiple-arduino-connections-serial-communication.html

各ピンは次のように接続しました。
Arduino D1(TX) <-> Seeeduino Xiao 7(RX)…2台とも
ATP3011 2(RX) <-> Seeeduino Xiao 10(SoftwareSerial TX)
ATP3011 3(TX) <-> Seeeduino Xiao 9(SoftwareSerial RX)
電源、スピーカーは同様です。

Arduinoのコード(Seeeduino Xiao 2台を制御)

void setup() {
  Serial.begin(9600);

}

void loop() {
  set9();
  delay(1000);
  set10();
  delay(1000);
}

void set9(){
  Serial.write(91);
  delay(2500);
  Serial.write(92);
  delay(5500);
  Serial.write(93);
  delay(4000);
}

void set10(){
  Serial.write(101);
  delay(2500);
  Serial.write(102);
  delay(5000);
  Serial.write(103);
  delay(4000);
}

Seeeduino Xiao 1台目のコード(ATP3011M6-PUを制御)

#include "Arduino.h"
#include "SoftwareSerial.h"

SoftwareSerial softSerial(9,10); //RX, TX

void setup() {
  Serial1.begin(9600);
  softSerial.begin(9600);
  softSerial.print("?");
}

void loop() {
  while(Serial1.available()){            // 受信データを確認する
  byte Signal = (byte)Serial1.read();  // 受信データを読み取る
  Serial1.println(Signal);
     if(Signal == 91){
        furi9();
     } else if(Signal == 93){
        tukomi9();
     } else if(Signal == 101){
        furi10();
     } else if(Signal == 103){
        tukomi10();
     }
}
void furi9(){
  softSerial.print("hoxtutoko-hi-kudasai.");
  softSerial.print("\r");
}
void tukomi9() {
  softSerial.print("donna/sa-bisudayo,magukaxtupudaro.");
  softSerial.print("\r");
}

void furi10(){
  softSerial.print("tuikadefurikakemokudasai.");
  softSerial.print("\r");
}
void tukomi10() {
  softSerial.print("donna/furikakedayo,gohannikakerudaro.");
  softSerial.print("\r");
}

Seeeduino Xiao 2台目のコード(ATP3011F1-PUを制御)

#include "Arduino.h"
#include "SoftwareSerial.h"

SoftwareSerial softSerial(9,10); //RX, TX

void setup() {
  Serial1.begin(9600);
  softSerial.begin(9600);
  softSerial.print("?");
}

void loop() {
  while(Serial1.available()){            // 受信データを確認する
    
     byte Signal = (byte)Serial1.read();  // 受信データを読み取る
     Serial1.println(Signal);
     if(Signal == 92){
        boke9();
     } else if(Signal == 102) {
        boke10();
     }
}

void boke9() {
softSerial.print("kashikomarimashita,dewa/okyakusamanoboushini/oireitashimasu.");
  softSerial.print("\r");
}

void boke10() {
softSerial.print("hai,kotiratyokusetukaradanikaketeomeshiagarikudasai.");
  softSerial.print("\r");
}

こちらも割とすんなりと再生してくれました。

また、別件でお仕事のオファーがありましたので、結局IchigoJamもそろえました。こちらは音声再生モジュールの説明書にサンプルコードが書いてありましたので、そちらを参考にしました。ちなみにArduinoはC/C++言語、IchigoJamはBASIC言語でプログラムします。

10 S="ohayo-gozaimasu.kyo-'wa/kugatuniju-sanniti,kinnyo-bi,syu-bunnohidesune.mina'sama,kyo-'mo/itiniti,goanzenni."
20 U=I2CW(46,S,LEN(S))&I2CW(46,13)

こちらは音声の再生終了を待ってから次のコマンドを入力すると、連続再生してくれました。ただ、取り扱えるデータ容量が1ファイルにつき1KBと限られていますので、あまり多くは再生できませんでした。

10 S="itetetete,koshigaitakute/tamaranwa.ji-chan,bokugakoshini/serohante-pu/haxtuteageruyo."
20 U=I2CW(46,S,LEN(S))&I2CW(46,13)
30 WAIT480
40 S="iya,washinokoshiwa/kaminankai,sixtupujaroga-."
50 U=I2CW(46,S,LEN(S))&I2CW(46,13)
60 WAIT280
70 S="a,daidokorokara/higadeteruzo.hontoda,hai,keshigomu,keshigomu.iya,syo-ka'kidaro."
80 U=I2CW(46,S,LEN(S))&I2CW(46,13)
90 WAIT550
100 S="syo-kakixtutesugoiyone-.un,no-'to/nomojimokantannikesetyaumonne.iya,no-'to/maxtushironinaxtutyaudaro,keshigomudaro."
110 U=I2CW(46,S,LEN(S))&I2CW(46,13)
120 WAIT670
130 S="keshigomuxtutenaitokomaruyone-.un,keshigomuganaito,ha'to/gakesenaimonne-.sore,ma'jixtuku/daro,ha'to/kesunowa."
140 U=I2CW(46,S,LEN(S))&I2CW(46,13)
150 WAIT660
160 S="konokeshigomu,zenzenmojigakesenaindayone-.ja-'bokunosyo-kakitukaxtuteiiyo-.donnakesikatadayo,keshigomudaro."
170 U=I2CW(46,S,LEN(S))&I2CW(46,13)
180 WAIT660
190 S="a,ji,mati'gaetyaxtuta.hai,heagomu.iya,keshigomudaro."
200 U=I2CW(46,S,LEN(S))&I2CW(46,13)
210 WAIT430
220 GOTO10

また、IchigoJamは普通のパソコンと違い、命令文を一度実行してしまうと後から修正できないため、一語一句正確に入力する必要があります。それはとても難しいので、パソコンとシリアル通信して命令文を入力することにしました。やり方はこちらの記事を参考にしました。

  • IchigoJamで作成したプログラムをパソコンにロード/セーブする:猫にコ・ン・バ・ン・ワ
    https://nuneno.cocolog-nifty.com/blog/2015/01/ichigojam-2634.html

USB-UART変換モジュール(IchgoJamとパソコンでシリアル通信するための機器)はESP32-DOWNLOADERを使用しました。各ピンは次のように接続しました。
IchigoJam 22(GND) <-> USB-UART GND
IchigoJam 15(RXD) <-> USB-UART TXD
IchigoJam 16(TXD) <-> USB-UART RXD

プログラムのアップロードにはGUIツールを使用しました。

  • IchigoJamにプログラムをアップロード/ダウンロードするGUIツールを作成しました:猫にコ・ン・バ・ン・ワ
    https://nuneno.cocolog-nifty.com/blog/2015/04/ichigojam-8164.html

こちらもすんなりとアップロードできましたが、文字コードがUTF-8では上手くいきませんでした。色々試したところShift-JISできちんと入力出来ました。これで容量いっぱいの長いプログラムでも簡単に修正できるようになりました。Windows10でテキストをShift-JISにするにはテキストエディタが必要ですが、宗派が色々ありますのでここでは割愛させていただきます。

こちらで使用したお笑いのテキストデータは、校正・閲覧で関わらせていただいた「お笑いドリル2.0 ボケマトリックス」から使用させていただきました。詳しくは下記をご覧ください。

以上、色々な環境で音声合成LSIのATP3011を使用してみましたが、いかがでしたでしょうか。気になった方はぜひ挑戦してみてください。

また、9/23には青葉通りでデモンストレーションを行う予定ですのでお時間にご都合のつく方はぜひお越しください。

  • 3
  • 0
  • 1

Laffey(ラフェィ)

色々な物・もの・モノを作って記事にしています

作者のページを見る

関連記事

寄付について

「novalue」は、‟一人ひとりが自分らしく働ける社会”の実現を目指す、
就労継続支援B型事業所manabyCREATORSが運営するWebメディアです。

当メディアの運営は、活動に賛同してくださる寄付者様の協賛によって成り立っており、
広告記事の掲載先をお探しの企業様や寄付者様を随時、募集しております。

寄付についてのご案内