智能机器人当然少不了语音功能,这篇文章将介绍一下ROS中的语音识别与合成。
参考《ros by example》 。
准备工作
1.运行以下命令:
sudo apt-get install gstreamer0.10-pocketsphinx
sudo apt-get install ros-indigo-pocketsphinx
sudo apt-get install ros-indigo-audio-common
sudo apt-get install libasound2
sudo apt-get install gstreamer0.10-gconf(indigo版本,必须安装)
2.下载pocketsphinx代码,地址:https://github.com/mikeferguson/pocketsphinx,记得编译。
$cd catkin_ws/src
$git clone https://github.com/mikeferguson/pocketsphinx
$cd ../
$catkin_make
3.了解topic /recognizer/output
pocketphinx软件包包括 Recognizer.py,这个脚本会处理电脑的音频输入流然后从现有的词库中匹配声音命令,匹配成功后会发送到/recognizer/output 这个话题上。其他程序可以通过订阅此话题获取识别的声音内容。
测试
最好使用带有麦克风的耳机,连接电脑,并将其选为音频输入设备,如果使用的是Ubuntu 14.04或更高版本,请转到系统设置,然后单击声音控制面板。在Input中从设备列表中选择你的耳机设备,说几句话测试一下,可以看到音量表响应。 然后点击Output选项卡,选择所需的输出设备,然后调整音量滑块。
运行launch
$roslaunch pocketsphinx robocup.launch
你会看到如下
现在可以说话了。正常情况如下:
$rostopic echo /recognizer/output
运行上面的命令可以更清楚的看到识别到的声音内容。
其他程序可以通过订阅这个topic 来获取识别的声音内容。另外,pocketsphinx只能识别词库里的单词或短语,因此有局限性。
机器人说话
1.安装
$sudo apt-get install ros-indigo-audio-common
$sudo apt-get install libasound2
2.运行
$rosrun sound_play soundplay_node.py
$rosrun sound_play say.py "Greetings Humans. Take me to your leader."
你会听到电脑发声:Greetings Humans. Take me to your leader.
默认的声音是kal_diphone,我们也可以更换其他的声音,查看电脑上其他的声音,运行
ls /usr/share/festival/voices/english
可以看到还有一个don_diphone(之前安装的).如果要更换成这个,运行下面命令
rosrun sound_play say.py "Welcome to the future" voice_don_diphone
查看所有可用的声音,运行下面命令
$sudo apt-cache search --names-only festvox-*
我们可以安装上面列表中的任意一个,eg:festvox-don,执行下面命令
$sudo apt-get install festvox-don
安装更多声音:
$ sudo apt-get install festlex-cmu
$ cd /usr/share/festival/voices/english/
$ sudo wget -c http://www.speech.cs.cmu.edu/cmu_arctic/packed/cmu_us_clb_arctic-0.95-release.tar.bz2
$ sudo wget -c http://www.speech.cs.cmu.edu/cmu_arctic/packed/cmu_us_bdl_arctic-0.95-release.tar.bz2
$ sudo tar jxfv cmu_us_clb_arctic-0.95-release.tar.bz2
$ sudo tar jxfv cmu_us_bdl_arctic-0.95-release.tar.bz2
$ sudo rm cmu_us_clb_arctic-0.95-release.tar.bz2
$ sudo rm cmu_us_bdl_arctic-0.95-release.tar.bz2
$ sudo ln -s cmu_us_clb_arctic cmu_us_clb_arctic_clunits
$ sudo ln -s cmu_us_bdl_arctic cmu_us_bdl_arctic_clunits
测试:
$ rosrun sound_play say.py "I am speaking with a female C M U voice" voice_cmu_us_clb_arctic_clunits
$ rosrun sound_play say.py "I am speaking with a male C M U voice" voice_cmu_us_bdl_arctic_clunits
还可以使用sound_play播放wav文件或一些内置的声音。
rosrun sound_play play.py `rospack find rbx1_speech`/sounds/R2D2a.wav
注意:play.py需要wav文件的绝对路径,建议使用rospack find 如果不用也可以只输入完整的路径名。
播放内置声音,参数可以选择1-5之间的整数,友情提示,先调低你的音量。
rosrun sound_play playbuiltin.py 4
总结
pocketsphinx只识别英文,如果要识别中文要费不少周章,我们可以使用讯飞语音来识别中文,效果还不错。推荐https://github.com/ncnynl/xf-ros,直接用,感谢作者ncnynl!