探索使用科大讯飞语音包控制机器狗(三)--控制小狗移动(语音识别移植)

来源:CSDN 发布时间:Nov 18, 2020, 9:30:28 AM 原地址:https://blog.csdn.net/weixin_41877339/article/details/109725355

上一章进行了初步的源码阅读以及简单修改移植,本章的目标是将SDK文件同机器狗的控制文件相结合,达到语音控制小狗运动的效果。

python编写订阅器发布器

考虑到大部分机器狗的控制脚本都是用python编写的,之前代码的编写都是基于c++,所以在这一部分先学习一下python脚本实现订阅器发布器的功能。

发布器

参考教程

  • 代码解析
import rospy #导入rospy模块
from std_msgs.msg import String#导入String类,字符串类型

def talker():#talker函数
    pub = rospy.Publisher('chatter', String, queue_size=10)#发布消息,话题是“chatter",类型是string,消息大小queue_size
    rospy.init_node('talker', anonymous=True)#初始化节点,匿名
    rate = rospy.Rate(10) # 10hz,发布消息的频率
    while not rospy.is_shutdown():#定义循环,在没有接收到关闭信号时一直执行循环
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)#这个loginfo(str)有3个作用,第一,打印消息,第二,被写入节点日志文件中,第三,被写入rosout中(这样就可以通过rqt_console查看)
        pub.publish(hello_str)#发布消息
        rate.sleep()#sleep函数,等待到下一次发布时间。(10HZ,也就是等1/10秒)

if __name__ == '__main__':#主函数
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

订阅器

  • 代码解析
import rospy
from std_msgs.msg import String

def callback(data):#回调函数,打印信息
    rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data)

def listener():

    # In ROS, nodes are uniquely named. If two nodes with the same
    # name are launched, the previous one is kicked off. The
    # anonymous=True flag means that rospy will choose a unique
    # name for our 'listener' node so that multiple listeners can
    # run simultaneously.
    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber('chatter', String, callback)

    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

if __name__ == '__main__':
    listener()

尝试python订阅器接收c++发布器的消息

我的计划是对于发布器,采用语音识别本来的c++脚本,对于订阅器直接在机器狗控制脚本的python文件中进行修改,所以,首先尝试编写最简单的文件实现两者的通信。移植也很简单,只需要简单修改订阅话题即可。

  • 在功能包下创建新文件夹script并编写listener.py
    在这里插入图片描述
  • 修改话题
 rospy.Subscriber('voiceWords', String, callback)
  • 运行效果
    在这里插入图片描述

移植代码到树莓派下

之前一直是在pc端跑的程序,机器狗是使用的树莓派3b,所以将语音识别进行移植,不过移植过程中出现了几个问题。为了方便我使用FileZilla进行文件传递。

  • 问题1
    这是因为缺少软件包导致的。
    在这里插入图片描述
  • 解决办法
 sudo apt-get install libasound2-dev
  • 问题2
    根据问题描述我们可以看出,不能识别libmsc.so文件。是因为交叉编译的原因
    在这里插入图片描述
  • 解决办法
    我们先查看现在的文件格式。
file /home/liuda/spotmicro/src/spotMicro/robot_voice/libs/x64/libmsc.so

我们发现是x86-64版本的,而我们树梅派是ARM架构的。所以自然不会识别。
在这里插入图片描述

然而,爆炸。
在这里插入图片描述
官网中没有给可以在ARM架构中使用的库文件,不过这怎能挡得住我们探索的脚步,网上最不缺的就是资源,我们只需要下载一个树莓派的库即可。下载链接,将下载后的文件中的RaspberryPi文件夹上传到树莓派中的libs文件夹下,并修改相应的编译文件即可成功编译。
在这里插入图片描述
在这里插入图片描述

  • 验证功能性
    遇到一个问题,这问题以前也出现过,主要原因是因为登陆失败,授权不成功,需要修改appid。可能是因为我修改了库文件,导致我申请的appid超出权限,登录失败。
    在这里插入图片描述
  • 解决办法
    解决办法也相当简单,修改appid即可,我直接在网上找了一个博主的56ee43d0,实测可以使用。
  • 识别不到声音
    出现一个新问题,识别不到声音

在这里插入图片描述

  • 问题分析
    识别不到声音我考虑是有可能是两个方面的原因,首先是音频输入声音太小,识别不到;其次是科大讯飞语音库SDK移植得有问题,导致不工作。我怀疑是第二种问题的可能性比较大,因此,移植一个不需要外部输入音频的文件进行功能的分析。
    遇到了找不到库文件的问题:
    在这里插入图片描述
    解决方法比较简单:直接将库文件复制到/usr/local/lib文件夹下。

然而,调用识别音频文件的功能包还是可以正常识别的(自动忽略“?”乱码),识别结果中美数控还是正常的。由此推断,语音识别功能是正常的,所以问题应该是出现在音频输入收声的部分。

在这里插入图片描述

考虑的解决办法是购买一个usb麦克风进行收声,具体效果有待验证。