语音交互设计:从唤醒到多轮对话的完整链路
语音交互,说白了就是让车听懂人话,还能说人话。我做了这么多年座舱交互,最深的感触是:语音做得好,用户会觉得这车有「灵魂」;做得不好,那就是个智障音箱。
今天咱们把语音交互的完整链路拆开来看。从唤醒到识别,再到理解、合成,最后是多轮对话。每个环节都有坑,我一个个说。
一、语音唤醒:第一道门槛
唤醒词设计,我踩过最大的坑。
记得有一次,我们给某车型做唤醒词「你好小智」。结果上市后用户投诉:开车时听音乐,系统自己就醒了。查了半天,发现是某首流行歌的副歌里有个「小智」的谐音。嗯,从那以后,我要求唤醒词必须做声学模型对抗测试。
唤醒词设计原则:
- 3-5个音节,太短容易误唤醒,太长用户嫌烦
- 避免常见词汇,比如「你好」「小X」这种太容易撞车
- 做多场景测试:音乐、空调、导航、电话都要测
- 双唤醒词策略:主唤醒词+备用唤醒词
唤醒的技术实现,目前主流有两种:
| 方案 | 优点 | 缺点 | 我推荐 |
|---|---|---|---|
| 传统DNN | 功耗低,响应快 | 准确率一般 | 适合低端芯片 |
| 端侧Transformer | 准确率高,抗噪强 | 功耗稍高 | 主流方案 |
我个人习惯用端侧方案。为什么?因为车机不能老联网,隧道、地库这些场景,本地唤醒是刚需。
二、语音识别:ASR的三大痛点
语音识别,业内叫ASR。我见过太多项目死在这步。
第一个痛点:噪声。车内环境其实很复杂,风噪、胎噪、空调声、乘客聊天。我曾经测试过一款车,时速120时识别率直接掉到60%。后来怎么解决的?多麦克风阵列+波束成形,定向拾取主驾声音。
第二个痛点:口音。中国方言太多了。四川话、东北话、粤语...我建议至少支持普通话+两种主流方言。别想着全支持,成本扛不住。
第三个痛点:打断。用户说话说到一半,突然被导航提示音打断,ASR就崩了。这里有个技巧:做语音活动检测(VAD),检测到用户还在说话,就延迟处理其他音频。
避坑指南:我曾经在项目里用云端ASR,结果隧道里全挂。后来改成端云结合:本地做基础识别,云端做纠错和热词更新。效果好了很多。
三、自然语言理解:让车真正「听懂」
ASR只是把声音转成文字,NLU才是理解意思。
举个例子:用户说「我有点冷」。ASR能识别出这几个字,但NLU要理解这是「调高空调温度」的意图。
NLU的核心是意图识别和槽位填充。我常用的框架:
# 伪代码示例
intent = classify("我有点冷") # 返回: adjust_temperature
slots = extract_slots("我有点冷") # 返回: {temperature: "升高", reason: "冷"}
# 然后执行
execute(intent, slots)
这里有个坑:用户表达方式千奇百怪。有人说「热死了」,有人说「空调开大点」,有人说「温度调低」。你想想看,如果每个表达都写一条规则,那得写到猴年马月?
我建议用预训练语言模型做语义理解。BERT、GPT这些模型,能泛化到没见过的表达。我在项目里用过一个轻量版BERT,参数量只有30M,车机跑得动。
注意:NLU的冷启动问题。新车上市,没有用户数据,模型效果会很差。我一般先做规则引擎兜底,等收集到足够数据再上模型。
四、语音合成:TTS的「人味」
语音合成,TTS。说白了就是让车说话。
早期TTS都是机械音,听着像机器人。现在主流是神经网络TTS,比如Tacotron、FastSpeech。效果已经很接近真人了。
但我发现一个问题:很多车厂只追求「像真人」,却忽略了场景适配。
- 导航播报:要清晰、干脆,语速稍快
- 闲聊对话:要自然、带感情,语速适中
- 警告提示:要严肃、有紧迫感,音量加大
我个人习惯做多风格TTS。同一个语音引擎,根据场景切换不同的音色和语速。比如导航时用「标准男声」,闲聊时用「温柔女声」。
还有一个细节:停顿。机器说话容易一口气说完,没有呼吸感。我让算法在句号处加200ms停顿,在逗号处加100ms。效果立竿见影。
五、多轮对话设计:真正的交互艺术
单轮对话很简单,问一句答一句。但多轮对话,才是体现功力的地方。
举个例子:
用户:帮我找个餐厅
系统:您想吃什么菜系?
用户:川菜
系统:附近有3家川菜馆,您想去哪家?
用户:第一家
系统:好的,已导航到「老四川川菜馆」
你看,这里经历了4轮对话。每一轮都在缩小范围,最终完成任务。
多轮对话的核心是对话状态管理。我常用的方案:
| 方案 | 适用场景 | 复杂度 |
|---|---|---|
| 基于槽位填充 | 简单任务(导航、空调) | 低 |
| 基于状态机 | 中等复杂度(音乐、电话) | 中 |
| 基于对话图 | 复杂任务(多步操作) | 高 |
我建议新手从槽位填充开始。为什么?因为简单、可控、不容易出bug。
多轮对话设计原则:
- 每轮只问一个问题,别让用户选择困难
- 提供默认值,用户可以直接说「好的」
- 支持跨轮纠错,比如用户说「不对,换第二家」
- 超时处理:用户不说话,主动询问或退出
我曾经做过一个失败的案例:多轮对话里没有超时机制。结果用户开车时没来得及回答,系统就一直等着,导航也不播了。后来加了30秒超时自动退出,问题解决。
六、实战经验:语音交互的「黄金三秒」
最后分享一个核心原则:黄金三秒。
用户发出语音指令后,系统必须在3秒内给出反馈。不管是识别结果、执行动作还是反问,总之不能让用户等。
为什么是3秒?因为驾驶场景下,用户注意力高度集中。等太久,用户会焦虑,甚至放弃语音操作。
我一般这样设计:
- 0-1秒:唤醒反馈(「叮」一声或灯亮)
- 1-2秒:识别结果展示(屏幕上显示文字)
- 2-3秒:执行动作或反问
如果识别慢怎么办?先给反馈,再慢慢处理。比如先显示「正在识别...」,等结果出来再更新。用户看到系统在动,就不会焦虑。
我的习惯:每次做语音交互设计,我都会亲自开车测试。把车开到高速上、开到闹市区、开到地库里。只有真实场景才能发现问题。纸上谈兵,做不出好产品。
好了,语音交互的完整链路就这些。下一章咱们聊手势交互,那个更有意思。