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

Stella981
• 阅读 935

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|来自: 微信

摘要: 这次教程对科大讯飞的iat_record代码进行解析,该sample代码的功能是可以通过麦克风对语音进行连续的识别,当检测到VAD则返回语音识别的结果文本。

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

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

这次教程对科大讯飞的iat_record代码进行解析,该sample代码的功能是可以通过麦克风对语音进行连续的识别,当检测到VAD则返回语音识别的结果文本。

在学习之前需要认识一个新名词就是VAD,voice Activity Detection-语音活动检测,又称语音端点检测或语音边界检测。检测用户有没有说完一句话,何时停止录音返回识别结果。

该sample代码介绍了两种方式进行语音识别,分别是本地的wav文件上传进行识别和通过本地麦克风进行拾音,然后录音后上传至服务器进行识别。本次教程为代码解析的上半部,主要介绍如何将本地已经存在的wav文件上传至服务器进行识别。

在代码中需要注意以下几点:

1.在进行语音识别结束后,显示的结果文本如果为乱码,则说明本地终端的显示字符的编码不是gb2312格式的,需要改变终端的字符编码格式。或者通过修改iat_record.c代码main函数中session_begin_params的result_encoding = utf8进行修改。

ROS(indigo) 语音工具 科大讯飞 百度 pocketsphinx julius rospeex 16.11.22更新 ROS中文语音
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),然后返回识别结果文本到本地的整个过程。 ...

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

收藏 邀请

本文同步分享在 博客“zhangrelay”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
ROS
ROS学习笔记01ROS(RobotOperatingSystem,机器人操作系统)提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能。ROS遵守BSD开源许可协议。本文内容为安装ROSNoetic并测试简单小乌龟仿真机器人的例子
Wesley13 Wesley13
3年前
ROS 日志消息(C++)
1.日志级别日志消息分为五个不同的严重级别宏,与Android的Log定义的严重级别类似,如下基础宏:ROS_DEBUG_STREAM、ROS_INFO_STREAM、ROS_WARN_STREAM、ROS_ERROR_STREAM、ROS_FATAL_STREAM(按照严重程序级别排序,低到高)C代码:
Wesley13 Wesley13
3年前
ROS 机器人技术
上次我们学习了TF的基本概念和如何发布静态的TF坐标:ROS机器人技术TF坐标系统基本概念(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fdlonng.com%2Fposts%2Frostf2)ROS机器人技术静态TF坐标帧(h
Wesley13 Wesley13
3年前
SLAM+语音机器人DIY系列:(七)语音交互与自然语言处理——1.语音交互相关技术
摘要这一章将进入机器人语音交互的学习,让机器人能跟人进行语音对话交流。这是一件很酷的事情,本章将涉及到语音识别、语音合成、自然语言处理方面的知识。本章内容:1.语音交互相关技术(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fhira
Wesley13 Wesley13
3年前
iphone之使用讯飞语音sdk实现语音识别功能
1、首先下载讯飞sdk及文档:http://open.voicecloud.cn/(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fopen.voicecloud.cn%2F)2、学习里面的demo简单实现了一个小的语音识别功能先做一个简单demo,看看识别效果。注:语音识别必须联
Stella981 Stella981
3年前
Flutter集成百度语音识别(Android端)实战
今天和大家分享一下Flutter中集成百度语音识别Android端的过程,供大家进行参考。既然是Flutter集成,那首先就要创建一个Flutter项目,这个就不仔细讲了,可以参考Flutter中文的创建项目流程(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fflutterchin
Stella981 Stella981
3年前
ReactNative集成百度语音合成
语音交互是现今应用最多的智能交互方式,在人工智能越来越火的当下应用十分广泛,所以特别针对车内环境,在驾驶员安心驾驶的时候,用语音可以安全的进行操控。恰好新版项目中要加入语音播报功能,因为我们的应用和司机有关,于是在网上搜索一些解决方案,目前有阿里云,百度云以及科大讯飞还有一些其他公司提供的相关解决方案。不同方案之间的对比,可以参考下面的文章:智能语音方
四儿 四儿
1年前
语音标注平台:推动语音技术发展的关键支撑
语音技术作为人工智能领域的重要分支,正日益渗透到我们的生活中。而语音标注平台作为语音技术发展的关键支撑,扮演着至关重要的角色。它为语音数据的标注和处理提供高效、准确的工具,推动了语音识别、语音合成和语音分析等领域的研究和应用。语音标注平台是指专门用于语音数
四儿 四儿
10个月前
语音数据集:开启智能语音技术的新篇章
随着人工智能技术的飞速发展,语音数据集在推动智能语音技术的进步中发挥着越来越重要的作用。语音数据集是训练和优化语音识别、语音合成等智能语音技术的关键资源,对于提高语音技术的准确性和自然度具有重要意义。一、语音数据集的重要性语音数据集是智能语音技术的基石。通