付録B. Arduinoでオーディオをキャプチャする
以下の文章では、第7章のwake-wordアプリケーションの音声キャプチャ・コードを説明する。機械学習とは直接関係ないので、付録として提供する。
Arduino Nano 33 BLE Senseには、オンボードのマイクが搭載されている。マイクからオーディオ・データを受信するには、新しいオーディオ・データのチャンクが準備できたときに呼び出されるコールバック関数を登録すればいい。
そのたびに、新しいデータの塊を、データの予備をストアするバッファに書き込む。オーディオデータは多くのメモリを消費するため、バッファには一定量のデータしか保存できない。バッファがいっぱいになると、このデータは上書きされる。
プログラミングが推論を実行する準備ができたらいつでも、このバッファから最後の1秒分のデータを読み取ることができる。われわれがデータにアクセスするよりも早く新しいデータが入り続ける限り、バッファには常に、前処理をしてモデルに送り込むのに十分な新しいデータがあることになる。
前処理と推論の各サイクルは複雑で、完了するまでに時間がかかる。このため、Arduinoでは推論を1秒間に数回しか実行できない。つまり、バッファがいっぱいになりやすいのだ。
第7章で見たように、audio_provider.hはこれら2つの関数を実装している:
-
GetAudioSamples()生オーディオデータのチャンクへのポインタを提供する。 -
LatestAudioTimestamp()直近にキャプチャされたオーディオのタイムスタンプを返す。
Arduino用にこれらを実装したコードはarduino/audio_provider.ccにある。
最初の部分では、いくつかの依存関係を取り込む。PDM.hライブラリーは、マイクからデータを取得するために使用するAPIを定義している。micro_model_settings.hファイルには、モデルのデータ要件に関連する定数が含まれており、正しい形式で音声を提供するのに役立つ:
#include "tensorflow/lite/micro/examples/micro_speech/audio_provider.h"#include "PDM.h"#include "tensorflow/lite/micro/examples/micro_speech/micro_features/micro_model_settings.h"
次のコードでは、いくつかの重要な変数をセットアップする:
namespace{boolg_is_audio_initialized=false;// An internal buffer able to fit 16x our sample sizeconstexprintkAudioCaptureBufferSize=DEFAULT_PDM_BUFFER_SIZE*16;int16_tg_audio_capture_buffer[kAudioCaptureBufferSize];// A buffer that holds our outputint16_tg_audio_output_buffer[kMaxAudioSampleSize];// Mark as volatile so we can check in a while loop to see if// any samples have arrived ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access