N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
[AquesTalk pico LSI] ATP3011F4とATP3010F4の違い


ATP3011F4-PUは、音声合成LSI AquesTalk picoの新バージョンです。
ATP3010F4からの主な変更点は次のとおりです。

  • 電源電圧
    2.5Vから動作するようになりました。(ATP3010F4は3.8Vから)

  • クロック
    外付発振子から内蔵クロックにし、外付け部品をなくしました。

  • スリープ機能
    SLEEP端子をLOWにすることで待機時消費電流を1μA程度まで下げることができます。

なお、内蔵クロックの精度が良くないため、UARTのボーレートは自動調整となりました。
ボーレート設定には、通信に先立ち、ホストから'?'を送信する必要があります。ATP3010F4から置換の場合は、ご注意ください。
| AquesTalk pico LSI | 19:04 | - | - |
[Arduino] AquesTalk pico LSI を SPI で制御する
 音声合成LSI 「AquesTalk pico LSI」 (ATP3010F4)は、UARTの他にI2CやSPIのインターフェースを持っています。
一方、Arduino側のUARTは、PCとの通信で既に使われているので、ArduinoとAquesTalk pico LSI間の通信には、I2CやSPIを利用するのが便利です。
ココまでは、前回(I2C)と同じ。

今回は、SPIを使ってAquesTalk pico LSIを動かす方法を示します。

配線



通信モードをSPI(Mode0)にするため SMOD0(4pin), SMOD1(5pin)をGNDに接続、
ATP3010F4とArduinoのSPI接続は次のとおり。
SCK(19pin)   <-> D13
MISO(18pin) <-> D12
MOSI(17pin) <-> D11
/SS(16pin)    <-> D10

サンプルスケッチ

このスケッチは、予めプログラムに用意した複数のメッセージを順番に読み上げるものです。

注意点が3つあります。
1. スレーブセレクト(/SS)は、独自に実装する必要があります。
今回のスケッチでは、Arduinoのpin10をこれに割り当てて、転送の開始時にLowに、終了後にHiにするようにしています。

2. SPIのバイト転送毎に10μsec以上間隔をあける必要があります。これはATP3010F4の制限によるものです。

3. 発声の終了はポーリングで確認する必要があります。
ダミーデータ0xFFを送って'>'が返るのを待ちます。
なお、ポーリングの間隔は10ms以上あけてください。

/////////////////////////////////
// aqtkpico_spi - SPI通信で AquesTalk Pico LSIを操作するArdionoスケッチ
//     
// by N.Yamazaki AQUEST Corp.  <http://www.a-quest.com>

#include <SPI.h>

// pin10をSPIのスレーブセレクト端子(SS)とする 配線に応じて変更可
const int slaveSelectPin = 10;

// ローマ字音声記号列
//     コマンドの最後のCR('¥r')を忘れずに
const char *TblKoe[] = {
"konnnichiwa¥r",
"yukkurisiteittene¥r",
"akuesuto-ku/pi'ko ba-jyonn <ALPHA =01a>.¥r",
"dennwaba'nngo-wa <NUMS VAL=01-2345-6789>desu.¥r",
"<NUMK VAL=16 COUNTER=di>;<NUMK VAL=5 COUNTER=funn>/<NUMK VAL=35 COUNTER=byo->desu.¥r",
"#J¥r", // チャイム音J
"#K¥r", // チャイム音K
};

void setup()
{
    // pin10を出力に設定
    pinMode (slaveSelectPin, OUTPUT);

    // SPIの初期化
    SPI.begin();
    SPI.setClockDivider(SPI_CLOCK_DIV16); // 最大クロックは1MHz(16MHz/16)
    SPI.setBitOrder(MSBFIRST);    // MSBファースト
    SPI.setDataMode(SPI_MODE0);    // SPIモード0    SMOD1:0 SMOD0:0
//    SPI.setDataMode(SPI_MODE3); // SPIモード3    SMOD1:0 SMOD0:1

    Serial.begin(9600);
}

void loop()
{
    int iret;
    for(int iMsg=0; iMsg<sizeof(TblKoe)/sizeof(char*); iMsg++){
        // Ready待ち
        iret = Pico_WaitReady();
        if(iret==0){
            Serial.print("OK¥n");
        }
        else { // Error
            Serial.print('E');
            Serial.print(iret);
            Serial.print('¥n');
        }

        // コマンド送出
        Pico_Synthe(TblKoe[iMsg]);
    }
}

/////////////////////////////
// Picoにコマンド送信
// 音声合成開始    引数に音声記号列を指定
// コマンド送出後、発声の終了を待たずに戻る
void Pico_Synthe(const char *koe)
{
    // SS端子をLOWに
    digitalWrite(slaveSelectPin,LOW);

    const char *p = koe;
    for(;*p!=0;){
        Pico_SPI_trans(*p++);
    }

    // SS端子をHIに
    digitalWrite(slaveSelectPin,HIGH);
}

/////////////////////////////
// PicoがRedyになるのを待つ
// コマンドが受信可能な状態(音声合成の終了)になるのを待つ
// return 0:正常終了 それ以外:エラー(エラーコード)
int Pico_WaitReady()
{
    int iret=0;

    // SS端子をLOWに
    digitalWrite(slaveSelectPin,LOW);

    for(;;){
        byte c = Pico_SPI_trans(0xff); // 0xffはダミーデータ

         //!!  '¥r'後の最初の応答は常に'*'になるという制約有り
        if(c=='>')    break;
        else if(c=='*' || c==0xff){
            // スレーブが処理中なのでしばらく放っておく
            delay(10);        // ポーリング間隔は10ms以上
        }
        else if(c=='E'){ // 何らかのエラーを返した
            char sErr[4];
            sErr[0] = Pico_SPI_trans(0xff);
            sErr[1] = Pico_SPI_trans(0xff);
            sErr[2] = Pico_SPI_trans(0xff);
            sErr[3]=0;
            iret = atoi(sErr);
        }
    }
 
    // SS端子をHIに
    digitalWrite(slaveSelectPin,HIGH);
    return iret;
}

/////////////////////////////
// SPI で1バイトの転送(双方向)
byte Pico_SPI_trans(byte c)
{
    delayMicroseconds(20);// バイト毎の転送間隔は10usec以上必要
    return SPI.transfer(c);
}



応用

ここでは、Arduino側の/SS端子をpin10にしましたが、他の端子でもかまいません。変更した場合は、スケッチの slaveSelectPin の値もそれに合わせて変更してください。

SPIのクロックは1MHz以下であれば良いので、スケッチの SPI_CLOCK_DIV16 SPI_CLOCK_DIV32 SPI_CLOCK_DIV64 にしても構いません。

SPIMode0
の代わりにSPIモード3を使う場合は、スケッチのSPI_MODE0SPI_MODE3に変更し、SMOD0端子はオープンにします。

| AquesTalk pico LSI | 16:06 | - | - |
[Arduino] AquesTalk pico LSI を I2C で制御する
音声合成LSI 「AquesTalk pico LSI」 (ATP3010F4)は、UARTの他にI2CやSPIのインターフェースを持っています。
一方、Arduino側のUARTは、PCとの通信で既に使われているので、ArduinoとAquesTalk pico LSI間の通信には、I2CやSPIを利用するのが便利です。

今回は、I2Cを使ってAquesTalk pico LSIを動かす方法を示します。
(SPIを使う場合はこちら

配線



通信モードをI2CにするためSMOD0(4pin)をGNDに接続、
I2C通信のSCL(28pin)をArduinoのA5に、SDA(27pin)をA4に接続します。
また、このSCLとSDAは、4.7KΩ程度でプルアップ(VCCに接続)します。

サンプルスケッチ

このスケッチは、予めプログラムに用意した複数のメッセージを順番に読み上げるものです。

注意点は、ArduinoのWireライブラリが1度に32byteまでしか送信できない制限があるようです(arduino-022)。
また、I2Cでは発声の完了が通知されないので、ポーリングで確認する必要があります。
そして、ATP3010F4の制限によりポーリングの間隔は10ms以上あけて行います。

実際の応用では、動的にメッセージの単語を入れ替えたり、さまざまな数値を読ませるのも良いと思います。
特に数値に関しては、単位(助数詞)を指定することで「一本、二本、三本」を「いっぽん、にほん、さんぼん」などと、読みやアクセントを正しく読む機能を持っていますので、是非ご利用ください。このあたりの詳しくは、データシートの音声記号列仕様に書いてあります。

追記 2011/12/27
下記ソースはArduino 0023のもので、Arduino 1.0の場合は次のように変更してください。
Wire.send()        -> Wire.write()
Wire.recieve()    -> Wire.read()


/////////////////////////////////
// aqtkpico_i2c - I2C通信で AquesTalk Pico LSIを操作するArdionoスケッチ
//  
// by N.Yamazaki AQUEST Corp.  <http://www.a-quest.com>

#include <Wire.h>
#define I2C_ADDR_PICO 0x2E // PicoのデフォルトのI2Cアドレス

// ローマ字音声記号列
//   コマンドの最後のCR('¥r')を忘れずに
const char *TblKoe[] = {
"konnnichiwa¥r",
"yukkurisiteittene¥r",
"akuesuto-ku/pi'ko ba-jyonn <ALPHA =01a>.¥r",
"dennwaba'nngo-wa <NUM VAL=01-2345-6789>desu.¥r",
"<NUMK VAL=16 COUNTER=di>;<NUMK VAL=5 COUNTER=funn>/<NUMK VAL=35 COUNTER=byo->desu.¥r",
"#J¥r", // チャイム音J
"#K¥r", // チャイム音K
};

void setup()
{
    Wire.begin();  // Arduino側をI2C Masterとして初期化
}

void loop()
{
    for(int iMsg=0; iMsg<sizeof(TblKoe)/sizeof(char*); iMsg++){
        Pico_WaitReady();  // Ready待ち
        Pico_Synthe(TblKoe[iMsg]); // 発声コマンド送出
    }
}

// Picoにコマンド送信
// 音声合成開始    引数に音声記号列を指定
void Pico_Synthe(const char *koe)
{
    // Wireの制約で、一度に送れるのは32byteまで
    // AquesTalk picoへは一度に128byteまで送れるので、
    // Wire.beginTransmission()〜Wire.endTransmission()を複数回に分けて呼び出す
    const char *p = koe;
    for(;*p!=0;){
        Wire.beginTransmission(I2C_ADDR_PICO);
        // Wireの制約で、一度に送れるのは32byteまで
        for(int i=0;i<32;i++){
            Wire.send(*p++);
            if(*p==0) break;
        }
        Wire.endTransmission(); // 実際はこのタイミングで送信される
    }
}

// PicoがRedyになるのを待つ
// コマンドの受信可能な状態(音声合成の終了)を待つ
int Pico_WaitReady()
{
    for(;;){
        Wire.requestFrom(I2C_ADDR_PICO, 1);
        if(Wire.available()>0){
            byte c = Wire.receive();
            if(c=='*' || c==0xFF) delay(10); // Busy応答は10msec以上待つ必要がある
            else if(c=='>')    break;    // Ready応答
        }
        else { // NOACK または応答がなかった時
            // Picoが動いていない可能性が高い
            return 1; //ERR
        }
    }
    return 0;  // OK
}



| AquesTalk pico LSI | 12:38 | - | - |
AquesTalk pico LSI 販売開始
おまたせしました!

AquesTalk pico LSI(ATP3010F4)、オンライン販売の開始です。
といっても、本格的な製造・販売体制が整っていないため個数限定となります。
売り切れの際はご了承下さい。

Make: での先行発売同様、セラロック付きです。
価格は送料込みで 1,575円 (配送はクロネコメール便速達のみ)。
また、数量割引は用意できていません m_ _m

ご購入は、以下のサイトから
Aquest Onlne Store




| AquesTalk pico LSI | 18:00 | - | - |
AquesTalk pico LSIの次の販売は
先日のMake:Tokyo MeetingでのAquesTalk pico LSIの先行発売は、おかげ様で20〜30分のあっという間に完売しました。

ご購入いただいた方、ありがとうございます。是非、使った感想をお寄せ下さいね。
一方で、多くの方々には折角お越しいただきながら売り切れでごめんなさい。

本格的な販売にはまだ少し時間がかかりそうなので、急遽、追加で1ロット手作業で作って販売することにしました。この販売時期に関しては、まだ部品の仕入れの段階なので未確定ですが、今月中旬頃にはなんとかするよう頑張ります! 次回も、シールが貼ってあるなど手作り感たっぷりの予定ですので、お手柔らかによろしくお願い致します。

発売時期に関してお知らせするメーリングリストを作成しましたので、よろしければご登録ください。発売前にメールでお知らせいたします。

■ML参加方法
join-aquestalk_pico_lsi.fsjF[あっと]ml.freeml.com に空メール ([あっと]を@に換えてください)。
あとは返信メールのURLにアクセス 。
なお、「マイページの作成」を促されますが、このMLに関しては不要です。
※メールアドレスは管理者も含めて非公開で参加する設定にしてあります。

追記:12月16日〜 販売を開始しました。こちらを参照
| AquesTalk pico LSI | 22:47 | - | - |
PROFILE
CATEGORIES
SELECTED ENTRIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
iOS4プログラミングブック
iOS4プログラミングブック (JUGEMレビュー »)
畑 圭輔,加藤 寛人,坂本 一樹,藤川 宏之,高橋 啓治郎,沖田 知彦,柳澤 昇
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
音声符号化
音声符号化 (JUGEMレビュー »)
守谷 健弘
CODECの本ですが、音声合成でも実用的なテクニックが満載
RECOMMEND
日本語 発音アクセント辞典
日本語 発音アクセント辞典 (JUGEMレビュー »)
NHK
辞典としてだけでなく、巻末のアクセントに関する解説が知識として役に立ちます。