科大讯飞离线语音识别安装与运行
先从官网下载sdk.
文件解析:
bin/inc下有四个头文件:msp_errors.h msp_types.h qisr.h qtts.h
msp_errors.h msp_types.h为通用数据结构的头文件,qisr.h是语音识别用的头文件,qtts.h是语音合成用的头文件。
这是sdk中原代的解释:
1.doc目录下存放开发文档等; 2.lib目录下存放SDK需要调用的动态库以及需要引用的头文件。 3.example目录下存放提供的示例demo,每个例子下都有Makefile文件,在当前目录make即可; 4.bin目录下存放符合标准的语音文件样例、配置文件和资源文件等,make之后的example可执行程序也会拷贝至此,请在此目录下运行,否则会运行失败; 5.prj目录下提供make脚本,可以快速编译例子。
然后我按照它的指示,在example下的asrdome下make,然而报错:找不到 lasound,去看它的makefile文件,其中需要这个库,在网上搜了一下,解决方案如下:
sudo apt-get install alsa-base alsa-utils alsa-source libasound2-dev
重新编译,又报错,警告:检测到时钟错误。您的创建可能是不完整的。
将之前编译创建的 “asrdemo.o” 删除 继续,编译成功。
然后再bin下生成了"asrdemo"可执行文件,在bin目录下运行(./asrdemo)
运行成功。
然而 输出的结果是一堆代码,里面夹杂识别的话。在网上查了一下,代码的函数逻辑大概如下
1.先要调用QISRInit()函数,参数是自己的appid,每个SDK都是注册才能下载的,所以是唯一的,用来区分用户的,不同级别的用户每天可以使用SDK的次数有限制,毕竟人用的多了语音识别的性能肯定会下降;
2.之后就是把GrammarID,输入输出的参数param和调用状态返回值ret作为参数传入QISRSessionBegin()函数中进行初始化,返回值是sessionID,这个是后面所有函数的主要参数之一;
3.打开自己的音频文件,调用QISRAudioWrite()函数写入,可以分段也可以一次,第一个参数是sessionID,上面初始化函数返回的值,第二个参数是音频数据头指针,第三个参数是音频文件大小,第四个参数是音频发送的状态,表示发送完了没有,剩下两个是服务器端检测语音状态和识别状态的返回值;
4.调用QISRGetResult()函数获取识别的结果,第一个参数还是sessionID,第二个参数是输出识别的状态,第三个参数是与服务器交互的间隔时间,官方建议5000,我取为0,第四个参数是调用状态返回值ret,最后这个函数的返回值就是上面结果的json数据了
录制语音时,使用“ffmpeg”录音,简单方便,符合语音识别的要求。
讯飞语音对语音的要求如下:采样率16K或8KHz,采样位是16位,单声道,格式是PCM或WAV。自带的录音软件都是默认32位采样,只能用ffmpeg或自己写代码录制,ffmpeg命令如下:
ffmpeg -f alsa -ar 16000 -ac 1 -i hw:0 lib.wav