こちらの記事について、内容・翻訳・視点・長さなど、皆様のご意見をお送りください。今後の記事製作の参考にしたいと思います。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
こちらの記事の感想をお聞かせください。
いろいろなモジュールを試しながら、音声認識MP3プレーヤーを作る
前回の私の記事では、「Grove - スタータキット(Arduino対応)」を紹介し、いかに速く簡単にガジェットのプロトタイピングが実行できるかをレビューした。このキットでSeeed社のGroveシステムの良さが分かったため、他にどのキットを紹介すべきか見てみたくなった。そこで今回は、「Speech Recognizer」を使った音声認識機能をレビューしてみたいと思う。
キットの内容
「Speech Recognizerキット (174-3226) 」は、Groveのいつもの透明のライトグリーンのボックスに入っている。中にはベースシールド、赤外線レシーバ、赤外線送信、MP3プレーヤ、RTC (リアルタイムクロック)、音声認識モジュールが1つずつと、必要なケーブルが入っていた。なおRTCモジュールにはCR1225リチウム電池が必要である。しかしキットには同梱されていなかったので別途調達しておく必要がある。
モジュール
Groveシステムでは、Arduino用のベースボードを装着し、そこに様々なモジュールを接続する。いつものように、各モジュールについて個別に説明し、それらのサンプルを紹介してから、このキット全体のサンプルを紹介する。
赤外線エミッタ及び赤外線レシーバ
Seeed GroveのWikiでは、赤外線モジュールの例で、送信モジュールと受信モジュールの両方を使用して、2台のArduinoを相互に通信させている。私は運がよく、スタータキットのベースシールドを持っていた。しかし、それがなくても、モジュールをArduinoに直接接続できる。
赤外線レシーバは、ベースシールドのポートD2に接続する。
赤外線エミッタは、ポートD3に接続する。
GitHubからGrove Infrared Libraryをダウンロードして、Arduino IDEにインストールした。このライブラリにはモジュールごとにサンプルスケッチが1つ含まれている。そのため、各サンプルを順番に開き、各モジュールが接続されているArduinoにアップロードするだけで済む。それが終わったら、2つのモジュールを相互に向けて、Arduino IDEのシリアルモニタを開く。ボーレートが設定されていない場合は、「115200」に設定すると、以下が表示される。
RTC モジュール
ボタン電池を装着すれば、RTCモジュールを試すことができるようになる。再度SeeedのWikiに記載されている手順に従う。ライブラリをダウンロードしてインストールし、次にサンプルスケッチを開いて以下の行を編集して適切な時間を設定し、アップロードする。
clock.fillByYMD(2013,1,19); //Jan 19,2013
clock.fillByHMS(15,28,30); //15:28 30"
clock.fillDayOfWeek(SAT); //Saturday
シリアルモニタウィンドウに、正確な時間が出力される。
音声認識モジュール
音声認識モジュールは、22種類のコマンドに応答するようプリセットされている。使用開始の手順に従って、提供されているスケッチをArduinoにアップロードすれば大丈夫だ。
モジュールに「Hicell」と話しかけると、赤色のLEDが点灯して声を認識していることが分かりる。次に、このサンプルのように、定義済みのコマンドの1つを発話すると、以下の画面のようにモニタウィンドウにコマンドが表示される。
今回は、ボーレートが「9600」に設定されていることを確認する。
Hicellコマンドは、マイクに近づくとうまくいくようだ。「Down」と「Go」を混同したこともあったが、ほとんどの場合は、はっきりと発話している限り、私が言ったことを認識してくれた。そのため、SiriやAlexaのように室内に配置されているよりも、マイクがユーザーに近いプロジェクトのほうに適しているように思えた。例えば、以下の動画のような、スクーターのハンドルバーに取り付けられているプロジェクトなどだ。
MP3プレーヤー
MP3プレーヤモジュールは、micro SDカードに音楽を保存し、MP3 WAVファイル及びWMVファイルを再生する。オーディオ出力は、3.5mmのステレオジャックを通じて行われる。ここでも、ダウンロードしてインストールするライブラリと、従うべき明確な手順がある。
前のサンプルと同様に、シリアルモニタを使用してモジュールと通信し、簡単なコマンドをプレーヤに送信して「再生」、「一時停止」、「再開」などを行う。私は、シリアルモニタが「9600」ボーに設定されていることを確認し、「P」というコマンドを送信すると、確かに音楽がヘッドホンを通して再生された。
次に、プレーヤーに音声コマンドを試す。
音声制御のMP3プレーヤの作成
このキットの手順には、音声制御をセットアップしてTVをオン/オフしたり、音声制御のMP3プレーヤを作成したりするための方法が記載されている。音声認識モジュールには、音楽を再生するための音声コマンドもたくさん用意されている。
音声制御のMP3プレーヤの設定及び実行方法について説明したWikiの部分は、あまり分かりやすく翻訳されていなかったため、その方法に従うのは少し難しいかもしれない。私はMP3プレーヤをベースシールドのポートD2に接続し、Speech RecognizerをポートD5に接続した。そして、複数の音楽ファイルをmicro SDカードにコピーした。再生する音楽トラックを指定したい場合は、ファイル名を数字で始まるように変更する必要がある。例えば、スケッチの行は次のようになる。
SpecifyMusicPlay(1);
これで、「001****.mp3」という名前の音楽ファイルが再生される。
私は2つのトラックの名前を変更したが、他のトラックはそのままにしてプレーヤでどうなるかを調べることにした。
以下は、音声コマンドを指定したスケッチの一部だ。
void loop()
{
int a=0;
if(speech.available())
{
a = speech.read(); // Read the return value from the Speech Recognizer
switch (a)
{
case 3: // speech command : Play music
SpecifyMusicPlay(1); // MP3: play the name of "001"
break;
case 4: // speech command : Pause
PlayPause(); // MP3: pause music
break;
case 19: // speech command : Start
PlayResume(); // MP3: continue music
break;
case 5: // speech command : Next
PlayNext(); // MP3: play next song
break;
case 6: // speech command : Previous
PlayPrevious(); // MP3: play previous song
break;
default:
break;
}
サンプルスケッチがアップロードされたら、「Hicell」と言い、次に「Play Music」と言うだけだ。私は他の音声コマンドも試してみたが、期待どおりの応答をした。「Next」と発話すると、次の番号のトラックが再生するが、元のファイル名のままにしておいた曲は再生できなかった。「Loop」コマンドを使用すれば、無視されたトラックを再生できかもと思い、スケッチを編集して、以下の2行を追加した。
case 12: //speech command : Go
PlayLoop(); // MP3: loop all songs
番号を付けたトラックをmicro SDカードから削除し、「Go」という音声コマンドを試すと、確かにそれらのトラックが再生された。これによって、聴きたい要素の一部が削除されるが、すべての音楽ファイルの名前を変更する必要がないことが分かった。特にSDカードに多数の音楽ファイルを保存しようとするときは、とても便利だ。
実際の応用
作ったのが以下の写真のモノだ。音声認識マイクをジャケットの衿に留め、MP3プレーヤをポケットに入れて、9Vのバッテリで動かせば、外出時に簡単に音楽を再生できることに気づいた。音声認識モジュールには長いケーブルが必要で、最長のSpeedは50cm (179-3728) のようですが、2本の変換ケーブル (179-3734) を使用して1本の長いケーブルにするか、又はカプラを使用して適切なソケット (179-3735) のケーブルを結合すると簡単だ。頑丈なケースに入れておけば、新年の抱負であるフィットネスを続ける心の支えになるかもしれない。