J-Botに英語を喋らせる



Emic Text-To-Speech ModuleというJ-Botのブレッドボードに装着できるボードがあります。これは英語のテキストを送るとスピーカーから女性の声で話してくれるというすぐれものです。外観は右の写真のとおり16本の足が出ています。全部は用いません。
PinPin NameType機能
1SINITTLレベルのシリアル入力。2400bps8 data bits,no parity,1 stop bit
2SOUTOTLレベルのシリアル出力。2400bps8 data bits,no parity,1 stop bit
3BUSYOHighレベルの時に使用中でビジーであるかエラーが起きている(LEDが赤点灯)。新しいコマンドあるいはテキストを受け取る準備ができているときにLOWになる(LEDが緑点灯)。
7VccP電源、+5V input
8,11GNDGグラウンド。システム電源のGNDに接続する。
9AINI694mVp-pレベルのアナログ入力。ACカップリングで接続しなければならない。使わない時は、無接続にすること。
10AOUTOシングルエンドのアナログ出力。最小5kΩ、最大1Vp-pの負荷をつけることができる。この信号には1.2Vの直流バイアスが乗っている。
14/RESETI外部リセット端子。アクティブロウ入力。電源を入れた時、あるいはエラーが起きた時にLOWにする。用いない時には無接続にすること。
15SP-Oスピーカーのマイナス端子に繋げる。8Ωで300mWまで使用できる。
16SP+Oスピーカーのプラス端子に繋げる。
ブロック図
基本的には下図のようにマイクロコントローラと接続します。
J-Botには下図のように接続します。

ソフトウェア

人間が理解できる文字列でコマンドを送るASCIIモードとバイナリーでコマンドを送るHexadecimalモードがあります。ここではデータ量の少ないHexadecimalモードでプログラミングします。コマンドリストは次のようになっています。

コマンド送るデータ備考
テキストを言葉にする0x00,text,0xAA
ボリュームを設定する0x01,n,0xAA0-7
スピードの設定0x02,n,0xAA0-4
ピッチの設定0x03,n,0xAA0-6
略号を加える0x04,abbr,0x2C,text,0xAA
略号を削除0x05,abbr,0xAA
略号のリスト0x06,0xAA
バージョンの表示0x07,0xAA
ソフトリセット0x08,0xAA
アナログ入力0x09,0xAA
ヘルプ0xFE,0xAA


さあ、これからJ-Botに「Hello World!」を喋らせてみましょう。

Hello world を喋らせる
import stamp.core.*;
/*
 * Hello world を喋らせる
 */

public class EmicTest1 {
// Emic Commands (Hex Mode)
  final static int Say     = 0x00;  //   say Engish text
  final static int Volume  = 0x01;  //   set volume, 0 - 7
  final static int Speed   = 0x02;  //   set speed, 0 - 4
  final static int Pitch   = 0x03;  //   set pitch, 0 - 6
  final static int AddAbbr = 0x04;  //   add abbreviation
  final static int DelAbbr = 0x05;  //   delete abbreviation
  final static int ListAbbr= 0x06;  //   list abbreviations
  final static int Version = 0x07;  //   get version
  final static int Reset   = 0x08;  //   soft reset
  final static int Audio   = 0x09;  //   enable audio in
  final static int PhT     = 0x10;  //   start of phonetic text
  final static int Help    = 0xFE;  //   display help
  final static int EOM     = 0xAA;  //   end of message
  final static int OK      = 0x55;  //   "okay" for hex mode

  final static int Space   = 0x20;  //  ASCII space character

  final static int SERIAL_TX_PIN  = CPU.pin0;
  final static int SERIAL_RTS_PIN = CPU.pin3;
  final static int SERIAL_CTS_PIN = CPU.pin2;
  final static int SERIAL_RX_PIN  = CPU.pin1;

  static Uart rxUart = new Uart( Uart.dirReceive, SERIAL_RX_PIN, Uart.dontInvert,
                           SERIAL_CTS_PIN,Uart.speed2400,
                           Uart.stop1 );
  static Uart txUart = new Uart( Uart.dirTransmit, SERIAL_TX_PIN,Uart.dontInvert,
                           SERIAL_RTS_PIN,  Uart.speed2400,
                           Uart.stop1 );

  public static void main() {
    System.out.println("reset");
    Soft_Reset();
    System.out.println("volume");
    setCommand(Volume, 5);
    do {
      talk("Hello world!");
    } while(true);
   }

   public static void talk(String val) {
     Check_Busy();
     txUart.sendByte(Say);
     txUart.sendString(val);
     txUart.sendByte(EOM);
     Wait_OK();
   }
   
   public static void setCommand(int cmd) {
     Check_Busy();
     txUart.sendByte(cmd);
     txUart.sendByte(EOM);
     Wait_OK();
   }

   public static void setCommand(int cmd, int val) {
     Check_Busy();
     txUart.sendByte(cmd);
     txUart.sendByte(val);
     txUart.sendByte(EOM);
     Wait_OK();
   }

   public static void Wait_OK(){
     int ret=0;
     for(int j=0; j<3; j++) {
       if(rxUart.byteAvailable())
        while((ret = rxUart.receiveByte()) != OK);;
       if(ret == OK ) break;
     }
   }

   public static void Check_Busy(){
     CPU.delay(800);
     while(CPU.readPin(SERIAL_CTS_PIN) == true) ;
   }

   public static void Soft_Reset(){
     txUart.sendByte(EOM);
     setCommand(Reset);
   }
}


Phonetic Alphabet

直訳すると音標文字で発音に即したアルファベットということになります。英語の場合はスペルが発音と一対一ではないため、おかしな発音をするときにはこのモードを使う必要があります。基本的には発音するテキストにこの語の初めに0x10を送り、スペースで終了という使い方になります。例えば「The quick \u0010bw1Wn fox」のようになります。ここで、\u0010はバイナリーをStringに埋め込むエスケープシーケンスです。また、母音の前には0か1をつけることができ、1は高めに、0は低めに発音するように指定できます。

母音子音
音素16進値音素16進値
i0x69beatp0x70pet
I0x49bitt0x74ten
e0x65baitk0x6Bkit
E0x45betb0x62bet
@0x40batd0x64debt
u0x75bootg0x67get
U0x55bookh0x68hat
o0x6Fboatf0x66fat
c0x63boughtT0x54thing
a0x61bobD0x44that
A0x41buts0x73sat
R0x52burrS0x53shut
O0x4Fboyv0x76vat
Y0x59buyz0x7Azoo
W0x57downZ0x5Aazure
x0x78abouty0x79you
X0x58rosesw0x77wit
r0x72rent
l0x6Clet
m0x6Dmet
n0x6Enet
G0x47sing
C0x43church
J0x4Ajudge
P0x50butter
Q0x51written


課題

音素データを引数にして喋らせるメソッドを作り、いくつか文章を読ませなさい。