4. 语音交互系统架构

语音唤醒,说白了就是设备一直在「听」,听到关键词就「醒」过来。单屏设备上这事很简单——谁听到谁醒。但多屏场景下,客厅一个屏、卧室一个屏、厨房一个屏,同时喊一嗓子「你好,小X」,三个屏都醒了,那画面就有点尴尬了。

我最早做这个功能时,觉得不就是个唤醒词检测嘛,能有多复杂?结果第一次联调,三个屏同时应答,用户直接懵了。嗯,从那以后我才认真研究起唤醒源仲裁和跨屏策略来。

4.1 单屏唤醒 vs 多屏唤醒

先看最基础的对比:

对比项 单屏唤醒 多屏唤醒
唤醒源数量 1 个麦克风阵列 2~N 个麦克风阵列(跨设备)
唤醒决策 本地 VAD + KWS 直接判定 需仲裁模块统一决策
用户体验 谁唤醒谁响应 仅最近/最合适的设备响应
技术难点 低功耗、远场识别 时间同步、能量比较、冲突消解

单屏唤醒,每个设备各自为政。麦克风阵列检测到唤醒词,本地 VAD 确认不是噪声,直接触发唤醒事件。这个流程我做过很多次,核心指标就两个:唤醒率和误唤醒率。一般要求唤醒率 > 95%,误唤醒率 < 1 次/24 小时。

多屏唤醒就不一样了。你想想看,三个屏同时听到「你好小X」,每个屏的本地 KWS 都输出一个唤醒置信度。这时候如果各自直接响应,用户就会听到三重回声。所以必须引入一个唤醒源仲裁机制。

4.2 唤醒源仲裁

仲裁的核心逻辑,说白了就是「谁最该醒」。我个人习惯把仲裁策略分为三个层级:

  1. 能量优先:比较各设备采集到的唤醒词音频能量,能量最大的设备离用户最近,优先响应。
  2. 置信度优先:如果能量接近(比如用户站在两个屏中间),则比较 KWS 输出的置信度分数。
  3. 优先级兜底:前两者都无法区分时,按预设的设备优先级(如客厅 > 卧室 > 厨房)决定。

核心公式(简化版)

唤醒得分 = w1 * 归一化能量 + w2 * 置信度 + w3 * 设备优先级

得分最高的设备获得唤醒权。w1、w2、w3 为权重系数,需根据实际场景调优。

我在项目中遇到过一个问题:两个屏放在同一房间,能量和置信度都差不多,结果仲裁结果反复跳变。后来加了一个仲裁锁定时间——一旦选定唤醒设备,锁定 2 秒内不再重新仲裁。这个坑,我建议你们提前埋上。

4.3 跨屏唤醒策略

仲裁只是第一步。真正麻烦的是跨屏场景下的唤醒策略。我把它分成三种典型模式:

策略模式 适用场景 实现方式
就近唤醒 家庭多屏(客厅、卧室、厨房) 能量比较 + 声源定位
主从唤醒 车载多屏(中控、后排、仪表) 主设备仲裁,从设备转发
协同唤醒 会议系统(多个麦克风阵列) 云端仲裁,多设备协同

就近唤醒是我最常用的策略。每个设备采集到唤醒词后,把音频能量和到达时间差(TDOA)上报给仲裁节点。仲裁节点根据这些信息估算声源位置,选择最近的设备响应。

主从唤醒在车载场景很常见。中控屏作为主设备,后排屏和仪表屏作为从设备。所有唤醒事件先上报给中控,由中控统一决策。我记得有一次调试,后排屏的麦克风灵敏度比中控高,导致后排唤醒但中控响应。后来加了一个麦克风灵敏度校准步骤,才解决这个问题。

协同唤醒适合更复杂的场景。所有设备的音频流上传到云端,云端做多通道波束成形和声源定位,再下发唤醒指令。这种方式精度最高,但延迟也最大,一般用在会议系统这类对实时性要求不高的场景。

我的经验:跨屏唤醒的延迟控制很关键。从用户说出唤醒词到设备响应,建议控制在 500ms 以内。超过 800ms,用户就会觉得「卡」了。我曾经为了优化这 300ms,把仲裁协议从 HTTP 改成了 MQTT,效果立竿见影。

4.4 唤醒源仲裁流程图

下面这张图是我自己画的一个典型仲裁流程,你们可以对照着理解:

唤醒源仲裁流程图 唤醒源仲裁流程图 用户说出唤醒词 多设备本地 KWS 检测唤醒词 各设备上报能量 + 置信度 仲裁节点计算唤醒得分 选择得分最高的设备 选定设备响应唤醒 说明:仲裁锁定时间 2s,锁定期间不重新仲裁,避免唤醒设备反复切换

4.5 避坑指南与实战建议

我曾经踩过的坑:

  • 时间不同步:各设备系统时间不一致,导致 TDOA 计算错误。解决方案是部署 NTP 或 PTP 时间同步协议。
  • 麦克风灵敏度差异:同一型号的设备,麦克风灵敏度可能差 3~5dB。建议出厂前做灵敏度校准,并在运行时做动态归一化。
  • 回声干扰:一个屏播放音乐,另一个屏的麦克风可能误检测到唤醒词。需要加回声消除(AEC)预处理。

测试建议:

  • 准备至少 3 个屏,摆成三角形,用户站在中心点测试仲裁准确性。
  • 测试边界场景:用户站在两个屏正中间、用户背对某个屏、环境噪声 60dB 以上。
  • 用自动化脚本模拟多设备同时上报,验证仲裁模块的并发处理能力。

多屏唤醒的测试,说白了就是反复验证「谁该醒」这个决策是否正确。我习惯在测试报告中记录三个指标:仲裁准确率(正确设备唤醒次数/总唤醒次数)、仲裁延迟(从唤醒词结束到仲裁完成的时间)、误唤醒率(非目标设备唤醒次数/总测试次数)。这三个指标达标了,多屏唤醒才算真正可用。