ROS(indigo) 语音工具 科大讯飞 百度 pocketsphinx julius rospeex 16.11.22更新 ROS中文语音

ROS语音工具汇总,目前先给出链接,只用过一些简单的命令。

中文语音:

参考链接:使用科大讯飞库

http://www.ncnynl.com/archives/201611/1069.html

http://blog.csdn.net/zhouge94/

pocketsphinx:

https://github.com/cmusphinx

http://cmusphinx.sourceforge.net/

julius:

https://github.com/julius-speech/julius

rospeex:

http://rospeex.org/top/

----

将语音识别实现,然后用ROS控制机器人,完成接口就可。

补充其他资料:

hark:

HARK是开源的机器人试听软件,即机器人的声音处理。 它包括声源定位模块,声源分离模块和分离的语音信号的自动语音识别模块,其工作在具有任何麦克风配置的任何机器人上。

http://wiki.ros.org/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语音交互系统_科大讯飞连续语音识别代码解析(上)

2016-12-5 09:22| 发布者: adm1n| 查看: 26| 评论: 0|来自: 微信

| 评论: 0|来自: 微信
摘要: 这次教程讲解了科大讯飞的iat_record代码中如何利用麦克风进行拾音,并且传输至服务器并自动检测端点(VAD),然后返回识别结果文本到本地的整个过程。 ...

ROS(indigo) 语音工具 科大讯飞 百度 pocketsphinx julius rospeex 16.11.22更新 ROS中文语音

ROS(indigo) 语音工具 科大讯飞 百度 pocketsphinx julius rospeex 16.11.22更新 ROS中文语音
这次教程讲解了科大讯飞的iat_record代码中如何利用麦克风进行拾音,并且传输至服务器并自动检测端点(VAD),然后返回识别结果文本到本地的整个过程。

在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

上一篇:解决 jmeter 压测Non HTTP response code: java.net.NoRouteToHostException/Non HTTP response message: Cannot assign requested address (Address not available)


下一篇:C # 数据绑定(1)——将DataTabel的data添加ListView