欢迎光临散文网 会员登陆 & 注册

【自己动手做一台SLAM导航机器人】第七章:语音交互与自然语言处理

2023-04-02 15:34 作者:小虎哥哥爱学习  | 我要投稿

本专栏目录:

视频教程

https://www.bilibili.com/video/BV1jS4y1a7Lz

这一章将进入机器人语音交互的学习,让机器人能跟人进行语音对话交流。这是一件很酷的事情,本章将涉及到语音识别、语音合成、自然语言处理方面的知识。本章内容:

1.语音交互相关技术

2.机器人语音交互实现

3.自然语言处理云计算引擎

下面这本书是本篇文章的参考文献,大家有需要可以入手一本:

1.语音交互相关技术

要机器人能完成跟人对话,涉及到语音识别、语音合成、自然语言处理等技术。简单点说,语音识别就是将人的声音转换成文字便于机器人计算与理解;语音合成就是将机器人要说的文字内容转换为声音;自然语言处理相当于机器人的大脑,负责回答提问。整个语音交互的过程,如图1。

(图1)语音交互过程

1.1.语音识别

语音识别技术,也被称为自动语音识别Automatic Speech Recognition(ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列,如图2。

(图2)语音识别

语音识别技术所涉及的领域包括:信号处理、模式识别、概率论和信息论、发声机理和听觉机理、人工智能等等。语音识别技术的最重大突破是隐马尔科夫模型Hidden Markov Model的应用。从Baum提出相关数学推理,经过Labiner等人的研究,卡内基梅隆大学的李开复最终实现了第一个基于隐马尔科夫模型的非特定人大词汇量连续语音识别系统Sphinx。此后严格来说语音识别技术并没有脱离HMM框架。当然神经网络方法是一种新的语音识别方法,人工神经网络本质上是一个自适应非线性动力学系统,模拟了人类神经活动的原理,具有自适应性、并行性、鲁棒性、容错性和学习特性,其强的分类能力和输入-输出映射能力在语音识别中都很有吸引力。但由于存在训练、识别时间太长的缺点,目前仍处于实验探索阶段。

1.2.语音合成

语音合成是语音识别的逆过程,也称为文字转语音(TTS),它是将计算机自己产生的、或外部输入的文字信息转变为可以听得懂的、流利的汉语或其他口语输出的技术。如图3。

(图3)语音合成

TTS过程包括这些步骤:语言处理,在文语转换系统中起着重要的作用,主要模拟人对自然语言的理解过程,文本规整、词的切分、语法分析和语义分析,使计算机对输入的文本能完全理解,并给出后两部分所需要的各种发音提示;韵律处理,为合成语音规划出音段特征,如音高、音长和音强等,使合成语音能正确表达语意,听起来更加自然;声学处理,根据前两部分处理结果的要求输出语音,即合成语音。

1.3.自然语言处理

有了语音识别和语音合成,要让机器人能智能的对答如流的和人交谈,还需要赋予机器人以灵魂。自然语言处理技术(NLP)就是来赋予聊天机器人内在灵魂的。

NLP是计算机领域与人工智能领域中的一个重要分支。由于数据的大幅度增强、计算力的大幅度提升、深度学习实现端到端的训练,深度学习引领人工智能进入有一个高潮。人们也逐渐开始将如日中天的深度学习方法引入到NLP领域,在机器翻译、问答系统、自动摘要等方向取得成功。经过互联网的发展,很多应用积累了足够多的数据可以用于学习。当数据量增大之后,以支持向量机(SVM)、条件随机场(CRF)为代表的传统浅层模型,由于模型过浅,无法对海量数据中的高维非线性映射做建模,所以不能带来性能的提升。然而,以CNN、RNN为代表的深度模型,可以随着模型复杂度的增大而增强,更好贴近数据的本质映射关系。一方面,深度学习的word2vec的出现,使得我们可以将词表示为更加低维的向量空间。另一方面,深度学习模型非常灵活,使得之前的很多任务,可以使用端到端的方式进行训练。

(图4)基于深度学习的自然语言处理过程

为了让大家更好的理解基于深度学习的自然语言处理过程,举一个比较通用的模型,如图4。问题句子通过Seq2Seq循环神经网络进行预处理和编码,然后进入答案搜索,接着通过DQN强化学习网络对问答策略进程学习。这样,随着时间的推移,问答系统回答问题的水平会越来越高,就达到了不断在线学习的目的了。

2.机器人语音交互实现

其实要自己做一款语音对话机器人还是很容易的,我们只需要选择好语音识别、语音合成、自然语言处理的技术,就可以在一款树莓派3开发板上实现了。由于语音交互系统的核心技术是云端自然语言处理技术,所以我们可以选择网上免费提供的语音识别、语音合成等现有方案,将主要精力用在云端自然语言处理技术的研发上。语音识别与语音合成SDK有:科大讯飞、百度语音、Google…,对于我们墙内玩家…(Google头疼)。经过我自己的实测,发现比较好用的免费SDK是科大讯飞家的,所以强烈推荐。为了测试方便,我先推荐图灵机器人API作为云端自然语言处理技术。等大家将整个语音交互系统的工作原理学会后,随时可以将图灵机器人API替换成自己的云端服务器,从而将主要精力转移到云端自然语言处理技术的研发上。说了这么多,我们先来看看咱们的机器人语音交互软硬件实现的真容吧,如图5。

(图5)机器人语音交互软硬件实现

USB麦克风拾取声音,USB声卡和音响播放声音,树莓派3开发板上运行语音识别、语音合成、QA及NLP请求。其中,语音识别和语音合成采用科大讯飞的SDK,QA及NLP请求调用图灵机器人的API接口。

这里特别说明一下,为什么选用USB声卡而不用树莓派自带AV声卡的原因。你可以直接将耳机插口插入树莓派的AV接口试试,肯定很酸爽!杂音太大。这里就需要硬件支持。杂音原因: 因为树莓派3的AV接口是音频和视频合并输出的,这个接口是美标接口,而在中国是国标的,接口的接地和音频是相反的,这就导致根本不能用了。另外对播放器的支持并不完善。

2.1.获取科大讯飞的SDK

科大讯飞提供用于研究用途的语音识别、语音合成的免费SDK,科大讯飞分发该SDK的形式是库文件(libmsc.so)+库授权码(APPID),库文件libmsc.so与库授权码APPID是绑定在一起的,这也是大多说商业软件分发的方式。

注册科大讯飞账号:

首先,前往讯飞开放平台(https://www.xfyun.cn),注册科大讯飞账号,注册好后,就可以进入自己的控制台进行设置了,如图6。

创建应用:

我们要在科大讯飞的开放平台创建我们需要的应用,这样讯飞就根据应用类型给我们生成对应的SDK库。

进入讯飞开放平台的控制台后,找到左侧栏的[创建应用],按要求填写各个选项,注意[应用平台]一栏填Linux,因为我们用的树莓派3开发板装的是Linux系统,如图7。

创建应用完成后,就要给该应用添加相应的AI技能了,由于我们需要讯飞的在线语音合成、在线语音识别(也就是语音听写),所以添加这两个服务就行了。如图8。

图8添加语音合成与识别服务

申请树莓派3平台对应的Linux SDK库:

由于科大讯飞开放平台默认只提供PC端x86架构的Linux库,所以如果我们想在树莓派3(树莓派3为ARM架构)上使用科大讯飞的Linux SDK库,就需要另外申请。其实申请方法也很简单,进入科大讯飞中我的语音云页面:

http://www.xfyun.cn/index.php/mycloud/app/linuxCrossCompile

进行树莓派Linux平台库文件交叉编译申请,选择应用(必须是linux平台的应用),按照默认勾选全部在线服务,平台架构ARM硬件型号Broadcom BCM2837(树莓派3代b型,即树莓派3的SOC,其余版本树莓派,树莓派2为BroadcomBCM2836,更早的版本为BroadcomBCM2835),处理器位数32,运行内存填了1GB。最后记得填上自己的邮箱,提交后,如填写无误正确,你的邮箱将收到可下载库的链接,下载解压后得到libmsc.so,这个库文件就是我们申请的树莓派3平台对应的Linux SDK库了。如图9。关于交叉编译器和编译脚本,从这里http://pan.baidu.com/s/1pLFPTYr下载,具体交叉可以参考这一篇

http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=32028&highlight=

关于这个库文件对应的库授权码APPID,可以在[我的应用]界面查看,如图10。

2.2.编译安装讯飞语音交互实例ROS版DEMO

利用科大讯飞提供的SDK库文件和官方API说明文档,我们就可以开发出自己的语音交互实例程序,当然也可以开发对应的ROS程序。在我们的miiboo机器人上开发的语音交互ROS功能包叫miiboo_asr。miiboo_asr功能包文件组织结构,如图11。其中lib文件夹下存放科大讯飞提供的libmsc.so库文件,iat.cpp是语音识别节点源文件,tts.cpp是语音合成节点源文件,qa_nlp.cpp是QA&NLP逻辑处理节点源文件,其他的文件我们可以不用关心。

(图11)miiboo_asr功能包文件组织结构

了解了miiboo_asr功能包的基本情况后,我们就开始编译安装吧。首先,将miiboo_asr包拷贝到~/catkin_ws_apps/src/目录下。然后将上面申请到的树莓派3平台对应的Linux SDK库libmsc.so文件拷贝到miiboo_asr/lib/中,并将miiboo_asr/CMakeLists.txt文件中有关libmsc.so的路径替换为你存放该libmsc.so的实际路径。如图12。

(图12)CMakeLists.txt文件中有关libmsc.so的路径修改

接着我们需要将miiboo_asr/launch/xf.launch文件中的各个appid、声卡硬件地址、麦克风硬件地址设置成自己实际的值。关于与libmsc.so库绑定的appid上面已经介绍了查看方法,而声卡硬件地址、麦克风硬件地址的查询也很简单。

麦克风硬件地址的查询直接使用命令arecord -l,如图13。

(图13)麦克风硬件地址的查询

在这里麦克风录制设备处于卡1,设备0,于是我们的麦克风硬件地址就是“plughw::CameraB409241”。

声卡硬件地址的查询直接使用命令aplay -l,如图14。

(图14)声卡硬件地址的查询

在这里声卡播放设备有三个,卡0中的设备0为3.5音频输出,卡0设备1为HDMI音频输出,卡2设备0为USB声卡输出。这里我推荐使用USB声卡输出,所以我们的声卡硬件地址就是“plughw:DAC”。

在编译miiboo_asr前,我们还需要安装一些依赖项,其实就是麦克风录音和音乐播放工具,安装命令如下:

现在可以编译miiboo_asr了,编译命令如下:

编译完成后,就可以运行语音交互节点来实现语音对话了,温馨提醒,请确保树莓派已连接网络,因为语音交互节点运行时需要访问网络。启动语音交互各个节点很简单,直接一条命令:

节点都运行起来后,会听到欢迎语句“你好,欢迎使用miiboo机器人语音控制系统”,之后就可以对着麦克风说出自己的指令,经语音识别被转换为文本,文本经图灵机器人得到应答,并通过语音合成使我们能听到回答的声音。这样一个语音交互的聊天机器人就诞生了,尽情享受和机器人聊天的乐趣吧^_^

这里说明一下,如果你使用我们的miiboo机器人,那么miiboo机器人上已经安装编译好了miiboo_asr功能包,所以只需要上面roslaunch miiboo_asr xf.launch这条启动命令,就可以开始机器人聊天之旅。但是,miiboo机器人上安装的miiboo_asr功能包的libmsc.so的访问次数和频率是有限制的,只能供学习使用。如果大家需要将miiboo_asr功能包用来二次开发或实际应用,就需要按照上面的步骤去科大讯飞官网申请自己的SDK库了。

3.自然语言处理云计算引擎

这一节的内容作为展望内容,供大家参考和进一步的学习研究。前面也提过,语音交互系统的核心技术是云端自然语言处理技术,等我们采用成熟的方案将语音识别、语音合成等基础问题解决后,就要投入自然语言处理技术的研发了。我的想法是这样的,首先需要在云端服务器上搭建一个WEB服务器,然后需要有一个网络爬虫系统不断从互联网上爬去各种训练数据,接着需要搭建一个深度学习框架并运行在线学习算法不断的利用爬到的数据学习,这样自然语言处理云计算引擎同时处于学习和工作状态,图15是我构想的系统结构。

(图15)自然语言处理云计算引擎

后记

为了防止后续大家找不到本篇文章,我同步制作了一份文章的pdf和本专栏涉及的例程代码放在github和gitee方便大家下载,如果下面给出的github下载链接打不开,可以尝试gitee下载链接:

  • github下载链接:https://github.com/xiihoo/DIY_A_SLAM_Navigation_Robot

  • gitee下载链接:https://gitee.com/xiihoo-robot/DIY_A_SLAM_Navigation_Robot

技术交流

QQ技术交流群:117698356

参考文献

[1] 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.


【自己动手做一台SLAM导航机器人】第七章:语音交互与自然语言处理的评论 (共 条)

分享到微博请遵守国家法律