Unitree G1 の内蔵 Jetson (Orin NX 16GB) だけで動く、日本語の音声会話アプリです。 クラウド通信なし(全モデルがローカル動作)・モーション非連動(安全のため運動系APIは一切呼ばない)。
リモコンの START ボタンを2回押す → ピッ → 話しかける → 本体スピーカーで返答。 「いま何が見える?」のような質問には、頭部カメラ(RealSense)の画像をVLMに渡して答えます。
リモコンSTART二度押し (DDS rt/wirelesscontroller)
↓
本体マイク (UDPマルチキャスト 239.168.123.161:5555, 16kHz PCM)
↓ エネルギーVADで発話切り出し
whisper.cpp whisper-server (GPU/CUDA, ggml-small) … 音声認識 ≈0.4秒
↓
llama.cpp llama-server (GPU/CUDA, Qwen2.5-VL-3B-Instruct Q4_K_M + mmproj)
… 応答生成(ストリーミング)。視覚系の質問はカメラ画像を添付
↓ 文が完成するたび逐次
Open JTalk + Meiボイス … 音声合成 (48kHz→16kHz変換)
↓
本体スピーカー (unitree_sdk2 AudioClient.PlayStream, g1_play経由)
kaiwa.py— 本体 (Python 3.8 標準ライブラリのみ)g1_play.cpp— I/Oヘルパー (スピーカー再生 / 音量 / STARTボタン検知 / カメラSNAP)。 unitree_sdk2 のexample/g1/audio/に置いてビルドするpersona.txt— ロボットの自己認識 (名前・出自など)。編集してsystemctl --user restart kaiwaで反映start.sh— 手動起動用systemd/— 自動起動用ユーザーユニット3つ (loginctl enable-lingerと併用)
- モデル取得 (
~/kaiwa/models/):ggml-small.bin(whisper.cpp)Qwen2.5-VL-3B-Instruct-Q4_K_M.gguf+mmproj-Qwen2.5-VL-3B-Instruct-f16.gguf
- ビルド:
- whisper.cpp:
cmake -B build_cuda -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=87 && cmake --build build_cuda --target whisper-server - llama.cpp: 同様 +
-DGGML_CUDA_FA=OFF(CUDA 11.4 では FlashAttention がリンクエラーになるため) - g1_play: unitree_sdk2 の example/g1/audio/ に
g1_play.cppを置き、CMakeLists に登録してビルド
- whisper.cpp:
- TTS:
open-jtalk+open-jtalk-mecab-naist-jdic+ MMDAgent の Mei ボイス systemd/*.serviceを~/.config/systemd/user/に置き、systemctl --user enable --now kaiwa-llm kaiwa-asr kaiwaとsudo loginctl enable-linger <user>
- Jetson の USB オーディオ (AB13X) は物理未配線。音声I/Oは必ず本体オーディオハブ経由で行う
- CUDA 11.4 + llama.cpp は
-DGGML_CUDA_FA=OFF必須。その代償として ビジョン処理前に画像を640pxに縮小しないとOOMで落ちる (kaiwa.pyのsnap()が対応済み) - whisper は発話長に関係なく30秒窓を処理するため、CPU では実用にならない。GPU + サーバー常駐が前提
- TTS (Open JTalk) はアルファベットを読めないので、ペルソナで「英単語を使わず答える」よう指示している
| 処理 | 時間 |
|---|---|
| 音声認識 (whisper-server GPU) | 約0.4秒 |
| テキスト応答 (最初の文まで) | 2〜3秒 |
| 画像つき応答 | 約6秒 |