holo-agent 是一个轻量级端侧语音交互助手,提供语音识别、语音合成、LLM理解等功能接口,旨在实现一个听你话,懂你话的机器人。
该项目搭载在ROS2 Humble上,依托DDS通信实现多机器人间的协同工作。
LLM部分,全本地部署可采用MiniPCM等GUFF格式量化模型,可在纯CPU环境中部署,如NUC迷你主机;也可将语言理解推理部分,分发至局域网中的GPU设备,Ollama本地部署LLM,搭载如DeepSeek、Qwen、Llama等LLM。
| 模块 | 技术方案 | 功能描述 |
|---|---|---|
| 音频录制(AUD) | PyAudio双缓冲检测&vad识别模型 | 检测语音开始与结束端点 |
| 语音识别(SST) | Paraformer 流式模型(FUNASR) | 实时转录音频为文本,支持中英文混合 |
| 语言理解(LLM) | Ollama(MiniPCM) | 解析用户指令 |
| 语音合成(TTS) | Sambert-Hifigan | 低延迟语音生成,支持多语种 |
- 视觉VLM识别:搭载VLM模型(Qwen3),进行图像识别
- MCP部署:统一诸多LLM的调用与回复接口格式,简化后续处理
- DIFY RAG: 接入RAG,更好地理解特定背景下的用户意图
- Task 生成:根据用户意图结合RAG,生成机器人运动的任务列表
- ROS2 行为树:基于任务列表执行
- 语音识别模块:FUNASR本地语音识别
- 语音合成模块:Sambert-Hifigan语音合成
- LLM模块:【MiniPCM】01 安装与使用
单独启动语音识别节点
ros2 run audio_input_local audio_input_local调用语音识别功能
ros2 topic pub /llm_state std_msgs/msg/String "data: listening" --once发布话题后,订阅成功后会发出“叮”的声音,开始录音,识别成功后,会发布audio_input_audio_to_text话题
- 本地MiniPCM
cd llama.cpp/
./llama-server -m ./models/minicpm3-4b-q4_k_m.gguf -c 2048 - 局域网启动ollama
ollama server运行llm推理
ros2 run llm_model chatllm- 本地调用MiniPCM服务
# 调用本地MiniPCM3模型
url = "http://localhost:8080/completion"
headers = {
"Content-Type": "application/json"
}
data = {
# "prompt": "Which company released MiniCPM3?",
# "n_predict": 128
# "image": "/home/leo/Pictures/1.png",
"prompt": str(messages_input),
"n_predict": 128
}
response = requests.post(url, json=data, headers=headers)
result = response.json()["content"]
# self.get_logger().info(f"从MiniPCM3得到回复: {response.json()}")
self.get_logger().info(f"\033[32m 从MiniPCM3得到回复: \n{result}\033[0m")
- ollama局域网调用qwen3:latest
import requests
# 调用局域网ollama服务 qwen3:4b模型
url = "http://192.168.100.244:11434/api/generate"
data = {
"model": "qwen3:4b",
"prompt": str(messages_input),
"think": False, # 关键参数:关闭深度思考
"stream": False # 关闭流式响应以获取完整结果
}
response = requests.post(url, json=data)
result = response.json()["response"]
self.get_logger().info(f"\033[32m 从qwen3:4b得到回复: \n{result}\033[0m")llm节点接收llm_input_audio_to_text话题,然后交由llm进行推理,将生成的文本回复发送
ros2 topic pub /llm_input_audio_to_text std_msgs/msg/String "data: 你是谁" --once单独运行语音合成节点
ros2 run audio_output audio_output_local.pyaudio_output节点接收audio_output_content话题,然后进行语音合成播放后,将往/llm_state发布信息,启动语音识别的指令,以此循环执行交互
单独调用语音合成命令
ros2 topic pub /audio_output_content std_msgs/msg/String "data: '今天天气如何'" --once
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。