書籍『TinyML』 の要点メモ, その3

その2 の続きのその3。

Wake-Word ("OK, Google", "Alexa", "Hey, Siri") のような限定された単語を検出するアプリをつくる。

7章: Wake-Word Detection: Building an Application

単語 "yes", "no" を判別するサンプルのビルドとデプロイまでの流れとアプリケーションの説明。

  • 帯域、電力、プライバシーと音声UIのレスポンス面からエッジデバイスでオフラインでwake wordを検出する。そのあとはクラウドに任せる。
  • "yes", "no", unknown word, silent の4つに分類する
  • マイクから入力した音声波形をFFTして、横軸は時間、縦軸は周波数毎のパワーのグレイスケール画像(2次元のテンソル)として取り扱う
  • モデルのサイズは18 kB
  • 使用する演算のみモデルに含める。
    • モデルが使用している演算を確かめるには、ビルドを演算を含まない状態で行い、エラーに従い足していく
  • テンソル用のメモリ確保。トライ&エラーで増やす。
  • windowが"noted"の"no"だけにかかって、"no"と誤検出しないように、1秒間の検出結果から判断する
  • データフロー
    • Audio Provider(マイク録音) -> Feature Provider(FFT) -> TFL Interpreter(Model) -> Command Recognizer(Wake-Wordの判別) -> Command Responder(LED表示など)

8章: Wake-Word Detection:

7章の発展版。自分でモデルをトレーニングするところから実施する。

  • 手順
    • Google Colabでwake-wordを指定してモデルを訓練する
    • tocoを使ってTFモデルからTFLモデルに変換する
    • TFLからTFLMの形式のC言語配列にxddコマンドで変換する
  • モデル
    • FFT
      • ハン窓、480点サンプル(30ms)をゼロ埋めした512サンプルに対してFFTする)
      • 256ビンの周波数を40に減らす。メル周波数のスケールに合わせて減らす。高周波側を平均するので結果的にノイズ抑圧効果もある。
      • 奇数ビンと偶数ビンで傾向が違う。バグではなくそういう実装をしていてそのほうが精度がでる(??。
    • 特徴量としてスペクトラムの大きさだけ使う。位相は使わない。
    • 横軸:時間 49=1000ms/20ms - 1, 縦軸:周波数 40
    • ニューラルネットワーク: CNN-> max pooling -> Full connection -> Softmax
    • 1秒間の推論結果を使って最終的な予測結果を生成する
  • データを集めるのは大変だけど、"Visual Wake Words Dataset" というのがある
  • 転移学習は有望だけど音声認識ではまだ発展途上