#MINI2440实现语音识别# (三)REST API访问和VAD端点检测

原文地址:http://blog.csdn.net/sinat_26551021/article/details/79602843

1.前言

  本文主要是接#MINI2440实现语音识别# (一)整体概述和实现流程记录这篇文章继续讲。首先简单介绍下背景。前面三个阶段分别完成了嵌入式Linux最小系统移植、驱动UDA1341声卡、跑通讯飞Demo库,可以实现语音转文字,但是存在几点问题:
1、讯飞demo库是采用动态库的方式提供API接口,看不到内部实现方法,而且通常只提供X86、X64架构下的库,在交叉编译环境下需要额外申请动态库,太麻烦;
2、其它公司BAT提供的DEMO没有C语言实现的,这样对我来说就等于免费资源放在那,但我就是用不上,所以决定采用REST API的方式来实现,灵活性增加;
3、前面录音方式采用的是ALSA提供的arecord、aplay命令,存在无法录制定长音频、录制音频只能保存在文件中等缺点,灵活性很差,必须自己使用API实现;
4、前面都是先录音成音频文件,然后再执行程序,上传音频文件,最后输出识别结果,方式太傻。所以,要加入语音活动检测VAD,自动判断是否有声音,有的话则上传音频文件进行识别,否则不做处理。

2. 实现流程记录

前三阶段参照:
#MINI2440实现语音识别# (一)整体概述和实现流程记录
#MINI2440实现语音识别# (二)驱动声卡UDA1341遇到的问题和解决办法

第四阶段:采用REST API的方式调用讯飞语音识别接口 —->

1、搭建自己的工程
2、同步板上时间—> BusyBox v1.26.0中已经实现ntpd命令,所以可以使用ntpd -p cn.pool.ntp.org -qNn去同步时间
3、date -R更改时区,拷贝PC端下的/etc/localtime至板上的/etc/localtime即可。
4、弄清楚LINUX下怎么用C实现HTTP请求,以及JSON结果解析?—–>用libcurl提供的API实现时,可以打开以下两个选项,用于输出更多信息方便调试。

curl_easy_setopt(curl, CURLOPT_HEADER, 1);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);

5、HTTP HEADER格式是”X-Appid:xxxxx”,JSON格式都采用英文字符,如 : ,
6、用LINUX SHELL下md5sum命令计算MD5时,结果与Python hashlib不一致 —> 计算MD5时,LINUX内的md5sum会自动加上\n计算,而Python hashlib不会。
shell里的md5sum生成的结果为什么与程序生成的不一样
7、出错:一直提示”无效的CheckSum”,打印:{“code”:”10004”,”desc”:”无效的CheckSum”,”data”:null,”sid”:”rwaa905617a@ched8b0e003d30000100”} —>原因:在计算CheckSum时,body部分有前缀“data=”,而在POST时,却没有前缀“data=”,导致校验一直失败。—> 调试手段:1、可以使用LINUX下面的curl命令进行HTTP POST请求,看这样是否能成功,其中-v可用于调试

http://blog.csdn.net/fengshuiyue/article/details/39530093/
curl -X POST https://api.xfyun.cn/v1/aiui/v1/iat -H “X-Appid:xxxxxx” -H “X-CurTime:1520759784” -H “X-CheckSum:2476bc9a9dedd3b3977786cf54d1c5fd” -H “X-Param:eyJhdWYiOiAiMTZrIiwgImF1ZSI6ICJyYXciLCAic2NlbmUiOiAibWFpbiJ9” -d “MTIz” -v

8、通过WebAPI的方式调用讯飞语音识别功能,发现识别速度要比讯飞提供的SDK快。

<—- 第四阶段完成

第五阶段:自动唤醒识别 —->

背景:前几阶段都是先录制好音频文件,再手动执行程序,上传文件识别,为了真正满足应用,开始加入语音唤醒功能。

1、通过WebRTC实现语音活动监测VAD
2、WebRTC包含许多功能,而且提供的源码里没有提供./configure make&make install的第三方库文件生成方式,所以把其中的VAD相关文件提出单独编译。
3、前阶段都是采用ALSA提供的arecord命令进行录音,不够灵活,下面开始采用API的方式实现录音。—> 可参照ALSA官网提供的入门文档:《A Tutorial on Using the ALSA Audio API》
4、声卡名字 hw:0,0
5、函数体内的字符串常量存在栈还是初始化变量区?—> 存在初始化变量区
6、调用sal_thread_create创建线程时,到snd_pcm_open时会出现段错误 —> 改变线程创建时的栈大小,发现段错误出现的位置在变化。因此推断是由于指定的栈空间太小,导致线程出现段错误。使用ulimit -s命令查看线程默认栈大小
7、二进制模式和文本模式的区别?LINUX是只有一种文件类型的系统,带b和不带b字母的模式相同。

C语言提供了文本模式和二进制模式,是为了适应不同操作系统对某些符号的不同处理。当选择不带b的模式时,上层应用程序与操作系统之间进行数据交互时,操作系统会对内容进行一层预处理(或者说转义),比如Windows将回车符”\r\n”解释成”\n”。
对于相同的文件ABC(回车)D,在windows下进行处理时,不带b的模式读出来是ABC\nD,带b读出来是ABC\r\nD。
对于相同的文件ABC(回车)D,在LINUX下进行处理时,不带b的模式读出来是ABC\nD,带b读出来是ABC\nD。

8、tar.gz tar.bz的区别 —> tar zcvf .tar.gz \ tar jxvf .tar.bz2 , gz(兼顾压缩时间和压缩比)
Linux下常用压缩 解压命令和压缩比率对比
9、fprintf和fwrite的区别?
10、如何进行端点监测?—> 持续一段时间。
python的webrtc库实现语音端点检测
11、 前面是在PC端的LINUX虚拟机上实现的,移植到MINI2440之后,设置channel为1的时候出错 —> 查找datasheet发现UDA1341只支持立体声。
12、由于讯飞语音识别接口对音频格式有具体要求,其中就必须要是单声道,所以要将双声道转单声道。
【C语言】PCM音频数据处理—左右声道分离
13、出错:snd_pcm_readi 返回错误:Broken pipe —> 通过time(0)打印时间差,发现是降噪太耗时间,导致超时,去掉降噪就可以了。
PCM音频处理——使用WebRTC音频降噪模块与其他方式的对比

<—- 第五阶段完成

3.源码路径

github:ASR-LINUX-MINI2440
github:CBB-LINUX

4.联系方式

  欢迎各位大佬来指导、交流和讨论。Email:zengchao@cqu.edu.cn

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值