耳聪目明 — 面向移动陪伴的多模态全双工语音交互机器人
零基础实训教案大纲:从唤醒词检测到唇语辅助确认,系统学习声源定位、卡尔曼滤波、人脸检测、语音识别、大语言模型交互、回声消除与唇部检测等核心技术,最终在树莓派上搭建一套完整的全双工语音交互机器人系统。
1. 项目概述
"耳聪目明"机器人是一款面向移动陪伴场景的多模态全双工语音交互机器人。它不仅能"听"懂人话,还能"看"懂唇语,在嘈杂环境中也能准确理解用户意图,实现自然流畅的人机对话。
传统语音助手是"半双工"的——你说一句,它答一句,中间不能打断。而"全双工"就像人和人聊天一样,双方可以随时插话、打断、抢话。 本项目通过回声消除、双讲检测和唇部视觉确认三重技术,让机器人具备真正的自然对话能力。
1.1 项目目标
- 知识目标:掌握语音信号处理、计算机视觉、嵌入式系统、人机交互等多学科基础知识
- 能力目标:能够独立完成多模态交互系统的设计、搭建与调试
- 素养目标:培养系统思维、问题排查能力和团队协作精神
1.2 核心特色
2. 系统整体架构
整个系统分为五大层次:感知层、处理层、决策层、控制层和交互层。各层之间通过消息队列解耦,保证系统的实时性和可扩展性。
(4~6麦)"] CAM["摄像头模块"] MOTOR_SENSOR["电机编码器"] end subgraph 处理层["⚙️ 处理层 — 信号与算法"] direction LR BF["波束形成
(声源定位)"] KF["卡尔曼滤波
(声源跟踪)"] AEC["回声消除"] VAD["语音活动检测"] FACE["人脸检测"] LIP["唇部检测"] end subgraph 决策层["🧠 决策层 — 智能推理"] direction LR ASR["语音识别
(ASR)"] LLM["大语言模型
(LLM)"] DTD["双讲检测
+ 决策"] FUSION["多模态融合
(语音+唇语)"] end subgraph 控制层["🔧 控制层 — 运动执行"] direction LR SERVO["舵机控制
(云台转向)"] MOVE["移动底盘
(可选)"] end subgraph 交互层["💬 交互层 — 输出反馈"] direction LR TTS["语音合成
(TTS)"] SCREEN["显示屏
(表情/状态)"] end MIC --> BF MIC --> AEC CAM --> FACE CAM --> LIP BF --> KF KF --> SERVO AEC --> VAD VAD --> ASR FACE --> SERVO ASR --> LLM ASR --> DTD LIP --> FUSION DTD --> FUSION FUSION --> LLM LLM --> TTS LLM --> MOVE MOTOR_SENSOR --> KF TTS --> AEC style 感知层 fill:#E6FCF5,stroke:#12B886,stroke-width:2px,color:#087F5B style 处理层 fill:#E7F5FF,stroke:#228BE6,stroke-width:2px,color:#1864AB style 决策层 fill:#F3F0FF,stroke:#7950F2,stroke-width:2px,color:#5F3DC4 style 控制层 fill:#FFF0F6,stroke:#E64980,stroke-width:2px,color:#C2255C style 交互层 fill:#FFF9DB,stroke:#FAB005,stroke-width:2px,color:#B8860B
2.1 各层职责说明
| 层次 | 核心任务 | 关键技术 | 输入 | 输出 |
|---|---|---|---|---|
| 感知层 | 采集声音、图像、电机状态等原始数据 | 麦克风阵列、摄像头、编码器 | 物理世界信号 | 音频流、视频帧、角度数据 |
| 处理层 | 对原始信号进行预处理和特征提取 | 波束形成、卡尔曼滤波、回声消除 | 原始音频/图像 | 增强音频、人脸框、嘴唇ROI |
| 决策层 | 理解用户意图,生成回复与决策 | ASR、LLM、双讲检测、多模态融合 | 处理后的信号 | 文本回答、控制指令 |
| 控制层 | 驱动电机实现物理动作 | 舵机控制、PID调节 | 目标角度/位置 | PWM信号、物理运动 |
| 交互层 | 向用户反馈结果 | TTS语音合成、OLED/LCD显示 | 文本、状态数据 | 语音播放、屏幕显示 |
3. 核心工作流程
机器人的工作过程分为三个阶段:唤醒定位阶段、对话交互阶段和全双工打断处理阶段。下面用流程图展示完整的运行逻辑。
唤醒词?} WAKE -- 否 --> START WAKE -- 是 --> LOC[声源定位
波束形成计算DOA] LOC --> TRACK[卡尔曼滤波
跟踪声源位置] TRACK --> MOTOR[控制舵机转向
声源方向] MOTOR --> FACE_DET[启动人脸检测] FACE_DET --> FACE_OK{检测到人脸?} FACE_OK -- 是 --> ASR_START[启动语音识别
开始对话] FACE_OK -- 否 --> TRACK ASR_START --> LISTEN[持续监听并识别] LISTEN --> ASR_RESULT{识别到
有效语句?} ASR_RESULT -- 否 --> LISTEN ASR_RESULT -- 是 --> LLM_CALL[调用LLM
生成回复] LLM_CALL --> CMD_TYPE{回复类型?} CMD_TYPE -- 对话回答 --> TTS_PLAY[语音合成播放] CMD_TYPE -- 运动指令 --> MOTOR_CMD[执行电机动作] TTS_PLAY --> DTD_CHECK{双讲检测
被打断?} DTD_CHECK -- 否 --> PLAY_END{播放结束?} PLAY_END -- 否 --> TTS_PLAY PLAY_END -- 是 --> LISTEN DTD_CHECK -- 是 --> LIP_CHECK[启动唇部检测
视觉二次确认] LIP_CHECK --> LIP_RESULT{确认是用户
在说话?} LIP_RESULT -- 是 --> INTERRUPT[打断当前回答
处理新输入] LIP_RESULT -- 否 --> CONTINUE[继续播放回答] INTERRUPT --> LISTEN CONTINUE --> TTS_PLAY style START fill:#E6FCF5,stroke:#12B886,stroke-width:2px style WAKE fill:#FFF9DB,stroke:#FAB005,stroke-width:2px style DTD_CHECK fill:#FFF0F6,stroke:#E64980,stroke-width:2px style LIP_CHECK fill:#E7F5FF,stroke:#228BE6,stroke-width:2px style LLM_CALL fill:#F3F0FF,stroke:#7950F2,stroke-width:2px
3.1 三阶段详解
阶段一:唤醒与定位
- 监听唤醒词 机器人处于低功耗待机状态,麦克风阵列持续监听环境声音,使用关键词检测模型(如 Snowboy / Porcupine)识别唤醒词。
- 波束形成声源定位 检测到唤醒词后,利用麦克风阵列各通道的声音到达时间差(TDOA),通过波束形成算法计算声源的方向角(DOA)。
- 卡尔曼滤波跟踪 对计算出的声源方向进行卡尔曼滤波,平滑噪声干扰,预测声源运动轨迹,避免因瞬时噪声导致舵机抖动。
- 舵机转向 + 人脸检测 控制云台舵机转向声源方向,同时启动摄像头进行人脸检测。找到人脸后锁定位置,进入对话模式。
阶段二:对话交互
- 语音活动检测(VAD) 检测用户是否在说话,过滤掉静音段和环境噪声,只把有效语音片段送给识别引擎。
- 语音识别(ASR) 将用户语音转换为文本。可使用开源方案(Whisper / FunASR)或云端API(讯飞/百度)。
- 大语言模型(LLM)交互 将识别文本发送给LLM,生成回答。同时支持意图识别——如果是控制指令(如"向前走"),则调用电机控制模块。
- 语音合成(TTS) 将LLM生成的文本回答转换为语音,通过扬声器播放给用户。
阶段三:全双工打断处理
机器人在播放回答时,自己的声音又会被麦克风听到(回声),而且用户可能随时插话打断。 怎么区分"机器人自己的声音"和"用户的插话"?这就是回声消除和双讲检测要解决的问题。
- 回声消除(AEC) 把扬声器正在播放的音频作为参考信号,从麦克风采集的信号中"减去"机器人自己的声音,剩下的才是环境中的真实声音。
- 双讲检测(DTD) 判断当前麦克风里除了回声之外,有没有用户在说话。如果检测到用户说话,触发打断逻辑。
- 唇部检测二次确认 双讲检测可能误判(比如环境噪声),这时候调用摄像头看用户嘴唇有没有在动,用视觉信息二次确认"用户真的在说话"。
- 打断决策 如果语音和视觉都确认用户在说话,立即停止当前回答,开始处理新的用户输入;如果只是噪声,继续播放回答。
4. 实训进度安排
建议实训周期为 4 周(约 80 学时),按照"基础入门 → 分模块实践 → 系统集成 → 调试优化"的顺序循序渐进。零基础学生可以先在电脑上完成算法验证,再迁移到树莓派。
| 周次 | 阶段 | 教学内容 | 学时 | 目标产出 |
|---|---|---|---|---|
| 第1周 | 基础入门 |
• 树莓派系统安装与Python基础 • 模块0:环境搭建与工具入门 • 模块1:唤醒词检测 • 模块2:麦克风阵列与声源定位基础 |
20 | 能在树莓派上跑通唤醒词检测 demo |
| 第2周 | 分模块实践 |
• 模块3:卡尔曼滤波与舵机控制 • 模块4:人脸检测与人脸跟踪 • 模块5:语音识别(ASR) • 模块6:大语言模型交互 |
20 | 各模块单独功能验证通过 |
| 第3周 | 进阶模块 |
• 模块7:回声消除与双讲检测 • 模块8:唇部检测与口型识别 • 多模态融合策略 |
20 | 全双工打断功能初体验 |
| 第4周 | 系统集成与调试 |
• 模块9:系统集成与全双工交互 • 性能优化与问题排查 • 项目展示与答辩 |
20 | 完整机器人系统 + 项目报告 |
零基础学生在前两周可能会遇到较多环境配置问题。建议老师提前准备好树莓派镜像,或者让学生先在 Windows/Mac 电脑上用 Python 跑通算法, 确认逻辑正确后再移植到树莓派。每个模块都要有"最小可运行Demo",让学生每一步都能看到成果,保持学习动力。
5. 教学模块详解
共 10 个教学模块,每个模块包含学习目标、核心知识点、实践内容和参考工具。 难度从入门到进阶循序渐进,标注了各模块的前置依赖关系。
模块0:环境准备与树莓派入门
让学生熟悉树莓派硬件和开发环境,掌握基本的 Linux 命令和 Python 编程,为后续模块打下基础。
学习目标
- 了解树莓派硬件组成
- 掌握系统烧录与远程连接
- 学会 Python 基础编程
- 掌握 GPIO 基本操作
核心知识点
- 树莓派系统安装 (Raspberry Pi OS)
- SSH / VNC 远程连接
- Linux 常用命令
- Python 基础语法
- GPIO 库 (gpiozero / RPi.GPIO)
实践内容
- 烧录系统并启动树莓派
- 实现 LED 闪烁控制
- 按键输入检测
- 编写第一个 Python 脚本
参考工具
- Raspberry Pi Imager
- VS Code + Remote SSH
- Python 3.9+
- gpiozero 库
模块1:唤醒词检测
让机器人"听懂"自己的名字。使用轻量级关键词检测模型,在低功耗状态下持续监听唤醒词,触发后续交互流程。
学习目标
- 理解音频采样基本概念
- 掌握唤醒词检测原理
- 能训练自定义唤醒词
- 实现实时唤醒检测
核心知识点
- PCM 音频格式与采样率
- 梅尔频率倒谱系数 (MFCC)
- 关键词检测算法原理
- 误唤醒率与召回率
实践内容
- 录制并制作唤醒词数据集
- 使用 Porcupine / Snowboy 检测唤醒词
- 调节灵敏度参数
- 触发 LED 反馈效果
参考工具
- Porcupine (Picovoice)
- Snowboy (开源)
- PyAudio / sounddevice
- librosa (音频分析)
模块2:声源定位与波束形成
用多个麦克风组成阵列,通过计算声音到达各麦克风的时间差,判断声源方向——就像人用两只耳朵判断声音从哪来一样。
学习目标
- 理解麦克风阵列原理
- 掌握波束形成基本概念
- 能计算声源方向角 (DOA)
- 理解不同阵列的优缺点
核心知识点
- 到达时间差 (TDOA)
- 广义互相关 (GCC)
- 延迟求和波束形成
- MVDR 自适应波束形成
- 线性阵列 vs 环形阵列
实践内容
- 搭建 4 麦线性阵列
- 用 GCC-PHAT 计算 TDOA
- 实现简单的 DOA 估计
- 输出角度到串口
参考工具
- Respeaker 麦克风阵列
- NumPy / SciPy
- Pyroomacoustics
- MATLAB (可选仿真)
模块3:卡尔曼滤波与电机控制
声源定位的结果可能有抖动和噪声。卡尔曼滤波能"猜"出声源的运动轨迹,让舵机平稳地跟踪目标,而不是抖来抖去。
学习目标
- 理解卡尔曼滤波原理
- 掌握舵机 PWM 控制
- 实现声源角度平滑跟踪
- 理解预测与更新的关系
核心知识点
- 卡尔曼滤波五步公式
- 过程噪声与测量噪声
- PWM 信号与舵机控制
- PID 调节基础
实践内容
- 编写一维卡尔曼滤波器
- 控制舵机转到指定角度
- 声源角度实时跟踪
- 对比滤波前后效果
参考工具
- filterpy (卡尔曼滤波库)
- Adafruit ServoKit
- SG90 / MG996R 舵机
- Matplotlib (数据可视化)
模块4:人脸检测与人脸跟踪
机器人转向声源方向后,需要用摄像头找到人脸并"盯着"人。本模块学习如何快速检测人脸,并控制舵机实现人脸跟踪。
学习目标
- 理解人脸检测原理
- 掌握 OpenCV 基础操作
- 实现实时人脸检测
- 完成视觉伺服跟踪
核心知识点
- Haar 级联 / MTCNN
- MediaPipe Face Detection
- 图像坐标系与角度映射
- 视觉伺服 (Visual Servoing)
实践内容
- OpenCV 图像基本操作
- 运行人脸检测模型
- 人脸框位置 → 舵机角度
- 人脸左右移动跟踪
参考工具
- OpenCV
- MediaPipe
- 树莓派摄像头 (CSI)
- USB 摄像头
模块5:语音识别(ASR)
把声音变成文字。学习语音活动检测(VAD)和语音识别技术,让机器人能听懂用户说的话。
学习目标
- 理解语音识别基本原理
- 掌握 VAD 端点检测
- 能集成本地/云端 ASR
- 处理识别错误与重试
核心知识点
- 语音活动检测 (VAD)
- 声学模型与语言模型
- 端到端语音识别
- 流式识别 vs 整句识别
实践内容
- 使用 WebRTC VAD
- Whisper 本地识别 (小模型)
- FunASR 中文识别
- 讯飞/百度 API 调用
参考工具
- OpenAI Whisper
- FunASR (阿里达摩院)
- WebRTC VAD
- vosk-api (离线识别)
模块6:大语言模型交互
接入大语言模型,让机器人不仅能听懂,还能"思考"和回答。学习 Prompt 设计、函数调用(Function Calling)和意图识别。
学习目标
- 理解 LLM 基本工作方式
- 掌握 API 调用方法
- 学会 Prompt 工程基础
- 实现函数调用控制电机
核心知识点
- 大语言模型 API 调用
- Prompt 设计技巧
- Function Calling
- 对话上下文管理
- 流式输出 (Streaming)
实践内容
- 调用 LLM API 实现问答
- 设计机器人角色设定
- 用函数调用控制舵机
- 多轮对话上下文管理
参考工具
- OpenAI API / 兼容接口
- LangChain (可选)
- Ollama (本地部署)
- Qwen / 通义千问
模块7:回声消除与双讲检测
全双工交互的核心模块。机器人在说话的同时也要能听——把自己的声音从麦克风里"消掉",并且能检测出用户什么时候插话。
学习目标
- 理解回声消除原理
- 理解双讲检测概念
- 掌握 AEC 算法使用
- 实现打断检测逻辑
核心知识点
- 自适应滤波 (LMS/NLMS)
- 声学回声消除 (AEC)
- 双讲检测 (DTD)
- 近端/远端信号
- 残留回声抑制
实践内容
- SpeexDSP / WebRTC AEC
- 录制回声音频并消除
- 实现简单双讲检测
- 触发打断事件测试
参考工具
- WebRTC AEC3
- Speex DSP
- speexdsp-python
- PyAudio
模块8:唇部检测与口型识别
双讲检测可能会被环境噪声误导。这时候用摄像头看看用户的嘴唇——如果嘴唇在动,就真的是在说话。这是多模态融合的关键一步。
学习目标
- 理解人脸关键点检测
- 掌握唇部 ROI 提取
- 实现唇动状态检测
- 理解唇语识别概念
核心知识点
- 人脸关键点 (Face Landmark)
- 唇部区域提取
- 唇部分割与轮廓
- 光流 / 帧差检测运动
- 视觉语音识别 (VSR)
实践内容
- MediaPipe Face Mesh
- 提取嘴唇关键点
- 计算嘴巴开合度
- 判断是否在说话
- 与音频结果融合验证
参考工具
- MediaPipe Face Mesh
- OpenCV
- dlib (可选)
- AutoLipSync (参考)
模块9:系统集成与全双工交互
把前面所有模块整合在一起,用消息队列或多线程架构连接各个模块,实现完整的全双工多模态语音交互机器人。
学习目标
- 掌握多线程/多进程编程
- 理解系统集成架构
- 学会调试复杂系统
- 优化实时性能
核心知识点
- 生产者-消费者模式
- 消息队列 (Queue)
- 多线程与锁机制
- 状态机设计
- 性能优化与延迟
实践内容
- 设计系统状态机
- 用队列连接各模块
- 实现全双工对话
- 性能测试与优化
- 整体功能演示
参考工具
- Python threading
- multiprocessing
- queue.Queue
- ROS (可选进阶)
6. 硬件清单
以下是基础版硬件清单,学生可根据预算和兴趣进行扩展。推荐以小组为单位采购,共享部分调试工具。
🔲 核心控制板
| 器件 | 推荐型号 | 数量 | 说明 |
|---|---|---|---|
| 树莓派主板 | Raspberry Pi 4B / 5 (4GB+) | 1 | 推荐 4GB 以上,运行更流畅 |
| SD 卡 | 32GB Class 10 | 1 | 烧录系统用 |
| 电源适配器 | 5V 3A USB-C | 1 | 必须用官方或合格电源 |
🎤 音频采集与播放
| 器件 | 推荐型号 | 数量 | 说明 |
|---|---|---|---|
| 麦克风阵列 | ReSpeaker 4-Mic Array | 1 | 4 麦环形阵列,带驱动支持 |
| 扬声器 | 3W 小喇叭 + 功放模块 | 1 | 或 USB 音箱 |
| USB 声卡 | CM108 芯片 | 1 | 音频输出用(可选) |
👁️ 视觉采集
| 器件 | 推荐型号 | 数量 | 说明 |
|---|---|---|---|
| 摄像头模块 | 树莓派官方摄像头 v2 / USB 摄像头 | 1 | 720p 即可,不需要太高分辨率 |
| 摄像头支架 | 可调节支架 | 1 | 方便调整角度 |
🔧 运动执行
| 器件 | 推荐型号 | 数量 | 说明 |
|---|---|---|---|
| 舵机 | SG90 (9g 微型舵机) | 2 | 云台左右 + 上下 |
| 舵机驱动板 | PCA9685 (16路 PWM) | 1 | I2C 控制,节省 GPIO |
| 云台支架 | 2 自由度舵机云台 | 1 | 安装摄像头和麦克风 |
🔋 其他
| 器件 | 推荐型号 | 数量 | 说明 |
|---|---|---|---|
| 面包板 + 杜邦线 | 通用 | 若干 | 接线用 |
| OLED 显示屏 | 0.96寸 I2C (SSD1306) | 1 | 显示状态和表情(可选) |
| 移动电源 | 5V 2A 输出 | 1 | 让机器人可以移动 |
| 底盘 + 电机 | 两轮差速底盘 | 1套 | 进阶选装,实现移动功能 |
基础版(不带移动底盘):约 500~700 元/台
进阶版(带移动底盘):约 800~1200 元/台
建议学校统一采购核心部件,学生自备树莓派或小组共用。
7. 软件环境
所有软件均使用开源或免费方案,学生可以在自己的电脑上先完成开发,再部署到树莓派。
| 类别 | 推荐方案 | 类型 | 适用场景 |
|---|---|---|---|
| 操作系统 | Raspberry Pi OS (64-bit) Bookworm | 开源免费 | 树莓派运行环境 |
| 编程语言 | Python 3.10+ | 开源免费 | 主要开发语言 |
| 唤醒词检测 | Porcupine / Snowboy | 免费/开源 | 低功耗关键词唤醒 |
| 声源定位 | Respeaker 驱动 + 自研 | 开源 | DOA 估计与波束形成 |
| 卡尔曼滤波 | filterpy / 手写实现 | 开源 | 声源跟踪平滑 |
| 人脸检测 | MediaPipe Face Detection | 开源免费 | 轻量高速人脸检测 |
| 唇部检测 | MediaPipe Face Mesh | 开源免费 | 468 点人脸关键点 |
| 语音识别 | FunASR / Whisper small | 开源免费 | 本地中文语音识别 |
| 回声消除 | WebRTC AEC3 / SpeexDSP | 开源免费 | 实时声学回声消除 |
| 大语言模型 | Qwen / 通义千问 API | 免费额度 | 对话生成与意图识别 |
| 语音合成 | Edge-TTS / 讯飞 TTS | 免费/免费额度 | 文本转语音 |
| 图像处理 | OpenCV + NumPy | 开源免费 | 图像读写与处理 |
8. 考核方式
采用过程性评价 + 最终成果相结合的方式,重点考察学生的动手能力和解决问题的能力,而不是死记硬背。
8.1 最终成果要求
- 功能完整性:唤醒词检测 → 声源定位转向 → 人脸检测 → 语音对话 → 打断检测,全流程跑通
- 稳定性:连续对话 5 轮以上不出错,唤醒成功率 ≥ 90%
- 创新性:在基础功能之上,有自己的改进或扩展(比如增加表情显示、移动底盘、多轮记忆等)
- 代码质量:代码结构清晰,有注释,模块化设计
8.2 项目报告要求
- 项目背景与目标
- 系统架构设计(附架构图)
- 各模块原理与实现细节
- 遇到的问题与解决方法
- 测试结果与性能分析
- 总结与展望
9. 扩展与进阶方向
学有余力的小组可以在基础功能之上,探索以下进阶方向,提升项目的完整度和创新性。