4. 语音交互系统架构
语音唤醒,说白了就是设备一直在「听」,听到关键词就「醒」过来。单屏设备上这事很简单——谁听到谁醒。但多屏场景下,客厅一个屏、卧室一个屏、厨房一个屏,同时喊一嗓子「你好,小X」,三个屏都醒了,那画面就有点尴尬了。
我最早做这个功能时,觉得不就是个唤醒词检测嘛,能有多复杂?结果第一次联调,三个屏同时应答,用户直接懵了。嗯,从那以后我才认真研究起唤醒源仲裁和跨屏策略来。
4.1 单屏唤醒 vs 多屏唤醒
先看最基础的对比:
| 对比项 | 单屏唤醒 | 多屏唤醒 |
|---|---|---|
| 唤醒源数量 | 1 个麦克风阵列 | 2~N 个麦克风阵列(跨设备) |
| 唤醒决策 | 本地 VAD + KWS 直接判定 | 需仲裁模块统一决策 |
| 用户体验 | 谁唤醒谁响应 | 仅最近/最合适的设备响应 |
| 技术难点 | 低功耗、远场识别 | 时间同步、能量比较、冲突消解 |
单屏唤醒,每个设备各自为政。麦克风阵列检测到唤醒词,本地 VAD 确认不是噪声,直接触发唤醒事件。这个流程我做过很多次,核心指标就两个:唤醒率和误唤醒率。一般要求唤醒率 > 95%,误唤醒率 < 1 次/24 小时。
多屏唤醒就不一样了。你想想看,三个屏同时听到「你好小X」,每个屏的本地 KWS 都输出一个唤醒置信度。这时候如果各自直接响应,用户就会听到三重回声。所以必须引入一个唤醒源仲裁机制。
4.2 唤醒源仲裁
仲裁的核心逻辑,说白了就是「谁最该醒」。我个人习惯把仲裁策略分为三个层级:
- 能量优先:比较各设备采集到的唤醒词音频能量,能量最大的设备离用户最近,优先响应。
- 置信度优先:如果能量接近(比如用户站在两个屏中间),则比较 KWS 输出的置信度分数。
- 优先级兜底:前两者都无法区分时,按预设的设备优先级(如客厅 > 卧室 > 厨房)决定。
核心公式(简化版)
唤醒得分 = w1 * 归一化能量 + w2 * 置信度 + w3 * 设备优先级
得分最高的设备获得唤醒权。w1、w2、w3 为权重系数,需根据实际场景调优。
我在项目中遇到过一个问题:两个屏放在同一房间,能量和置信度都差不多,结果仲裁结果反复跳变。后来加了一个仲裁锁定时间——一旦选定唤醒设备,锁定 2 秒内不再重新仲裁。这个坑,我建议你们提前埋上。
4.3 跨屏唤醒策略
仲裁只是第一步。真正麻烦的是跨屏场景下的唤醒策略。我把它分成三种典型模式:
| 策略模式 | 适用场景 | 实现方式 |
|---|---|---|
| 就近唤醒 | 家庭多屏(客厅、卧室、厨房) | 能量比较 + 声源定位 |
| 主从唤醒 | 车载多屏(中控、后排、仪表) | 主设备仲裁,从设备转发 |
| 协同唤醒 | 会议系统(多个麦克风阵列) | 云端仲裁,多设备协同 |
就近唤醒是我最常用的策略。每个设备采集到唤醒词后,把音频能量和到达时间差(TDOA)上报给仲裁节点。仲裁节点根据这些信息估算声源位置,选择最近的设备响应。
主从唤醒在车载场景很常见。中控屏作为主设备,后排屏和仪表屏作为从设备。所有唤醒事件先上报给中控,由中控统一决策。我记得有一次调试,后排屏的麦克风灵敏度比中控高,导致后排唤醒但中控响应。后来加了一个麦克风灵敏度校准步骤,才解决这个问题。
协同唤醒适合更复杂的场景。所有设备的音频流上传到云端,云端做多通道波束成形和声源定位,再下发唤醒指令。这种方式精度最高,但延迟也最大,一般用在会议系统这类对实时性要求不高的场景。
我的经验:跨屏唤醒的延迟控制很关键。从用户说出唤醒词到设备响应,建议控制在 500ms 以内。超过 800ms,用户就会觉得「卡」了。我曾经为了优化这 300ms,把仲裁协议从 HTTP 改成了 MQTT,效果立竿见影。
4.4 唤醒源仲裁流程图
下面这张图是我自己画的一个典型仲裁流程,你们可以对照着理解:
4.5 避坑指南与实战建议
我曾经踩过的坑:
- 时间不同步:各设备系统时间不一致,导致 TDOA 计算错误。解决方案是部署 NTP 或 PTP 时间同步协议。
- 麦克风灵敏度差异:同一型号的设备,麦克风灵敏度可能差 3~5dB。建议出厂前做灵敏度校准,并在运行时做动态归一化。
- 回声干扰:一个屏播放音乐,另一个屏的麦克风可能误检测到唤醒词。需要加回声消除(AEC)预处理。
测试建议:
- 准备至少 3 个屏,摆成三角形,用户站在中心点测试仲裁准确性。
- 测试边界场景:用户站在两个屏正中间、用户背对某个屏、环境噪声 60dB 以上。
- 用自动化脚本模拟多设备同时上报,验证仲裁模块的并发处理能力。
多屏唤醒的测试,说白了就是反复验证「谁该醒」这个决策是否正确。我习惯在测试报告中记录三个指标:仲裁准确率(正确设备唤醒次数/总唤醒次数)、仲裁延迟(从唤醒词结束到仲裁完成的时间)、误唤醒率(非目标设备唤醒次数/总测试次数)。这三个指标达标了,多屏唤醒才算真正可用。