跳到主要内容

聊天机器人与语音识别:让机器接住你的话

这一章讲三件事: 聊天机器人的设计语言(五种类别、FSM vs 槽位(要收集的信息格)填充、意图/实体/例句); 语音从声波到文字的完整流水线(取样→特征→声学/语言模型→解码); 以及两场「数据 vs 模型」的实测对决。 原书这两章本是第四篇的出口:对话系统正是「语音进来→NLP 处理→语音出去」的消费方。

1. 聊天机器人:先选类别,再写代码

开宗明义:ChatBot 不一定有 AI——能自动应答就算。企业需要的更不是 Siri 式的天南地北,书里把需求分成五类,每类的验收标准完全不同1:

类别诉求要不要精准
闲聊型有趣、实时不需要
任务型(专家系统)特定领域专业推理要,但不求实时
FAQ 客服相似问题配知识库答案要,还要「浅显易懂」

剩下两类更接近「查东西」:

  • 信息检索(搜索):给出所有可能,由用户自己挑,不需要唯一答案。

  • 数据库应用:自然语言转 SQL(数据库查询语言)去订房、订位,要的是能执行。

书里的忠告排在所有技术之前:开工前先搞清需求,「以免开发出来不符合需求」。

对话管理的两条路

  • FSM(有限状态机):传统 IVR 的做法——问题按预设顺序问,每题答对才进下一状态,出错退回重来(银行 ATM 式);
  • 槽位填充(Slot Filling):借助 NLP,用户一句话「我要订 3 月 21 日双人房」系统直接处理,缺什么再问什么——书里对比的旧世界是「普通话请按 1,闽南话请按 2,客语请按 3,英语请按 4」2

设计红线:不能重复问相同的问题,必须设跳脱条件——状态重复两次以上可能就是 Bug;书里搬出的反面教材是微软聊天机器人 Tay:上线不到 24 小时学会骂人讲脏话,紧急下架3

设计语言:六个术语

技能(一个应用领域,如「订房」)/意图(一次对话的目的,如「查询空房」)/实体(人事时地物,用第 12 章的 NER(命名实体识别:标出人事时地物) 抽取)/例句(同一意图的各种说法,「我要订 3 月 21 日双人房」「明天、双人房一间」)/行动(信息集齐后执行)/开场白(随机问候防枯燥)4这套术语书里明说「几乎是业界的标准」——它来自 Dialogflow 一节,但适用于所有对话平台5

工具选型三层:ChatterBot(配接器架构,本身只有文字比对没 NLP)、Rasa(yml 配置意图与故事,「比较像传统 AIML,以问答例句当训练数据,相对僵硬,需大量人力维护,好处是精准控制回答」)、以及云平台 Dialogflow(Google 的 NLU 平台:today/tomorrow 自动转日期、全世界城市可识别)6

Dialogflow 有两个细节最能体现「对话即状态机」:追问意图有寿命——一般意图默认 5 轮对话、追问意图 2 轮,超过 20 分钟状态全部重置;复杂商业逻辑走 Webhook(POST 到你的服务)履行——书里演示了 Flask+SQLite 的订房计数器7。原书简体版 2022 年成书,书里的对话平台章节能当「概念标本」读,概念没过时,产品名会换。

2. 语音识别:从声波到文字

第一站:把物理变成数字

为什么值得做:讲话每分钟 150~200 字,打字只有 60 字/分——语音输入天然是更快的接口8。但声音先得数字化,两个关键参数9:

  • 取样频率:按奈奎斯特定理,要重建信号,取样频率必须覆盖信号最高频率的两倍。电话只传 4kHz 音频,所以取样 8kHz 就够;CD 44.1kHz、蓝光 96kHz——「够用的精度」由内容决定;
  • 量化(把每个样本的幅度转成整数):精度分 8 位、16 位、32 位(电话 8 位、网络电话 16 位)。再加编码(PCM 家族)就有了 wav 文件的全部要素。

第二站:波形不好分析,先转频域

不规则声波难分析,傅里叶变换把它拆成多个规则正弦波之和——时域变频域,频谱图(X 轴时间、Y 轴频率)能直接看出各频率的能量分布10。特征提取的标配是 MFCC:先分帧(每帧 25ms、重叠 10ms 防边界丢信号)、加窗、预加重高频,再变换取系数——深度学习之前的语音特征几乎都是它11

第三站:识别的完整流水线

为什么识别「整句」那么难?因为词太多、相似音太多。书里给出的答案是改变预测目标:以音素为单位——人语言中能区别意义的最小声音单位,英文约 40~50 个,中文还要加声调;bat 由 /b/、/æ/、/t/ 三个音素拼成,同音异字靠上下文兜底12

经典流水线四步,数十年主流13:

音频 → 特征提取(MFCC)
→ 声学模型(GMM):特征→音素→拼音→查拼音字典
→ 语言模型(HMM/n-gram):上一个词预测下一个词
→ 解码搜索:综合两种得分找最可能的词
(小词库维特比精确搜索;大词库用 Beam Search/WFST)

这条线背后的数学全部在第 02 章出现过:贝叶斯(由结果反推原因概率的公式)公式、GMM(多正态分布混合)、MLE、n-gram 语言模型。深度学习 2014 年才从「双向 LSTM+CTC 目标函数」切入这个领域,但工具箱至今仍以 GMM-HMM 为主——一个领域的新旧交替比论文标题慢得多14

语音识别的实践生态:Kaldi 与数据集

原书 14-5 交代了落地生态,两句带走:工具箱主流是 Kaldi——C++ 写的,把声学模型、语言模型、解码搜寻的函数库都囊括了,安装复杂且依赖 Shell 脚本,最好在 Linux 上跑;里面 OpenFst 对应 WFST 解码、Sclite 用来算词错误率(WER)。数据去 OpenSLR 免费下载——中文有 CN-Celeb(1000 位著名华人的三十万条语音),英文有 TIMIT、LibriSpeech15

3. 两场「数据 vs 模型」的实测

本章(也是全书应用篇)最有分量的,是作者用实验打的两次假:

第一场:曲风分类。 MFCC 喂 CNN,训练准确率 99.89%,验证只有 52.50%——教科书级过拟合。救它的不是更强的模型,而是数据操作:每首歌切 10 段(数据量×10),验证准确率升到 69.44%;书里同时引述多篇实验:数据增补帮助不大,数据分段才是特效药16

第二场:短指令识别。 bed/cat/happy 三词分类,测试集准确率高达 97.88%;但作者自己录音测试「差强人意」——原因有二:发音欠佳,以及录音处理方式与训练数据不同。追根溯源,书里对比了两个人的「happy」波形:起音点不同,波形差异巨大,「必须收集够多的训练数据才能找出共同的特征」17

两场的结论是同一句:识别系统对「训练数据与你真实场景的分布差异」极其敏感——换你自己上场,请自己收集训练数据18

4. 收官:三大基石

原书语音章的总结,恰好接回第 01 章:文字、影像、语音是 AI 应用的三大基石,自驾车、机器人、ChatBot、医疗诊断都盖在上面;第三波浪潮不再后继无力的部分原因,正是这些基本技术终于成熟——「这就像盖房子的地基」19。第 01 章作者赌「第三波不会入冬」,到这里给出了他自己的论据。

5. 可带走的

  1. ChatBot 五分类:闲聊/任务型/FAQ/检索/数据库——验收标准不同,开工前先选;
  2. FSM vs 槽位填充:按序问答 vs 一句话补全信息+缺啥问啥;设计红线=不重复提问、设跳脱条件(Tay 事件);
  3. 六个术语(技能/意图/实体/例句/行动/开场白)几乎是业界标准;追问意图有寿命(5 轮/2 轮,20 分钟重置);
  4. Rasa 僵硬但可控,云平台开箱即用——按「要多少控制权」选;
  5. 语音数字化的两个数:取样频率(奈奎斯特:电话 4kHz→取样 8kHz)与量化精度(8/16 位);
  6. 傅里叶变换把波形拆成正弦波,频谱图按时间看频率能量;MFCC 是经典特征(分帧 25ms 重叠 10ms);
  7. 识别以音素为目标(bat=/b/æ/t/,中文多声调);经典管线=特征→声学模型(GMM)→语言模型(n-gram)→解码搜索;深度学习 2014 年经双向 LSTM+CTC 进场;
  8. 过拟合的救星是数据操作:切 10 段=验证率 52.5%→69.4%;
  9. 自己录音自己认,准确率立刻打折——训练数据与真实场景要同分布;工具用 Kaldi(Linux),数据去 OpenSLR(中文 CN-Celeb)下载;
  10. 三大基石呼应第 01 章:文字/影像/语音成熟,第三波才有地基。

6. 原文地图

主题原书章原文位置
ChatBot 技术链(STT→NLU→TTS)第四篇扉页text/89-ch04.txt:11(搜「STT」)
五分类13-1 ChatBot类别text/109-ch13-13-1-chatbot.txt:7(搜「不限话题的机器人」) · text/109-ch13-13-1-chatbot.txt:9(搜「任务型机器人」)
槽位填充 vs IVR13-2 ChatBot设计text/110-ch13-13-2-chatbot.txt:55(搜「普通话请按1」)
Tay 事件、跳脱条件13-2 ChatBot设计text/110-ch13-13-2-chatbot.txt:59(搜「跳脱条件」)
六术语13-2 ChatBot设计text/110-ch13-13-2-chatbot.txt:35(搜「技能(Skill」) · text/110-ch13-13-2-chatbot.txt:41(搜「例句(Utterance」) · text/110-ch13-13-2-chatbot.txt:45(搜「开场白」)
ChatterBot/Rasa 评语13-4 ChatBot工具框架text/112-ch13-13-4-chatbot.txt:15(搜「ChatterBot采配接器」) · text/112-ch13-13-4-chatbot.txt:265(搜「AIML」)
Dialogflow 与寿命13-5 Dialogflow实践text/113-ch13-13-5-dialogflow.txt:9(搜「槽位填充」) · text/113-ch13-13-5-dialogflow.txt:201(搜「寿命(Lifespan」) · text/113-ch13-13-5-dialogflow.txt:281(搜「几乎是业界的标准」)
讲话 150 字 vs 打字 60 字第14章 语音识别text/114-ch14.txt:7(搜「讲话的速度约为每分钟150」)
奈奎斯特、量化14-1 语音基本认识text/115-ch14-14-1.txt:39(搜「奈奎斯特」) · text/115-ch14-14-1.txt:49(搜「量化(Quantization」)
傅里叶、频谱图、MFCC14-2 语音前置处理text/116-ch14-14-2.txt:7(搜「傅里叶变换(Fourier Transform」) · text/116-ch14-14-2.txt:39(搜「频谱图(Spectrogram」) · text/116-ch14-14-2.txt:47(搜「每帧是25ms」) · text/116-ch14-14-2.txt:43(搜「MFCC」)
音素、bat、流水线14-4 自动语音识别text/118-ch14-14-4.txt:11(搜「音素,又称音位」) · text/118-ch14-14-4.txt:13(搜「bat由3个音素」) · text/118-ch14-14-4.txt:27(搜「声学模型(Acoustic Model」)
GMM-HMM 与 CTC14-4 自动语音识别text/118-ch14-14-4.txt:33(搜「双向LSTM,以CTC」)
维特比与 Beam Search14-4 自动语音识别text/118-ch14-14-4.txt:81(搜「维特比」)
曲风过拟合与数据分段14-3 语音相关的深度学习应用text/117-ch14-14-3.txt:49(搜「99.89」) · text/117-ch14-14-3.txt:69(搜「69.44」)
happy 波形、自录打折14-3 语音相关的深度学习应用text/117-ch14-14-3.txt:91(搜「起始发音点」) · text/117-ch14-14-3.txt:207(搜「差强人意」)
三大基石14-6 总结text/120-ch14-14-6.txt:15(搜「三大基石」)

Footnotes

  1. 出处:「13-1 ChatBot类别」第 7 段(text/109-ch13-13-1-chatbot.txt:7,搜「不限话题的机器人」)。五类定义在同章第 7~13 段;「开工前先搞清楚需求」在第 15 段(搜「以免开发出来不符合需求」)。

  2. 出处:「13-2 ChatBot设计」第 55 段(text/110-ch13-13-2-chatbot.txt:55,搜「普通话请按1」)。FSM 的描述在第 53 段(搜「有限状态机」)。

  3. 出处:「13-2 ChatBot设计」第 59 段(text/110-ch13-13-2-chatbot.txt:59,搜「跳脱条件」)。

  4. 出处:「13-2 ChatBot设计」第 35 段(text/110-ch13-13-2-chatbot.txt:35,搜「技能(Skill」)、第 37 段(text/110-ch13-13-2-chatbot.txt:37,搜「意图(Intent」)、第 41 段(text/110-ch13-13-2-chatbot.txt:41,搜「例句(Utterance」)、第 43 段(text/110-ch13-13-2-chatbot.txt:43,搜「行动(Action」)与第 45 段(text/110-ch13-13-2-chatbot.txt:45,搜「开场白」)。

  5. 出处:「13-5 Dialogflow实践」第 281 段(text/113-ch13-13-5-dialogflow.txt:281,搜「几乎是业界的标准」)。

  6. 出处:「13-4 ChatBot工具框架」第 15 段(text/112-ch13-13-4-chatbot.txt:15,搜「ChatterBot采配接器」)、第 265 段(text/112-ch13-13-4-chatbot.txt:265,搜「AIML」)与「13-5」第 9 段(text/113-ch13-13-5-dialogflow.txt:9,搜「槽位填充」)。

  7. 出处:「13-5 Dialogflow实践」第 201 段(text/113-ch13-13-5-dialogflow.txt:201,搜「寿命(Lifespan」)与第 223 段(text/113-ch13-13-5-dialogflow.txt:223,搜「Webhook:撰写一个网页服务」)。

  8. 出处:「第14章 语音识别」第 7 段(text/114-ch14.txt:7,搜「讲话的速度约为每分钟150」)。

  9. 出处:「14-1 语音基本认识」第 39 段(text/115-ch14-14-1.txt:39,搜「奈奎斯特」)与第 49 段(text/115-ch14-14-1.txt:49,搜「量化(Quantization」)。CD 44.1kHz/蓝光 96kHz 在第 43 段。

  10. 出处:「14-2 语音前置处理」第 7 段(text/116-ch14-14-2.txt:7,搜「傅里叶变换(Fourier Transform」)与第 39 段(text/116-ch14-14-2.txt:39,搜「频谱图(Spectrogram」)。

  11. 出处:「14-2 语音前置处理」第 43 段(text/116-ch14-14-2.txt:43,搜「MFCC」)与第 47 段(text/116-ch14-14-2.txt:47,搜「每帧是25ms」)。

  12. 出处:「14-4 自动语音识别」第 9 段(text/118-ch14-14-4.txt:9,搜「相似音太多」)、第 11 段(text/118-ch14-14-4.txt:11,搜「音素,又称音位」)与第 13 段(text/118-ch14-14-4.txt:13,搜「bat由3个音素」)。

  13. 出处:「14-4 自动语音识别」第 23~29 段(text/118-ch14-14-4.txt:25,搜「信号处理与特征提取」)、第 27 段(text/118-ch14-14-4.txt:27,搜「声学模型(Acoustic Model」)与第 81 段(text/118-ch14-14-4.txt:81,搜「维特比」)。

  14. 出处:「14-4 自动语音识别」第 33 段(text/118-ch14-14-4.txt:33,搜「双向LSTM,以CTC」)。

  15. 出处:「14-5 自动语音识别实践」第 5 段(text/119-ch14-14-5.txt:5,搜「Kaldi是目前较为流行」)、第 21 段(text/119-ch14-14-5.txt:21,搜「OpenFst是加权」)与第 33 段(text/119-ch14-14-5.txt:33,搜「CN-Celeb」)。原文作者自陈因无 Linux 设备跳过 Kaldi 实践。

  16. 出处:「14-3 语音相关的深度学习应用」第 49 段(text/117-ch14-14-3.txt:49,搜「99.89」)与第 69 段(text/117-ch14-14-3.txt:69,搜「69.44」)。数据增补帮助不大的判断在第 63 段(搜「数据增补并无太大帮助」)。

  17. 出处:「14-3 语音相关的深度学习应用」第 91 段(text/117-ch14-14-3.txt:91,搜「起始发音点」)与第 207 段(text/117-ch14-14-3.txt:207,搜「差强人意」)。97.88% 在第 149 段(搜「97.88」)。

  18. 出处:「14-3 语音相关的深度学习应用」第 207 段(text/117-ch14-14-3.txt:207,搜「建议还是要自己收集训练数据」)。

  19. 出处:「14-6 总结」第 15 段(text/120-ch14-14-6.txt:15,搜「三大基石」)。