Ros结合科大讯飞linuxSDK进行离线语唤醒、命令识别

慢慢更新中…

工程:多智能车室内ROS编队,现想加入语音功能,选择科大讯飞。
参考:
1.https://blog.csdn.net/u013834525/article/details/80097253
2.https://www.aidaxue.com/course/courseDetail?id=524
3.https://www.xfyun.cn/doc/asr/commandWord/Linux-SDK.html#_1%E3%80%81%E7%AE%80%E4%BB%8B
4.https://www.ncnynl.com/archives/201905/3028.html

1.树莓派上使用科大讯飞SDK

2021年6月份
由于工程中需要用到多种语音功能,其中在线语音听写等多个功能官方文档都如下信息:

但是csdn上还是有人用树莓派结合科大讯飞做语音的,如:
1.https://blog.csdn.net/lhh31/article/details/54810084
但是当年讯飞的sdk的libs文件夹下除了x64和x86外是有个RaspberryPi文件夹提供树莓派动态库的,现在没有了
2.https://blog.csdn.net/weixin_39608478/article/details/111298424
上面这位用树莓派4b实现了科大讯飞语音功能,但我emmmmm…反正就没搞成。所以放弃,反正我用的ros,把语音功能布置在虚拟机上,处理完语音信号后再把命令识别结果发送给树莓派小车也是可以的。

2.开个头

系统:ubuntu18.04(虚拟机)
下载SDK,编译,运行示例,请参考:
1.https://www.xfyun.cn/
2.https://www.aidaxue.com/course/search?search=%E8%AF%AD%E9%9F%B3
3.https://blog.csdn.net/weixin_39608478/article/details/111298424
4.https://www.guyuehome.com/27841
主要推荐看1.官网文档和2.视频教程入个门哈,先把自己要用到的功能示例都跑一遍吧。

3.离线命令词条识别

1.BNF语法文件解读
参考:https://www.aidaxue.com/course/courseDetail?id=524
Ros结合科大讯飞linuxSDK进行离线语唤醒、命令识别_第1张图片
callStrat中:
[ ] 表示该槽可说可不说,不说的话指令一样生效一样,
| 表示“或者”
如第三个callStrat定义说成“张海洋打电话”“打电话张海洋”都可以
一个BNF文件示例:


/*!slot ;
!slot ;
!slot ;
!slot ;

!start ;
:[];

:我想|我要|请|帮我|我想要|请帮我|要;

:[];

:打电话给!id(10001)|打给!id(10001)|拨打!id(10001)|拨打电话给!id(10001)|呼叫!id(10001)|
打一个电话给!id(10001)|打个电话给!id(10001)|给|拨通!id(10001)|
接通!id(10001)|呼叫!id(10001)|呼叫给!id(10001)|打!id(10001);

:打电话!id(10001)|打个电话!id(10001)|打一个电话!id(10001)|
拨打电话!id(10001)|拨电话!id(10001)|0拨个电话!id(10001)|呼个电话!id(10001)|
的电话!id(10001)|的号码!id(10001)|的手机!id(10001)|
的办公电话!id(10001)|的移动号码!id(10001)|的联通号码!id(10001)|
的电信号码!id(10001)|客服电话!id(10001);

:丁伟;*/


!slot <todo>;
!slot <order>;

!start <t214>;
<t214>:[<todo>]<order>;

<todo>:运行!id(21301)|执行!id(21301)|进行!id(21301)|
回去!id(21302)|返回!id(21302);

<order>:人脸检测!id(21401)|检测人脸!id(21401)|
面部识别!id(21402)|识别身份!id(21402)|人脸识别!id(21402)|身份识别!id(21402)|
没电了!id(21403)|充电!id(21403)|快没电了!id(21403);

引用自:https://blog.csdn.net/u013834525/article/details/80097253,仅供参考。

4.将ROS与科大讯飞结合的重要参考

https://blog.csdn.net/u013834525/article/details/80097253
上面这篇博客里说了官方samples的不足,实现的功能正是我想要的唤醒和离线命令词条识别,目前在学习中,由于每个人的sdk的库都与自己的appid绑定,这位博主给的代码包中有不少内容需要用自己的sdk去替换,但是又遇到不少问题,后续再整理:
1.github上ros分支,readme文档说需要替换res目录,但是科大讯飞的sdk没有相应目录,不知怎么办。

5.科大讯飞离线语音唤醒、离线词条识别、离线语音合成在ros应用

1.先设置语音唤醒词
Ros结合科大讯飞linuxSDK进行离线语唤醒、命令识别_第2张图片
2.下载组合SDK包,由于后续会拓展其他功能,选择了五个功能
Ros结合科大讯飞linuxSDK进行离线语唤醒、命令识别_第3张图片
组合SDK下载界面:https://www.xfyun.cn/sdk/dispatcher
解压后:
Ros结合科大讯飞linuxSDK进行离线语唤醒、命令识别_第4张图片
3.下载我的功能包:
链接:https://pan.baidu.com/s/1SF-DEHLv-r5ZqIUnxEkc7A
提取码:1hae
声明:代码是在下面这位“白夜行的狼”博主基础上修改并且加入ros当中,要理解工作原理请参考这位博主的博客,感谢这位博主的分享,代码仅供学习参考,如有侵权请联系删除。
https://blog.csdn.net/u013834525/article/details/80097253
代码是初期的示例代码,不少文件是从上面这位博主那里继承的,作为ros控制节点来说并不完善,但可以运行,再次申明仅供参考。

4.资源替换等操作
Readme:
Blog:https://blog.csdn.net/u013834525/article/details/80097253
Tihs package use alsa to record voice and wait for awake, and then recognize order.
My code is refer to iflytek’s asr_record_sample and awaken_sample. For more infomation, please check through iflytek’s reference.

I do not know why, but the iflytek does not accept relative path, so you need to change your package’s absolute path in asr_record.h like this:
#define PACKAGE_PATH “/home/your_name/catkin_ws/src/awaken_asr/”

And you need to change your appid which obtained from http://www.xfyun.cn/ in awaken_asr_ros.cpp.
Replace the resource files in res folder & libs folder

To use it, just cd to your work space and source ./64bit_make.sh or 32bit_make.sh depending on your system. It will build automatically. After building the code, you just need to run ./bin/awaken_asr
It will awaken by saying the word in wordlist.txt and the run order recognition according to the rules specific in call.bnf for 15s. When finish, it will change variate g_order and g_is_order_publiced. You can do your job in main.c

运行环境:虚拟机ubuntu18.04
以上是另一个博主的readme内容,需要注意的是除了修改appid、路径之外,还需要去替换对应于你自己appid的资源,包括:
a.你下载的sdk中的libs文件夹替换掉本功能包中libs
b.根据系统位数选择libs中的对应的库文件如libmsc.lib、libw_ivw.lib拷贝到/usr/lib/路径下:进入sdk库文件夹libs/x64/或者libs/x86/下
sudo cp libmsc.lib /usr/lib/libmsc.lib、
sudo cp libw_ivw.lib /usr/lib/libw_ivw.lib
c.备份保留我的工程中res文件夹
d.用自己的SDK当中res文件夹替换我功能包中res文件夹。特别注意,我下载的组合SDK中res文件夹位于bin/msc/res/处,内有多个.jet文件,将sdk当中此res文件夹复制替换掉我的包中的res文件夹。
e.将原本的res/asr/call.bnf文件文件复制到你当前的更改过后的res/asr/路径下。
f.ros编译执行。
g.此包中进行消息处理发布ros话题等代码自己根据需求添加即可。

5.运行结果:
Ros结合科大讯飞linuxSDK进行离线语唤醒、命令识别_第5张图片
Ros结合科大讯飞linuxSDK进行离线语唤醒、命令识别_第6张图片

你可能感兴趣的:(语音识别,linux)