N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
<< 隠しコマンドでATP3011R4のチューニング | main | 歌唱音声合成 Plug-In 「AquesTone2」を公開しました >>
[Arduino] AquesTalk ライブラリ

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で音声出力をはじめよう!「入門編」
| AquesTalk pico LSI | 16:43 | comments(2) | - |
コメント
こんにちは、ji1izr/眞田といいます。つい最近CQ出版社のインターフェース誌で知ったAquesTalkPicoを購入し、Arduinoとシリアル接続で動作させていました。I2Cで接続して動作させるライブラリが出されたことを知り、早速使わせていただきました。最初はシリアルからI2Cへ設定を変更すること(設定端子の接続変更)を忘れたりで音が出せませんでしたが、やっと何とかできるようになりました。現在、アマチュア無線のパケット通信と音声出力とを組み合わせることを試行錯誤しています。こちらのブログを時々拝見させていただき、参考とさせていただきますので、今後もよろしくお願いいたします。
| ji1izr | 2012/11/17 10:38 PM |
こんにちわ。tadpole といいます。arduinoとAques Talk プロトシールド(スイッチサイエンス社)、ボタンパッド(seedsstudio)、アンプ、スピーカー、電池を組み合わせてタッパーの中に配置しました。
if 文で場合分けすることで、ボタンを押すごとに違うセリフをしゃべります。
       凄い、ウケます。
3×4=12 pattern ですが、arduino のmemory はまだ余裕があるのでもっとパターンを増やせないかと現在試行錯誤中です。
| 遠藤 忠雄 | 2015/10/02 7:12 AM |
コメントする









PROFILE
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND
RECOMMEND