openWakeWordが反応しない?検出率を順番に確認する方法
反応がない原因はモデルだけではありません。マイク入力、リサンプリング、フレーム分割、特徴抽出、しきい値、合成音声と実際の話者の差も同じ症状を起こします。再学習の前にパイプラインを確認します。
最初に行うこと:トリガー結果だけでなく生の予測スコアを記録します。スコアが全く動かなければ音声とモデル読み込み、正しい語で上昇するが届かなければしきい値と学習範囲を調べます。
1. WAVでモデル読み込みを確認
マイクを使う前に、正解語を含む16 kHz WAVをpredict_clip()でテストします。パス間違い、古いキャッシュ、ONNX/TFLiteの取り違えは、検出率ゼロと同じように見えます。
from openwakeword.model import Model
model = Model(wakeword_models=["my_model.onnx"])
print(model.predict_clip("positive.wav"))
2. 音声形式を確認
openWakeWordは16-bit、16 kHz PCMを使用し、公式文書では80 msの倍数のフレームを推奨しています。実際の入力をWAVとして保存して聞き、チャンネル、型、フレーム長、振幅を確認します。診断中は自動ゲイン、ノイズ抑制、エコーキャンセルを一時的に無効にします。
3. スコアを測ってからしきい値を変える
0.5は開始値であり万能ではありません。20回以上の正解発話と数分の通常会話を測定してください。しきい値を下げると見逃しは減りますが、誤検出は増えます。
| 現象 | 確認項目 |
|---|---|
| 常にゼロ付近 | パス、音声型、サンプルレート、特徴処理 |
| 正解語がしきい値直下 | 負例で低いしきい値を評価 |
| WAVは動くがマイクは動かない | 入力、リサンプリング、バッファ |
| 一人だけ認識 | 話者と発音の多様性 |
| 遠距離・騒音で失敗 | 実環境の雑音、部屋、距離 |
4. VADやクールダウンを分離
VADゲート、デバウンス、クールダウン、連続陽性フレーム条件が有効なスコアを止めることがあります。診断時に無効化し、モデルスコア、VAD、しきい値判定、状態を記録しながら一つずつ戻します。
5. 学習データを改善
- 複数のTTS話者、速度、ピッチ、音量を使用する。
- 実環境に近い雑音、残響、距離を追加する。
- 似た発音を難しい負例として使う。
- 特定のアクセントを逃す場合、正しく切り出した実音声を追加する。
- 独立データでRecallと誤検出を同時に評価する。
Voicuteがばらつきを減らす方法
Voicuteは対象語用の小型モデルを学習し、合成音声に音響変化を加え、選択した実音声を組み合わせるVoice Enhanced方式も提供します。きれいな合成音と実マイクの差を小さくすることが目的です。出力されたONNX/TFLiteモデルも、最終端末での検証としきい値調整が必要です。
判断:音声形式やしきい値が原因ならopenWakeWordを継続できます。合成、拡張、評価環境の保守が難しい場合は、生成済みのポータブルモデルも選択肢です。
オフラインモデルを作成