关于语音交互,你不得不知的技术知识
要更好的了解语音交互,那么就不得不了解背后的技术知识,国庆花了几天大致看完了宗成庆的《统计自然语言处理》,这本书主要讲的是语言交互里最关键的部分,即Natural languge Processing。为了自我梳理,把本书和看的吴军的《数学之美》 一起汇总了下,整理出来给需要的童鞋。
本文分四个部分,相对比较长,而且又是技术的,可能会比较难看进去,但是….要坚持。
- 一,语音交互的系统构成
- 二,语音交互面临的困难
- 三,自然语言处理的关键技术
- 四,具体场景语音交互实现的技术原理
一,语音交互的构成
语音交互一般包括三个模块:
- 语音识别 ASR(Automatic Speech Recognition),主要工作是将声音信息转化为文字。
- 自然语言处理 NLP(Natural Language Processing),主要工作是理解人们想要表达的意思,并给出合理的反馈。
- 语音合成TTS( Text To Speech),主要工作是指将文字转化为声音
《统计自然语言处理》给了更细致和完整的的人机对话系统组成结构,主要包括如下6个技术模块:
1,语音识别模块(speech recognizer)
实现用户输入语音到文字的识别转换,识别结果一般以得分最高的前n(n≥1)个句子或词格(word lattice)形式输出。(把用户说的语音转成文字)
2,语言解析模块 (language parser)
对语音识别结果进行分析理解,获得给定输入的内部表示。(即把用户说的转成机器理解的语言)
3,问题求解模块(problem resolving)
依据语言解析器的分析结果进行问题的推理或查询,求解用户问题的答案。 (即解决用户问题的模块,比如调用的百度搜索)
4,对话管理模块(dialogue management)
是系统的核心,一个理想的对话管理器应该能够基于对话历史调度人机交互机制,辅助语言解析器对语音识别结果进行正确的理解,为问题求解提供帮助,并指导语言的生成过程。可以说,对话管理机制是人机对话系统的中心枢纽。( 能够记录历史对话数据,通过训练能够给到用户更好的回答)
5,语言生成模块(language generator)
根据解析模块得到的内部表示,在对话管理机制的作用下生成自然语言句子。 (把回答的机器语言再转换成 口语语言)
6,语音合成模块(speech synthesizer)
将生成模块生成的句子转换成语音输出。(把口语语言再转化成语音)
二,语音交互的面临的困难
下图是知乎问题 为什么 Siri 听懂了我的话,还是不能做出有效的回答或准确的操作?的内容,很好的例证了语音交互里的最大的问题在于 语义理解,即准确的理解用户的对话目的。Siri可以很好的识别语音,即能知道用户说的是“ 明天早上9点帮我预约出租车去公司“,但是却不能理解你的对话目的,到底是要设定预约提醒日历,还是要提前预约出租车。
而造成Siri不能理解用户的原因是,1,原本的对话有多个含义,2, 原本的对话里 滴滴打车对于Siri来说是未知语言。(当时内置系统并没有对接滴滴)
因此语音交互最终需要解决的关键问题是歧义消解(disambiguation)问题,和未知语言现象的处理问题。
理解了这个背景,我们在和Siri对话或者设计语音交互的功能时就能理解它们为什么不能做出有效的回答。下面一篇讲的就是怎么做语义理解。
三,自然语言处理的关键技术
怎么让机器去理解 “ 明天早上9点帮我预约出租车去公司“ 这句话, 就像对于一个2年纪小孩子,它可能听得懂但是看不懂,那么我们是不是先要要教她这句话是这样读:
“ 明天/早上/9点/帮/我/预约/出租车/去/公司”——即 中文分词
然后教她意思是 “明天早上9点/帮我/预约出租车/去公司”——即 句法结构
然后告诉她这里的“预约”不是预约提醒,即语义分析
最后 “刚说的明天早上9点帮我预约出租车去公司。 但是我现在不需要了”—是转折,即篇章分析
1,中文分词
词是对话最小单元,因此理解一句话的前提是能够知道对话里用了哪些词。
比如:“上海大学城书店在哪里”,就需要拆分成“上海/大学城/书店/在/哪里”,而不是: “上海大学/城/书店/在/哪里”
下面是《数学之美》吴军讲的 分词的统一方法,他讲的比较直接好了解,就直接截图了。
不同应用的 分词颗粒度大小是不同的,早期谷歌的分词采用Basic Technology公司的通用分词器,分词结果没有针对搜索进行优化,后期还专门为搜索设计和实现了自己的分词系统。
2, 句法分析(syntactic parsing)
文中的解释是句法分析是自然语言处理中的关键技术之一,其基本任务是确定句子的句法结构。 其实说简单点, 我的理解是,中文分词是把一句话拆分成 word1, word2, word3,那么句法分析就是把一句拆分成 主语,谓语,宾语….。
通过句法分析,能够更快的理解一句话,比如在理解英文对话的时候,虽然有些形容词看不懂,但是我们找到动词和主语或宾语后,能够大致知道这句话的意思。
基于概率上下文无关文法(probabilistic (或stochastic)context-free grammar, PCFG或SCFG)的短语结构分析方法可以说是目前最成功的语法驱动的统计句法分析方法,有兴趣的可以深入了解下。
3,语义分析
语义分析主要是词义消歧和语义角色标注。
词义消歧主要是因为一词多义非常普遍,如,英语中的单词bank的含义可以是“银行”,也可以是“河岸”,到底是哪个需要根据上下文环境,自动排除歧义。
比如 “ take me to the bank in the north “ 到底是去北边的银行还是去北边的河岸。
词义消歧方法分为有监督的消歧方法(supervised disambiguation)和无监督的消歧方法(unsupervised disambiguation)。在有监督的消歧方法中,可以根据训练数据得知一个多义词所处的不同上下文与特定词义的对应关系,那么,多义词的词义识别问题实际上就是该词的上下文分类问题,一旦确定了上下文所属的类别,也就确定了该词的词义类型。
在无监督的词义消歧中,由于训练数据未经标注,因此,首先需要利用聚类算法对同一个多义词的所有上下文进行等价类划分,如果一个词的上下文出现在多个等价类中,那么,该词被认为是多义词。然后,在词义识别时,将该词的上下文与其各个词义对应上下文的等价类进行比较,通过上下文对应等价类的确定来断定词的语义。
4,篇章分析
篇章在英文中常用“discourse”表示,在汉语里常有篇章、语篇或者话语之说。篇章分析的最终目的是从整体上理解篇章,最重要的任务之一是分析篇章结构。
在对话的过程中我们很少长篇大论,但是在多轮对话时,一整段对话其实是一个篇章。所以需要理解每句话之间或者说篇章的结构。
比如:“ 帮我定个明天早上7点的闹钟“ “ 算了,太早了,帮我改成8点“ 那么通过理解两句话的结构,我们知道需要去取消之前7点的闹钟,并设置一个8点的闹钟。
四,人机对话系统的实现技术
下面是《统计自然语言处理》里介绍的一种口语解析方法——基于规则和HMM的统计解析方法,文章并没有说这是人机对话系统的标准实现技术,而且表示这种做法有一定缺陷。 我们只需要了解这种根据词汇分类,语义组块分析后生成机器能够理解的对话分析机制。
基于规则和HMM的统计口语解析方法是
由词汇分类模块对其词汇进行词义分类,即把句子中的每一个词映射到相应的词义类中。语义组块分析器从句子对应的词义类序列中分析出语义组块,组块分析器输出的是一个语义组块序列。统计解析模块从语义组块序列分析出句子IF表示的主要框架。语义组块解释模块把各个语义组块解释为相应的IF表达式片段。 经过对上述两部分的合并,得到最终的IF(interchange format)表达式(国际语音翻译先进研究联盟C-STAR采用的一种称作中间转换格式的语义表示形式,以有利于多语言互译)。
1,IF表达式格式:
Speaker:Speech-Act[+Concept]*[(Argument=Value[,Argument=Value]*)]
例:明天我想预订一个单人间。
IF:c:give-information+reservation+room(room-spec=(room-type=single, quantity=1), reservation-spec=(time=(relative-time=tomorrow)))
该IF的含义为:说话人为“c”,该句子的意图是提供信息,主题概念为“预订房间”,关于“房间”的具体信息由一组“属性-值”对描述:房间类型(room-type)为单人间(single),数量(quantity)为1;“预订”的具体要求通过“相对时间(relative-time)”这一参数描述,参数值取“明天(tomorrow)”。
2.词汇分类
据词汇的语义功能,把每个词汇划分到不同的类。其分类依据是词汇在句子中的语义功能,语义功能相同的词汇归为一类,例如,“单人间”和“双人房”属于同一个语义类;“大”和“小”虽然词义不同,但在句子中的语义功能是相同的,所以,把它们也归为一类。
3,语义组块分析
根据语义组块具体的意义,对语义组块进行了语义分类。例如,所有对时间的表达,“明天”、“后天”、“星期一”、“三天后”等,都归属于时间类语义组块,记作TIME;对房间类型的表达,如“单人间”、“双人间”、“一个人住的房间”、“宽敞的房间”等,都归属于房间类语义组块,记作ROOM_TYPE。
4,统计解析过程
手工标注一定数量的语料。对于语料中的每一个句子,首先对它进行语义组块分析,得到该句子对应的组块序列,然后给出该句子的IF语义表示,最后把IF语义表示线性化并且和语义组块序列对齐。用这些语料来对模型的参数进行训练,就得到一个统计解析模型。
对于一个需要解析的句子,首先对它进行语义组块分析,得到该句子对应的语义组块序列,然后把语义组块序列作为统计解析模型的输入,则解析模型的输出就是输入句子的线性化后的IF框架。
5,组块解释方法
在语义组块分析时,通过规则方法获得语义组块的同时,也可以得到语义组块内部的层次结构,但这种层次结构并不是我们所需要的IF表示,因此,我们设计了语义组块解释模块,用来把这种层次结构转换为IF表示。语义组块解释模块是与组块分析模块配合工作的,组块分析过程中用到的每一条规则都对应一个规则的解释方法,利用这些解释方法可以把规则所涉及的词汇解释为相应的IF表示。循环调用生成语义组块的每一条规则所对应的解释子程序,就可以得到该语义组块对应的IF层次表示。
6,IF的生成
从上面的介绍可以看出,基于HMM的解析模块输出的结果和语义组块解释的结果都只是IF的片段,只有把它们合并才能得到完整的IF表示。语义组块解释模块把每个语义组块转换为IF片段,同时每个语义组块经过统计解析模块解析后,又对应一个标注符号,并且该标注符号最终要作为IF表示中的一个结点。在各组块合并时,IF生成器把语义组块解释结果作为该结点的子结点,把经过简化处理的concepts序列还原为原来的concepts序列,这样就得到了IF表示。
至此,本文讲完了,感谢&撒花。并推荐 宗成庆的这本《统计自然语言处理》。
本文由 @少女璐 原创发布于人人都是产品经理。未经许可,禁止转载。
题图来自Pixabay,基于CC0协议
另外小吐槽一下少女楼主的文风,CC0,HMM好多专业名称的缩写,读起来不适
刚刚看过《数学之美》,里面有些统计学知识的推导还是挺难懂的,楼主基础蛮好的,本人也从事语音产品工作,期待有机会进行交流
同涉及语音产品中,可否留个方式交流?
18681503479 您加我吧