AIスタックチャンのWakeWord.cppを解読

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距離を算出