前回、マイコンモジュールM5Stackを購入したことを記事にしました。今回はこのM5Stackを活用しておしゃべりロボットのようなものを作ってみようと思います。
前回購入したM5Stackについては以下の記事をご覧ください。
M5Stackをしゃべらせる
今回M5Stackを使ったおしゃべりロボットを作成するにあたり、Avaterというディスプレイに顔のグラフィックを表示させるアプリケーションと、音声合成サービスVoiceText Web APIを使用します。
全て1から開発するのは大変なので、robo8080さんの「M5Core2_Avatar_VoiceText_TTS」のリポジトリを使わせて頂くことにします。
GitHubからリポジトリをダウンロードしてください。
VoiceText Web APIに登録する
今回、Aveterがしゃべる際に発する音声を作成するために、VoiceText Web APIという音声合成してくれるWebサービスを使用します。
このWebサービスを利用することで、テキストデータから音声データを生成することができます。
以下のページにアクセスしてユーザー登録をしてください。(登録は無料です)
ユーザー登録が完了すると、APIを使用するためのキーをもらうことができます。
M5Stack-Avatarをインストール
M5Stack AvaterはM5Stackのディスプレイに顔を表示させることができるアプリケーションです。プログラムから表情を変化させたり、吹き出しを表示してしゃべらせることができます。
Avaterを使うことでM5Stackをロボットのように見せることができます。
こちらはバージョン0.7.3をダウンロードしてください。
ESP8266Audioをインストール
ESP8266Audioは、WAV、MP3、MIDIなどのオーディオファイルを再生するためのライブラリです。VoiceText Web APIで合成した音声データをM5Stackから出力するために必要になります。
こちらはバージョン1.9.3をダウンロードしてください。
ソースコードの修正
さて、ここからは「M5Core2_Avatar_VoiceText_TTS」のプロジェクトファイル内のソースコードを変更していきます。
Avatar.cpp
Arduino IDEのファイル->環境設定の「スケッチブックの保存場所」のパスにある「libraries」フォルダ内を「Avatar.cpp」というファイル名で検索をかけてください。
ファイルが見つかったらエディタで開き、以下の箇所を修正します。
「init()」関数(96行目~123行目)で実行されている「xTaskCreate」、「xTaskCreate」、「xTaskCreate」の3つの関数の第3引数を「512」→「1024」と変更します。
void Avatar::init() {
DriveContext *ctx = new DriveContext(this);
// TODO(meganetaaan): keep handle of these tasks
xTaskCreate(drawLoop, /* Function to implement the task */
"drawLoop", /* Name of the task */
2048, /* Stack size in words */
ctx, /* Task input parameter */
1, /* Priority of the task */
NULL); /* Task handle. */
xTaskCreate(saccade, /* Function to implement the task */
"saccade", /* Name of the task */
1024, /* Stack size in words */
ctx, /* Task input parameter */
2, /* Priority of the task */
NULL); /* Task handle. */
xTaskCreate(updateBreath, /* Function to implement the task */
"breath", /* Name of the task */
1024, /* Stack size in words */
ctx, /* Task input parameter */
2, /* Priority of the task */
NULL); /* Task handle. */
xTaskCreate(blink, /* Function to implement the task */
"blink", /* Name of the task */
1024, /* Stack size in words */
ctx, /* Task input parameter */
2, /* Priority of the task */
NULL); /* Task handle. */
}
このソースのように修正されていれば完了です。
M5Core2_Avatar_VoiceText_TTS.ino
M5Core2_Avatar_VoiceText_TTSのリポジトリ内にあるファイル、「M5Core2_Avatar_VoiceText_TTS.ino」の17、18行目にあるwifiのSSIDとパスワードをお使いのルーターのものに書き換えてください。
const char *SSID = "YOUR_WIFI_SSID";
const char *PASSWORD = "YOUR_WIFI_PASSWORD";
AudioFileSourceVoiceTextStream.cpp
上記「M5Core2_Avatar_VoiceText_TTS.ino」と同じディレクトリにある「AudioFileSourceVoiceTextStream.cpp」についても修正を行います。
30行目の以下の部分を修正します。
const String tts_user = "YOUR_TSS_API_KEY"; // set your id
「YOUR_TSS_API_KEY」の部分を、先ほどVoiceText Web APIに登録した際に発行されたAPIキーに変更してください。
コンパイルしてみる
実際にコンパイルしてみると、私の環境では以下のようなエラーが発生しました。
\libraries\ESP8266Audio-1.9.3\src\libtinysoundfont/tsf.h: In function 'void tsf_channel_midi_control(tsf*, int, int, int)':
tsf.h:2100:1: error: insn does not satisfy its constraints:tsf.h:2100:1: internal compiler error: in extract_constrain_insn, at recog.c:2210
調べてみるとESP8266Audioライブラリに含まれる「tsf.h」というファイルのバグのようです。
以下のような方法でコンパイルエラーを解消することができました。
ボードマネージャーのバージョンを変更する
ボードマネージャーのバージョンによってもエラーがでるようです。今回のv2.0.2はNGでした。
v2.0.0にバージョンを下げるとエラーが解消されます。
ボードマネージャーについては紅樹 タカオさんが以下のページでまとめてくれていますので、ぜひご覧ください。
tsf.hをバグ修正版に置き換える
もう1つの方法はコンパイルエラーの原因になっているtsf.hを修正されたファイルに置き換えです。以下のページにバグが修正された「tsf.h」のソースがあります。「libraries」フォルダ内を「tsf.h」で検索し、見つかったファイルを置き換えてください。
M5Stackに書き込み実行する
コンパイルエラーが解消されたらM5Stackに書き込みます。
以下のように動作させることができました。
プログラムを変更することでセリフを変えることができます。
まとめ
今回はM5Stackをしゃべらせるアプリケーションを構築してみました。音声合成が可能なクラウドサービスを使用するというIoTシステムを作成することができました。
ただ、ライブラリやハードウェアのバージョンの整合によるエラーは付きまといそうかなという気がしています。
また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。
スキルアップや副業にぜひ活用してみてください。
スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。
講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。
それでは、また次の記事でお会いしましょう。
コメント