Ubuntu16.04 ROS Kinetic版本使用PocketSphinx进行语音识别

在正文之前,先介绍一下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),所以才有这么多步骤。

下载ROS-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

Ubuntu16.04 ROS Kinetic版本使用PocketSphinx进行语音识别_第1张图片

只能识别.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/下的文件,即可运行。

你可能感兴趣的:(人工智障)