write in advance
此次实验课给我的生活来了沉重的一击,不单单是因为没有做出来,还因为我卡在了 插件 缺失 而无法解决。之前对待实验课,能在操作流程之外有暇思考具体的实现,此次只能记录简单的操作流程部分。
老规矩,基于同样的《ROS机器人开发技术基础》教材。
以下是实验内容,要求:
内容一
解法一:PocketSphinx功能包的踩坑记录
简单的语句识别,有两种方法:一是使用书上的教学包,编译、安装PocketSphinx功能包。
功能包可以通过git clone指令下载,老师也在教学平台提取放置了pocketsphinx的压缩包。书上对这部分内容的讲解很乱,我已记不清当时的操作,我在网上看到了这样的一步一步教下载功能包的教程,此处给出链接,不再赘述。
ROS语音识别-pocketsphinx库的安装和使用_gstreamer0.10-pocketsphinx-CSDN博客
我并不是照着这篇博客做的,你也并不需要完整地输入它所有的指令,可以对照着你有什么,缺什么,选择性地看。
在安装完功能包后,该功能包的目录下输入指令,查看该功能包下载是否正确,是否出现失误,
tree -L 3
解释一下这条指令:tree表示以树形结构显示文件层次, L 推测是 layer 的缩写,3表示三层,你可以把3改为4,比照看看有什么不同。
当你到达PocketSphinx功能包显示为类似的结构时,说明你正确安装了功能包——但是,你有可能会遇到 无组件 的问题。
上边的 trackback error 说明在哪些文件中出现了问题。我们能看到,问题出现在recoginze.py 文件的多个地方。一个小技巧,出现traceback error的错误,我们一般看最后一处报错,逐个往回解决。这是我们解决这种报错的一个通用方法。因为文件内部是 调用的关系,你在主函数中调用了一个函数,调用函数的语句报错,在确定该语句没有语法错误后,你很自然地定位到该函数中,想看看内部究竟出现了什么问题。
这是pyhton文件中的recognizer类,在其初始化函数部分,通过 if-elif-else 的条件判断,能够看出当我们没有给出source初值时,会跳转到 使用组件 gconfaudiosrc。
网上有博客通过在launch文件中增加以下指令解决问题:
<param name="source" value="alsarc"/>
这条语句的意思是将组件的值改为 alsarc。当然,如果你没有 alsarc组件,那么你一样会报错。
当我希望通过指令
sudo apt-get install aslarc
下载该组件时,它显示无法定位软件包。后续的解决方法很简单:换国内的镜像源,重新下载,确保 aslarc 正确安装,再运行这个launch文件。你可以期待它如期运行。当然它可能存在其他的问题。
参考文章
最后,关于我缺少组件的报错,给出三个参考链接,可能对你有用。
【踩坑记录】no element “gconfaudiosrc“_no element "gconfaudiosrc" (1)-CSDN博客
ROS中PocketSphinx缺少组件gconfaudiosrc解决方案_no element "gconfaudiosrc" (1)-CSDN博客
此处的第一条参考,我同样缺少组件alsarc,且软件源有问题,折腾许久放置一边。
第二条参考对我没有作用,我实际上有组件 gconfaudiosrc,使用 apt-get 指令也显示是最新版本。我找到第三篇文章,解决的是明明有组件,但launch文件报错无组件的问题。
gstreamer 无组件问题修复_gstreamer卸载-CSDN博客
解法二:科大讯飞SDK
科大讯飞的解法很简单,在科大讯飞的网站下注册、登录,照着书上的操作下载API,将压缩包解压,在指定目录下运行脚本,对源文件编译、生成可执行文件。然后在终端运行可执行文件。
此处给出两个例子:
./filename
python filename.py
第一条指令用于执行当前目录下名为 filename的可执行文件。对于C语言编译链接生成的可执行文件而言,它是你Ubuntu当前目录下的菱形的文件,不存在后缀名。./是当前目录的意思
第二条指令用于执行python 文件。第二条指令的意思 是指用python 方式执行 文件名为 filename.py的python文件。
顺利的话,你对着电脑说话,它能将你说话的内容显示在终端上。
内容二:
内容二挖一个坑。可能我明天会了,就记录下来,可能我一直不会,不得已删去。