「智能音箱听懂你说话」这件事,模型只占一环。 Demo 把一个请求拆成七段,端到端 816 毫秒:等你说完(判尾)占 36.8%,是最大的一块; 真正的语音识别只占 11.8%。
这是全书第一节。 先把「人工智能」从概念拉到一条时间线上——你对着音箱说一句话,中间到底发生了什么。
一、一个请求,七段路
对着智能音箱说「明天天气怎么样」,它不是「一下听懂了」,而是走了七段:确认你开始说话、 确认你说完了、把声音转成字、判断你想干什么、查资料、把答案合成语音、再加上网络往返。 Demo 用一段 120 帧、每帧 20 毫秒(合计 2.4 秒)的合成音频模拟这句话: 第 18 帧(360 毫秒处)能量越过阈值,第 77 帧(1540 毫秒处)话音结束。 七段相加 816 毫秒。注意这是「用户说完到听见回应」的时间,不含他自己说话的那 1.18 秒。 所以第一件要建立的认识是:「AI 能力」和「AI 体验」不是一回事。 识别准确率再高,判尾多等半秒,用户就觉得它笨。
二、最大的一块不在模型里
拆开看:判尾 300 毫秒(36.8%)、TTS 首帧 150 毫秒(18.4%)、ASR 识别 96 毫秒(11.8%)、 网络往返 90 毫秒、检索 80 毫秒、VAD 确认 60 毫秒、意图分类 40 毫秒。 最大的两项加起来超过一半,而且都不是「模型推理」——一个是等静音,一个是等第一个音素合成出来。 把判尾从 300 毫秒压到 100 毫秒,端到端立刻掉到 616 毫秒。 代价是用户句中一停顿就被打断,体验反而更差。 这就是「能对话」和「能自然对话」之间那道坎:它不在模型精度里,在时序设计里。 这也是训练师要参与的事——决定「多等多久算说完」,本质是拿数据定阈值。
三、那「AI」到底在哪一段
七段里真正用到训练出来的模型的是三段:ASR(声学模型+语言模型)、意图分类(文本分类模型)、 TTS(声学模型)。其余四段是工程与时序。 所以一个产品的「智能感」,是三段模型加四段工程一起给的。只调模型不调时序,用户感觉不到; 只调时序不调模型,用户会立刻发现「它听不懂」。 后面十章会分别落到这三段上:训练数据怎么来(第七章)、模型怎么训(第四、五、八章)、 效果怎么评(第九章)、怎么上线(第十章)。
四、动手 Demo:七段相加,最贵的一段是「等你说话」
造一段 2.4 秒的音频能量序列,用阈值找出话音起止位置,再把语音助手的七个环节按耗时排开, 算每段占端到端多少。最后算一次「把判尾压短」的收益与代价。
frame_ms = 20
voice = energy > 0.02 # 能量过阈值的帧算「有声」
first = int(np.argmax(voice)) # 第一帧有声的位置
confirm = 3 # 连判 3 帧才认「开始了」
stages = [(u'VAD 确认', confirm * frame_ms),
(u'端点检测', 300), (u'ASR 识别 8 个字', 8 * 12), ...]
total = sum(v for _, v in stages)
实跑输出:
--------------------------------------------------------------------
一句话要过五道手:唤醒、判尾、识别、理解、合成
--------------------------------------------------------------------
音频总长 120 帧 × 20 毫秒 = 2400 毫秒
能量阈值 0.020(静止底噪约 0.0038)
话音起点 第 18 帧(360 毫秒处)
话音终点 第 77 帧(1540 毫秒处)
阶段 耗时(毫秒) 占端到端
----------------------------------------------
VAD 确认(连判 3 帧) 60 7.4%
端点检测(等静音) 300 36.8%
ASR 识别 8 个字 96 11.8%
NLU 意图分类 40 4.9%
知识库检索 80 9.8%
TTS 合成首帧 150 18.4%
网络往返 2 次 90 11.0%
端到端首字延迟 816 毫秒
用户说完到听见回应 816 毫秒(不含说话本身)
最大的一块 端点检测(等静音)(300 毫秒,36.8%)
判尾那 300 毫秒买的是「用户真的说完了」这个确认。把它压到 100 毫秒,
端到端就掉到 616 毫秒;代价是用户句中一停顿就被打断。
这就是「能对话」和「能自然对话」之间那道坎——它不在模型里,在时序里。
输出里话音起点是第 18 帧(360 毫秒),终点是第 77 帧(1540 毫秒)——音频一共 120 帧 2400 毫秒, 所以前后各留了一段静音。 七段合计 816 毫秒,最大的一块是判尾的 300 毫秒,占 36.8%。ASR 那一段只有 96 毫秒,占 11.8%。 把判尾压到 100 毫秒,总时长变成 616 毫秒——省下整整两百毫秒,但代价写在正文里: 句中停顿会被当成说完了。 这几个数字都是我给的工程估算(每字 12 毫秒、TTS 首帧 150 毫秒之类),不是任何厂商的实测。 它们的用处是让你看清比例,而不是让你记住某个具体毫秒数。
30 秒实验
- 对着手机语音助手说一句带停顿的话,看它会不会在你停顿处抢答。
- 把 Demo 里 ASR 的每字耗时改成 30 毫秒,算端到端变成多少。
- 想一想:为什么「不说话超过 N 秒就挂断」这个 N,不能定得太小也不能太大?
常见误区
- 「AI 就是模型」——模型只占七段里的三段,其余是时序与工程。
- 「延迟高就换更大的模型」——本例里最大的一块跟模型无关。
- 「判尾越短越灵敏」——短到 100 毫秒就会把正常停顿当结束。
自测三问(点开对答案)
1. 一次语音交互里,端到端最耗时的一段通常是哪一段? —— 等用户说完的「判尾」,本例占 36.8%,比识别本身大得多。 2. 「能对话」和「能自然对话」差在哪? —— 差在时序设计:判尾多久、能不能打断、首帧多快出来。 3. 七段里哪几段真的用到训练出来的模型? —— ASR、意图分类、TTS 三段,其余是工程与时序。看清一个请求之后,下一步是问:这些能力是怎么分出层级的。
- ☐ (本节完,下一节 1.1.2 层级分类:解析人工智能的能力)