STM32F4-Discoveryの音声認識

画像

この記事では、STM32F4-Discoveryデバッグボードを使用して、マイクロコントローラーで音声を認識する方法について説明します。 音声認識はコンピューターにとってもかなり難しいタスクであるため、この場合はGoogleサービスを使用して実行されます。 この方法での音声認識は、たとえばスマートホームデバイスの1つなど、さまざまなタスクで役立ちます。



STM32F4-Discoveryデバッグカードは、記事でよく言及されているSTM32-Discoveryデバッグカードとは著しく異なります。 マイクロコントローラSTM32F407VGT6は、1 MBのフラッシュと192 KBのRAMを備えたCortex-M4Fアーキテクチャを使用してインストールされます。 コントローラは、168 MHzの周波数で動作できます。



アンプを内蔵したオーディオDAC(出力はヘッドフォンジャックに接続されています)とデジタルMEMSマイクがデバッグボードにインストールされているため、STM32F4-Discoveryに基づいたサウンドで動作するデバイスを簡単に作成できます。



Google Voice Searchを使用した音声認識については、 記事をご覧ください

マイクロコントローラを使用して上記のフレーズを認識するには、いくつかのアクションを実行する必要があります。



コントローラーのメモリにサウンドを録音します。

オーディオエンコーディングを実行します。

Googleサーバーに接続します。

POSTリクエストとエンコードされたオーディオデータをサーバーに送信します。

サーバーから応答を受信します。



音声録音

ボードにはすでにデジタルマイクが搭載されているため、音声を録音します。 この場合、それはPDMマイクです。 クロックとデータの2つの信号出力しかありません。 クロック信号がある場合、PDM変調を使用してエンコードされた信号がマイクデータ出力に表示されます(詳細については、Wikipedia: パルス密度変調を参照してください)。 STM32F4-Discoveryでは、マイクはSPI / I2Sに接続されています-マイクからデータを受信するには、データを受信するようにI2Sを構成し、I2Sからの割り込み後、レジスタから受信データを読み取ります。 これらのデータはコントローラのメモリに保存され、十分な量のデータが記録された後、フィルタリングされ、その結果、オーディオデータのいくつかのサンプルが得られます。

マイクの使用については、STのドキュメントAN3998に記載されています。マイクの原理、接続の機能、およびフィルター機能の使用について説明しています。



STのWebサイトには、ボードのさまざまな例のうち、サウンドを扱う例がありますが、非常に洗練されています。この例は、コントローラーのメモリとボードに接続されたUSBフラッシュドライブからサウンドを再生する方法を示しています フラッシュドライブの録音もデモされます。 そこからサウンドを再生および録音するためのコードを取りました。 以下に、このコードのいくつかのエラーと欠陥を示します。おそらく、この例は急いで書かれたものです。



サウンドエンコーディングの再コーディング

音声認識サービスの使用に関する説明は、インターネットで繰り返し提供されています。 Googleはデータの非標準のSpeexエンコーディングを使用しているため、すべての場合において、著者はFLACオーディオコーデックを使用します。

これは、Chromiumブラウザのコードから見ることができます。サウンドの録音を担当するコードです。

POSTリクエストの説明は、データタイプが「audio / x-speex-with-header-byte」であることを示しています。

STM32では、FLAC形式でデータをエンコードすることはできません。そのようなライブラリはありません。 ただし、SpeexコードはSTM32に移植されているため、このコーデックをエンコードに使用しました。 Chromiumコードから、コーデックの変更がどのようなものであるかを理解するのは非常に簡単です。エンコードされたオーディオデータの各フレームの前に、フレームの長さ(バイト)に等しい追加バイトが挿入されます。



サウンドの録音とエンコードは、ダブルバッファリングを使用して同時に実行されます。160サンプルのオーディオデータが一方のバッファに書き込まれている間、もう一方のバッファのデータはSpeex形式にエンコードされます。 エンコードされたデータは、コントローラーのメモリに保存されます。 録音には2秒かかり、エンコードされた2100バイトのオーディオデータが形成されます。 サンプリング周波数-8 kHz。



Googleサーバー接続

画像

インターネットに接続するには、WIFIモジュールを備えたデバッグボード-RN-XVが使用されます。 WIFIモジュールRN-171(ボードの下部)、アンテナ、3セットのセイオード、ピンコネクタがあります。 モジュールとの通信はUARTを介して行われるため、4線で十分に機能します。 スパークファンのボードの価格は、35ドルです。 WIFI自体-モジュールは30ドルかかります。 sparkfunのモジュールの詳細については、 RN-XV WiFlyモジュールを参照してください。



サーバーにデータを転送するには、TCPを介してデータに接続し、このタイプのリクエストを送信する必要があります。



POST http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=ru-RU HTTP/1.1@#Content-type: audio/x-speex-with-header-byte; rate=8000@#Connection: close@#Content-length: 2100@#@#







@#文字は、プログラムをCRLFに置き換えます。 リクエストを送信した後、エンコードされた2100バイトのオーディオデータをサーバーに送信する必要があります。 すべてのデータを受信すると、サーバーは音声認識を実行し、認識された文字列を追加情報とともに送信します。その後、サーバーへの接続が閉じられます。



サーバーの応答が受け入れられると、プログラムは認識された行を選択し、別のUARTマイクロコントローラーを介して表示します。 このUARTからのデータは、認識されたフレーズが表示されるウィンドウにあるターミナルのコンピューターに送信されます。 その後、コントローラーは新しいフレーズの録音を開始する準備が整います。



結果のデザインは次のようになります。

画像



そして、これがどのように機能するかです:





更新:



記事を投稿した後、大きな音声(音声を含む)が表示されたときに録音を開始できました。 このため、プログラムは常にサウンドを記録およびエンコードします。 エンコードされたデータは配列に配置されます。 終わりに達した後、データは最初に収まり始めます。 同時に、プログラムは大きな音が出ているかどうかを常にチェックします。 表示されると、プログラムはレコードポインタの値を保存し、2秒間記録します。 記録を停止した後、プログラムはデータを別のバッファにコピーします。 サウンドがどの時点で出現したかがわかっているため、直前にデータを取得できます。 したがって、単語の最初の音は失われません。



VAD作業ビデオ:





プログラムはIARで書かれています。

このプログラムを使用すると、サーバーに送信する前に録音したフレーズを再生できます。 これを行うには、main関数の一部の行のコメントを外すだけで十分です。



添付のアーカイブには、いくつかのプロジェクトが含まれています。

my_audio_test-マイクからの音を録音してすぐに再現します。

speex_out-コントローラーのフラッシュメモリに保存されているSpeex形式でサウンドを再現します。

speex_rec-Speexを使用して2秒間音声を録音およびエンコードし、その後録音を再生します。

speech_wifi-音声認識プロジェクト自体。このプロジェクトはWIFIを使用します。

speech_wifi_vadはVADを使用した音声認識プロジェクトで、このプロジェクトはWIFIを使用します。



www.dropbox.com/s/xke5rq8lzi980x5/NEW_VOICE.zip?dl=0



All Articles