宇树机器人G1二次开发:语音对话完整功能实现(打断、停止、待命、激活、有线/无线话筒)
1. 引言
宇树机器人G1是一款功能强大的通用人形机器人,其开放的SDK为开发者提供了广阔的二次开发空间。语音交互是机器人实现自然、高效人机交互的核心能力。本文将详细介绍如何在宇树G1机器人上实现一套完整的语音对话系统,涵盖语音对话、打断对话、停止对话、进入待命、激活对话等核心功能,并提供有线话筒与无线话筒两种方案的完整代码实现。
通过本文,你将能够为你的G1机器人赋予“耳朵”和“嘴巴”,使其能够听懂指令、进行多轮对话,并灵活响应用户的交互意图。
2. 环境准备与依赖安装
2.1 硬件准备
- 宇树机器人G1:确保机器人系统已启动,网络连接正常。
- 音频输入设备:
- 有线话筒方案:USB接口的麦克风,直接插入机器人主控计算机的USB口。
- 无线话筒方案:支持蓝牙或2.4G无线连接的麦克风,需确保与机器人主控计算机配对成功。
- 音频输出设备:机器人内置扬声器或外接音箱。
2.2 软件环境
- 操作系统:Ubuntu 20.04/22.04 (推荐,与官方SDK兼容性最佳)
- Python版本:Python 3.8+
- 宇树G1 SDK:确保已安装并配置好
unitree_sdk2。
2.3 Python依赖包安装
在机器人主控计算机上执行以下命令安装必要的Python库:
pipinstallpyaudio wave numpy sounddevice soundfile pipinstallopenai-whisper# 可选,用于本地语音识别pipinstallspeechrecognition pipinstallpydub pipinstallpyttsx3# 如果使用在线ASR服务(如百度、阿里云、Azure等),还需安装对应SDK# pip install baidu-aip3. 核心功能模块设计
整个语音对话系统可分为以下几个核心模块:
渲染错误:Mermaid 渲染失败: Lexical error on line 9. Unrecognized text. ...] subgraph “用户交互” H[用户说 ---------------------^
4. 完整代码实现
4.1 主程序框架:voice_controller.py
#!/usr/bin/env python3# -*- coding: utf-8 -*-""" 宇树G1机器人语音对话控制器 功能:语音对话、打断、停止、待命、激活、支持有线/无线话筒 作者:CSDN博主 """importthreadingimporttimeimportqueueimportjsonfromenumimportEnumimportlogging# 配置日志logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')logger=logging.getLogger(__name__)classRobotState(Enum):"""机器人对话状态枚举"""STANDBY="standby"# 待命状态,等待唤醒LISTENING="listening"# 聆听状态,正在接收语音PROCESSING="processing"# 处理中,ASR或NLUSPEAKING="speaking"# 播报状态,TTS输出中STOPPED="stopped"# 强制停止状态classVoiceController:"""语音对话主控制器"""def__init__(self,mic_type='wired'):""" 初始化语音控制器 :param mic_type: 话筒类型,'wired' 或 'wireless' """self.state=RobotState.STANDBY self.mic_type=mic_type self.audio_queue=queue.Queue(maxsize=10)self.stop_event=threading.Event()self.interrupt_event=threading.Event()# 初始化各模块self.audio_input=self._init_audio_input(mic_type)self.vad_detector=VADetector()self.asr_engine=ASREngine()self.tts_engine=TTSEngine()self.dialog_manager=DialogManager()# 唤醒词和打断词self.wake_words=["小宇","机器人","嗨G1"]self.interrupt_words=["停","停止","闭嘴","打断"]self.standby_words=["待命","休息","退下"]logger.info(f"语音控制器初始化完成,话筒类型:{mic_type}")def_init_audio_input(self,mic_type):"""初始化音频输入设备"""ifmic_type=='wired':returnWiredMicrophone()elifmic_type=='wireless':returnWirelessMicrophone()else:raiseValueError(f"不支持的话筒类型:{mic_type}")defstart(self):"""启动语音对话系统"""logger.info("启动语音对话系统...")self.stop_event.clear()self.interrupt_event.clear()# 启动音频采集线程audio_thread=threading.Thread(target=self._audio_capture_loop,daemon=True)audio_thread.start()# 启动主处理线程main_thread=threading.Thread(target=self._main_loop,daemon=True)main_thread.start()logger.info("语音对话系统已启动,等待唤醒...")returnaudio_thread,main_threaddefstop(self):"""停止整个语音系统"""logger.info(