ROS(indigo) 语音工具 科大讯飞 百度 pocketsphinx julius rospeex 16.11.22更新 ROS中文语音
ROS语音工具汇总,目前先给出链接,只用过一些简单的命令。
中文语音:
参考链接:使用科大讯飞库
1 http://www.ncnynl.com/archives/201611/1069.html
2 http://blog.csdn.net/zhouge94/
pocketsphinx:
1 https://github.com/cmusphinx
2 http://cmusphinx.sourceforge.net/
julius:
1 https://github.com/julius-speech/julius
rospeex:
----
将语音识别实现,然后用ROS控制机器人,完成接口就可。
补充其他资料:
hark:
HARK是开源的机器人试听软件,即机器人的声音处理。 它包括声源定位模块,声源分离模块和分离的语音信号的自动语音识别模块,其工作在具有任何麦克风配置的任何机器人上。
百度语音接口:
http://wiki.ros.org/baidu_speech
https://github.com/DinnerHowe/simple_voice
推荐阅读:
http://rosclub.cn/post-571.html
http://rosclub.cn/post-572.html
ROS语音交互系统_科大讯飞连续语音识别代码解析(上)
这次教程对科大讯飞的iat_record代码进行解析,该sample代码的功能是可以通过麦克风对语音进行连续的识别,当检测到VAD则返回语音识别的结果文本。 在学习之前需要认识一个新名词就是VAD,voice Activity Detection-语音活动检测,又称语音端点检测或语音边界检测。检测用户有没有说完一句话,何时停止录音返回识别结果。 该sample代码介绍了两种方式进行语音识别,分别是本地的wav文件上传进行识别和通过本地麦克风进行拾音,然后录音后上传至服务器进行识别。本次教程为代码解析的上半部,主要介绍如何将本地已经存在的wav文件上传至服务器进行识别。 在代码中需要注意以下几点: 1.在进行语音识别结束后,显示的结果文本如果为乱码,则说明本地终端的显示字符的编码不是gb2312格式的,需要改变终端的字符编码格式。或者通过修改iat_record.c代码main函数中session_begin_params的result_encoding = utf8进行修改。 3.在获取某一文件缓冲区的拷贝的方法可以从该sample中学习,
完整的视频教程请关注优酷视频,视频链接如下: http://v.youku.com/v_show/id_XMTgzODI0NzcwNA==.html 想观看更多的ROS视频教程请在优酷中搜索“ROS小课堂”即可查看到更多的视频教程,也欢迎大家订阅,这样每周发布视频时会自动提醒。 本人能力有限,若在视频教程中,出现任何问题,请及时通知我,我会及时纠正。 |
ROS语音交互系统_科大讯飞连续语音识别代码解析(下)
在demo_mic函数中主要调用了三个函数来完成整个识别过程: (1)sr_init()函数,主要进行参数的初始化,本地结构体变量的状态初始化,设置服务器参数的回调函数。在此函数中进一步调用了科大讯飞提供的create_recorder()函数和open_recorder()函数,但是这些函数最终都是调用ALSA接口完成的pcm设备的初始化和打开设备。 (2)sr_start_listening()函数,主要完成的功能是调用QISRSessionBegin()函数与服务器进行通信,开始进行一次语音识别,调用成功后服务器返回会话ID,获取到ID后,调用start_recorder()函数,来开始从麦克风中获取音频数据,并通过回调函数将获取到的音频数据传至科大讯飞服务器,服务器然后会返回识别的结果,是否识别到VAD等回调各种状态。若识别到VAD则会自动关闭麦克风,停止继续获取音频流数据,服务器返回识别结果,通过回调函数通知到本地。 (3)sr_stop_listening()函数,主要完成收尾工作,关闭麦克风,销毁创建麦克风申请的各种资源,缓冲区等。 在整个代码解析过程中,我认为可能大家会比较感兴趣的地方都在开始的图片里展示出来了。 首先是为什么头文件中在声明函数地方,都要加上 #ifdef __cplusplusextern "C" {#endif ..int function();... #ifdef __cplusplus}#endif 就是为了在c++代码中,编译时防止函数名词被修改,因为C语言编译和c++编译过程不相同,函数名称会被修改。如果在C++编译中不加这个宏定义进行包裹,那么C编译的so文件库可能在C++中调用可能就会有问题。 然后就是在打印调试信息方面有个小技巧,如下: #define SR_DBGON 1 --SR_DBGON 这个名词可以根据需要自行修改#if SR_DBGON == 1# define sr_dbg printf ---sr_deb也可以自行修改,这个名词就代替了printf#else# define sr_dbg #endif 在最开始的#define SR_DBGON 1这个就是所以调试信息的总开关,如果设置为1,那么 sr_dbg 就是等同于printf这个函数, 示例:...sr_dbg("mem alloc failed\n");... 那么示例中的sr_deb就会被替换成,printf("mem alloc failed\n"); 如果设置SR_DBGON 为0,那么根据#if SR_DBGON == 1这个判断可得,#define sr_dbg 就会被识别为空,那么示例中代码就会被替换成如下: ("mem alloc failed\n");即调试信息不会输出了。 本次教程的优酷视频地址如下: http://v.youku.com/v_show/id_XMTg0NzcxMzA3Ng==.html |