Skip to content

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.cppkWhisperLang = "ja" を指定していたが、 Module-LLM (AX630C / Ubuntu 22.04) には日本語 ASR モデルが存在しない

ADB で確認した結果(Mac → USB OTG ケーブル → Module-LLM body 横の USB-C で接続):

bash
$ 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:

cpp
static const char* kWhisperLang = "en";   // ja → en

英語 ASR (sherpa-ncnn-streaming-zipformer-20m) で動作させる。 KWS が "HELLO" 検出 → VAD → 英語 ASR → bridge に英語テキストが届く。

検知ロジック

setup 失敗を確実に拾えるよう、isSetupOk() で work_id に . が入っているか判定する:

cpp
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 側 ASRModule-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 は出ない)

関連

aieo-product / stack-chan project