AIスタックチャンのウェイクワード検出のソースである WakeWord.cpp をざっくり解読します。
コメントにある通り、ややこしいです。
仕様・用語
- サンプルレート: 16000Hz
- VAD : 音声アクティビティ検出 (人が話していることを検出)
- MFCC : メル周波数ケプストラム係数 (音声の特徴量)
- DTW距離 : 2つの時系列データの似てない度 (伸縮は補正する)
- M5Unifiedライブラリに依存
- SimpleVoxライブラリに依存
- ESP32固有のライブラリに依存
主要なAPI
以下の3つが主要なAPI (公開関数) です。
wakeword_init() : 初期化
- rawAudio (ウェイクワード登録用バッファ) に3秒ぶんのメモリを確保
- rxBuffer (マイク入力用バッファ) にVADフレーム長×3個ぶんのメモリを確保
- rawBuffer (ウェイクワード比較用バッファ) に MFCCフレーム長+VADフレーム長 ぶんのメモリを確保
- features (MFCC用バッファ) にMFCCフレーム数×MFCC係数の個数 ぶんのメモリを確保
- ノイズ抑制器を生成
- 登録済みのウェイクワードのMFCCをSPIフラッシュメモリからロード
wakeword_regist() : ウェイクワードの登録
- マイクからVADフレームぶんの音声を rxBuffer へ
- ノイズ抑制器に通す
- VADで1発話ぶんの音声を rawAudio にためる
- MFCCを算出し、ウェイクワードのMFCCとする
- ウェイクワードのMFCCをSPIフラッシュメモリに保存
wakeword_compare() : ウェイクワードの比較
- マイクからVADフレームぶんの音声を rxBuffer へ
- ノイズ抑制器に通す
- VADで発話音声を rawBuffer にためる
- MFCCフレーム長ごとにMFCCを算出して features にためる
- 発話の終わりを検出するか、最大MFCCフレーム数に達したら判定へ
- MFCCを正規化
- ウェイクワードと今回の発話のMFCCのDTW距離を算出
- 180未満であれば一致と判定
依存しているESP32固有のライブラリ
- esp_heap_caps : 動的メモリ確保 (標準関数のmalloc等と異なり、メモリ種別を選べる)
- esp_dsp : DSPライブラリ
- esp_ns : ノイズ抑制
- esp_vad : VAD (音声アクティビティ検出)
SimpleVoxライブラリ
- simplevox::VadEngine : VADエンジン ( esp_vad に依存)
- simplevox::MfccEngine : MFCCエンジン ( esp_dsp に依存)
- simplevox::calcDTW : DTW距離を算出