耳聪目明 — 面向移动陪伴的多模态全双工语音交互机器人

零基础实训教案大纲:从唤醒词检测到唇语辅助确认,系统学习声源定位、卡尔曼滤波、人脸检测、语音识别、大语言模型交互、回声消除与唇部检测等核心技术,最终在树莓派上搭建一套完整的全双工语音交互机器人系统。

实训对象:零基础学生 目标平台:树莓派 模块总数:10 个教学模块

1. 项目概述

"耳聪目明"机器人是一款面向移动陪伴场景的多模态全双工语音交互机器人。它不仅能"听"懂人话,还能"看"懂唇语,在嘈杂环境中也能准确理解用户意图,实现自然流畅的人机对话。

💡 什么是"全双工"语音交互?

传统语音助手是"半双工"的——你说一句,它答一句,中间不能打断。而"全双工"就像人和人聊天一样,双方可以随时插话、打断、抢话。 本项目通过回声消除、双讲检测和唇部视觉确认三重技术,让机器人具备真正的自然对话能力。

1.1 项目目标

  • 知识目标:掌握语音信号处理、计算机视觉、嵌入式系统、人机交互等多学科基础知识
  • 能力目标:能够独立完成多模态交互系统的设计、搭建与调试
  • 素养目标:培养系统思维、问题排查能力和团队协作精神

1.2 核心特色

🎯
声源定位
麦克风阵列 + 波束形成算法,机器人能"转过头"看向说话的人
音频处理
👁️
唇语辅助
嘈杂环境下用摄像头读取唇形,二次确认语音识别结果
视觉处理
🤖
智能对话
接入大语言模型,支持闲聊、问答、指令执行等多种交互
人工智能
🔄
全双工交互
支持打断、插话,像真人一样自然对话,不是一问一答
系统集成

2. 系统整体架构

整个系统分为五大层次:感知层、处理层、决策层、控制层和交互层。各层之间通过消息队列解耦,保证系统的实时性和可扩展性。

图 2-1 系统整体架构图
flowchart TB subgraph 感知层["🎤 感知层 — 数据采集"] direction LR MIC["麦克风阵列
(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. 核心工作流程

机器人的工作过程分为三个阶段:唤醒定位阶段、对话交互阶段和全双工打断处理阶段。下面用流程图展示完整的运行逻辑。

图 3-1 机器人主工作流程图
flowchart TD START([待机状态]) --> WAKE{检测到
唤醒词?} 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 三阶段详解

阶段一:唤醒与定位

  1. 监听唤醒词 机器人处于低功耗待机状态,麦克风阵列持续监听环境声音,使用关键词检测模型(如 Snowboy / Porcupine)识别唤醒词。
  2. 波束形成声源定位 检测到唤醒词后,利用麦克风阵列各通道的声音到达时间差(TDOA),通过波束形成算法计算声源的方向角(DOA)。
  3. 卡尔曼滤波跟踪 对计算出的声源方向进行卡尔曼滤波,平滑噪声干扰,预测声源运动轨迹,避免因瞬时噪声导致舵机抖动。
  4. 舵机转向 + 人脸检测 控制云台舵机转向声源方向,同时启动摄像头进行人脸检测。找到人脸后锁定位置,进入对话模式。

阶段二:对话交互

  1. 语音活动检测(VAD) 检测用户是否在说话,过滤掉静音段和环境噪声,只把有效语音片段送给识别引擎。
  2. 语音识别(ASR) 将用户语音转换为文本。可使用开源方案(Whisper / FunASR)或云端API(讯飞/百度)。
  3. 大语言模型(LLM)交互 将识别文本发送给LLM,生成回答。同时支持意图识别——如果是控制指令(如"向前走"),则调用电机控制模块。
  4. 语音合成(TTS) 将LLM生成的文本回答转换为语音,通过扬声器播放给用户。

阶段三:全双工打断处理

🔑 全双工的核心挑战

机器人在播放回答时,自己的声音又会被麦克风听到(回声),而且用户可能随时插话打断。 怎么区分"机器人自己的声音"和"用户的插话"?这就是回声消除和双讲检测要解决的问题。

  1. 回声消除(AEC) 把扬声器正在播放的音频作为参考信号,从麦克风采集的信号中"减去"机器人自己的声音,剩下的才是环境中的真实声音。
  2. 双讲检测(DTD) 判断当前麦克风里除了回声之外,有没有用户在说话。如果检测到用户说话,触发打断逻辑。
  3. 唇部检测二次确认 双讲检测可能误判(比如环境噪声),这时候调用摄像头看用户嘴唇有没有在动,用视觉信息二次确认"用户真的在说话"。
  4. 打断决策 如果语音和视觉都确认用户在说话,立即停止当前回答,开始处理新的用户输入;如果只是噪声,继续播放回答。

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

模块0:环境准备与树莓派入门

入门基础 · 建议 4 学时 · 无前置依赖

让学生熟悉树莓派硬件和开发环境,掌握基本的 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

模块1:唤醒词检测

音频处理 · 建议 6 学时 · 前置依赖:模块0

让机器人"听懂"自己的名字。使用轻量级关键词检测模型,在低功耗状态下持续监听唤醒词,触发后续交互流程。

学习目标

  • 理解音频采样基本概念
  • 掌握唤醒词检测原理
  • 能训练自定义唤醒词
  • 实现实时唤醒检测

核心知识点

  • PCM 音频格式与采样率
  • 梅尔频率倒谱系数 (MFCC)
  • 关键词检测算法原理
  • 误唤醒率与召回率

实践内容

  • 录制并制作唤醒词数据集
  • 使用 Porcupine / Snowboy 检测唤醒词
  • 调节灵敏度参数
  • 触发 LED 反馈效果

参考工具

  • Porcupine (Picovoice)
  • Snowboy (开源)
  • PyAudio / sounddevice
  • librosa (音频分析)
2

模块2:声源定位与波束形成

音频处理 · 建议 8 学时 · 前置依赖:模块1

用多个麦克风组成阵列,通过计算声音到达各麦克风的时间差,判断声源方向——就像人用两只耳朵判断声音从哪来一样。

学习目标

  • 理解麦克风阵列原理
  • 掌握波束形成基本概念
  • 能计算声源方向角 (DOA)
  • 理解不同阵列的优缺点

核心知识点

  • 到达时间差 (TDOA)
  • 广义互相关 (GCC)
  • 延迟求和波束形成
  • MVDR 自适应波束形成
  • 线性阵列 vs 环形阵列

实践内容

  • 搭建 4 麦线性阵列
  • 用 GCC-PHAT 计算 TDOA
  • 实现简单的 DOA 估计
  • 输出角度到串口

参考工具

  • Respeaker 麦克风阵列
  • NumPy / SciPy
  • Pyroomacoustics
  • MATLAB (可选仿真)
3

模块3:卡尔曼滤波与电机控制

运动控制 · 建议 6 学时 · 前置依赖:模块2

声源定位的结果可能有抖动和噪声。卡尔曼滤波能"猜"出声源的运动轨迹,让舵机平稳地跟踪目标,而不是抖来抖去。

学习目标

  • 理解卡尔曼滤波原理
  • 掌握舵机 PWM 控制
  • 实现声源角度平滑跟踪
  • 理解预测与更新的关系

核心知识点

  • 卡尔曼滤波五步公式
  • 过程噪声与测量噪声
  • PWM 信号与舵机控制
  • PID 调节基础

实践内容

  • 编写一维卡尔曼滤波器
  • 控制舵机转到指定角度
  • 声源角度实时跟踪
  • 对比滤波前后效果

参考工具

  • filterpy (卡尔曼滤波库)
  • Adafruit ServoKit
  • SG90 / MG996R 舵机
  • Matplotlib (数据可视化)
4

模块4:人脸检测与人脸跟踪

计算机视觉 · 建议 8 学时 · 前置依赖:模块3

机器人转向声源方向后,需要用摄像头找到人脸并"盯着"人。本模块学习如何快速检测人脸,并控制舵机实现人脸跟踪。

学习目标

  • 理解人脸检测原理
  • 掌握 OpenCV 基础操作
  • 实现实时人脸检测
  • 完成视觉伺服跟踪

核心知识点

  • Haar 级联 / MTCNN
  • MediaPipe Face Detection
  • 图像坐标系与角度映射
  • 视觉伺服 (Visual Servoing)

实践内容

  • OpenCV 图像基本操作
  • 运行人脸检测模型
  • 人脸框位置 → 舵机角度
  • 人脸左右移动跟踪

参考工具

  • OpenCV
  • MediaPipe
  • 树莓派摄像头 (CSI)
  • USB 摄像头
5

模块5:语音识别(ASR)

音频处理 · 建议 6 学时 · 前置依赖:模块1

把声音变成文字。学习语音活动检测(VAD)和语音识别技术,让机器人能听懂用户说的话。

学习目标

  • 理解语音识别基本原理
  • 掌握 VAD 端点检测
  • 能集成本地/云端 ASR
  • 处理识别错误与重试

核心知识点

  • 语音活动检测 (VAD)
  • 声学模型与语言模型
  • 端到端语音识别
  • 流式识别 vs 整句识别

实践内容

  • 使用 WebRTC VAD
  • Whisper 本地识别 (小模型)
  • FunASR 中文识别
  • 讯飞/百度 API 调用

参考工具

  • OpenAI Whisper
  • FunASR (阿里达摩院)
  • WebRTC VAD
  • vosk-api (离线识别)
6

模块6:大语言模型交互

人工智能 · 建议 6 学时 · 前置依赖:模块5

接入大语言模型,让机器人不仅能听懂,还能"思考"和回答。学习 Prompt 设计、函数调用(Function Calling)和意图识别。

学习目标

  • 理解 LLM 基本工作方式
  • 掌握 API 调用方法
  • 学会 Prompt 工程基础
  • 实现函数调用控制电机

核心知识点

  • 大语言模型 API 调用
  • Prompt 设计技巧
  • Function Calling
  • 对话上下文管理
  • 流式输出 (Streaming)

实践内容

  • 调用 LLM API 实现问答
  • 设计机器人角色设定
  • 用函数调用控制舵机
  • 多轮对话上下文管理

参考工具

  • OpenAI API / 兼容接口
  • LangChain (可选)
  • Ollama (本地部署)
  • Qwen / 通义千问
7

模块7:回声消除与双讲检测

音频处理 · 建议 8 学时 · 前置依赖:模块5、模块6

全双工交互的核心模块。机器人在说话的同时也要能听——把自己的声音从麦克风里"消掉",并且能检测出用户什么时候插话。

学习目标

  • 理解回声消除原理
  • 理解双讲检测概念
  • 掌握 AEC 算法使用
  • 实现打断检测逻辑

核心知识点

  • 自适应滤波 (LMS/NLMS)
  • 声学回声消除 (AEC)
  • 双讲检测 (DTD)
  • 近端/远端信号
  • 残留回声抑制

实践内容

  • SpeexDSP / WebRTC AEC
  • 录制回声音频并消除
  • 实现简单双讲检测
  • 触发打断事件测试

参考工具

  • WebRTC AEC3
  • Speex DSP
  • speexdsp-python
  • PyAudio
8

模块8:唇部检测与口型识别

计算机视觉 · 建议 8 学时 · 前置依赖:模块4、模块7

双讲检测可能会被环境噪声误导。这时候用摄像头看看用户的嘴唇——如果嘴唇在动,就真的是在说话。这是多模态融合的关键一步。

学习目标

  • 理解人脸关键点检测
  • 掌握唇部 ROI 提取
  • 实现唇动状态检测
  • 理解唇语识别概念

核心知识点

  • 人脸关键点 (Face Landmark)
  • 唇部区域提取
  • 唇部分割与轮廓
  • 光流 / 帧差检测运动
  • 视觉语音识别 (VSR)

实践内容

  • MediaPipe Face Mesh
  • 提取嘴唇关键点
  • 计算嘴巴开合度
  • 判断是否在说话
  • 与音频结果融合验证

参考工具

  • MediaPipe Face Mesh
  • OpenCV
  • dlib (可选)
  • AutoLipSync (参考)
9

模块9:系统集成与全双工交互

系统集成 · 建议 10 学时 · 前置依赖:所有模块

把前面所有模块整合在一起,用消息队列或多线程架构连接各个模块,实现完整的全双工多模态语音交互机器人。

学习目标

  • 掌握多线程/多进程编程
  • 理解系统集成架构
  • 学会调试复杂系统
  • 优化实时性能

核心知识点

  • 生产者-消费者模式
  • 消息队列 (Queue)
  • 多线程与锁机制
  • 状态机设计
  • 性能优化与延迟

实践内容

  • 设计系统状态机
  • 用队列连接各模块
  • 实现全双工对话
  • 性能测试与优化
  • 整体功能演示

参考工具

  • Python threading
  • multiprocessing
  • queue.Queue
  • ROS (可选进阶)

6. 硬件清单

以下是基础版硬件清单,学生可根据预算和兴趣进行扩展。推荐以小组为单位采购,共享部分调试工具。

🔲 核心控制板

器件推荐型号数量说明
树莓派主板Raspberry Pi 4B / 5 (4GB+)1推荐 4GB 以上,运行更流畅
SD 卡32GB Class 101烧录系统用
电源适配器5V 3A USB-C1必须用官方或合格电源

🎤 音频采集与播放

器件推荐型号数量说明
麦克风阵列ReSpeaker 4-Mic Array14 麦环形阵列,带驱动支持
扬声器3W 小喇叭 + 功放模块1或 USB 音箱
USB 声卡CM108 芯片1音频输出用(可选)

👁️ 视觉采集

器件推荐型号数量说明
摄像头模块树莓派官方摄像头 v2 / USB 摄像头1720p 即可,不需要太高分辨率
摄像头支架可调节支架1方便调整角度

🔧 运动执行

器件推荐型号数量说明
舵机SG90 (9g 微型舵机)2云台左右 + 上下
舵机驱动板PCA9685 (16路 PWM)1I2C 控制,节省 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. 考核方式

采用过程性评价 + 最终成果相结合的方式,重点考察学生的动手能力和解决问题的能力,而不是死记硬背。

30%
平时表现与出勤
30%
模块作业完成情况
25%
最终系统演示
15%
项目报告与答辩

8.1 最终成果要求

  • 功能完整性:唤醒词检测 → 声源定位转向 → 人脸检测 → 语音对话 → 打断检测,全流程跑通
  • 稳定性:连续对话 5 轮以上不出错,唤醒成功率 ≥ 90%
  • 创新性:在基础功能之上,有自己的改进或扩展(比如增加表情显示、移动底盘、多轮记忆等)
  • 代码质量:代码结构清晰,有注释,模块化设计

8.2 项目报告要求

  • 项目背景与目标
  • 系统架构设计(附架构图)
  • 各模块原理与实现细节
  • 遇到的问题与解决方法
  • 测试结果与性能分析
  • 总结与展望

9. 扩展与进阶方向

学有余力的小组可以在基础功能之上,探索以下进阶方向,提升项目的完整度和创新性。

🚗
移动底盘
加上两轮差速底盘,让机器人能跟着人走,实现真正的"移动陪伴"
运动控制
😀
表情与情绪
用 OLED/LCD 显示机器人表情,根据对话内容变化情绪
人机交互
🧠
本地大模型
在树莓派上跑小参数模型(如 Qwen-1.8B),实现离线对话
本地部署
👋
手势识别
增加手势识别功能,用手势控制机器人动作
视觉扩展
🏠
智能家居控制
接入米家/HomeKit,用语音控制家里的智能设备
IoT应用
📡
多机器人协同
多台机器人通过网络通信,实现分工协作
多智能体