Module-LLM 単体で日本語音声対話を完結させる
初出: 2026-05-25 — Issue #50 続編 / whisper-japanese-not-supported の決着
結論
Module-LLM 購入直後の状態では 日本語 ASR / 日本語 LLM / 日本語 TTS いずれも動かない。 しかし M5Stack 公式 apt repo (repo.llm.m5stack.com) + コミュニティ製 deb (TinySwallow) を オフライン install することで、Module-LLM 単体オンデバイスで日本語対話が完結する。
| レイヤ | 出荷時 | install 後 |
|---|---|---|
| ASR (音声→文) | ❌ 英語(sherpa-onnx 20M) と中国語のみ | ✅ Whisper-tiny multilingual (日本語含む) |
| KWS (wake) | ✅ 英語のみ "HELLO" | ✅ そのまま |
| VAD | ⚠️ daemon 1.3 (古い) | ✅ daemon 1.8 + silero-vad 0.4 |
| LLM | ⚠️ qwen2.5-0.5B 日本語精度低 | ✅ tinyswallow-1.5b-ax630c |
| TTS | ❌ MeloTTS daemon 1.3 で ja-jp 0.5 を読めず zh-cn fallback | ✅ daemon 1.8 + ja-jp 0.6 で正しく日本語発話 |
なぜ出荷時は動かなかったか
- M5Stack apt repo (
StackFlow.list) が/etc/apt/sources.list.d/に追加されていない - 旧 daemon (1.3 系) は新モデルパッケージのフォーマットを認識できない (ja-jp 0.5 で実験済)
- Module-LLM body の eth0 は
NO-CARRIERでネットに繋がらないので、Module-LLM 単体でapt installができない
解決方法 — オフライン install ルート
Module-LLM 本体は インターネットに直接出れない ため、Mac 側で deb を取得して ADB 経由で push & dpkg する必要がある。
前提
- Module-LLM body 横の USB-C に USB OTG ケーブルで Mac に接続 (Module-LLM ADB アクセス)
- CoreS3 を一旦外して Module-LLM 単体にする (USB-C の物理アクセスのため)
adb devicesにax620e-adbが見えている
実行
# 基底セット (Whisper + KWS + VAD + MeloTTS ja-jp + daemon 1.8 系統一)
bash mac-studio/scripts/module-llm-install-japanese.sh
# TinySwallow-1.5B 日本語 LLM (2GB)
bash mac-studio/scripts/module-llm-install-tinyswallow.shinstall 内訳
daemon 系 (基底ライブラリ + サービス)
lib-llm 1.8 を上げると依存している各 daemon も 1.6+ に揃える必要がある:
| パッケージ | 出荷時 | install 後 |
|---|---|---|
lib-llm | 1.6 | 1.8 |
llm-sys | 1.3 | 1.6 (最新) |
llm-asr | 1.3 | 1.7 |
llm-kws | 1.3 | 1.8 |
llm-vad | 無し | 1.8 (新規) |
llm-llm | 1.3 | 1.8 |
llm-melotts | 1.3 | 1.8 |
llm-whisper | 無し | 1.8 (新規) |
モデル系
| パッケージ | バージョン | 用途 |
|---|---|---|
llm-model-whisper-tiny | 0.4 | 日本語含む multilingual ASR |
llm-model-silero-vad | 0.4 | VAD モデル |
llm-model-sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-01 | 0.3 | 英語 KWS ("HELLO") |
llm-model-melotts-ja-jp | 0.6 | 日本語 TTS |
llm-model-tinyswallow-1.5b-ax630c (kinneko github) | 1.0.0 | 日本語 LLM (2GB) |
旧パッケージの衝突
旧 KWS モデルは llm-sherpa-onnx-kws-zipformer-gigaspeech-3.3m-2024-01-01 という別名で install されているため、新版 llm-model-sherpa-onnx-kws-zipformer-... と conflict する。 スクリプトでは旧名を apt-get remove --purge してから新版を入れる手順が組み込まれている。
firmware 側の変更
firmware/src/main.cpp:
// ASR を日本語に戻す
static const char* kWhisperLang = "ja"; // en → ja
// LLM を TinySwallow に変更 (日本語精度大幅向上)
llm_config.model = "tinyswallow-1.5b-ax630c";module_llm.whisper.setup() は内部で llm-whisper daemon に setup を投げる。 daemon 1.8 + whisper-tiny 0.4 が入っていれば language="ja" が認識される。
期待される動作
[main] kws_work_id=kws.NNNN OK
[main] vad_work_id=vad.NNNN OK
[main] whisper_work_id=whisper.NNNN OK (lang=ja)
[main] llm_work_id=llm.NNNN OK (model=tinyswallow-1.5b-ax630c)
[main] melotts_work_id=melotts.NNNN OK (model=melotts-ja-jp)
[main] voice pipeline ready, wake=HELLO
[ユーザー: "HELLO" と発話]
[wake] keyword detected
[vad] speech_start
[vad] speech_end
[asr] こんにちは スタックちゃん
[llm] -> こんにちは スタックちゃん
[llm] <- やあ、ぼくは Donack!今日も会えて嬉しいよ。
[tts] 日本語で発話 (Module-LLM 内蔵 MeloTTS ja-jp)→ Mac Studio を経由せずに数秒で応答が返る (10 秒の往復が解消)。
トラブルシュート
| 症状 | 原因 / 対処 |
|---|---|
install 中に dpkg: conflicts with | 旧 llm-sherpa-* パッケージが残存 → apt-get remove --purge してから再 install |
whisper_work_id=whisper (.NNNN 無し) | daemon と モデルパッケージのバージョン不一致 → 全部 1.8 系で揃える |
melotts_work_id=melotts で fallback | ja-jp 0.5 + daemon 1.3 の組み合わせは動かない → 0.6 + daemon 1.8 へ更新 |
[asr] が中国語っぽいローマ字を返す | whisper のデフォルト言語が zh のまま → firmware の kWhisperLang = "ja" を確認 |
| TinySwallow 起動失敗 | モデル名 tinyswallow-1.5b-ax630c が正しいか、daemon 1.8 で setup できるか確認 |