音声認識組込みモジュールを使ってみます(Arduino編)
〔マイコンのトップに戻る〕
以前こちらで音声合成LSI(ATP3011F4-PU)を使って音声を発生させる実験の記事は書きました。
今回は、音声を認識するモジュール(SR-MOD100)を実験してみたいと思います。
音声認識組込みモジュールは、マイクロテクニカのこちらから購入しました。 *1)
少し、値がお高いのですがぁ、USART通信(シリアル通信)で簡単に制御できます。
このモジュールは、登録(録音?)した音声を認識します、登録は32フレーズ可能でこれは登録した
本人の声のみ認識します、これを”特定話者認識フレーズ”と呼んでいます。
(パスワードフレーズと言う機能なら5人まで登録できる様です)
また、”不特定話者認識フレーズ”機能であれば予め25フレーズ内蔵されています、これは誰の声でも
認識可能な様です。
※ 2017/01/12現在、"SR-MOD100C"と新しくなった様です、
ユーザー定義SIフレーズ+20語(8語まで購入時に申請すれば無料)機能が新たに加わっている
様です。 基板の接続は下記とは異なるでしょう! *1)
登録フレーズを認識した場合は、登録しているフレーズの該当するインデックス番号が送信されます。
尚、”音声認識組込みモジュールを使ってみます(PIC編)”はこちらを見て下さい。
《SR-MOD100用のサポートソフトについて》
SR-MOD100用のマニュアルとサポートソフトウエアは、マイクロテクニカのこちらからダウンロードして
下さい。("型式の先頭文字で検索"の項で"S"文字をクリック)
以下は、windows 7 Pro にインストールした場合での記述です。
@ ダウンロードしたファイル"EasyVR.zip"を解凍すると、「EasyVR」フォルダーが出来ます。
A この中に有る"EasyVR-Commander-3.4.10-QS-5.2.1.exe"を実行してインストールします。
B 途中で左図が表示されたら、[いいえ]を
選択します。
"QuickSynthesis 5.2.1"と言うツールは
インストールをしなくてもOKです。
インストールするとエラーもでるしぃ。
C "EasyVR Commander"ツールがインストールされます。
ちなみに、ショートカットは作成されない
このツールで、モジュールのテストと特定話者認識フレーズの登録が出来ます、
詳しい使い方はマニュアルを見て下さい。
モジュールとパソコンの接続
左のモジュール写真は、マイクロテクニカからの拝借です、
実際のモジュールと少し異なります。
モジュールとパソコンの接続はシリアルインターフェイスで
行います。
マイクロテクニカに、モジュールのUART信号をパソコンの
USBポートに接続出来る様にする為のボードも販売して
いますが少し値段が高いので、秋月電子の”USBシリアル
変換モジュール”を利用する方法をお勧めします。
”USBシリアル変換モジュール”の話はこちらの記事を
参照下さい。
Arduinoの1/0番端子に接続してUSBを繋いで”EasyVR - Commander”ツールを起動させればと
思ったのですが、ダメでした。(あ、arduino CPU ICを外せばぁ...未実験)
実験の準備
下記サンプルプログラムを利用する為に、”特定話者認識フレーズ”を登録します、登録方法は
マニュアルを見て下さい。
SDグループ(青色フォルダ)の最初の”1 Group”に下記フレーズを登録します。
・Index0: てんとう (点灯)
・Index1: しょうとう (消灯)
(点灯)で認識するとLEDを点けて、(消灯)で認識するとLEDを消します。
こんな感じに登録しますぅ。
最初(LEDてんとう)(LEDしょうとう)と登録したのですがぁ、うまく認識せずだったので
(てんとう)(しょうとう)にしたら上手く行きました。
《配線図》
モジュールとはソフトウェアシリアルで配線を
行いたいと思います。
なのでデジタルピンの何処でも良いのですが
今回は8番ピンをRX、9番ピンをTXにて使用
します。
尚、今回はブレッドボードなくても配線OKです
3本のI/O端子が有り入出力が可能です。
マイクは付属の物を取り付けます。
(付属のメスーメス・リード線で配線)
モジュールの詳しい端子の使い方は
マニュアルを参照下さい。
モジュール電源は3.3-5Vまで対応です。
(今回は、5V で使います)
LEDのON/OFFには、Arduino内蔵の13番LEDを利用します。
《ダウンロードプログラムについて》
↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
skSRMOD100.zip
解凍すると下の様に展開されます。
[skSRMOD100]─┬─[examples]───[SpeechRecognition]--- SpeechRecognition.ino
├ skSRMOD100.cpp
├ skSRMOD100.h
└ keywords.txt
Arduino-1.0.1IDEがインストールされているフォルダー、インストール先を変更していないなら
[C:\Program Files\arduino-1.0.1\libraries]です。
この場所に上記解凍ファイルを[skSRMOD100]ディレクトリ丸ごと移動します。
また、こちらの[ライブラリ登録]も参考にして見て下さい。
SpeechRecognition.ino ・・・・ 本体のサンプルスケッチ
skSRMOD100.cpp ・・・・・・・音声認識モジュールと通信を行う関数のライブラリソース
skSRMOD100.h ・・・・・・・・ヘッダファイル
keywords.txt ・・・・・・・・・・ キーワードファイル
SpeechRecognition.ino
音声認識モジュール(SR-MOD100)と通信を行う為のメインのサンプルプログラムです。
”SpeechRecognition.ino”を開くにはarduinoIDEを起動して、
メニューバーの「File:ファイル」→「Examples:スケッチの例」→「skSRMOD100」→[SpeechRecognition]
をクリック操作すればファイルが開かれます。
次に、IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。
書込み完了後、IDEのシリアルモニターを起動させましょう。
起動させたら、(てんとう)(しょうとう)を発声すれば13番LEDが点灯・消灯を行います。
シリアルモニター画面にも”ON”/ ”OFF”を表示します。
これは電源を切るまでは繰返し実行しているので、何時でも声を出せば13番LEDをON/OFF出来ます。
発声を認識できなかった場合は、モニターに”Failed!!”と表示しエラー番号も表示します。
(エラー番号はマニュアルの22頁 "STS_ERROR"の項 を参照下さい)
また、今回の認識待ち時間は3秒です、この時間までに声を発生しないとタイムアウトになり、モニター
に”Timeout!!”と表示されます。
skSRMOD100.h
音声認識モジュールと通信を行うライブラリのインクルードファイルです。
このライブラリを利用する場合は、
arduinoIDEメニューバーの「Sketch:スケッチ」→「ImportLibray...:ライブラリを使用」→「skSRMOD100」を
クリック操作すれば、"#include <skSRMOD100.h>"がスケッチに追加されます。
まぁ、手動でキー入力しても良いんですけどね。
又、下記の様に記述されています、ソフトウェアシリアルのピンを変更する場合は書換えて下さい。
#define SR_rxPin 8 // ソフトウエアシリアル通信で、受信を行うピンの指定
#define SR_txPin 9 // ソフトウエアシリアル通信で、送信を行うピンの指定
skSRMOD100.cpp
音声認識モジュールとソフトウエアシリアルで通信を行う為の関数集です。
まず利用する場合は下記2行を記述します。
#include <SoftwareSerial.h>
#include <skSRMOD100.h>
音声認識モジュールと通信を行う関数の使い方を説明します。
skSRMOD100
音声認識組込モジュールライブラリ関数を使用(生成)する為に必要な宣言を行います。
skSRMOD100 SR(speed) ;
speed : ソフトウエアシリアル通信のスピード(ボーレート)を設定します
300、1200、2400、4800、9600、14400、19200、28800、31250、38400、
57600、115200 のみをサポートしています。
(SR-MOD100はデフォルトが9600ボーです、変更は"CMD_BAUDRATE"コマンドで行います。)
SR の名前は任意に変更可能です。
skSRMOD100 SR(9600) ; 以下はこの宣言例で記述します。
ans = SR.begin(no)
SR-MOD100を使用する為の初期化を行う処理です
SR-MOD100は電源を入れた時はスリープ状態なのでウエイクアップをさせます。
no :使用言語を指定します(今回は日本語で初期化しています)
0=英語 1=イタリア語 2=日本語 3=ドイツ語 4=スペイン語 5=フランス語
ans : 0=正常終了 -1=コマンドを受け入れ出来る状態で無い -2=言語設定エラー
ans = SR.SendCMD(cmd,para1,para2)
SR-MOD100にコマンドを発行する処理です
コマンドの詳しい話はマニュアルを参照下さい。
但し、CMD_BREAK/CMD_SLEEP/CMD_LANGUAGE/CMD_TIMEOUT/CMD_BAUDRATE/
CMD_QUERY_IO/CMD_RECOG_SI/CMD_RECOG_SD のコマンドのみ対応です。
これ以外のコマンドは、音声認識用の音声登録関連コマンド群ですが、
音声の登録は"EasyVR Commander"ツールで行いましょう、その方が簡単に出来ます。
cmd :発行するコマンドを指定します
para1:コマンドに第1引数が有れば指定します(無ければ-1を必ず指定します)
para2:コマンドに第2引数が有れば指定します(無ければ-1を必ず指定します)
ans :0=正常終了 -1=コマンドを現在処理中です
例1) 音声認識待ち時間を5秒に変更する場合(コマンド:CMD_TIMEOUT)
SR.SendCMD('o',5,-1) // 又は SR.SendCMD(0x6F,5,-1)
例2) スイッチが押された時に3番I/OピンをONさせる場合(コマンド:CMD_QUERY_IO)
if (digitalRead(2) == LOW) {
SR.SendCMD('q',3,1) ;
}
例3) スイッチが押された時に不特定話者認識フレーズを行う場合(コマンド:CMD_RECOG_SI)
if (digitalRead(2) == LOW) {
// モニター画面に表示を行う
Serial.println("Voice Come on") ;
// 不特定話者認識プロセスの実行コマンドを発行する
// 引数はワードセット2番のインデックスを渡す
SR.SendCMD('i',2,-1) ;
}
ans = SR.CMD_STS( )
コマンドの実行状態をチェックします。
コマンドを発行し、それが終了した後に何か処理を行いたい場合等に使用します。
もちろん実行中なら、SR.SendCMD( )は受けつけません。
CMD_RECOG_SI/CMD_RECOG_SDコマンドは、音声認識処理が完了(74H)(65H)(72H)するまでは
実行中の状態です。
ans :0=コマンドは実行中でない それ以外=実行中です
SR.CMD_CTL( )
発行したコマンド(SR.SendCMD)の処理を制御する関数です
SR-MOD100は、データを1バイト単位での送信受信となっています。
その送信受信は20ms間隔で行わないとならない為にこの関数は存在します。
例えば、音声認識待ち時間変更コマンドを送信する場合、
SOFT_UART.write('o') ; // コマンドの発行
delay(20) ;
SOFT_UART.write(5+0x41) ; // 引数の発行
delay(20) ;
SOFT_UART.read() ; // ステータスを受信する
ってな感じです、なのでdelay(20)を使えばこの待ち時間に他の処理をしないとならない場合が
有るでしょうそういう場合はdelay(20)は使えません。
なので、SR.CMD_CTL( )はループ内で常に下記の如く実行させないとダメです。
skSRMOD100 SR(9600) ;
void setup()
{
// SR-MOD100を使用する為に初期化を行う
SR.begin(2) ; // 日本語で初期化
}
void loop()
{
if (digitalRead(2) == LOW) {
// スイッチが押されたら
// 不特定話者認識プロセスの実行コマンドを発行する
// 引数はワードセット2番のインデックスを渡す
SR.SendCMD('i',2,-1) ;
}
// SR-MOD100との通信を制御する処理
SR.CMD_CTL() ;
}
SR_USER_CALLBACKT_HANDLER(sts,para)
発行したコマンドに対して、SR-MOD100から返答を受けた場合に処理されるコールバック関数
です、なので、返答を受信した場合に何か処理を行うにはこの関数に全て記述します。
また、この関数はメインプログラム(例"SpeechRecognition.ino")の中に記述すると良いでしょう。
sts :返答のステータス値が格納されます
para:返されたステータス値に戻り引数が有ればここに格納されます
STS_SIMILAR/STS_RESULT時なら音声を認識したインデックス番号がセットされます
STS_ERRORならエラーコード番号がセットされます
STS_PINなら入力設定した汎用I/Oピンの入力状態がセットされます
このステータス以外は、STS_OUT_OF_MEM/STS_INTERR/STS_TIMEOUT/
STS_INVALID のみ対応
void SR_USER_CALLBACKT_HANDLER(unsigned char sts,unsigned char para)
{
switch (sts) {
case SR_STS_SIMILAR :
// 不特定話者認識フレーズの該当するインデックス番号が返された場合の
// 処理をここに記述する
break ;
case SR_STS_RESULT :
// 特定話者認識フレーズの該当するインデックス番号が返された場合の
// 処理をここに記述する
// LEDをON/OFFするサンプルの記述です
if (para == 0) digitalWrite(13,HIGH) ; // LED点灯
else digitalWrite(13,LOW) ; // LED消灯
break ;
case SR_STS_ERROR :
// エラーが返された(フレーズ認識失敗)場合の処理をここに記述する
break ;
case SR_STS_PIN :
// 汎用I/Oピンの入力状態が返された場合の処理をここに記述する
break ;
default :
// その他のステータスが返された場合の処理をここに記述する
break ;
}
}
《その他》
左写真は実験風景です。
感想などを....
不特定話者認識フレーズの場合はハッキリ
発音しないと誤認識が多いかもって感じでしょうか。
実際にモジュールを組み込む場合として、
取り付け穴が無い、ピンピッチも2mmなので、
取り付けには一工夫いるでしょう。
簡単に制御出来るのですがぁ、
もう少し値段が安ければぁ、
いろいろな物に組込もうって思えるの
ですがぁ....ねぇ...。
《 読者様からの情報 》 *2)
★ mikeyuさんからの情報です。
レオナルドで本サンプルソースを動作させる場合は、
ans = SR.begin(2); // 日本語で初期化
この行の前にdelay(1000)〜delay(3000)を入れると動作するそうです。
追記(*2) 2018/10/20
リンク切れ見直し(*1) 2017/01/12
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.