音声合成LSIを使って、日本語の音声を出力する(ATP3012)
はじめに
(ICはIntegrated Circuit(集積回路)の略、LSIはLarge Scale Integration(大規模集積回路)の略です。つまりICがたくさん集まったのがLSIです。)
今回は音声合成LSIのATP3012を使いました。これを使うと、ローマ字の文字列を日本語の音声にして出力することができます。ゆっくり実況を見たことがある人なら、馴染みのある音声で話します。なにやら経緯があるようですね。音声には種類があって、サンプルを聞くことができます。
- 今回使用したLSIはこちら → https://akizukidenshi.com/catalog/g/gI-09973/
- 音声デモンストレーションはこちら → https://www.a-quest.com/demo/index.html
ICにしては1000円程と高めですが、これにはライセンスクオリティが含まれているそうです。
このLSIを使うのは3回目です。慣れたものですが、プログラムについてはよく分かっていない部分があったので、試してみました。
回路を組む
▼回路図はこちら
▼実際に回路を組んだ状態
何やら複雑な回路図で、初心者の方に敬遠されるかもしれませんがご安心ください。私もよく分かっていません。
ATP3012のように複雑なICは、データシートに基本回路例や応用回路例が載っていることが多いです。今回はデータシートを参考に組んでいます。
スイッチがありますが、これはSLEEP端子に繋がっています。これでLSIのONとOFFを切り替えることができます。スピーカーへの電力供給は電池から行っています。マイコンの電流消費を抑えるためです。
ちなみに、ブレットボードにICを挿すと、抜けにくくなります。掴むところがありませんし、無理やり抜くとピンが折れてしまいます。ICを抜く用の工具があるので、そちらを使うことをお勧めします。
▼IC抜きで抜くところ。ブレットボードの溝にちょうど入ります。
水晶発振子は16MHzのものを使用しています。Amazonで買いました。少額のときは、送料を抑えたいのでAmazonで買っています。抵抗やコンデンサーはスターターキットに入っていたものが大半です。ちょっとだけ買い足しています。
▼スターターキットは、よく使う抵抗やコンデンサーが入っています。とりあえず電子工作したいときはおすすめです。
プログラムを書く
データシートにいろいろ書いているので、一度は読んでみてください。コマンドの所に書いていますが、CR(改行コードのこと)を受信した後に発声するので、文字列の後に改行コードが必要です。
ATP3012は通信方式を選べますが、今回はUART通信を選んでいます。詳しい説明は省きますが、SoftwareSerial関数を使って、デジタルピンを擬似的にUART通信ができるようにしています。使い方はシリアル通信用の関数とほとんど同じです。実際に使用したプログラムをご覧ください。
今回はデータシートにあった音声記号列サンプルを順次話すようにプログラムしています。
▼試行錯誤の結果、完璧ではないにせよ動作したプログラム
配列に文字列を格納している所が長いだけで、実行しているプログラムは短いです。
コマンドの実行後にATP3012から '>' が返ってくるので、36行目のところでコマンドを実行したかどうかを判定しています。ちなみに '>' を ">" にしたらうまくいきませんでした。地味な違いですが、これに気づくのに時間がかかりました…
なぜか i=8で停止してしまいます。省いたら今度は i=14で停止。他の文字列を減らすと、ちゃんと発声します。今のところ謎です。とりあえず少ない文字列であれば問題なく発声するので、使う分には問題ないという感じです。まだまだ試す必要がありそうです。
まとめ
プログラムは微妙でしたが、回路的には問題なく動作させることができました。SLEEP端子にスイッチを繋げていましたが、こちらも想定通りに動いてくれました。SLEEP中は命令をまったく受け付けませんでした。今回の回路をもとに、新しくATP3012用の基板を作ろうと思います。
追記
読み返したらどう見てもデータ送りすぎですね。まだまだ経験不足です。
この記事ではUART通信で使っていますが、I2C通信でも使ってみました。もしよければご覧ください。
▼I2C通信で使ったときの記事