【QT分享】基于QT的连续语音识别 [复制链接]
电梯直达
跳转到指定楼层
21189
楼主| TShadow 发表于 2017-3-13 19:56:21
1#
本帖最后由 TShadow 于 2017-3-13 19:56 编辑
操作系统:windows 10 x64
测试版本:Qt 5.8 mingw
本贴提供一个基于QT的连续语音识别Demo,通过音量大小判断音频录入的开始和结束,在附件的代码里,实时音量跟踪和录音都被封装成了独立的类,大家可以在记的代码里导入这些类并直接使用,即可实现连续语音识别了。
-
MicAudio类
提供两个可调用的函数,很简单。- void startListen() : 开始监听音量
- void stopListen():停止监听音量
刷新时间可以在函数内部自行修改,当捕获到音量时会自动发出一个signal,在主函数中connect一下并在slot里操作即可。
-
WaveRecorder类
主要用到的就是void set_FileName(QString des_path),void Start(),void Stop(),void Reset()- void set_FileName: 设置录音文件
- void Start: 开始录音
- void Stop: 停止录音
- void Reset: 重置参数
这个类很简单,但是调用的是win底层api,QT在使用之前需要先在pro文件里加载libwinmm.a,这个我已经在demo配置好了,libwinmm.a就在目录下。
-
iFlyVoice类
这个类相对于之前的版本(http://bbs.xfyun.cn/forum.php?mo … id=24654&extra=)做了修改,继承了QThread,程序中是以新的线程执行的,为什么这么做后面会说。主要用到以下函数:- bool login(const char* login_param):登录操作,返回登录是否成功。记得填好自己的appid
- bool logout():退出操作,很简单。
- void speech2Text(const char* audioFileName, int iaccent, char *grammarId):主要就是语音转文字,具体介绍可以看code里面的说明,这个函数会通过继承QThread的run函数在新的线程里面执行,以start函数自动调用run。
主函数的整体思路:
由MicAudio类实时监听音量变化,当超过一定数值就开始由WaveRecorder类录音,为什么不用Qt自带的录音,一是避免实时监听和录音的冲突,二是底层API的效率会高一些,可以有效避免冲突。当音量低于一定数值时,自动停止录音,然后调用iFlyVoice类开辟新的线程并进行翻译,然后显示出结果。其实,我也试过用QAudioRecorder录音,但是效果总是不好,于是抛弃了。
提示:代码中的appid已经删除,请填写自己的,msc.dll也使用自己的吧,如果遇见未启动就crash,基本上是msc.dll没放好的原因。其他的操作也可以看参考之前的帖子,就是写的有点乱。http://bbs.xfyun.cn/forum.php?mo … id=24654&extra=
本博客分享了一个基于QT的连续语音识别演示项目,利用音量大小判断音频录制的开始和结束,提供了MicAudio、WaveRecorder和iFlyVoice三个关键类,分别用于音量监听、录音和语音转文字。

被折叠的 条评论
为什么被折叠?



