在正文之前,先介绍一下speech_recognition这个工具包,可以调用google、Sphinx、IBM等多个语音识别的方法进行调用。
https://realpython.com/python-speech-recognition/
https://github.com/Uberi/speech_recognition
下面进入正文,实现ROS Kinetic版本中使用PocketSphinx进行语言识别的方法。PocketSphinx方法与其它语音识别方法最大不同在于,它可以在没有网络的情况下离线使用。
安装各种库和组件
sudo apt-get install ros-kinetic-audio-common libasound2 gstreamer0.10-* gstreamer1.0-pocketsphinx
从https://packages.debian.org/jessie/libsphinxbase1中,下载libsphinxbase1_0.8-6_amd64.deb
sudo dpkg -i libsphinxbase1_0.8-6_amd64.deb
从https://packages.debian.org/jessie/libpocketsphinx1中,下载libpocketsphinx1_0.8-5_amd64.deb
sudo dpkg -i libpocketsphinx1_0.8-5_amd64.deb
从https://packages.debian.org/jessie/gstreamer0.10-pocketsphinx中,下载gstreamer0.10-pocketsphinx_0.8-5_amd64.deb
sudo dpkg -i gstreamer0.10-pocketsphinx_0.8-5_amd64.deb
由于ROS Kinetic不支持(sudo apt-get install ros-kinetic-pocketsphinx),所以才有这么多步骤。
这里我们使用github上的开源ros项目
cd ~/catkin_ws/src
git clone https://github.com/mikeferguson/pocketsphinx
在我们的catkin_ws/src/目录下,会新建一个pocketsphinx的文件夹,有demo和node两个子文件夹,node中存放语言识别的程序,demo中存放的是ros调用的launch文件,以及.dic的词库和.lm的语言模型。
Pocketsphinx Python
sudo pip3 install pocketsphinx
这条命令安装完成后,会在/usr/local/lib/python3.5/dist-packages/ 目录下生成一个pocketsphinx的包,在这个包下有个/model/en-us/,这里存放着pocketsphinx训练好的声学模型。
我们接下来对catkin_ws/src/pocketsphinx/node/ 下的recognizer.py进行更改:
def __init__(self):
# Start node
rospy.init_node("recognizer")
self._device_name_param = "~mic_name" # Find the name of your microphone by typing pacmd list-sources in the terminal
self._lm_param = "~lm"
self._dic_param = "~dict"
self._hmm_param = "~hmm" #添加hmm参数
def start_recognizer(self):
rospy.loginfo("Starting recognizer... ")
self.pipeline = gst.parse_launch(self.launch_config)
self.asr = self.pipeline.get_by_name('asr')
self.asr.connect('partial_result', self.asr_partial_result)
self.asr.connect('result', self.asr_result)
#self.asr.set_property('configured', True) #屏蔽
self.asr.set_property('dsratio', 1)
# Configure language model
if rospy.has_param(self._lm_param):
lm = rospy.get_param(self._lm_param)
else:
rospy.logerr('Recognizer not started. Please specify a language model file.')
return
if rospy.has_param(self._dic_param):
dic = rospy.get_param(self._dic_param)
else:
rospy.logerr('Recognizer not started. Please specify a dictionary.')
return
#从launch文件中,获取hmm参数
if rospy.has_param(self._hmm_param):
hmm = rospy.get_param(self._hmm_param)
else:
rospy.logerr('Recognizer not started. Please specify a hmm.')
return
self.asr.set_property('lm', lm)
self.asr.set_property('dict', dic)
self.asr.set_property('hmm', hmm) #设置hmm参数
self.bus = self.pipeline.get_bus()
self.bus.add_signal_watch()
self.bus_id = self.bus.connect('message::application', self.application_message)
self.pipeline.set_state(gst.STATE_PLAYING)
self.started = True
那么相对的,我们要修改demo下的launch文件,robocup.launch修改为:
即将声学模型添加到了launch文件中,传入参数。
voice_cmd.launch同理:
打开两个端口,catkin_make以后
一个端口运行:
roslaunch pocketsphinx robocup.launch
另一个窗口,查看识别的结果:
rostopic echo /recognizer/output
只能识别.dic字典中的词,识别效果一般般。
参考:https://blog.csdn.net/seeseeatre/article/details/79228816
如果运行launch文件出错,可以下载另一个声学模型hub4wsj_sc_8k,将hub4wsj_sc_8k文件夹下的文件全部复制,替换掉/usr/local/lib/python3.5/dist-packages/pocketsphinx/model/en-us/下的文件,即可运行。