ArduinoとBitVoicerサーバーによる音声認識
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 3 |
このプロジェクトについて
この投稿では、ArduinoボードとBitVoicerサーバーを使用して音声コマンドでいくつかのLEDを制御する方法を紹介します。この投稿ではArduinoMicroを使用しますが、手元にある任意のArduinoボードを使用できます。
音声コマンドをLEDアクティビティに変換するには、次の手順が実行されます。
- 音声波はSparkfunElectretBreakoutボードによってキャプチャおよび増幅されます。
- 増幅された信号は、アナログ-デジタルコンバーター(ADC)を使用してArduinoでデジタル化およびバッファリングされます。
- オーディオサンプルは、Arduinoシリアルポートを使用してBitVoicerサーバーにストリーミングされます。
- BitVoicerServerはオーディオストリームを処理し、そこに含まれる音声を認識します。
- 認識された音声は、Arduinoに送り返される事前定義されたコマンドにマッピングされます。
- TheArduinoはコマンドを識別し、適切なアクションを実行します。
上のビデオは、この投稿の最終結果を示しています。ビデオでは、BitVoicerServerが合成音声フィードバックも提供していることに注意してください。この音声フィードバックはサーバーで定義され、サーバーオーディオアダプターによって再生されますが、合成されたオーディオはArduinoに送信され、デジタル-アナログコンバーター(DAC)を使用して再生されることもあります。次の投稿では、Arduino DUEを使用する方法を紹介します。1つは増幅され、もう1つはスピーカーで、Arduino自体を使用して合成音声を再生します。
資料のリスト:
- Arduino Micro(またはその他のArduinoボード):〜U $ 20.00
- Sparkfun Electretマイクブレイクアウト:7.95米ドル
- BitVoicer Server 1.0 :U $ 9.90
- ブレッドボード:〜U $ 10.00
- 3つのxLED:〜U $ 1.00
- 3 x330オーム抵抗器:〜U $ 0.75
- ジャンパー線:〜U $ 0.30
ステップ1:配線
最初のステップは、下の写真に示すように、Arduinoとブレッドボードをコンポーネントで配線することです。
<図> <図> <図> <図>ここで最も重要な詳細は、ArduinoADCに提供されるアナログリファレンスを参照しています。私のテストでは、Sparkfun ElectretBreakoutで3.3Vを使用するとより良い結果が得られました。そのため、3.3VピンとAREFピンの間にジャンパーを追加しました。 3.3VがAREFピンに印加されているときに(何らかの理由で)analogRead関数を使用する場合は、analogRead関数を使用する前にanalogReference(EXTERNAL)を呼び出す必要があります。そうしないと、アクティブな基準電圧(内部で生成された)とAREFピンが短絡し、Arduinoボード上のマイクロコントローラーが損傷する可能性があります。
ステップ2:コードをArduinoにアップロードする
次に、以下のコードをArduinoにアップロードする必要があります。便宜上、Arduinoスケッチはこの投稿の下部にある[添付ファイル]セクションでも入手できます。コードをアップロードする前に、BitVoicerサーバーライブラリをArduino IDEに適切にインストールする必要があります(.zipライブラリのインポート)。
BVS_Demo1.inoこのスケッチには4つの主要な部分があります:
- ライブラリ参照と変数宣言:最初の2行には、BVSPおよびBVSMicライブラリへの参照が含まれています。これらのライブラリはBitSophiaによって提供され、BitVoicerServerのインストールフォルダにあります。他の行は、スケッチ全体で使用される定数と変数を宣言しています。 BVSPクラスはBitVoicerServerとの通信に使用され、BVSMicクラスはオーディオサンプルのキャプチャと保存に使用されます。
- Setupfunction:この関数は、シリアル通信、BVSPクラス、BVSMicクラスを初期化し、frameReceivedイベントの「イベントハンドラー」(実際には関数ポインター)を設定します。
- ループ関数:この関数は、3つの重要なアクションを実行します。サーバーのステータスを要求し(keepAlive()関数)、サーバーがデータを送信したかどうかを確認し、受信したデータを処理し(receive()関数)、音声の録音と送信を制御します。ストリーム(isSREAvailable()、startRecording()、stopRecording()、sendStream()関数)。
- BVSP_frameReceivedfunction:この関数は、receive()関数が1つの完全なフレームが受信されたことを識別するたびに呼び出されます。ここでは、BitVoicerサーバーから送信されたコマンドを実行します。コマンドには2バイトが含まれています。最初のバイトはピンを示し、2番目のバイトはピンの値を示します。 analogWrite()関数を使用して、ピンに適切な値を設定します。
ステップ3:BitVoicerサーバーソリューションオブジェクトのインポート
次に、Arduinoで動作するようにBitVoicerサーバーを設定する必要があります。 BitVoicer Serverには、場所、デバイス、BinaryData、音声スキーマの4つの主要なソリューションオブジェクトがあります。
場所は、デバイスがインストールされている物理的な場所を表します。私の場合、Homeという場所を作成しました。
デバイスはBitVoicerサーバークライアントです。 ArduinoMicroという名前の混合デバイスを作成し、通信設定を入力しました。 ARDUINOMICROに関する注意 :RTSとDTRを使用するため、[通信]タブでこれらの設定を有効にする必要があります。また、サーバーオーディオアダプターを使用して音声を合成するSystemSpeakerデバイスを作成しました。
BinaryDataは、BitVoicerサーバーがクライアントデバイスに送信できるコマンドの一種です。これらは実際には、コマンドにリンクできるバイト配列です。 BitVoicerサーバーは、そのコマンドに関連する音声を認識すると、バイト配列をターゲットデバイスに送信します。各ピン値に1つのBinaryDataオブジェクトを作成し、ArduinoMicroGreenLedOn、ArduinoMicroGreenLedOffなどの名前を付けました。ソリューションに18個のBinaryDataオブジェクトが含まれることになったので、 VoiceSchema.sof からオブジェクトをダウンロードしてインポートすることをお勧めします。 以下のファイル。
音声スキーマは、すべてが一緒になる場所です。これらは、認識される文と実行するコマンドを定義します。文ごとに、必要な数のコマンドとそれらが実行される順序を定義できます。コマンド間の遅延を定義することもできます。このようにして、ビデオに表示されている一連のアクションを実行することができました。
この投稿で使用したすべてのソリューションオブジェクトを以下のファイルからインポート(ソリューションオブジェクトのインポート)できます。 1つにはデバイスが含まれ、もう1つには音声スキーマとそのコマンドが含まれます。
Devices.sof
ステップ4:結論
それだ!気に入っていただけたでしょうか。
ビデオに示されているデモを実行するために必要なものはすべて揃っています。ビデオでは、BitVoicerサーバーマネージャーでArduinoMicroデバイスを有効にすることから始めたことに注意してください。有効になるとすぐに、Arduinoは利用可能な音声認識エンジンを識別し、BitVoicerサーバーへのオーディオのストリーミングを開始します。
BitVoicerサーバーマネージャーで利用可能なサーバーモニターツールで認識結果を追跡できます。
次の投稿では、ArduinoDUEを使用して合成音声を再生する方法を紹介します。
コード
- BVS_Demo1.ino
BVS_Demo1.ino Arduino
#include#include //オーディオのキャプチャに使用されるArduinoピンを定義します#defineBVSM_AUDIO_INPUT 5 // LEDピンを定義します#defineRED_LED_PIN 6#define YELLOW_LED_PIN 9#define GREEN_LED_PIN 10 // BVSPにパラメーターとして渡される定数を定義します。//BVSP.beginfunctionconstunsigned long STATUS_REQUEST_TIMEOUT =1000; const unsigned long STATUS_REQUEST_INTERVAL =2000; //オーディオバッファーのサイズを定義しますconstint AUDIO_BUFFER_SIZE =64; / /受信バッファのサイズを定義しますconstint RECEIVE_BUFFER_SIZE =2; // BVSPクラスの新しいグローバルインスタンスを初期化しますBVSPbvsp =BVSP(); // BVSMicクラスの新しいグローバルインスタンスを初期化しますBVSMicbvsm =BVSMic(); / /記録されたサンプルの読み取りに使用されるバッファーを作成します// BVSMicクラスからバイトaudioBuffer [AUDIO_BUFFER_SIZE]; // BitVoicerサーバーから送信されたコマンドの読み取りに使用されるバッファーを作成します//バイト0 =ピン数値//バイト1 =ピン値バイトreceiveBuffer [RECEIVE_BUFFER _SIZE]; void setup(){//ピンモードを設定しますpinMode(RED_LED_PIN、OUTPUT); pinMode(YELLOW_LED_PIN、OUTPUT); pinMode(GREEN_LED_PIN、OUTPUT); // 115200 bpsでシリアル通信を開始しますSerial.begin(115200); //通信に使用されるArduinoシリアルポートを設定します。//ステータスリクエストがタイムアウトするまでにかかる時間と//ステータスリクエストをBitVoicerサーバーに送信する頻度を設定します。 bvsp.begin(Serial、STATUS_REQUEST_TIMEOUT、STATUS_REQUEST_INTERVAL); // frameReceivedを処理する関数を定義します//イベントbvsp.frameReceived =BVSP_frameReceived; // BVSMicクラスタイマーを準備しますbvsm.begin();} void loop(){//ステータス要求間隔が経過したかどうかを確認し、//経過した場合は、ステータス要求をBitVoicerサーバーに送信しますbvsp.keepAlive(); //シリアルポートバッファに利用可能なデータがあるかどうかを確認し、// BitVoicerサーバープロトコルの仕様に従って//そのコンテンツを処理しますbvsp.receive(); //使用可能なSREが1つあるかどうかを確認します。ある場合は、//録音を開始します。 if(bvsp.isSREAvailable()){// BVSMicクラスが録音していない場合、オーディオ入力を設定し、//録音を開始しますif(!bvsm.isRecording){bvsm.setAudioInput(BVSM_AUDIO_INPUT、EXTERNAL); bvsm.startRecording(); } // BVSMicクラスに使用可能なサンプルがあるかどうかを確認しますif(bvsm.available){//ストリームを送信する前に//インバウンドモードがSTREAM_MODEであることを確認しますif(bvsp.inboundMode ==FRAMED_MODE)bvsp.setInboundMode(STREAM_MODE); // BVSMicクラスからオーディオサンプルを読み取りますintbytesRead =bvsm.read(audioBuffer、AUDIO_BUFFER_SIZE); //オーディオストリームをBitVoicerサーバーに送信しますbvsp.sendStream(audioBuffer、bytesRead); }} else {// SREは利用できません。 BVSMicクラスが記録している場合、//それを停止します。 if(bvsm.isRecording)bvsm.stopRecording(); }} // frameReceivedイベントを処理しますvoidBVSP_frameReceived(byte dataType、intpayloadSize){//受信したフレームにバイナリデータが含まれているかどうかを確認します// 0x07 =バイナリデータ(バイト配列)if(dataType ==DATA_TYPE_BINARY){// If 2バイトを受信しました。コマンドを処理してください。 if(bvsp.getReceivedBytes(receiveBuffer、RECEIVE_BUFFER_SIZE)==RECEIVE_BUFFER_SIZE){analogWrite(receiveBuffer [0]、receiveBuffer [1]); }}}
回路図
製造プロセス
- PythonでArduinoとRFIDを使用した出席システム
- LEDとピエゾスピーカーを備えたDHT11センサー
- ArduinoTemp。 3.2ディスプレイを備えたモニターとリアルタイムクロック
- ArduinoとAndroidデバイスでルンバロボットを制御する
- ArduinoとNokia5110ディスプレイを備えたDIY電圧計
- ArduinoとMPU6050によるサーボモーターの制御
- u-blox LEA-6H 02GPSモジュールとArduinoおよびPython
- DHT11でBlynkの温度と湿度を読み取る方法
- Arduinoによる音声認識と合成
- ArduinoUnoと1sheeldを備えた4x4x4LEDキューブ
- GPSおよびTFTディスプレイシールドを備えたGPSロケーションディスプレイ