从 Windows 调试到 Orin 真机:宇树 G1 导览机器人语音交互开发全记录
从 Windows 调试到 Orin 真机宇树 G1 导览机器人语音交互开发全记录摘要本文记录一套面向展厅导览场景的 G1 语音交互系统从 0 到真机落地的过程。系统不是简单「聊天机器人」而是ASR → 意图理解 → 导览任务 → TTS的完整闭环且遵循「大模型只理解、不直控底层」的安全原则。真机部署在Jetson Orin NX上ASR/TTS 走宇树内置离线链路对话与复杂意图走通义千问 Qwen Omni API。历经 Windows 模拟调试、云端语音方案验证、真机联调、唤醒词优化、回声抑制、网络/DNS 踩坑等阶段最终形成可长期维护的g1_guide_robot/voice/模块。一、项目背景与目标1.1 要做什么中文语音对话科技、展品、公司、场馆问答语音发起导览「带我去实验室讲讲」到点自动讲解TTS 播报locations.yaml里的讲解词安全指令最高优先级停止 / 取消 / 急停1.2 不是什么不是让大模型直接调 SDK 走路不是纯云端 ASR/TTS demo真机最终走宇树本机语音不是一次性脚本而是可配置、可切换后端的生产架构二、整体架构语音链路用户说话 ↓ [ASR 语音识别] ├─ 开发期ConsoleASR / DashScopeASR / 麦克风 └─ 真机UnitreeASRDDS rt/audio_msg g1_asr_bridge ↓ [HybridIntentParser 混合意图] ├─ 规则优先停止、取消、楼层确认、导览点位匹配 └─ Qwen Omni 兜底复杂说法、开放问答 ↓ [GuideTaskManager 导览任务] chat / guide_to / explain / tour / navigate ... ↓ [TTS 语音播报] ├─ 开发期ConsoleTTS / DashScope CosyVoice └─ 真机UnitreeCliTTSg1_tts_cli / g1_tts_worker核心代码目录g1_guide_robot/voice/ loop.py # 语音主循环、唤醒词、TTS 静音窗口 asr.py # 多后端 ASRConsole / DashScope / Unitree tts.py # 多后端 TTSConsole / DashScope / Unitree CLI recorder.py # 麦克风录音、宇树组播录音 streaming_tts.py # 流式播报云端方案 audio_devices.py # 音频设备枚举 audio_player.py # 本地播放 status.py # 终端状态行三、开发历程按阶段阶段 0方案设计与模拟闭环Week 1目标不接硬件先把业务跑通。默认robot_backend: simulator、navigator_backend: simulatorASR/TTS 用ConsoleASR/ConsoleTTS键盘输入、打印输出完成loop.py主循环、hybrid_intent.py规则LLM、task_manager.py任务状态机收获先验证「意图 → 任务 → 回复」逻辑再碰硬件避免联调时分不清是语音问题还是导航问题。阶段 1Windows 本地 云端语音验证Week 2目标在开发机上体验真实听感和对话质量。模块方案作用ASRDashScope 实时识别验证识别率、延迟TTSCosyVoice / TTSMaker验证音色、长句稳定性LLMQwen Omni Plus聊天 复杂意图关键设计HybridIntentParser安全类意图stop/cancel_task/floor_confirmed永远本地规则优先不交给 LLM已能规则解析的导览意图guide_to_location等跳过额外 LLM 调用降低延迟和成本只有规则搞不定的句子才走 Qwen这一步证明语音体验可以云端但导览控制不能交给模型直出。阶段 2对接宇树 G1 真机语音Week 3–4转折点G1 教育版自带离线 ASR 和机载 TTS云端语音在真机上不是最优解。2.1 ASRUnitreeASR订阅 DDS 话题rt/audio_msg通过g1_asr_bridge二进制桥接接收识别文本网卡绑定eth0192.168.123.x 宇树内网# asr.py 核心思路classUnitreeASR(SpeechToText):G1 onboard offline ASR from DDS topic rt/audio_msg.2.2 TTSUnitreeCliTTS调用unitree_sdk2-main/build/bin/g1_tts_cli长句用常驻g1_tts_worker避免每句冷启动需配置LD_LIBRARY_PATH指向 aarch64 库2.3 部署 ProfileG1_DEPLOY_PROFILEg1# deploy/profiles.yamlg1:runtime:robot_backend:unitreenavigator_backend:single_floorvoice:tts_backend:unitree_cliasr_backend:unitreestream_reply:falserobot:network_interface:eth0真机启动exportG1_DEPLOY_PROFILEg1exportG1_NETWORK_INTERFACEeth0cd~/voice-guide-g1bash~/fix_robot_network.sh# 校时 DNS否则 API/HTTPS 全挂python app.py--modevoice# 或 onboardWeb 语音同机python app.py--modeonboard--host0.0.0.0--port8000阶段 3唤醒词与误识别优化持续迭代G1 内置 ASR 对方言/噪声敏感「小达小达」常被识别成「小德小德」「小丹小丹」等。解法在loop.py做模糊唤醒匹配而不是死板字符串相等_WAKE_CHARr[达德丹答晓查康兰打大塔他她它]_FUZZY_WAKE_PATTERNS(re.compile(小_WAKE_SEPARATOR_WAKE_CHAR...),...)同时支持双唤醒词小达小达单唤醒词小达带我去大厅唤醒后 N 秒内免重复唤醒wake_followup_seconds经验真机语音产品 30% 工作量在唤醒与误触发不在 LLM。阶段 4回声抑制与「自己听自己」关键坑现象TTS 播报时麦克风/ASR 把机器人自己说的话又识别一遍造成死循环或误触发。解法_tts_playback_session— 播报期间 ASR 静音contextmanagerdef_tts_playback_session(asr,tts):asr.begin_tts_mute()# 播报期间不送识别tts.begin_playback_session()try:yieldfinally:tts.end_playback_session()asr.end_tts_mute()并加post_tts_guard_seconds播报结束后几秒内降低误触发。注意不要频繁重启 ASR bridge会触发 SetMode 提示音静音比重启优雅。阶段 5Orin 真机环境与工程化Week 55.1 网络坑必踩问题现象解决系统时间 1970HTTPS/DNS 全失败启动脚本校时网关不是 DNSgitee.com解析失败固定 223.5.5.5 / 114.114.114.114WiFi SSH 慢git push 像卡死大 buffer 后台任务 日志5.2 代码托管机器人~/g1_voice_chat→ 推送 Giteevoice-guide-g1Windows 开发代码合并进master新建develop研发分支约定语音模块以真机为准Windows 与 Orin 哈希对比 19 个 voice/agent 文件一致5.3 运行模式模式用途console纯文本调试意图voice真机语音导览web控制台 地图onboardOrin 同机Web 语音推荐四、技术选型总结层级真机最终方案原因ASR宇树内置离线低延迟、不依赖外网、与机载麦匹配TTSg1_tts_cli / worker原生喇叭、稳定LLMQwen Omni API开放问答、复杂意图本地 Orin 不必跑大模型意图规则 LLM 混合安全、省 token、导览指令可预期录音宇树组播 / 本机麦真机走 DDS开发机走 PortAudio曾评估但未采用为主路径外置 Jetson Nano 专职语音 Orin 专职导航可行但 ASR/TTS 绑定 G1 网段全放 Orin 更简单全云端 DashScope 语音开发好用真机延迟和离线差五、踩坑清单给后来人ASR 识别到 TTS 内容→ 播报期 mute别重启 bridge唤醒词太死板→ fuzzy regex 单/双唤醒模式Orin 时间不对→ 所有 API 失败先date再调试eth0 / wlan0 混用→ 宇树 SDK 走 eth0SSH 走 WiFi别搞错网卡Windows 无 git→ 用脚本 dulwich 推 Gitee真机以 SSH 为准长 TTS 阻塞对话→ worker 常驻 分句 stream_tts_sentences_onlyLLM 直接控机器人→ 禁止必须经GuideTaskManager白名单六、当前能力与指标真机唤醒词「小达小达」「小达」支持聊天、知识问答、导览、到点讲解、停止/取消语音文件g1_guide_robot/voice/共 9 个模块与 Windows 开发机字节级一致部署路径~/voice-guide-g1develop分支启动G1_DEPLOY_PROFILEg1app.py --mode voice|onboard七、后续规划语音侧Nano 拆分方案若 Nav2 吃满 Orin 算力Nano 跑 voice loopOrin 提供 HTTP 任务 API流式 TTS 流式 LLM 更低首字延迟真机 profile 目前stream_reply: false多语言 / 多方言唤醒词库语音状态 Web 可视化与/map控制台联动导航侧另文不在本篇展开。八、附录最小真机语音启动命令# 1. 网络bash~/fix_robot_network.sh# 2. 环境exportG1_DEPLOY_PROFILEg1exportG1_NETWORK_INTERFACEeth0exportDASHSCOPE_API_KEY你的密钥# 3. 启动cd~/voice-guide-g1 python app.py--modevoice控制台应出现● 监听中 G1 内置离线 ASR说「小达小达你好」或「小达带我去实验室」进行验证。九、结语G1 导览机器人的语音模块本质上是「可靠听 可靠懂 可靠说 安全控」四件事。大模型很强但展厅机器人真正难的是唤醒、回声、真机网络、与宇树 SDK 磨合。我们走过的路径是先模拟、再云端验证体验、最后真机切宇树原生 ASR/TTS并用规则层守住安全底线。如果你也在做 G1 或类似人形导览希望这篇历程能少踩几个我们踩过的坑。仓库Giteeli-kui-who-loves-learning/voice-guide-g1硬件宇树 G1-EDU Jetson Orin NX Developer Kit联系 / 交流欢迎在评论区讨论唤醒词、ASR _bridge 或 Orin 部署细节。