Skip to content

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 devicesax620e-adb が見えている

実行

bash
# 基底セット (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.sh

install 内訳

daemon 系 (基底ライブラリ + サービス)

lib-llm 1.8 を上げると依存している各 daemon も 1.6+ に揃える必要がある:

パッケージ出荷時install 後
lib-llm1.61.8
llm-sys1.31.6 (最新)
llm-asr1.31.7
llm-kws1.31.8
llm-vad無し1.8 (新規)
llm-llm1.31.8
llm-melotts1.31.8
llm-whisper無し1.8 (新規)

モデル系

パッケージバージョン用途
llm-model-whisper-tiny0.4日本語含む multilingual ASR
llm-model-silero-vad0.4VAD モデル
llm-model-sherpa-onnx-kws-zipformer-gigaspeech-3.3M-2024-01-010.3英語 KWS ("HELLO")
llm-model-melotts-ja-jp0.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:

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 withllm-sherpa-* パッケージが残存 → apt-get remove --purge してから再 install
whisper_work_id=whisper (.NNNN 無し)daemon と モデルパッケージのバージョン不一致 → 全部 1.8 系で揃える
melotts_work_id=melotts で fallbackja-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 できるか確認

関連

aieo-product / stack-chan project