1. register_speaker_node: Enable AEC to match main node for better SV accuracy. 2. tts/dashscope: Fix ffmpeg argument order (input option thread_queue_size). 3. asr/dashscope: Keep WebSocket connection alive to reduce latency. 4. speaker_verifier: Force single-thread inference to avoid CPU contention.
ROS 语音包 (robot_speaker)
注册阿里云百炼获取api_key
https://bailian.console.aliyun.com/?tab=model#/api-key ->密钥管理 放到config/voice.yaml
安装依赖
- 系统依赖
sudo apt-get update
sudo apt-get install -y python3-pyaudio portaudio19-dev alsa-utils ffmpeg swig meson ninja-build build-essential pkg-config libwebrtc-audio-processing-dev
- Python依赖
cd ~/ros_learn/hivecore_robot_voice
# 在 Python 3.10 环境下,需要单独安装 aec-audio-processing 以跳过版本检查
pip3 install aec-audio-processing --no-binary :all: --ignore-requires-python --break-system-packages
pip3 install -r requirements.txt --break-system-packages
编译启动
- 注册声纹
- 启动节点后可以说:二狗今天天气真好开始注册声纹
- 正确的注册姿势: 方法A(推荐):唤醒后停顿一下,然后说一段长句子。 用户:"二狗" 机器:(日志提示等待声纹语音) 用户:"我现在正在注册声纹,这是一段很长的测试语音,请把我的声音录进去。"(持续说 3-5 秒) 方法B(连贯说):一口气说很长的一句话。 用户:"二狗你好,我是你的主人,请记住我的声音,这是一段用来注册的长语音。"
- 注意:要包含唤醒词,语句不要停顿,尽量大于1.5秒
cd ~/ros_learn/hivecore_robot_voice
colcon build
source install/setup.bash
ros2 run robot_speaker register_speaker_node
- 主节点
- 启动节点后每句交互包含唤醒词,唤醒词和语句之间不要有停顿
- 二狗拍照看看开启图文交互
- 支持已注册声纹用户打断
cd ~/ros_learn/hivecore_robot_voice
colcon build
source install/setup.bash
ros2 launch robot_speaker voice.launch.py
架构说明
[录音线程] - 唯一实时线程 ├─ 麦克风采集 PCM ├─ VAD + 能量检测 ├─ 检测到人声 → 立即中断TTS ├─ 语音 PCM → ASR 音频队列 └─ 语音 PCM → 声纹音频队列(旁路,不阻塞)
[ASR推理线程] - 只做 audio → text └─ 从 ASR 音频队列取音频→ 实时 / 流式 ASR → text → 文本队列
[声纹识别线程] - 非实时、低频(CAM++) ├─ 通过回调函数接收音频chunk,写入缓冲区,等待 speech_end 事件触发处理 ├─ 累积 1~2 秒有效人声(VAD 后) ├─ CAM++ 提取 speaker embedding ├─ 声纹匹配 / 注册 └─ 更新 current_speaker_id(共享状态,只写不控) 声纹线程要求:不影响录音,不影响ASR,不控制TTS,只更新当前说话人是谁
[主线程/处理线程] - 处理业务逻辑 ├─ 从 文本队列 取 ASR 文本 ├─ 读取 current_speaker_id(只读) ├─ 唤醒词处理(结合 speaker_id) ├─ 权限 / 身份判断(是否允许继续) ├─ VLM处理(文本 / 多模态) └─ TTS播放(启动TTS线程,不等待)
[TTS播放线程] - 只播放(可被中断) ├─ 接收 TTS 音频流 ├─ 播放到输出设备 └─ 响应中断标志(由录音线程触发)
用到的命令
- 音频设备
# 1. 查看所有音频设备
cat /proc/asound/cards
# 2. 查看 card(1)的流信息(设备参数)
cat /proc/asound/card1/stream0
- 相机设备
# 1. 查看相机所有基础信息(型号、固件版本、序列号等)
rs-enumerate-devices -c
- 模型下载
modelscope download --model iic/speech_campplus_sv_zh-cn_16k-common --local_dir [指定路径]
Description
Languages
Python
100%