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语音交互系统_科大讯飞连续语音识别代码解析(上)
2016-12-5 09:22| 发布者: adm1n| 查看: 26| 评论: 0|来自: 微信
摘要: 这次教程对科大讯飞的iat_record代码进行解析,该sample代码的功能是可以通过麦克风对语音进行连续的识别,当检测到VAD则返回语音识别的结果文本。
这次教程对科大讯飞的iat_record代码进行解析,该sample代码的功能是可以通过麦克风对语音进行连续的识别,当检测到VAD则返回语音识别的结果文本。
在学习之前需要认识一个新名词就是VAD,voice Activity Detection-语音活动检测,又称语音端点检测或语音边界检测。检测用户有没有说完一句话,何时停止录音返回识别结果。
该sample代码介绍了两种方式进行语音识别,分别是本地的wav文件上传进行识别和通过本地麦克风进行拾音,然后录音后上传至服务器进行识别。本次教程为代码解析的上半部,主要介绍如何将本地已经存在的wav文件上传至服务器进行识别。
在代码中需要注意以下几点:
1.在进行语音识别结束后,显示的结果文本如果为乱码,则说明本地终端的显示字符的编码不是gb2312格式的,需要改变终端的字符编码格式。或者通过修改iat_record.c代码main函数中session_begin_params的result_encoding = utf8进行修改。
2.结构体speech_rec_notifier的声明在speech_recognizer.h中,结构体的三个成员变量都是函数指针,在iat_record.c中,使用on_result,on_speech_begin.on_speech_end进行初始化,这样就可以通过该结构体变量实现了注册回调函数功能。
3.在获取某一文件缓冲区的拷贝的方法可以从该sample中学习,
01
const
char* audio_file =
"/home/corvin/music/**.wav"``;
//为某wav文件路径,
02
FILE* f_pcm = NULL;
//打开wav文件的指针
03
char * p_pcm = NULL;
//新申请的缓冲区指针,用于存储拷贝的wav文件缓冲区
04
unsigned long pcm_size = 0;
//存储wav文件大小
05
f_pcm =
fopen``(audio_file,
"rb"``);
//打开该wav文件,获取指向头部缓冲区的指针
06
if``(NULL = f_pcm)
//判断打开是否成功
07
{
08
printf(``"open [%s] failed!\n"``, audio_file);
09
}
10
fseek``(f_pcm, 0, SEEK_END);
//指针直接跳到缓冲区末尾
11
pcm_size =
ftell``(f_pcm);
//ftell功能就是返回当前缓冲区指针位置相对于缓冲区开头位置偏移多少字节,这样就可以获得wav文件大小
12
fseek``(f_pcm, 0, SEEK_SET);
//重新将指针跳转到文件开头
13
p_pcm = (char *)malloc(pcm_size);
//申请跟wav文件大小相同的缓冲区,头指针赋值给p_pcm
14
read_size =
fread``((void *)p_pcm, 1, pcm_size, f_pcm);
//将f_pcm缓冲区中读出pcm_size字节大小的缓冲区,每个item为1个字节,复制到p_pcm指针处的缓冲区中,这样就完成了赋值一份完整的wav文件的功能,而不修改源文件
15
if``(read_size != pcm_size)
//判断读取的字节数与写入到缓冲区的大小是否相同,若不相同则读取缓冲区异常
16
{
17
printf(``"read [%s] error!\n"``, audio_file);
18
}
完整的视频教程请关注优酷视频,视频链接如下:
http://v.youku.com/v\_show/id\_XMTgzODI0NzcwNA==.html
想观看更多的ROS视频教程请在优酷中搜索“ROS小课堂”即可查看到更多的视频教程,也欢迎大家订阅,这样每周发布视频时会自动提醒。
本人能力有限,若在视频教程中,出现任何问题,请及时通知我,我会及时纠正。
ROS语音交互系统_科大讯飞连续语音识别代码解析(下)
2016-12-5 09:25| 发布者: adm1n| 查看: 29| 评论: 0|来自: 微信
摘要: 这次教程讲解了科大讯飞的iat_record代码中如何利用麦克风进行拾音,并且传输至服务器并自动检测端点(VAD),然后返回识别结果文本到本地的整个过程。 ...
这次教程讲解了科大讯飞的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
本文同步分享在 博客“zhangrelay”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。