XBee ZigBee 音声合成出力 AquesTalk ワイヤレスおしゃべり端末

by ボクにもわかる地上デジタル

XBeeメインメニューへ戻る
地デジトップへ戻る

XBee ZigBee AquesTalk
XBee ZigBee 音声合成出力 AquesTalk ワイヤレスおしゃべり端末(子機)

このページについて

 このページではAQUEST社の AquesTalk pico LSI ATP3011F4-PUを用いてスピーカから音声合成出力するワイヤレスおしゃべり端末を製作します。AquesTalkは「ひとつの(A)」と「探究(quest)」、「話す(Talk)」の3語を合成して名付けられたようです。
 近年、バスの車内アナウンスなどで音声合成を耳にすることが増えたと思います。音声をスムーズに話すには様々なパターンの音の組み合わせを複雑に合成して出力する必要があります。AqesTalk pico LSIは簡単なテキスト(ローマ字)入力とアクセント記号などでスムーズな音声合成を行うことができるLSIです。このLSIのハードウェアはArduinoマイコンで使用されているAVR社のATmega328Pです。AQUEST社はこのマイコン用のソフトを書き込んで製品化し、秋月電子通商などが販売しています。
 せいぜい8ピン程度で実現できそうなのですが、汎用マイコンを使っている都合で28ピンもの大きなチップとなっています。CSPなど4×4mmのパッケージを使って8ピンDIPくらいになれば使いやすいのですが、そういった商品は今のところありませんので、28ピンの大きなチップを使うしかありません。

AquesTalk pico LSIの種類

 AquesTalk pico LSIは外部クロックの要否や合成音などによっていくつかの種類があります。ATP3011は外部クロック不要、ATP3012は外部クロック必要(その代わりに音質が良い)です。
 番号に続く「F」は女声、「M」は男声、「R」はロボット声です。また「F4」は「かわいい系」、「F5」は「落ち着いた」などがあります。
 もし、こだわりが無ければ、ここでは「F4」が良いでしょう。周波数の低い声を出力するには大きなスピーカが必要で消費電流も多くなります。小型スピーカで効率よく再生できるのは周波数の高い「F4」だからです。
 また「かわいい系」という表記も興味をそそります。半導体の商品名に「かわいい」と名付けられることは珍しいので、余計に目立ちます。実際に可愛く聞こえるかどうかというと、残念ながらまだまだ不自然な機械の声です。単に高い声(小型スピーカ向け)という印象しか受けませんでした。今後の技術開発に期待することにしましょう。

AquesTalk pico LSIの種類
声種 ATP3011
内蔵クロック
ATP3012
外部クロック
音声・主成分の
周波数帯域
女声("ゆっくり") ATP3011F1-PU 200〜2000 Hz
かわいい系の女声 ATP3011F4-PU 300〜2000 Hz
落ち着いた女声 ATP3012F5-PU 150〜1500 Hz
落ち着いた男声 ATP3011M6-PU 100〜1000 Hz
ロボット声 ATP3011R4-PU 150〜2000 Hz

 実用で用いられているものに比べると音声の品質は全体的に低いです。ATP3011の場合、まれに言葉を聞き取りにくいことがあります。単語や数値を明確に聞き取る必要がある場合は、サンプリング周波数を10kHz(周波数帯域5KHz)まで改善したATP3012F5がお奨めです。但しピン配列が異なったり外部クロックが必要だったり、また動作時の消費電流が倍ほどに増えてしまいます。(待機時の消費電流は変わりません。)

システム構成例

 ここで製作するのは子機となる音声合成を出力する端末です。この端末に音声データを送信する親機はXBee ZB PROモジュールとXBee USBエクスプローラをパソコンに接続して製作します。


親機:PC -> XBee USB エクスプローラ -> XBee PRO ZB(Coordinator API)

子機:XBee ZB(Router AT) -> AquesTalk -> オーディオアンプ -> スピーカ

子機のハードウェア製作例

 子機のXBee ZBモジュールのファームウェアは「ZIGBEE ROUTER AT」を使用します。(親機は「ZIGBEE COORDINATOR API」を用います。)
 下図はXBee ZBモジュールを外した様子です。写真をクリックすると拡大表示することが出来ます。アナログ回路に詳しくない方は、なるべく同じ配線となるようにしてください。とくに電源とGNDの配線にはご注意ください。

XBee ZigBee AquesTalk
AquesTalk ワイヤレスおしゃべり端末(子機)の配線図

 オーディオICには定番品ながら1個50円程度と安価なJRC(日本無線)のNJM386BDを用いました(写真の右側にある8ピンのIC)。少なくとも1980年頃から現在に亘り、使いやすさや安定性、汎用性などの性能の高さからオーディオにとどまらず多くの機器の増幅に使用されてきたNS社のLM386の互換品です。本アンプの電源電圧は4Vから動作します。本製作では4Vよりも低い3.3Vで動かしますが、3.3Vでの製作例は多くあり、私も良く3.3Vで使っていることから常温における動作に問題は無いと思います。
 どちらかというと本アンプの課題は、古い製品のため、スリープ機能(シャットダウン機能)が無いことです。しかも無音時であっても常時4mA程度の消費電流が流れてしまいます。乾電池で駆動させたい場合はスリープ機能やポップノイズ音(電源を入れた時に「プチッ」となる音)の対策回路を内蔵し、また無音時の消費電力の低い最新のアンプを使用したほうが良いでしょう。また、XBee ZBをEnd Deviceとし、XBeeもしくはAquesTalkからアンプの電源を制御する必要があるでしょう。
 NJM386BDの2番ピンに接続するコンデンサ0.022uFには温度変化などで容量変化の少ないフィルムコンデンサ等を使用します。3番ピンの入力用の0.1uFも可能であればオーディオ用のコンデンサを使用します。その他のコンデンサやコイルは汎用品で良いでしょう。スピーカ部の100pFはノイズ対策用で、オーディオICの4番ピンと5番ピンとの間に入れるのが最も効果的です(写真の挿入位置はそうなっていません)。NJM386BDの仕様書には他にもノイズ対策用、発振防止用の部品が入っていますが、この製作例では効果が無かったので省略しました。
 アンプNJM386BDの最大出力は700mWですが3.3V動作時はせいぜい200mW程度だと思います。スピーカは口径4cm〜せいぜい6cmの小型でインピーダンスが8Ω程度のものを使用します。但しインピーダンスが著しく高い圧電スピーカは電圧駆動の傾向が強くなるので(電流増幅の傾向が強い)NJM386BDでは駆動できません。
 ブレッドボードの左側にある抵抗とダイオード、そしてブレッドボードの11-a番ピンのコンデンサは簡易リセット回路です。これが無いとオペアンプやXBee、コンデンサなどによる電源の立ち上がり特性の問題でAquesTalkが正しく起動しない場合があります。このリセット回路は電源の切入りを高速に行うと原理的にリセットがかかりません。リセットをかける場合は、電源を切って一息入れてから電源を投入します。ダイオードには汎用的な小信号スイッチダイオード1S2076Aや1N4148などを使用します。
 それでも起動が不安定な場合は14番ピンをGNDに接続してセーフモードにします。ワイヤレスモジュール、オーディオ回路ともに電源の立ち上がり特性に大きく影響する部分なので、セーフモードによる回避も一つの方法でしょう。ただし、その不安定な状態は電源の立ち上がり時の電圧推移に起因している可能性が高いので、量産する製品を設計するような場合はリセット回路等の時定数を見直すべきだと思います。

 コミッショニングボタンはXBee ZBモジュールの20番ピンとGNDとの間にプッシュスイッチを挿入して製作します。不要なピンはブレッドボードに挿さずに浮かせています。ブレッドボードと同じ配線パターンのプリント基板を用いる場合は、4か所とも半田付けして不要な部分をパターンカットすることで安定した実装が可能です。
 なお、ブレッドボード上の短いジャンパワイヤーの色はワイヤーの長さを示しています。特に注意していただきたいのはAquesTalkの電源です。外部からは赤ワイヤーが+3.3Vですがブレッドボード上の短いワイヤーは黄色になっています。またGNDは外部は青ワイヤーですがボード上は橙(赤に見える)です。GNDに橙(赤)ワイヤーがある点で誤解しやすくなっているのでご注意ください。

高音質 ATP3012F5-PU 子機のハードウェア製作例

 下図はAquesTalkに高音質な「ATP3012F5-PU」の場合の配線図です。音声出力ピンがATP3011とは異なり15番ピンになるので、47kΩの抵抗の位置変更が必要です。また、9番ピンと10番ピンに水晶発振子かセラミック発振子(セラロック)の追加が必要です。ブレッドボードの都合上、セラミック発振誌のGNDがうまく挿せないので、実験ではGNDを接続せずに使用しました。実用的に使用する場合はマイコンの8番ピンへ接続します。(他のGNDと共用しないようにします。)

AquesTalk ATP3012F5-PU
外部クロック(セラロック)対応の高音質 AquesTalk ATP3012F5-PU の配線図

 音質の方はATP3011よりも明瞭で、より実用的です。オペアンプ周りの0.022uF、0.1uF、47uFのコンデンサはオーディオ用のものを使用しました。オーディオ用のコンデンサは誤差が少ないだけでなく、オーディオ周波数帯のAC特性に特化して性能を調整していますので、高級オーディオ以外であっても効果があります。オーディオ信号に入れると音が明瞭になったり、電源回路に入れるとデジタルノイズが聞こえにくくなったりといった違いが出ます。ブレッドボード上で確認してみると良いでしょう。(効果の程度は条件によって異なります。また、条件によっては、たまたま一般品の方が他の回路との相性が良くてオーディオ用の方が改悪となってしまうという場合もあります。)

親機のソフトウェア例

 親機のサンプルソフトウェアです。実行すると子機XBee ZBのコミッショニングボタンによるペアリング待ち状態になります。子機XBee ZBのコミッショニングボタンを押下するとペアリングが完了し、XBee ZBおよびAquesTalkとの通信が実行され、「こんにちは」の音声が出力されます。ぎこちないので、「コンニチワ」と書いた方が良いかもしれません。
 初回版のサンプルソフトウェアはこちら=「sample15_voice.zip」からダウンロードすることが出来ます。ライブラリはVer 1.85以降を利用ください。今後のリリースについてはライブラリVer 1.87以降の「example」フォルダに収録予定です。
 なお、親機の製作方法、開発環境やライブラリのインストールについては「XBee ZigBee 基本編 ワイヤレス通信を始めよう」などを参照してください。

親機(Cygwin)で動かすプログラム例

#include "../libs/xbee.c"
#include "../libs/kbhit.c"
#include <ctype.h>

#define VOICE_NUM   32                  // 音声データ長

byte dev[8];                            // XBee子機のアドレス

int main(int argc,char **argv){
    char voice[VOICE_NUM]="konnitiwa'";
    char voice_out[VOICE_NUM+1];
    byte voice_len=0;
    byte dev_en;
    byte len;
    byte i,j;
    byte trig=0;
    XBEE_RESULT xbee_result;

    byte port=0;
    
    // setup処理
    print_timer();printf("setup\tXBee Init\n");
    if( argc==2 ) port = (byte)(argv[1][0]-'0');
    xbee_init( port );          // XBee用COMポートの初期化(引数はポート番号)
    xbee_atnj(0xff);

    // loop 処理
    while(1){
        if(trig==0){
            if( dev_en == 0 ){
                printf("Waiting for XBee.\n");
            }else if( dev_en == 1 ){
                printf("Waiting for Aques Talk.\n");
                xbee_uart(dev,"?konnitiwa'\r");
            }
            trig=0xFF;
        }
        trig--;
        if ( kbhit() ){
            j = (byte)getchar();
            if(j == (byte)'\n'){
                printf("Send '%s'\n",voice);
                sprintf(voice_out,"%s\r",voice);
                xbee_uart(dev,voice_out);
                voice_len=0;
            }else if(j >= 0x20 && voice_len < VOICE_NUM-2){
                voice[voice_len]=(char)j;
                voice_len++;
                voice[voice_len]='\0';
            }
        }
        
        len=xbee_rx_call( &xbee_result );   // データを受信します。
        
        // 受信時の処理
        if(xbee_result.MODE == MODE_IDNT){
            printf("Found XBee IDNT. ( ");
            for(i=0;i<8;i++){
                dev[i]=xbee_result.FROM[i];
                printf("%02X ",dev[i] );
            }
            printf(")\n");
            xbee_ratd_myaddress(dev);       // 親機のアドレスを子機に設定
            dev_en=1;
        }
        if(bytecmp(dev, xbee_result.FROM ,8 )==0 && xbee_result.MODE == MODE_UART ){
            if( len==1 && xbee_result.DATA[0]==(byte)'>'){
                printf("Voice Device Enable.\n");
                dev_en=2;
            }else{
                for(i=0;i<len;i++) if( isprint( xbee_result.DATA[i]) )
                   printf("%c",(char)xbee_result.DATA[i] );
                printf(" (");
                for(i=0;i<len;i++) printf("%02X ",xbee_result.DATA[i] );
                printf(")\n");
            }
        }
    }
}

 このサンプルを実行した様子を下記に示します。ここではペアリング後に「今日はいい天気です」と話してみます。赤文字部分がパソコン(Cygwinコンソール上)のキーボードから入力した文字です。

親機(Cygwinコンソール)上の実行画面例

$ examples/sample15_voice 3
examples/sample15_voice 3
2014/03/30 15:35:51 setup       XBee Init
Serial port = COM3 (/dev/ttyS2)

--------------------
ZB Coord 1.86
by Wataru KUNINO
--------------------
4055XXXX COORD.

[4C:47]CAUTION:ATNJ=(FF)
Waiting for XBee.
Waiting for XBee.
Found XBee IDNT. ( 00 13 A2 00 XX XX XX XX ) ← ペアリング完了
Waiting for Aques Talk.
Voice Device Enabled.                        ← AquesTalkとの通信準備完了
kyo'-wa,i'-te'nkidesu                         ← 音声メッセージを入力
Send 'kyo'-wa,i'-te'nkidesu'
Voice Device Enabled.

次のステップへ

 このページでは音声を出力するだけでしたが、このLSIにEasyVRを組み合わせると、ちょっとした会話も実現できるはずです。興味のある方は「Arduino用 EasyVR Shield で音声認識」を参照しながら、プチ会話を楽しんでみてはいかがでしょうか。

XBee ZigBee AquesTalk
EasyVR Arduino Shield

XBeeメインメニューへ戻る

地デジトップへ戻る