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>

  <node name="recognizer" pkg="pocketsphinx" type="recognizer.py" output="screen">
    <param name="lm" value="$(find pocketsphinx)/demo/robocup.lm"/>
    <param name="dict" value="$(find pocketsphinx)/demo/robocup.dic"/>
    <param name="hmm" value="/usr/local/lib/python3.5/dist-packages/pocketsphinx/model/en-us"/>
  </node>

</launch>

即将声学模型添加到了launch文件中,传入参数。

voice_cmd.launch同理:

<launch>

  <node name="recognizer" pkg="pocketsphinx" type="recognizer.py">
    <param name="lm" value="$(find pocketsphinx)/demo/voice_cmd.lm"/>
    <param name="dict" value="$(find pocketsphinx)/demo/voice_cmd.dic"/>
    <param name="hmm" value="/usr/local/lib/python3.5/dist-packages/pocketsphinx/model/en-us"/>
  </node>

  <node name="voice_cmd_vel" pkg="pocketsphinx" type="voice_cmd_vel.py" output="screen"/>

</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/下的文件,即可运行。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值