智能语音计算器(四)
最后说讯飞的语音引擎部分,这部分的实现逻辑可以参考官方给的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
智能语音计算器(四)相关推荐
- 智能语音计算器(三)
这边来说界面的实现,个人觉得该模块实现有点乱,因为其中包括了录音功能,还需要改进. #ifndef CALCULATORUI_H #define CALCULATORUI_H#include < ...
- 智能语音计算器(二)
这边文章来介绍该项目的计算引擎模块. #ifndef CALCULATORDEC_H #define CALCULATORDEC_H#include <qt5/QtCore/QString> ...
- android语音记账,爱彼语记语音计算器记账记事本
爱彼语记语音计算器记账记事本是一款非常实用的手机记账工具.智能语音输入技术,集多种功能于一体,还有超多贴心小功能.感兴趣的朋友不要错过了,快来下载体验吧. 应用详情: 能听懂您说出的运算表达式并秒出结 ...
- 阿里AI labs发布两大天猫精灵新品,将与平头哥共同定制智能语音芯片
作者 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 2019 年,去年刮起的一阵智能音箱热浪似乎稍微冷却下来,新产品不再像雨后春笋一样层出不穷,挺过市场洗礼的产品更是凤毛麟角,这些产 ...
- 中国智能语音行业研究
报告来源:中信证券 作者:刘雯蜀 杨泽原 张若海 智能语音作为人机交互的新型方式,有望大规模推广,中国市场是更适合语音交互的市场. 2017年中国人工智能市场规模达约220亿元,智能语音占中国人工 ...
- 智能语音简史:这场技术革命从哪开始?
来源:与非网 1952年,贝尔实验室(Bell Labs)制造一台6英尺高自动数字识别机"Audrey",它可以识别数字0-9的发音,且准确度高达90%以上.并且它对熟人的精准度高 ...
- 智能语音技术新发展与发展趋势
本文总结于西工大音频语音与语言处理实验室(ASLP@NPU)负责人-谢磊教授在深蓝学院的公开课--智能语音技术的新进展与发展趋势-NPU-ASLP视角. 大家好!感谢深蓝学院的邀请!我代表西工大音频语 ...
- 大咖面对面 | 陈果果博士谈智能语音
智能语音在近年一直是个很火的话题,商业应用也在不断增加,在10月10号的深蓝&大咖面对面活动中,我们邀请到了语音界大佬陈果果博士,针对目前语音领域问题进行分享与探讨. 目录 嘉宾介绍 直播精华 ...
- python json loads 中文乱码_python实现智能语音天气预报
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 飞奔的帅帅 PS:如有需要Python学习资料的小伙伴可以加点击下 ...
最新文章
- 拼音开头有什么字_excel查找函数应用:如何提取姓名的拼音首字母
- Leetcode-整数反转 C++
- 腾讯开奖,应届生年薪40万,白菜价,薪资倒挂!
- java i= i_java中 i!=i+1?你错了。 | 学步园
- winform Combobox出现System.Data.DataRowView的解决的方法
- MySQL 时间戳转换成秒
- python 数组学习
- CLR Via CSharp读书笔记(11):事件
- 每天一道剑指offer-重建二叉树
- 不知不觉,写了一个编译器(一)
- hdu 2037 这个夏天不AC (java)
- 学习笔记 再论静态方法和类方法
- 软件工程导论 实验三 软件设计
- 下载超星或读秀图书时,怎么搞定完整书签?
- 100句激励自己的英文名言
- mysql 定义取值范围_MySQL中各种字段的取值范围
- 【权威发布】360追日团队:Xshellghost技术分析——入侵感染供应链软件的大规模定向攻击
- ChatGPT初体验——开发好帮手
- 你所不知的X86 CPU微码机制
- 计算机b类核心期刊有哪些,B类及以上期刊有哪些
热门文章
- LCCUP‘22秋季编程大赛(个人赛)总结
- Hadoop垃圾回收站与YARN日志聚合
- 北京燃油车指标转成新能源指标怎么转?
- 拥挤城市小程序如何玩转会展营销?
- elasticsearch分词练习、自定义分词器练习
- 2015 计蒜之道 初赛 第一场 搜狗输入法的分词算法
- 基于AT89S52芯片+LCD1602液晶显示+DS12C887时钟模块的数字时钟
- 【干货】1.5W+字的全链路前端性能优化送给你
- TensorFlow: A System for Large-Scale Machine Learning翻译
- 2018技术胖Web前端视频教程全套