Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3046316
  • 博文数量: 396
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4209
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-04 13:04
文章分类

全部博文(396)

文章存档

2022年(1)

2021年(2)

2020年(8)

2019年(24)

2018年(135)

2017年(158)

2016年(68)

我的朋友

分类: 嵌入式

2018-08-02 15:26:41

机器人通过机器视觉看到色彩斑斓的世界,但是人类最美好的不只是看到的,还有听到的,让机器人听懂人类的语音,同样是一样非常美妙的事情。

机器听觉,简单来说就是让机器人能听懂人说的话,以便更好的服务于人类。将语音——人类最自然的沟通和交换信息的媒介应用到智能机器人控制中,在机器人系统上增加语音接口,用语音代替键盘输入,并进行人机对话,不仅是将语音识别从理论转化为实用的有效证明,同时也是机器人智能化的重要标志之一。

一、语音识别原理

语音识别分为两步:

第一步是根据识别系统的类型选择能够满足要求的一种识别方法,采用语音分析方法分析出这种识别方法所要求额度语音特征参数,这些参数作为标准模式存储起来,这一过程称为学习训练

第二步就是识别检测阶段。根据实际需要选择语音特征参数,这些特征参数的时间序列构成了测试模版,将其与已存在的参考模版逐一进行比较,进行测度估计,最后经由专家知识库判决,最佳匹配的参考模版即为识别结果。

原理图如下:

image

二、让机器人听懂你说的话

ROS中集成了CMU SphinxFestival开源项目中的代码,发布了独立的语音识别功能包。

2.1 安装pocketsphinx功能包

首先,我们需要安装pocketsphinx功能包和其依赖的其他声音功能库。 

  1. sudo apt-get install gstreamer0.10-pocketsphinx
  2. sudo apt-get install gstreamer0.10-gconf
  3. sudo apt-get install ros-indigo-pocketsphinx
  4. sudo apt-get install ros-indigo-audio-common
  5. sudo apt-get install libasound2

    该功能包中的核心节点是recognizer.py文件。这个文件通过麦克风收集语音信息,然后调用语音识别库进行识别生成文本信息,通过/recognizer/output消息发布,其他节点就可以订阅该消息然后进行相应的处理了。

安装完成后我们就可以运行测试了。

首先,插入你的麦克风设备,然后在系统设置里测试麦克风是否有语音输入。

然后,运行包中的测试程序:

  1. roslaunch pocketsphinx robocup.launch

   此时,在终端中会看到一些加载功能包的信息。尝试说一些指定的语句,当然,必须是英语,例如:bring me the glasscome with me。在运行的终端中,你应该可以看到识别后的文本信息:

image

  该识别后的消息也会通过/recognizer/output话题发布,我们也可以直接看ROS最后发布的结果消息:

  1. rostopic echo /recognizer/output

image

   从之前的原理介绍上,我们语音识别是将输入的语音与模版进行对比。pocketsphinx

功能包是一种离线的语音识别功能,默认支持的模版有限,我们可以通过下面的命令来查看暂时支持的所有语音指令:

  1. roscd pocketsphinx/demo
  2. more robocup.corpus

    如果输入其他模版中不存在的语音信息,语音识别只能匹配最为接近的模版并输出。当然,你会觉得这些模版无法满足你的需求,在下一节中我们会学习如何添加自己需要的语音模版。

2.2       创建语音库

      语音库中的可识别信息使用txt文档存储,使用如下命令查看功能包中设计的语音指令:

  1. roscd rbx1_speech/config
  2. more nav_commands.txt

      你应该可以看到如下可识别的指令:

image

你可以根据需求,对以上文件进行修改和添加。

然后我们要把这个文件在线生成语音信息和库文件,这一步需要登陆网站,根据网站的提示上传文件,然后在线编译生成库文件。

image

点击选择文件,然后选择nav_commands.txt文件,再点击Compile Knowledge Base按键进行编译。编译完成后,下载“COMPRESSED TARBALL压缩文件,解压至config文件夹下,这些解压出来的”.dic”“.lm”文件就是根据我们设计的语音识别指令生成的语音模版库。我们可以给这些文件改个名字:

  1. roscd rbx1_speech/config
  2. rename -f 's/3026/nav_commands/' *

rbx1_speech/launch文件夹下看看voice_nav_commands.launch这个文件:

  1. > 
  2.    name="recognizer" pkg="pocketsphinx" type="recognizer.py" output="screen"> 
  3.      name="lm" value="$(find rbx1_speech)/config/nav_commands.lm"/> 
  4.      name="dict" value="$(find rbx1_speech)/config/nav_commands.dic"/> 
  5.   > 
  6. >


    可以看到,这个launch文件在运行recognizer.py节点的时候使用了我们生成的语音识别库和文件参数,这样就可以实用我们自己的语音库来进行语音识别了。

    通过之前的命令来测试一下效果如何吧:

  1. roslaunch rbx1_speech voice_nav_commands.launch 
  2. rostopic echo /recognizer/output



、让机器人说话

现在机器人已经可以按照我们说的话行动了,要是机器人可以和我们对话就更好了。再之前的安装过程中,ros-indigo-audio-common元功能包已经包含了文本转语音的(Text-to-speechTTS)的功能包sound_play。如果你还没有安装,可以使用下边的命令进行安装:

  1. sudo apt-get install ros-indigo-audio-common
  2. sudo apt-get install libasound2

      然后我们来测试一下。在一个终端中运行sound_play的主节点:

  1. rosrun sound_play soundplay_node.py

    在另外一个终端中输入需要转化成语音的文本信息:

  1. rosrun sound_play say.py "Greetings Humans. Take me to your leader."

有没有听见声音!ROS通过识别我们输入的文本,让机器人读了出来。发出这个声音的人叫做kal_diphone,如果不喜欢,我们也可以换一个人来读:

  1.  sudo apt-get install festvox-don  
  2.  rosrun sound_play say.py "Welcome to the future" voice_don_diphone

、与机器人对话

    接下来我们再玩点更高级的,综合使用前边学习的pocketsphinxsound_play功能包,再加入一点简单的人工智能,让机器人具备简单的自然语言理解能力,能够和我们进行简单的交流,就像苹果手机上的Siri助手一样。

4.1 人工智能标记语言——AIML

AIMLArtificial Intelligence Markup Language,人工智能标记语言)是一种创建自然语言软件代理的XML语言,由Richard Wallace和世界各地的自由软件社区在1995年至2002年发明。AIML主要用于实现机器人的语言交流功能,用户可以与机器人说话,而机器人通过一个自然语言的软件代理,也可以给出一个聪明的回答。目前AIML已经有了JavaRubyPython C C#Pascal等语言的版本。

AIML文件包含一系列已定义的标签。我们通过一个简单的实例学习一下AIML的语法规则。

  1.  version="1.0.1" encoding="UTF-8">
  2.   >
  3.     > HOW ARE YOU >
  4.     > I AM FINE >
  5.   >
  6. >

1.        标签:所有的aiml代码都需要介于标签之间,该标签包含文件的版本号和编码格式。

2.        标签:表示一个基本的知识块,包含一条输入语句和一条输出语句,用来匹配机器人和人交流过程中的一问一答和一问多种应答,但不允许多种提问匹配。

3.        标签:表示用户的输入语句的匹配,在上边的例子中,用户一旦输入 How are you ,机器人就会找到这个匹配。注意,标签内的语句必须大写。

4.