Module-LLM の Whisper(ja) が silent fail する
初出: 2026-05-25 (解決) — Issue #50
症状
CoreS3 firmware が KWS wake word "HELLO" は検出する ([wake] keyword detected)。 しかし、その後の VAD / Whisper のメッセージが 一切来ない。
[main] kws_work_id=kws.1001 ← OK
[main] vad_work_id=vad ← .NNNN なし
[main] whisper_work_id=whisper ← .NNNN なし
...
[msg] wid=kws.1001 obj=kws.bool
[wake] keyword detected
(以降何も来ない)KWS が kws.1001 のように .NNNN 付きで返るのに対し、Whisper だけが whisper(モジュール名そのまま)。これは setup 失敗時の戻り値 で、エラーを raise せず silent に失敗する。
根本原因
firmware/src/main.cpp で kWhisperLang = "ja" を指定していたが、 Module-LLM (AX630C / Ubuntu 22.04) には日本語 ASR モデルが存在しない。
ADB で確認した結果(Mac → USB OTG ケーブル → Module-LLM body 横の USB-C で接続):
$ adb shell 'apt-cache search sherpa'
llm-sherpa-ncnn-streaming-zipformer-20m-2023-02-17 # 英語 ASR
llm-sherpa-ncnn-streaming-zipformer-zh-14m-2023-02-23 # 中国語 ASR
llm-sherpa-onnx-kws-zipformer-gigaspeech-3.3m # 英語 KWS
llm-sherpa-onnx-kws-zipformer-wenetspeech-3.3m # 中国語 KWS
$ adb shell 'apt-cache search whisper'
(0 件 — Whisper パッケージ自体が存在しない)つまり M5Module-LLM ライブラリの whisper.setup(language="ja") は API 名としては受け付けるが、内部実装の sherpa-onnx ASR が日本語モデル不在で work_id を返せず、"whisper" という生のモジュール名だけ返って黙る。
対処
暫定 (本対応)
firmware/src/main.cpp:
static const char* kWhisperLang = "en"; // ja → en英語 ASR (sherpa-ncnn-streaming-zipformer-20m) で動作させる。 KWS が "HELLO" 検出 → VAD → 英語 ASR → bridge に英語テキストが届く。
検知ロジック
setup 失敗を確実に拾えるよう、isSetupOk() で work_id に . が入っているか判定する:
auto isSetupOk = [](const String& wid, const char* prefix) {
if (wid.length() == 0) return false;
if (wid == prefix) return false; // 生のモジュール名 → 失敗
return wid.indexOf('.') >= 0; // ".1234" 付き → 成功
};これで「setup したつもりで動いていない」事故が即座にログで分かる。
本質的な日本語化(今後)
Module-LLM 側で日本語 ASR を動かす道は無いので、いずれかが必要:
| 方針 | 内容 | 工数 |
|---|---|---|
| A. bridge 側 ASR | Module-LLM の VAD だけ使い、PCM を WSS で bridge に送る → Whisper.cpp / OpenAI Whisper API / Apple Speech で日本語認識 | 中 |
| B. sherpa-onnx 日本語 multilingual モデルを移植 | AX630C 向けに変換し install | 高 |
| C. 押下式に切替 | ボタンで録音 → bridge へ送信。wake word UI を諦める | 低 |
A が現実的。Module-LLM は KWS + VAD + 音声バッファ送信器として使い、ASR は母艦に任せる構成。
学び
- M5Module-LLM の
setup()系はエラーを raise せず silent fail する設計。戻り値の work_id を必ず検証すること - API 名 (
whisper) と内部実装 (sherpa-onnx) は別物。API 名は対応モデル有無を意味しない - 日本語対応は MeloTTS (合成) は ja-jp パッケージあり、ASR (認識) は無い、と非対称
- ADB アクセスは Module-LLM body 横の USB-C が必須(Mate の USB-C は CH340 シリアル変換で ADB は出ない)
関連
- 04. Module-LLM ADB アクセス
- 05. VOICEVOX セットアップ — 出力側の日本語対応
- MeloTTS が中国語で発話 — 似たパターンの silent fail