Arduino用 音声合成LSIライブラリ
このライブラリは、Arduinoから音声合成LSI「AquesTalk pico LSI」(以下、"LSI")を制御するためのライブラリです。これを使えば簡単に音声合成を行うスケッチが書けます。
なお、Arduino基板とLSIは2線のI2Cインターフェースで接続することを前提としています。ハードウェア的には「AquesTalk Shield(*1)」を使ったり、ブレッドボード上で配線します(下の配線例参照)。
*1 AquesTalkプロトシールド や ROBOBA032
配線例
Arduino Uno, ATP3011XX-PU ブレッドボードとアクティブスピーカを使った例
動作環境
■ 対象デバイス(LSI)
ATP3012F6-PU/ATP3012F5-PU/ATP3011R4-PU/ATP3011M6-PU/ATP3011F1-PU/ATP3011F4-PU/ATP3010F4-PU
■ Arduino IDE
Ver.1.0.x Ver.1.6.x
■ Arduino基板
Arduino Unoやその互換ボードなど
簡単な使い方(example/HelloTalk.inoと同じ)
#include <AquesTalk.h>
#include <Wire.h> // ライブラリ内部で使用するので定義必要
// Hello Talk - AquesTalk pico LSIで「こんにちは」を繰り返し発声するAquesTalk atp; //インスタンス定義 変数名は任意
void setup()
{
}void loop()
{
atp.Synthe("konnnichiwa."); //引数に指定のテキストを発声
}
ダウンロード
URL Arduino_AquesTalk_Library.zip 2015/2/16 update
Arduino環境にライブラリをインストールする方法は、"arduino ライブラリ 追加"などで検索してください。
関数メソッド
ライブラリの関数の説明を以下に示します。
関数の具体的な使用方法は ライブラリ付属のサンプルスケッチ"SampleTalk"を参照するのが良いです。
AquesTalk(int addr)
AquesTalkクラスのインスタンスを生成します。addrには、LSI側のI2Cアドレス(7bit)を指定します。addrは省略することも可能です。この場合、アドレスは出荷時設定の0x2Eとなります。
Example
AquesTalk talk; // 出荷時設定のインスタンス生成
AquesTalk aquestalk(0x2F); // I2Cアドレスを0x2Fに変更した場合
bool IsActive()
LSIの接続・動作をチェックします。
LSIから応答がある場合はtrue、無い場合はfalseが返ります。
falseの場合には、配線等をチェックしてください。
思ったとおりに動作しない場合は、まず、この関数で動作をチェックしてみます。
void Synthe(const char *msg)
音声合成を行います。
msgには 発声する音声記号やコマンド文字列を指定します。
この関数は、前の発声の終了を待ってから、引数の文字列の最後にデリミタのCR('¥r')を付与してLSIに送信しています。
発声の終了を待たずに関数から戻ります。
間違った音声記号列を引数に指定した場合は、LSIは何も発声せずにエラーを返しますので、エラーの有無は、本関数の呼出し後に GetResp()関数を呼び出して確認できます。
void SyntheP(const prog_char *msg)
引数にプログラム領域上のコマンドを指定する他はSynthe()と同じです。
メッセージが固定の場合には、RAMを節約することができます。
詳しくは、ArduinoのPROGMEMを参照してください。
void SyntheS(String &strMsg)
引数にString型でコマンドを指定する他はSynthe()と同じです。
void Write(const char *msg)
LSIに指定の文字列を送信します。
msgには 発声する音声記号やコマンド文字列を指定します。
Synthe()と異なり、LSIの受信の可否にかかわらず送信します。
また、最後にデリミタのCR('¥r')を送信しないので、コマンドを分割して送信できます。
void WriteP(const prog_char *msg)
引数にプログラム領域上のコマンドを指定する他はWrite()と同じです。
bool IsBusy();
発声中か否かを返します。
発声中はtrueを返します。次のコマンドはfalseの場合に送信する必要があります。
なお、応答なしの場合もfalseを返します。
uint8_t GetResp()
LSIの応答を取得します。
発声中の場合は、発声終了後に戻ります。
Synthe()の後で呼び出すことで、音声記号列の指定ミスを確認できます。
戻り値: >100 エラーコード(LSIのデータシート参照), 0 正常終了, 2 応答なし, 3上記以外
void Break();
LSIの発声を中止します。
void SetSpeed(uint16_t speed, uint8_t *pRet=0)
発話速度を設定します。
発話速度はLSIの不揮発メモリに設定しますので、
これで設定した値は、電源を切っても継続されます。
speed: 50-300 標準:100 50:最遅 300:最速
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
uint16_t GetSpeed(uint8_t *pRet=0)
現在の発話速度の設定値を取得します。
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
void GetVersion(char *str)
LSIのファームバージョンを返します。
strには6バイト以上の配列を用意して呼び出してください。
void SetRom(uint16_t adr, uint8_t val, uint8_t *pRet=0)
LSIの不揮発メモリ(EEPROM)に値を設定します。
これでLSIの各種パラメータを設定できます。
指定するアドレスおよび値はLSIのデータシートを参照してください。
不意に値を変更すると、LSIが動かなくなりますので、LSIの仕様を十分に理解した上でお使いください。
adr: EEPROMアドレス 0-0x3ff
val: 値 0-0xFF
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
uint8_t GetRom(uint16_t adr, uint8_t *pRet=0)
LSIの不揮発メモリ(EEPROM)に値を取得します。
adr: EEPROMアドレス 0-0x3ff
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
戻り値:値 0-0xFF
// 以下の関数はATP3011R4のみ有効です。
void SetPitch(uint8_t pitch, uint8_t *pRet=0)
声の高さを設定します。
pitch: 声の高さ 0-254 標準:64 0:高い 254:低い
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
uint8_t GetPitch(uint8_t *pRet=0)
現在の声の高さの設定値を取得します。
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
戻り値: 声の高さ 0-255 標準:64(または255) 0:高い 254:低い
void SetAccent(uint8_t accent, uint8_t *pRet=0)
アクセントの強さを設定します。
accent: アクセントの強さ 0-255 標準:64 0:なし 255:強い (値に対して段階的に変化)
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
uint8_t GetAccent(uint8_t *pRet=0)
現在のアクセントの強さの設定値を取得します。
pRet: 正常に設定できたか確認する場合指定。省略可。返される値はGetResp()と同じ。
戻り値: アクセントの強さ 0-255 標準:64 0:なし 255:強い
注意
本ライブラリは、I2C通信にWire標準ライブラリを使用しています。したがって、本ライブラリを使用する場合は、スケッチ上に #include <Wire.h> も追加してください。
サイズ
本ライブラリは2byteのSRAM領域を消費します(1インスタンスあたり。Wireライブラリのサイズは含まず)。
ROM(Flash)領域は、Wireライブラリも含めて3K〜10Kbyte程度使います(用いる関数により異なる)。
サンプルスケッチ
ライブラリには、以下のサンプルスケッチが含まれています。スケッチを書くときの参考にしてください。
- HelloTalk: 「こんにちは」を連続して発声する最も簡単なスケッチ
- SampleTalk: AquesTalkライブラリの各関数の使い方を示した例
- MultiTalk: 2台で音声合成の掛け合いを行う制御方法の例
- PitchAccent: 声の高さやアクセントの強さを変えた例(ATP3011R4のみ)
Link
・Arduinoで音声出力をはじめよう!「入門編」











