当前位置: 首页 > 后端技术 > Node.js

理解语音交互:“若琪,今天杭州的天气”发生了什么?

时间:2023-04-03 14:21:54 Node.js

这篇文章是写给web开发者的,介绍一篇关于“语音交互”的科普文章。希望通过这篇文章,开发者能够了解什么是语音交互,以及语音交互在YodaOS中的技术实现。不知道YodaOS是什么?单击此处查看。作为Web开发人员,相信在面试中经常会问到“浏览器输入URL后会发生什么”这样的经典问题,可以帮助工程师了解整个Web技术栈。因此,本文将从“今天杭州的天气若起”这句话开始,试图让大家了解语音交互技术的全貌。以下章节涉及的知识点包括(可以先自己查):语音激活(VT)语音识别(ASR)语义理解(NLP)语音合成(TTS)技能(Skill)-语音时代的应用交互如下语音交互的过程:从上图可以看出:首先,用户(人)通过智能设备上的麦克风获取音频信号数据(PCM),通过“语音激活”模块,它可以正确地将带有激活词的数据转换成云端可以识别的音频数据(比如opus)。接下来VUIClient会通过WebSocket上传音频数据,云端通过一系列算法最终将音频数据转换成两部分:若琪今日天气”。NLP:JSON格式的数据。NLP也称为语义理解。它通常会将每个句子解析成两个重要的信息:一部分叫做意图(Intent),表示用户说这句话的目的,比如“今天的天气”,那么我们可以得到这句话的意图就是query_weather,这意味着我们正在查询天气;另一部分是具体的信息(Slots),一般是JSON中的一个对象,比如“今天的天气”在slots.date中会是today,意思就是这句话问的是“今天”的天气,同理,slots.location也可以用来表示“哪里”的天气;ASR和NLP会被VUIRuntime发送给具体的技能(Skill),每个A技能通过解析Intent和Slots进行相应的处理,最后生成一段文字,通过TTS回复给用户。以上其实就是一个语音交互的基本流程,下面会根据不同的模块进行介绍。语音激活过程在解释这个过程之前,让我们看看为什么需要它。当用户与智能设备交互时,由于媒介是语音(空气),不像传统的GUI(PC、平板、手机)设备,它们有独立的媒体平台(如屏幕、按钮等),所以交互目标很明确。生活中的空气是共享的,也就是说在进行交互之前,首先要判断用户是否想和你对话。比如你说“帮我开灯”,可能是让你老婆开灯,而不是如果齐。不管Alexa、若琪、小爱同学,还是天猫精灵,首先你需要给设备取一个好听的名字,让设备知道你是不是在和他/她说话。这就是语音激活模块所做的事情。然而,把这么简单的事情做好,却并不容易。首先,让我们了解什么是PCM。维基百科上的中文名称是:PulseCodeModulation。很难理解,对吧?如果想把整个概念说清楚,可能需要涉及到很多声学和信号科学??的知识,这里就不展开了。简单的说,你可以理解为你说一段话(语音),然后被麦克风记录成二进制数据,这个原始数据就叫做PCM。了解了PCM之后,我们再了解两个概念:AEC和自源消除。在智能音箱上,通常有麦克风和扬声器。麦克风在接收声音时,也会记录当前设备通过扬声器播放的声音。因此,AEC所做的就是将设备本身播放的音频从PCM数据中剔除,以减少干扰。.VT,激活算法模块。将AEC后的音频数据输入到VT算法/模型中,他会给出激活分数,最后通过分数判断是否激活。在激活模块内部,从麦克风获取语音数据后,会经过AEC处理,消除说话人的声音,然后通过其他降噪算法去除一些额外的噪声,最后得到处理后的音频数据会输入到VT,如果模型判断为激活,则后续的(音频)数据会通过VUIClient上传到云端ASR,直到云端判断用户说完结束交互。NLP交付流程前面提到,云端会交付两类数据:ASR和NLP。但是,没有提到云是如何生成这些数据的。这里我们先解释一些NLP的部分。ASR将音频数据转换成文本后,会输入到NLP服务(云端),那么云端是如何在本地将一段简单的文本解析成想要的JSON格式呢?NLP引入领域概念。比如“若琪,今天的天气”会划分到天气域,“我要开灯”是IoT域,“我想听音乐”是音乐域。有故事、时间、百科、导航和聊天等。可以简单理解为field是一个很大的范围,就是用户想和设备交流的话题,intent就是这个话题下需要设备帮助完成的任务。比如“今天的天气”,主语是天气,原意是询问。有了“领域”的概念,当我们获取到一串文本时,我们将能够通过预训练的模型、预定义的规则和说法来判断这段文本命中了哪些领域和意图,然后从文本中提取相关信息.最后将所有的信息组合成一个完整的JSON发送给设备。根据每个NLP命中字段或技能的不同,设备将其发送给相应的技能进行处理。CloudApp语音交互的输出比较简单,基本就是:TTS、音效和多媒体音乐,所以这里就有了VUIRendering的概念。在GUI时代,渲染的输出是对屏幕、声音、视频的交互控制。而VUI就是TTS、音效和多媒体音乐,相对于GUI来说还是相当简单的。因此,和Web一样,VUI渲染也分为服务端渲染和本地渲染:本地渲染:本地应用直接处理NLP数据,在本地执行业务逻辑,最终播放TTS、音效、多媒体音乐。服务器端渲染:NLP服务会先将数据发送到一个预先配置好的服务器,在服务器上执行业务逻辑,将TTS、音效、多媒体音乐转换成指令(Directives),返回给NLP服务.最后,设备收到后,只需要根据指令进行相应的操作即可。一般在服务端渲染的应用称为CloudApp。它的优点当然是实时更新,开发简单快捷,类似于Web的运行机制,缺点是能力有限,扩展依赖于协议本身的能力(类似于浏览器)沙盒)。盒子)。技能生命周期无论是在本地还是云端,技能都像我们熟悉的页面一样有生命周期,VUIRuntime会对其进行管理。在YodaOS中,每个技能都可以通过两种方式激活:用户通过语音NLP发出命令并激活它们。用户通过按下设备上的按钮触发启动。每个技能启动后,都会在技能栈的顶部,表示当前技能正在运行。此时可以控制设备的输出内容(TTS、音频和多媒体)。同时,如果一个技能已经在运行,则之前的技能会被销毁或暂停,这取决于它是瞬间(CUT)还是场景(SCENE)技能:CUT:一个技能用于单个会话,所以有当新技能命中时,会毫不犹豫的结束(摧毁)该技能。场景:适用于需要长时间互动的技能,例如音乐播放、游戏或音频故事。如果新请求的技能被CUT,则之前的技能会先暂停,CUT结束后恢复;如果新请求的技能是SCENE,则之前的技能将被替换。综上所述,其实一次语音交互远不止上面说的这些流程。在此,只希望抛砖引玉,与对语音交互感兴趣的工程师们分享一下我们在YodaOS上的一些心得。最后欢迎大家关注我们的VUIRuntime:https://github.com/yodaos-pro...。