最后说讯飞的语音引擎部分,这部分的实现逻辑可以参考官方给的demo,一步一步来就行。

#ifndef CALCULATORASR_H
#define CALCULATORASR_H#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>#include "qisr.h"
#include "msp_cmn.h"
#include "msp_errors.h"#define    BUFFER_SIZE    4096
#define FRAME_LEN    640
#define HINTS_SIZE  100
#define RET_SIZE 100class CalculatorASR
{public:CalculatorASR();~CalculatorASR();void myLogin();void run_iat(const char* audio_file, const char* session_begin_params);void myLogOut();char* getResult();private:char result[RET_SIZE];
};#endif

根据代码的结构做一下小小的改动。

#include "CalculatorASR.h"CalculatorASR::CalculatorASR()
{}CalculatorASR::~CalculatorASR()
{}void CalculatorASR::run_iat(const char* audio_file, const char* session_begin_params)
{const char*        session_id                    =    NULL;char            rec_result[BUFFER_SIZE]        =    {NULL};    char            hints[HINTS_SIZE]            =    {NULL}; //hints为结束本次会话的原因描述,由用户自定义unsigned int    total_len                    =    0; int                aud_stat                    =    MSP_AUDIO_SAMPLE_CONTINUE ;        //音频状态int                ep_stat                        =    MSP_EP_LOOKING_FOR_SPEECH;        //端点检测int                rec_stat                    =    MSP_REC_STATUS_SUCCESS ;            //识别状态int                errcode                        =    MSP_SUCCESS ;FILE*            f_pcm                        =    NULL;char*            p_pcm                        =    NULL;long            pcm_count                    =    0;long            pcm_size                    =    0;long            read_size                    =    0;if (NULL == audio_file)goto iat_exit;f_pcm = fopen(audio_file, "rb");if (NULL == f_pcm) {printf("\nopen [%s] failed! \n", audio_file);goto iat_exit;}fseek(f_pcm, 0, SEEK_END);pcm_size = ftell(f_pcm); //获取音频文件大小 fseek(f_pcm, 0, SEEK_SET);        p_pcm = (char *)malloc(pcm_size);if (NULL == p_pcm){printf("\nout of memory! \n");goto iat_exit;}read_size = fread((void *)p_pcm, 1, pcm_size, f_pcm); //读取音频文件内容if (read_size != pcm_size){printf("\nread [%s] error!\n", audio_file);goto iat_exit;}//printf("\n开始语音听写 ...\n");session_id = QISRSessionBegin(NULL, session_begin_params, &errcode); //听写不需要语法,第一个参数为NULLif (MSP_SUCCESS != errcode){printf("\nQISRSessionBegin failed! error code:%d\n", errcode);goto iat_exit;}while (1) {unsigned int len = 10 * FRAME_LEN; // 每次写入200ms音频(16k,16bit):1帧音频20ms,10帧=200ms。16k采样率的16位音频,一帧的大小为640Byteint ret = 0;if (pcm_size < 2 * len) len = pcm_size;if (len <= 0)break;aud_stat = MSP_AUDIO_SAMPLE_CONTINUE;if (0 == pcm_count)aud_stat = MSP_AUDIO_SAMPLE_FIRST;ret = QISRAudioWrite(session_id, (const void *)&p_pcm[pcm_count], len, aud_stat, &ep_stat, &rec_stat);if (MSP_SUCCESS != ret){printf("\nQISRAudioWrite failed! error code:%d\n", ret);goto iat_exit;}pcm_count += (long)len;pcm_size  -= (long)len;if (MSP_REC_STATUS_SUCCESS == rec_stat) //已经有部分听写结果
        {const char *rslt = QISRGetResult(session_id, &rec_stat, 0, &errcode);if (MSP_SUCCESS != errcode){printf("\nQISRGetResult failed! error code: %d\n", errcode);goto iat_exit;}if (NULL != rslt){unsigned int rslt_len = strlen(rslt);total_len += rslt_len;if (total_len >= BUFFER_SIZE){printf("\nno enough buffer for rec_result !\n");goto iat_exit;}strncat(rec_result, rslt, rslt_len);}}if (MSP_EP_AFTER_SPEECH == ep_stat)break;//usleep(200*1000); //模拟人说话时间间隙。200ms对应10帧的音频
    }errcode = QISRAudioWrite(session_id, NULL, 0, MSP_AUDIO_SAMPLE_LAST, &ep_stat, &rec_stat);if (MSP_SUCCESS != errcode){printf("\nQISRAudioWrite failed! error code:%d \n", errcode);goto iat_exit;    }while (MSP_REC_STATUS_COMPLETE != rec_stat) {const char *rslt = QISRGetResult(session_id, &rec_stat, 0, &errcode);if (MSP_SUCCESS != errcode){printf("\nQISRGetResult failed, error code: %d\n", errcode);goto iat_exit;}if (NULL != rslt){unsigned int rslt_len = strlen(rslt);total_len += rslt_len;if (total_len >= BUFFER_SIZE){printf("\nno enough buffer for rec_result !\n");goto iat_exit;}strncat(rec_result, rslt, rslt_len);}usleep(150*1000); //防止频繁占用CPU
    }memset(result,0,sizeof(result));strcpy(result,rec_result);iat_exit:if (NULL != f_pcm){fclose(f_pcm);f_pcm = NULL;}if (NULL != p_pcm){    free(p_pcm);p_pcm = NULL;}QISRSessionEnd(session_id, hints);
}void CalculatorASR::myLogin()
{int            ret                        =    MSP_SUCCESS;const char* login_params            =    "appid = 5bc94820, work_dir = ."; // 登录参数,appid与msc库绑定,请勿随意改动const char* session_begin_params    =    "sub = iat, domain = iat, language = zh_cn, accent = mandarin, sample_rate = 16000, result_type = plain, result_encoding = utf8";/* 用户登录 */ret = MSPLogin(NULL, NULL, login_params); //第一个参数是用户名,第二个参数是密码,均传NULL即可,第三个参数是登录参数    if (MSP_SUCCESS != ret){printf("MSPLogin failed , Error code %d.\n",ret);//goto exit; //登录失败,退出登录
    }
}void CalculatorASR::myLogOut()
{MSPLogout();
}char *CalculatorASR::getResult()
{return result;
}

讯飞的下载地址:https://doc.xfyun.cn/msc_linux/

我是在linux系统下实现的,也提供其他系统的SDK,根据自己需求选择下载类型。

在此再次感谢科大讯飞。

转载于:https://www.cnblogs.com/wzqstudy/p/10076875.html

智能语音计算器(四)相关推荐

  1. 智能语音计算器(三)

    这边来说界面的实现,个人觉得该模块实现有点乱,因为其中包括了录音功能,还需要改进. #ifndef CALCULATORUI_H #define CALCULATORUI_H#include < ...

  2. 智能语音计算器(二)

    这边文章来介绍该项目的计算引擎模块. #ifndef CALCULATORDEC_H #define CALCULATORDEC_H#include <qt5/QtCore/QString> ...

  3. android语音记账,爱彼语记语音计算器记账记事本

    爱彼语记语音计算器记账记事本是一款非常实用的手机记账工具.智能语音输入技术,集多种功能于一体,还有超多贴心小功能.感兴趣的朋友不要错过了,快来下载体验吧. 应用详情: 能听懂您说出的运算表达式并秒出结 ...

  4. 阿里AI labs发布两大天猫精灵新品,将与平头哥共同定制智能语音芯片

    作者 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 2019 年,去年刮起的一阵智能音箱热浪似乎稍微冷却下来,新产品不再像雨后春笋一样层出不穷,挺过市场洗礼的产品更是凤毛麟角,这些产 ...

  5. 中国智能语音行业研究

    报告来源:中信证券 作者:刘雯蜀  杨泽原  张若海 智能语音作为人机交互的新型方式,有望大规模推广,中国市场是更适合语音交互的市场. 2017年中国人工智能市场规模达约220亿元,智能语音占中国人工 ...

  6. 智能语音简史:这场技术革命从哪开始?

    来源:与非网 1952年,贝尔实验室(Bell Labs)制造一台6英尺高自动数字识别机"Audrey",它可以识别数字0-9的发音,且准确度高达90%以上.并且它对熟人的精准度高 ...

  7. 智能语音技术新发展与发展趋势

    本文总结于西工大音频语音与语言处理实验室(ASLP@NPU)负责人-谢磊教授在深蓝学院的公开课--智能语音技术的新进展与发展趋势-NPU-ASLP视角. 大家好!感谢深蓝学院的邀请!我代表西工大音频语 ...

  8. 大咖面对面 | 陈果果博士谈智能语音

    智能语音在近年一直是个很火的话题,商业应用也在不断增加,在10月10号的深蓝&大咖面对面活动中,我们邀请到了语音界大佬陈果果博士,针对目前语音领域问题进行分享与探讨. 目录 嘉宾介绍 直播精华 ...

  9. python json loads 中文乱码_python实现智能语音天气预报

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 飞奔的帅帅 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

最新文章

  1. 拼音开头有什么字_excel查找函数应用:如何提取姓名的拼音首字母
  2. Leetcode-整数反转 C++
  3. 腾讯开奖,应届生年薪40万,白菜价,薪资倒挂!
  4. java i= i_java中 i!=i+1?你错了。 | 学步园
  5. winform Combobox出现System.Data.DataRowView的解决的方法
  6. MySQL 时间戳转换成秒
  7. python 数组学习
  8. CLR Via CSharp读书笔记(11):事件
  9. 每天一道剑指offer-重建二叉树
  10. 不知不觉,写了一个编译器(一)
  11. hdu 2037 这个夏天不AC (java)
  12. 学习笔记 再论静态方法和类方法
  13. 软件工程导论 实验三 软件设计
  14. 下载超星或读秀图书时,怎么搞定完整书签?
  15. 100句激励自己的英文名言
  16. mysql 定义取值范围_MySQL中各种字段的取值范围
  17. 【权威发布】360追日团队:Xshellghost技术分析——入侵感染供应链软件的大规模定向攻击
  18. ChatGPT初体验——开发好帮手
  19. 你所不知的X86 CPU微码机制
  20. 计算机b类核心期刊有哪些,B类及以上期刊有哪些

热门文章

  1. LCCUP‘22秋季编程大赛(个人赛)总结
  2. Hadoop垃圾回收站与YARN日志聚合
  3. 北京燃油车指标转成新能源指标怎么转?
  4. 拥挤城市小程序如何玩转会展营销?
  5. elasticsearch分词练习、自定义分词器练习
  6. 2015 计蒜之道 初赛 第一场 搜狗输入法的分词算法
  7. 基于AT89S52芯片+LCD1602液晶显示+DS12C887时钟模块的数字时钟
  8. 【干货】1.5W+字的全链路前端性能优化送给你
  9. TensorFlow: A System for Large-Scale Machine Learning翻译
  10. 2018技术胖Web前端视频教程全套