音声合成LSIの使い方 - 初級編 [Arduino]
アクエスト社の「音声合成LSI」シリーズはシリアル通信で任意のテキストを送信すると、自動的に音声に変換してくれる優れものです。
今回はATP3012を使用しますが、基本的な操作は同じなのでATP3011(ピン配置が一部異なり、クリスタルが不要)でもご利用可能です。
次の動画では「文字列を音声に変換」したものを、トランジスタで増幅してスピーカーで発声しています。「こんにちは。シリアルモニターで文字を入力します。」を繰り返しています。
※格安スマホで動画を撮影しているので、音質がさがっています。
今回の配線、スケッチではシリアルモニターにASCII文字列を打ち込むと、自動的にその文章が音声に変換されます。
目次
1. 使用部品・材料
2. 配線図
3. ATP3012とATP3011の主な違い
4. スケッチ(プログラム)
5. コマンド
6. エラーコード表
7. ライセンスについて
1. 使用部品・材料
総額で約1,860円です。(Arduino本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
サンハヤト SAD-101 ニューブレッドボード | ¥500 | Amazon.com |
音声合成LSI ATP3012R5-PU(小型ロボットの音声) | ¥900 | 秋月電子の通販コード(I-11517) |
スピーカー 8Ω8W | ¥100 | 秋月電子の通販コード(P-03285) |
トランジスター2SC1815Y(60V150mA)(10個入テーピング品) | ¥80 | 秋月電子の通販コード(I-04268) |
両端ロングピンヘッダ 1×40 (40P 6.1) | ¥50 | スピーカーの端子接続用。このピンヘッダはサイズ少し大きいのでジャンパーワイヤーで代用した方が良いかもです。 秋月電子の通販コード(C-09056) |
絶縁ラジアルリード型積層セラミックコンデンサー0.1μF50V2.54mm(10個入) | ¥100 | 秋月電子の通販コード(P-00090) |
クリスタル(水晶発振子)16MHz | ¥30 | 秋月電子の通販コード(P-08671) |
絶縁型ラジアルリード型積層セラミックコンデンサー22pF50V±5%2.54mm(10個入) | ¥100 | 秋月電子の通販コード(P-04060) |
カーボン抵抗器 | 数円 | 10kΩ(1個)、1kΩ(1個)を使用。 |
スピーカーは在庫切れになる可能性があります。その場合は、スピーカーに流せる電流が多くなるW(ワット数)が高いものを購入すると良いです。
トランジスタの定番である2SC1815シリーズのコレクタ電流(IC)は最大150mA(5V室温25℃で約80mA)です。手元にこれしかないので、2SC1815を使用しています。また、今回の例ではスピーカーに流す電流は約76mAです。
これ以上の電流を流したい方はコレクタ電流(IC)が最低でも500mA以上のものを購入すると良いです。※A(アンペア)単位のものあった方が良いです。
本稼動する場合はトランジスタの公式データシートをよくご確認の上、稼動して下さい。(特にコレクタ損失の温度特性グラフは要確認です。)
2. 配線図
CLK16,PMOD1,PMOD0,SMOD1,SMOD0ピンをHIGHにする事により、クロックモードを「16MHz」、動作モードを「コマンド入力モード」(UART/I2C/SPIによるシリアル通信)、通信モードを「UART」にしています。
公式データシートには記載されていませんが、HIGHにする際に10kΩの抵抗器を通しています。
次は公式データシートより(atp3012_datasheet.pdf)
ピン配置
クロックモード
動作モード
通信モード
回路図
3. ATP3012とATP3011の主な違い
次は公式データシートより(atp3012_datasheet.pdf)
今回のATP3012はATP3011より音質が向上されています。その代わりに動作クロックに外付けのクリスタルまたはセラミック振動子が必要です。
その他にATP3012のピン配置はATP3011と比べてAOUT/PMOD1が入れ替わっています。
4. スケッチ(プログラム)
シリアルモニターにASCII文字列を打ち込むと自動的に音声に変換されます。
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); // RX, TX void setup() { Serial.begin(9600); // ソフトウェアシリアルの初期化 mySerial.begin(9600); // 「こんにちは。シリアルモニターで文字を入力します。」と発声する mySerial.print("konnitiwa.siriaru'mo'nita-de/mo'ziwo nyuuryoku'simasu."); mySerial.print("\r"); } void loop() { char c; String raw = ""; // シリアルモニターから音声合成LSIへ while (Serial.available() > 0) { c = Serial.read(); // LFは無視する(LFがあっても動作はします) if (c == "\n") break; mySerial.print(c); delay(5); } // 音声合成LSIからシリアルモニターへ while (mySerial.available() > 0) { char c = mySerial.read(); raw += c; delay(5); } if (raw != "") { if (raw == ">") { Serial.println("> (この記号は準備OK)"); } else if (raw == "*") { Serial.println("* (この記号は発声中などBusy)"); } else { Serial.println(raw); } } }
5. コマンド
送信コマンド
ASCII文字列[CR] | 文字列を音に変換する。 ASCII文字列(半角)とその終端に改行コードの「CR」(\r)を付加する事により発声する。(127byteまで) |
---|---|
#V | バージョン情報 |
#J | チャイム音(J) |
#K | チャイム音(K) |
$ | 発声を中断する。(CR は付けない) |
受信コマンド
> | 準備OK |
---|---|
* | 発声中などBusy状態 |
ASCII文字列の句切記号
※公式データシートより(atp3012_datasheet.pdf)
ASCII文字列の例
こんにちは。 |
---|
konnnitiwa. |
おはよー。 |
---|
ohayo-. |
お腹すいたー。 |
---|
onakasuita-. |
私は17歳です。 |
---|
watashiwa/ju-nana/sa'i/de'su. |
プチモンテはコンピューター関連のブログです。 |
---|
puti'mo'nte/wa/ko'npyu'-ta'-/ka'nnrenn/no'/buro'gudesu. |
6. エラーコード表
E100 | その他のエラー |
---|---|
E101 | メモリ不足 |
E105 | 音声記号列に未定義の読み記号が指定された |
E106 | 音声記号列のタグの指定が正しくない |
E107 | タグの長さが制限を越えている(または[>]がみつからない) |
E200 | 音声記号列が長すぎる |
E251 | コマンドの指定が正しくない |
E254 | チャイム音データが壊れている |
E203 | ヒープメモリ不足 |
E255 | (Warning)発声中にブレークされた |
※公式データシートより(atp3012_datasheet.pdf)
7. ライセンスについて
音声合成LSIの販売価格にライセンスロイヤリティが含まれているので、ロボット等に組み込んで販売しても別途、費用はかかりません。
参考サイト
AquesTalk pico LSI (音声合成LSIを開発した社長ブログ)
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。