HIROBIRO

HIROBIRO

金銭的、精神的自由を目指すブログ。

プーさんのぬいぐるみとおしゃべりするシステムを作ってみた

f:id:hirokun1735:20180303172748p:plain




スマホで昔撮った動画を見ているとプーさんのぬいぐるみとおしゃべりしている動画が出てきました。

私が一方的に喋っているのではなく、ちゃんとぬいぐるみも返事を返しています。

一年前の私はプーとおしゃべりしたい気持ちが強すぎるあまり、プーを喋れるように改造していました。

このとき作っていたプログラムや回路図は無くしてしまっていたので、もう一度作り直すことにしました。


ぬいぐるみと喋るには

 私はプーさんが大好きで、家のプーさんのぬいぐるみによく話しかけています。

しかしプーに話しかけてもいつも一方通行で返事は返ってきません。

プーとおしゃべりしたいという夢に一歩でも近づくため、電子工作の力を借りることにしました。


 電子工作と言えばArduinoです。

Arduinoを使うことはすぐに思いついたのですが、肝心の人間の声を喋らせる仕組みを作るのに少し悩みました。

まず思いついたのはアニメのプーさんの音声を録音し、こちらがプーに話しかけるとその音声を流してくれるというものです。


ただデータ音声を集めるのが手間になります。

何より私は普段自分の家のプーとよく会話をしているため、逆にアニメでプーが喋っていると違和感を感じるのです

うちのプーはおっさん声じゃないし、こんなセリフ言わないわって感じるのです。

音声合成LSI

ネットサーフィンであれこれ調べたところ便利なものを見つけました。

秋月電子で売っていた音声合成LSIです。

これはチップの中に音声合成エンジンを搭載しており、あらかじめ自分で喋らせたい文章を登録もしくはプログラムで組み立てれば任意の文章を発声させることができます。

Arduinoを使って動かせます。

 
f:id:hirokun1735:20121031135013j:plain


この音声合成LSIは声のパターンによっていくつかの種類があります。

メーカー(株式会社アクエスト)の公式サイトでサンプルの音声を聞くことができます。

聞き比べて最もうちのプーのイメージに合うLSIを選びました。

購入を決めたのは「ATP3011F4-PU(かわいい女性の音声)」です。

 
akizukidenshi.com

マイクで入力、スピーカーで出力

早速作り始めましたが、自由自在に会話ができるようにするのは流石に私にはハードルが高かったです。

とりあえずボタンを押す度に設定したいくつかの文章をスピーカーから発声してくれるシステムを作りました。


その後押しボタンの代わりにマイクを付け、マイクでこちらの声を拾うとプーが喋ってくれるようにしました。

こちらのAnalog Sound Sensor V2を使用しました。


akizukidenshi.com



音声認識機能を作るほどの技術は無かったので本当におしゃべりできるわけではありませんが、数種類の文章をある程度ランダムに話せるようにしました。

今度は無くさないように回路図を作って残しておきます。

 
f:id:hirokun1735:20180331130758p:plain


f:id:hirokun1735:20180331011722j:plain

プログラム作成

Arduinoで動かすプログラムを作成しました。
マイクに向かって話しかけると、あらかじめ登録した文章をランダムにスピーカーから出力します。
こちらの話した内容を認識してくれるわけではありません。


作成したプログラムも載せておきます。
プログラムは下記のサイトを参考にさせてもらいました。
blog-yama.a-quest.com
blog.gorugle.org


//Pooh_communication

#include <Wire.h>    // I2C通信用ライブラリ
#define I2C_ADDR_AQUESTALK 0x2E // AquesTalk pico LSIのデフォルトのI2Cアドレス
const int ledPin = 13;    // LED のピン番号
int analogPin = 0;
int lastState;    // 一つ前のマイクアナログ値の状態
int cnt=1;

void setup()
{
  Serial.begin(9600);            // 9600 bpsで通信する
  Serial.println("Start");       // 最初に1度だけ Start を表示
  
  Wire.begin();  // ArduinoをI2C Masterとして初期化
  pinMode(ledPin, OUTPUT);        // LED端子を出力に

  lastState=analogRead(analogPin);
  while(AquesTalk_IsBusy()) ; // Ready待ち

  Wire.beginTransmission(I2C_ADDR_AQUESTALK);
  Wire.write("hi'rokunn\r");
  Wire.endTransmission();
}

void loop()
{
/////////////////////////////////////
// スイッチの処理
/////////////////////////////////////
  int state = analogRead(analogPin);  
  Serial.println(state);
  if(lastState == 0 && state >= 5){ // 音声入力
    Get_Message(cnt);
  }
  lastState = state; //現在のスイッチ状態を保存
  delay(100);  // 0.1sec間隔でLED点滅
  digitalWrite(ledPin, HIGH);
  delay(100);
  digitalWrite(ledPin, LOW);
  
  if(cnt == 10){  //登録メッセージ数
    cnt =0;
  }
  cnt++;
}

/////////////////////////////////////
//メッセージ作成
/////////////////////////////////////
String Get_Message(int cnt)
{
  while(AquesTalk_IsBusy()) ; // Ready待ち
  Wire.beginTransmission(I2C_ADDR_AQUESTALK);  
  switch(cnt) {
    case 1: Wire.write("hi'rokunn\r"); break;
    case 2: Wire.write("onakasuita-\r"); break;
    case 3: Wire.write("so'o-/da'i\r"); break;
    case 4: Wire.write("oba'kagairu-\r"); break;
    case 5: Wire.write("yameru'nnda\r"); break;
    case 6: Wire.write("nemu'i/nemu'i\r"); break;
    case 7: Wire.write("oyasuminasa/i\r"); break;
    case 8: Wire.write("pupu'-\r"); break;
    case 9: Wire.write("pu-pu/pu'-pu/pu-pu/pu-\r"); break;
    case 10: Wire.write("pu'gera/pu'gera/pu'-kusukusu\r"); break;

    default:;
  }
  Wire.endTransmission();
}

/////////////////////////////////////
//音声合成用の関数
/////////////////////////////////////

// LSIがコマンドを受信可能かチェック
// 戻り値 0:Ready 1:Busy 2:Error
int AquesTalk_IsBusy()
{
  delay(10); // Busy応答は10msec以上待つ必要がある 連続して呼ばれた場合のため
  Wire.requestFrom(I2C_ADDR_AQUESTALK, 1);
  if(Wire.available()>0){
    byte c = Wire.read();
    if(c=='>')    return 0;    // Ready応答
    else        return 1;    // busy応答
  }
  else {
    return 2; //ERR: NOACK または応答が無い。I2Cの配線をチェック
  }
}


メッセージの作成部分の関数に喋らせたい文章を登録します。
アクセントの場所も決める必要があり文章の作り方にはコツがありますが、メーカーのサイトでデモがあるので試しに色々文章を作ってみると面白いと思います。
https://www.a-quest.com/demo/index.html




Arduinoでおしゃべりシステムを作った


まとめ

音声変換LSIを使ってプーさんとおしゃべりするシステムを作りました。
マイクに話しかけると登録した文章がスピーカーから流れます。
Arduinoやブレッドボード上の回路をもっと小型化し、プーに背負わせたリュックでも入れてしまえば完璧です。
今度はおしゃべりしながら手や首を動かせるようにしたいです。