Skip to main content

3. AI大模型语音交互

3. AI大模型语音交互1. 概念介绍1.1 “AI大模型语音交互”是什么?1.2 实现原理简述2. 代码解析关键代码1. 语音输入节点 (largemodel/largemodel/asr.py)2. AI服务与语音输出节点 (largemodel/largemodel/model_service.py)代码解析3. 实践操作3.1 配置离线语音交互3.2 启动并测试功能

1. 概念介绍

1.1 “AI大模型语音交互”是什么?

largemodel项目中,AI大模型语音交互 是将前面介绍的离线ASR离线TTS大语言模型(LLM) 核心连接起来,形成一个完整的、能听、会说、会思考的对话系统。

这不再是孤立的功能,而是一个真正的语音助手 的雏形。用户可以通过语音与机器人进行自然语言对话,机器人则能理解问题、思考答案,并用语音回答。整个过程都在本地完成,无需网络。

该功能的核心是 model_service ROS2节点。它扮演着大脑和神经中枢的角色,订阅ASR的识别结果,调用LLM进行思考,再将LLM的文本回复发布给TTS节点去合成语音。

1.2 实现原理简述

这个功能的实现原理是一个经典的数据流管道(Pipeline):

  1. 声音 - > 文本 (ASR): asr节点持续监听环境声音,一旦检测到用户说完一句话,就将其转换成文本,并发布到 /asr_text 话题上。
  2. 文本 - > 思考 -> 文本 (LLM): model_service节点订阅了 /asr_text 话题。当它收到ASR发来的文本后,会将其作为提问(Prompt)送给本地部署的大语言模型(如通过Ollama运行的Qwen)。LLM会根据上下文生成一段回答的文本。
  3. 文本 - > 声音 (TTS): model_service节点拿到LLM的回答后,将其发布到 /tts_text 话题上。
  4. 声音播放 : tts_only节点订阅了 /tts_text 话题,收到文本后立即调用离线TTS模型将其合成为音频,并通过扬声器播放出来。

这个流程形成了一个完整的语音输入 - > 文本处理 -> 文本输出 -> 语音输出的闭环。


2. 代码解析

关键代码

1. 语音输入节点 (largemodel/largemodel/asr.py)

​ x # From largemodel/largemodel/asr.py class ASRNode ( Node ): def __init__ ( self ): # ... self . asr_pub = self . create_publisher ( String , "asr" , 5 ) # ... ​ def kws_handler ( self ) -> None : if self . listen_for_speech ( self . mic_index ): asr_text = self . ASR_conversion ( self . user_speechdir ) if asr_text ! = 'error' : self . asr_pub_result ( asr_text ) ​ def asr_pub_result ( self , asr_result : str ) -> None : msg = String ( data = asr_result ) self . asr_pub . publish ( msg )

2. AI服务与语音输出节点 (largemodel/largemodel/model_service.py)

xxxxxxxxxx # From largemodel/largemodel/model_service.py class LargeModelService ( Node ): def __init__ ( self ): # ... self . asrsub = self . create_subscription ( String , 'asr' , self . asr_callback , 1 ) # ... ​ def asr_callback ( self , msg ): """Callback function for handling ASR messages. / 处理ASR消息的回调函数。""" # ... result = self . model_client . infer_with_text ( msg . data , message = messages_to_use ) self . process_model_result ( result ) ​ def process_model_result ( self , result , from_seewhat = False ): """Process the result returned by the model. / 处理模型返回的结果。""" # ... user_friendly_response = response_json . get ( "response" , "我正在处理..." ) # ... self . _safe_play_audio ( user_friendly_response ) # ... self . execute_tools ( tools_list ) ​ def _safe_play_audio ( self , text_to_speak : str ): """ Synthesizes and plays all non-empty messages only in non-text chat mode. """ if not self . text_chat_mode and text_to_speak : try : self . model_client . voice_synthesis ( text_to_speak , self . tts_out_path ) self . play_audio_async ( self . tts_out_path ) except Exception as e : self . get_logger (). error ( f"Safe audio playback failed: {e}" )

代码解析

AI大模型的语音交互功能由asr.pymodel_service.py两个独立的ROS节点协同完成,它们之间通过ROS话题/asr进行通信,形成一个完整的处理回路。

  1. 语音输入与发布 (asr.py):

    • ASRNode节点的功能是处理语音输入。在kws_handler函数中,它完成录音和文本转换。
    • 转换成功后,asr_pub_result函数被调用。此函数将得到的文本字符串放入一个std_msgs.msg.String消息中,然后通过self.asr_pub发布者将该消息发布到/asr话题。
  2. 订阅与响应 (model_service.py):

    • LargeModelService节点在初始化时,通过create_subscription方法订阅了/asr话题,并指定asr_callback作为其回调函数。
    • ASRNode/asr话题上发布消息时,ROS系统会自动调用LargeModelServiceasr_callback函数,并将消息作为参数msg传入。
  3. 交互回路 :

    • asr_callback函数接收到消息后,提取其中的文本数据(msg.data),并将其传递给大模型进行推理(self.model_client.infer_with_text)。
    • 推理完成后,process_model_result函数被调用。该函数从模型结果中提取出用于回复的文本。
    • 接着,_safe_play_audio函数被调用,它使用TTS功能(self.model_client.voice_synthesis)将回复文本合成为音频并播放。
    • 至此,一个从“接收用户语音”到“用语音回应用户”的完整交互回路就完成了。两个节点通过ROS的发布-订阅模式解耦,asr.py负责输入,model_service.py负责处理和输出。

3. 实践操作

3.1 配置离线语音交互

要实现一个完全离线的语音交互系统,你需要确保ASR、TTS和LLM三个部分都配置为离线模式。

  1. 打开主配置文件yahboom.yaml:

xxxxxxxxxx gedit ~/yahboom_ws/src/largemodel/config/yahboom.yaml 2. 修改/确认以下关键配置 :

xxxxxxxxxx asr : ros__parameters : use_oline_asr : False # 关键: 设为False,启用离线ASR regional_setting : "China" ​ model_service : ros__parameters : useolinetts : False # 关键: 设为False,启用离线TTS llm_platform : 'ollama' # 关键: 设为'ollama',启用离线LLM regional_setting : "China" 3. 打开模型接口配置文件large_model_interface.yaml:

xxxxxxxxxx gedit ~/yahboom_ws/src/largemodel/config/large_model_interface.yaml 4. 确认所有离线模型路径正确 :

xxxxxxxxxx # large_model_interface.yaml ​ ## 离线大模型 ollama_model : "qwen2.5:7b" # 确保这个模型已通过ollama pull下载 ​ ## 离线语音识别 local_asr_model : "/path/to/your/SenseVoiceSmall" # 确保ASR模型路径正确 ​ ## 离线语音合成 zh_tts_model : "/path/to/your/zh_CN-huayan-medium.onnx" # 确保TTS模型路径正确 # ...

3.2 启动并测试功能

注:Jetson Orin Nano 4GB 由于性能限制,无法运行此案例。如需体验此功能,请参考 <在线大模型(语音交互)>对应章节

  1. 启动largemodel 主程序: 运行下面的命令,开启语音交互:

xxxxxxxxxx ros2 launch largemodel largemodel_control.launch.py 2. 测试 :

* **唤醒** : 对着麦克风说:“你好,小亚。”

* **对话** : 扬声器回应之后,就可以说出你想提问的话。

* **观察日志** : 在运行`launch`文件的终端中,你应该能看到:

1. ASR节点识别出你的问题并打印出来。
2. `model_service`节点收到文本,调用LLM,并打印出LLM的回复。
* **听回答** : 稍后,你应该能从扬声器听到机器人用合成的语音回答你的问题。