マイク録音できたよ
現在、ドロイド君(ESP32を使用)による音声認識を試みています。
ドロイド君システムでは、以下の位置にマイクを取り付けています。(MAX9814を使用)
このマイクを使った、音声認識実現までの道のりは、たぶん以下のような感じかと。
----
1. ドロイド君のマイクで音声を取得し、SDカードへ保存
2. 1.のデータに対して、パソコン上で色々な音声認識手法をシミュレーションし、手法を決定。
3. 2.をESP32に実装し、計算量・認識精度含め実機実験
----
そこでまずは1.について、ドロイド君システム(ESP32)による、マイク録音を実装してみました。
その結果がこちら。
後ろにノイズが載っていますが、何を言っているのかは聞き取れるかと思います。
聞き取れる、ということは、きっと音声認識もできるはず!
データ取得方法としては、マイクからの出力をAD変換して、16bitモノラル・8000Hzでサンプリングしています。
(ESP32のAD最大解像度は12bitなので、16bit全てを生かしきれてないですが…)
一応、ESP32の実力的にはもっと高レートでもサンプリング可能ですが、負荷が低いに越したことはないので、とりあえずこの条件にて、2.の実験に移行してみようと思います。
実験の結果、精度を削れそうなところはさらに削り、逆に足りなさそうなら1.に戻って再検討しようと思います。
ちなみに、ESP32のリソースの使い方ですが、デュアルコアを生かし、音声データの録音とSDカードへの保存を同時に実行する形にしています。
理由としては、メモリ量的な問題(10秒の録音でも160KB程度必要)と、将来的な音声認識のリアルタイム処理を見据えて、の2点からです。
処理の流れとしては、ダブルバッファリング方式で、以下のような感じでやっています。
----
1. [Core1] AD変換をぐるぐる回し、バッファAにためる。
2. [Core1] バッファAがいっぱいになったら、バッファBに切り替えADぐるぐる。同時に、バッファAをSDカードへ保存するよう、Core0へリクエスト。
3. [Core0] SDカードへ保存処理。(この間もCore1ではADぐるぐる)
4. [Core1] バッファBがいっぱいになったら、バッファAに切り替えADぐるぐる。同時に、バッファBをSDカードへ保存するよう、Core0へリクエスト。
5. [Core0] SDカードへ保存処理。(この間もCore1ではADぐるぐる)
(以下、2.~5.を録音時間が過ぎるまで繰り返し)
----
いや~、デュアルコアって助かります。ただ、Core0ではWIFIなど他のタスクも動いている、という話も耳にするので、処理量には注意が必要かと。
将来的には、Core0 の「SDカードへ保存処理」を「音声認識処理」に置き換えれば、リアルタイムに音声認識できるのでは、ともくろんでいます。
早く、ドロイド君とお話できるようになるといいな~。
では、また次回をお楽しみに。