跳转至

语音交互

适用配置

AI Perception Pack · 语音交互功能模块

VOICE INTERACTION PACK

麦克风、扬声器与语音链路

参考配置使用 USB 语音模块与 RDK S100/S100P,完成语音采集、语音播报和语音控制。设备名称、声卡号与播放通道以当前系统枚举结果为准。

  • 音频输入:麦克风采集语音
  • 音频输出:扬声器播报合成语音
  • 典型用途:ASR、TTS、在线对话、语音动作控制
模块外设图示

建议先完成录音与放音检查,再启动语音识别、语音播报和对话组合流程。

语音模块简介

机器人头部装配有集成麦克风和扬声器的USB免驱语音模块,支持回声消除和降噪。单麦克风,采样率48K 16bits。

语音识别

语音功能运行环境基于 Ubuntu 22.04 和 ROS 2 Humble。

=================================
请选择要进入的工作空间和虚拟环境:
=================================
1) Driver (~/driver)
2) RDK AI (~/rdk_ai)
3) TROS (~/tros)
4) 不进入任何虚拟环境 (保持默认)
=================================
请输入数字[1-4] (直接按 Enter 保持默认):1
语音识别功能由 asr_node 节点实现。将录制的音频文件发送至语音识别接口进行识别。

SSH连接算力大脑成功后,开启终端输入如下命令:

ros2 run voice_chat asr_node
终端显示:
[INFO][1782444819.440623631][asr_node]: ASR节点已启动,开始录音和识别...
[INFO][1782444819.441665175][asr_node]: 收到监听状态,开始聆听中...
[INFO][1782444819.441999472][asr_node]: 开始录音和识别...
[INFO][1782444829.470446185][asr_node]: 录制音频: /home/gem/driver/bipedal_robot_proj/src/driver/voice_ws/cache/wav_rec/test.wav
[INFO][1782444829.478409699][asr_node]: 采样率: 16000, 时长:10.0 秒
[INFO][1782444830.146334283][asr_node]: 识别到用户语音: '今天星期几?'
[INFO][1782444830.146724313][asr_node]: 已发布文本到/text_input: '今天星期几?'

语音合成

语音合成功能由 text_to_speech_node节点实现。该功能主要用于把大模型生成的文字回复转换为语音,实现机器人语音回答。

SSH连接算力大脑成功后,开启终端一输入如下命令:

ros2 run voice_chat text_to_speech_node
开启终端二输入如下命令:
ros2 topic pub --once /tts_input std_msgs/msg/String "data:'请告诉我今天的天气。'"
终端一显示:
[INFO][1782445060.235823923][text_to_speech_node]: 文本转语音节点已启动,等待输入/tts_input话题数据...
[INFO][1782445062.657565813][text_to_speech_node]: 接收到文本: '请告诉我今天的天气。'
[INFO][1782445062.657785328][text_to_speech_node]: 开始播报语音...
[INFO][1782445062.658113423][text_to_speech_node]: 文本分割为 1个句子
[INFO][1782445062.658914832][text_to_speech_node]: 开始合成文本: '请告诉我今天的天气。'
[INFO][1782445063.489652497][text_to_speech_node]: 播放第 1段音频
[INFO][1782445065.656606724][text_to_speech_node]: 所有音频段播放完成

大模型交互

大模型交互功能由 llm_chat_node 节点实现。该节点订阅 /text_input 话题,接收语音识别结果或手动发送的文本内容,调用大模型接口生成回答。将其发布到 /tts_input 话题,由语音合成节点进行播报。

SSH连接算力大脑成功后,开启终端一输入如下命令:

ros2 run voice_chat llm_chat_node
开启终端二输入如下测试命令:
ros2 topic pub --once /text_input std_msgs/msg/String "data: '你是谁'"
终端一显示:
[INFO][1782445276.616859368][openai_interaction_node]: OpenAI交互节点已启动,等待输入/text_input话题数据...
[INFO][1782445339.040860508][openai_interaction_node]: 接收到文本: '你是谁'
INFO - HTTP Request: POST https://api.deepseek.com/chat/completions"HTTP/1.1 200 OK"
INFO - AI 响应: 我是Kudada,你的双足人形机器人伙伴。
[INFO][1782445340.885935827][openai_interaction_node]: 已发送TTS 消息: '我是Kudada,你的双足人形机器人伙伴。'

在线智能对话

语音交互是语音识别、大模型交互和语音合成的完整组合流程。用户说话后,系统先通过 asr_node 节点将语音转换为文本,再由 llm_chat_node 节点根据文本生成回复,最后由 text_to_speech_node 节点将回复内容合成为语音并播放。整体流程为:语音输入 → 文本识别 → 大模型回复 → 语音播报。

SSH连接算力大脑成功后,开启终端输入如下命令:

ros2 launch voice_chat voice_chat.launch.py
终端显示:
[asr_node-3][INFO][1782445573.255611652][asr_node]: 录制音频: /home/gem/driver/bipedal_robot_proj/src/driver/voice_ws/cache/wav_rec/test.wav
[asr_node-3][INFO][1782445573.264049575][asr_node]: 采样率: 16000, 时长: 10.0 秒
[asr_node-3][INFO][1782445574.153397720][asr_node]: 识别到用户语音: '今天天气如何?'
[asr_node-3][INFO][1782445574.153939188][asr_node]: 已发布文本到 /text_input: '今天天气如何?'
[llm_chat_node-2][INFO][1782445574.155149399][llm_chat_node]: 接收到文本: '今天天气如何?'
[esp32_face_node-4][INFO][1782445574.155169095][esp32_face_node]: 收到文本: 今天天气如何?
[esp32_face_node-4][INFO][1782445574.155478977][esp32_face_node]: 未匹配到表情命令
[llm_chat_node-2] 2026-06-26 11:46:14,553 - INFO - HTTP Request: POST https://api.deepseek.com/chat/completions "HTTP/1.1 200 OK"
[asr_node-3][INFO][1782445575.155887649][asr_node]: 开始录音和识别...
[asr_node-3][INFO][1782445575.156676312][asr_node]: 收到监听状态,开始聆听中...
[llm_chat_node-2] 2026-06-26 11:46:17,068 - INFO - AI 响应: 今天天气是晴天,建议外出游玩哦。
[llm_chat_node-2][INFO][1782445577.068976186][llm_chat_node]: 已发送 TTS 消息: '今天天气是晴天,建议外出游玩哦。'
[text_to_speech_node-1][INFO][1782445577.069914306][text_to_speech_node]: 接收到文本: '今天天气是晴天,建议外出游玩哦。'
[text_to_speech_node-1][INFO][1782445577.070279719][text_to_speech_node]: 开始播报语音...
[asr_node-3][INFO][1782445577.070598747][asr_node]: 收到播报状态,正在说话,暂停录音...

综合控制/语音控制表情

语音控制表情由 esp32_face_node 和 esp32_face_sender.py 实现。启动完整语音对话功能后,系统会监听/text_input 话题,当识别文本中包含“开心”“生气”“睡觉”“惊讶”等表情关键词时,节点会匹配对应的 eye 命令,并通过固定串口路径发送给 ESP32。ESP32 接收到命令后,控制眼睛屏幕切换到对应表情。该功能与大模型语音回复并行工作,用户说出带表情词的语句时,可以同时触发表情切换和语音回答。

SSH连接算力大脑成功后,开启终端输入如下命令:

ros2 launch voice_chat voice_chat.launch.py
终端显示:
[asr_node-3][INFO][1782445771.928684548][asr_node]: ASR节点已启动,开始录音和识别...
[asr_node-3][INFO][1782445771.929767995][asr_node]: 收到监听状态,开始聆听中...
[asr_node-3][INFO][1782445771.930164756][asr_node]: 开始录音和识别...
[esp32_face_node-4][INFO][1782445773.259408726][esp32_face_node]: ESP32 串口已打开:/dev/serial/by-id/usb-Espressif_USB_JTAG_serial_debug_unit_1C:DB:D4:49:9E:0C-if00,baud=115200
[esp32_face_node-4][INFO][1782445773.261005710][esp32_face_node]: ESP32表情节点已启动,监听话题: /text_input
[asr_node-3][INFO][1782445781.953345579][asr_node]: 录制音频: /home/gem/voice_ws/cache/wav_rec/test.wav
[asr_node-3][INFO][1782445781.961229500][asr_node]: 采样率: 16000, 时长: 10.0 秒
[asr_node-3][INFO][1782445782.758607558][asr_node]: 识别到用户语音: '你开心吗?'
[asr_node-3][INFO][1782445782.759265601][asr_node]: 已发布文本到 /text_input: '你开心吗?'
[llm_chat_node-2][INFO][1782445782.759863593][llm_chat_node]:接收到文本: '你开心吗?'
[esp32_face_node-4][INFO][1782445782.760161592][esp32_face_node]: 收到文本: 你开心吗?
[esp32_face_node-4][INFO][1782445782.962687727][esp32_face_node]: 已发送 eye2, ESP32 回复:eye2
[esp32_face_node-4][esp32_face_node-4][ESP32] Eye command OK: eye2
[llm_chat_node-2] 2026-06-26 11:49:43,034 - INFO - HTTP Request: POST https://api.deepseek.com/chat/completions "HTTP/1.1 200 OK"
[asr_node-3][INFO][1782445783.761483227][asr_node]: 收到监听状态,开始聆听中...
[asr_node-3][INFO][1782445783.761996013][asr_node]: 开始录音和识别...
[llm_chat_node-2] 2026-06-26 11:49:45,840 - INFO - AI 响应: 我作为机器人没有情绪感受,但我很高兴能为你服务。有什么需要帮忙的吗?
[llm_chat_node-2][INFO][1782445785.841152560][llm_chat_node]: 已发送 TTS 消息:'我作为机器人没有情绪感受,但我很高兴能为你服务。有什么需要帮忙的吗?'
IMG_256

双目动画:开心

综合控制/语音控制步态

语音控制功能用于通过语音命令控制机器人步态动作。系统启动后,用户说出“前进”“后退”“左转”“右转”“停止”等语音命令,语音识别模块会将语音内容转换为文字,并自动匹配对应的动作命令。匹配成功后,系统会将动作命令发送至运控接口,由运控小脑接收并完成机器人前进、后退、转向或停止等动作。

SSH连接算力大脑成功后激活Driver 环境,终端输入如下命令:

终端一:开启语音识别功能,将语音识别为文本内容。

cd bipedal_robot_proj/src/driver/voice_ws/src/voice_chat/voice_chat
python3 asr_node.py
终端二:将语音动作转换为数字命令,通过ZMQ发送给运控接口。
cd bipedal_robot_proj/src/driver/voice_ws/src/voice_chat/voice_chat
python3 voice_motion_control_node.py
终端三:接收命令并发送给运控小脑。

启动控制接口

# 激活Driver环境
cd ~/driver
python3 nav_tools/zmq_json_send.py --cmd set_sdk_mode --sdk-mode 1
# 启动动作命令发送程序
python3 action_cmd_forward.py
语音控制动作程序终端日志可看到当前状态,并通过ZMQ发送对应的数字命令:
[INFO][1782445781.961229510][voice_motion_control_node]: 语音运动控制节点已启动
[INFO][1782445782.758607547][voice_motion_control_node]: 订阅: /text_input | ZMQ: tcp://127.0.0.1:7001
[INFO][1782445782.759265702][voice_motion_control_node]: 语音: '前进' -> 命令: 1
动作命令发送程序收到对应数字命令并发送对应运动命令给运控小脑。
🎮 机器人简单命令
==================================================
1 - 前进 (2s后自动停止)
2 - 后退 (2s后自动停止)
3 - 左移 (2s后自动停止)
4 - 右移 (2s后自动停止)
5 - 左转 (4s后自动停止)
6 - 右转 (4s后自动停止)
7 - 原地转圈 (持续旋转)
8 - 停止 (立即停止所有动作)
q - 退出
==================================================
消息格式: v2 (速度协议)
ZMQ 数字命令接收: tcp://0.0.0.0:7001
ZMQ 命令发送: tcp://192.168.8.202:6061
请输入命令编号:
🤚 收到数字: 1
🚀 已发送: forward
⏱️ 将在 2.0s 后自动停止
请输入命令编号: ⏱️ 定时停止: stop