帖子

[demo分享] 【QT分享】基于QT的连续语音识别

[复制链接]
  • TA的每日心情
    开心
    2017-4-18 23:35
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    613410  楼主| TShadow 发表于 2017-3-13 19:56:21 1#
    本帖最后由 TShadow 于 2017-3-13 19:56 编辑

    -------------------------------
    操作系统:windows 10 x64
    测试版本:Qt 5.8 mingw
    -------------------------------

    本贴提供一个基于QT的连续语音识别Demo,通过音量大小判断音频录入的开始和结束,在附件的代码里,实时音量跟踪和录音都被封装成了独立的类,大家可以在记的代码里导入这些类并直接使用,即可实现连续语音识别了。

    1.  MicAudio类
         提供两个可调用的函数,很简单。
         1) void startListen() : 开始监听音量
         2) void stopListen():停止监听音量
        刷新时间可以在函数内部自行修改,当捕获到音量时会自动发出一个signal,在主函数中connect一下并在slot里操作即可。

    2. WaveRecorder类
        主要用到的就是void set_FileName(QString des_path),void Start(),void Stop(),void Reset()
         1) void set_FileName: 设置录音文件
         2) void Start: 开始录音
         3) void Stop: 停止录音
         4) void Reset: 重置参数
        这个类很简单,但是调用的是win底层api,QT在使用之前需要先在pro文件里加载libwinmm.a,这个我已经在demo配置好了,libwinmm.a就在目录下。


    3.  iFlyVoice类
        这个类相对于之前的版本(http://bbs.xfyun.cn/forum.php?mo ... id=24654&extra=)做了修改,继承了QThread,程序中是以新的线程执行的,为什么这么做后面会说。主要用到以下函数:
        1) bool login(const char* login_param):登录操作,返回登录是否成功。记得填好自己的appid
        2) bool logout():退出操作,很简单。
        3) 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=

    最后,欢迎大家积极讨论,尤其是我的方案有哪些问题或者可以值得进一步优化的。

    VoiceAssist2.0.rar

    39.47 KB, 下载次数: 284

    评分

    参与人数 2语点 +9 收起 理由
    13265198681 + 5 很给力!
    壹伍壹拾 + 4 很给力!

    查看全部评分

    壹伍壹拾 发表于 2017-3-14 09:16:12
    2#
    感谢分享,对我帮助很大,请问可以移植到arm板上面去吗?qt4.7.1

    楼内回复

    目前我没还没尝试过  详情 发表于 2017-3-14 13:01
    使用道具 举报 回复
     楼主| TShadow 发表于 2017-3-14 13:01:26
    3#
    壹伍壹拾 发表于 2017-3-14 09:16
    感谢分享,对我帮助很大,请问可以移植到arm板上面去吗?qt4.7.1

    目前我没还没尝试过
    使用道具 举报 回复
    JZ2440 发表于 2017-6-14 18:51:05
    4#
    感谢楼主分享的好东西,收藏了
    使用道具 举报 回复
    JZ2440 发表于 2017-6-14 18:51:09
    5#
    感谢楼主分享的好东西,收藏了

    楼内回复

    请问楼主,怎么会出现 ”rror: LNK1107: 文件无效或损坏: 无法在 0x2B8 处读取”这个错误  详情 发表于 2017-6-25 15:01
    使用道具 举报 回复
    AutoNoval 发表于 2017-6-25 15:01:40
    6#
    JZ2440 发表于 2017-6-14 18:51
    感谢楼主分享的好东西,收藏了

    请问楼主,怎么会出现 ”rror: LNK1107: 文件无效或损坏:  无法在 0x2B8 处读取”这个错误

    楼内回复

    你应该问一下楼主  详情 发表于 2017-6-30 09:39
    使用道具 举报 回复
    JZ2440 发表于 2017-6-30 09:39:16
    7#
    AutoNoval 发表于 2017-6-25 15:01
    请问楼主,怎么会出现 ”rror: LNK1107: 文件无效或损坏:  无法在 0x2B8 处读取”这个错误
    ...

    你应该问一下楼主
    使用道具 举报 回复
    weizehai087@163 发表于 2017-10-31 17:48:59
    8#
    楼主,为什么我的运行出来,不会显示出识别的文字
    使用道具 举报 回复
    641878107@qq.co 发表于 2018-8-30 21:38:53
    9#
    楼主你好,想问一下appid登陆一直显示失败是怎么回事?您的两个版本我都尝试过了

    楼内回复

    因为登录方式出错了,所以不能登录。可以换成另外一种登录方式。 int ret = MSP_SUCCESS; int upload_on = 1; //是否上传用户词表 const char* login_params = "appid =12345  详情 发表于 2020-1-3 12:11
    使用道具 举报 回复
    156****6176 发表于 2018-10-10 14:09:33
    10#
    楼主您好,首先感谢您的分享。现在是使用起来了,但是我每次说话的前几次都可识别出来,后面就不能识别了。 而且识别的频率有点慢。请问楼主是否已经优化,或者可以指点一下,谢谢!
    使用道具 举报 回复