云知声语音语义识别,语音唤醒和语音合成简单工具类封装
最近项目在使用云知声SDK,遇到了不少麻烦现在总结下。自己留个记录也希望能够对有用到云知声的一个帮助。。不多说了上代码啦!!
一,语义识别和语音识别(在线语音识别和语义)至于本地识别就是类型不同已备注,云知声语音识别和语义识别是在一起的,这个大家使用时可注意了。语音识别我这边就直接转换成了String了,语义识别可能大家要根据自己需求去解析了。返回的是Json格式字符串
首先初始化key和secret这个大家要去云知声开放平台申请啦.为了方便大家链接云知声开放平台http://n
public class Config {public static final String appKey = ""; public static final String secret =""; }
public class ASROnline {private final Context mContext; private SpeechUnderstander mUnderstander; private StringBuffer mAsrResultBuffer; public ASROnline(Context context) {this.mContext = context; }/** * 当前识别状态 */ enum AsrStatus {idle, recording, recognizing }private static int currentDomain = 0; private static String arrayDomain[] = new String[]{"general", "poi", "song", "movietv", "medical"}; private static String arrayLanguageStr[] = new String[]{SpeechConstants.LANGUAGE_MANDARIN, SpeechConstants.LANGUAGE_ENGLISH, SpeechConstants.LANGUAGE_CANTONESE}; private static int arraySample[] = new int[]{SpeechConstants.ASR_SAMPLING_RATE_BANDWIDTH_AUTO, SpeechConstants.ASR_SAMPLING_RATE_16K, SpeechConstants.ASR_SAMPLING_RATE_8K}; private static int currentSample = 0; private static int currentLanguage = 0; private AsrStatus statue = AsrStatus.idle; public void startUnderstand() {mAsrResultBuffer = new StringBuffer(); //创建语音理解对象,appKey和 secret通过 http://dev.hivoice.cn/ 网站申请 mUnderstander = new SpeechUnderstander(mContext, Config.appKey, Config.secret); // 开启可变结果 mUnderstander.setOption(SpeechConstants.ASR_OPT_TEMP_RESULT_ENABLE, true); mUnderstander.setOption(SpeechConstants.ASR_EVENT_MODEL_LOAD_SUCCESS, true); // mUnderstander.setOption(SpeechConstants.VPR_FARFILED_ENABLED, true); //设置远讲是否可用 // mUnderstander.setOption( SpeechConstants.VPR_BLUETOOTH_ENABLED, true);开启蓝牙录音 // mUnderstander.setOption(SpeechConstants.ASR_SERVER_ADDR, true);设置语义解析服务器 SpeechConstants.NLU_SERVER_ADDR server=ip:port //mUnderstander.setOption(SpeechConstants.NLU_SERVER_ADDR,value); 设置语义解析服务器key/value mUnderstander.init(""); // 保存录音数据 // recognizer.setRecordingDataEnable(true); if (statue == AsrStatus.idle) {// 修改录音采样率 mUnderstander.setOption(SpeechConstants.ASR_SAMPLING_RATE, arraySample[currentSample]); // 修改识别领域 mUnderstander.setOption(SpeechConstants.ASR_DOMAIN, arrayDomain[currentDomain]); // 修改识别语音 mUnderstander.setOption(SpeechConstants.ASR_LANGUAGE, arrayLanguageStr[currentLanguage]); mUnderstander.start(); } else if (statue == AsrStatus.recording) {stopRecord(); } else if (statue == AsrStatus.recognizing) {mUnderstander.cancel(); statue = AsrStatus.idle; }//net_asr 在线识别结果 //net_nlu 在线语义结果 //local_asr 离线识别结果 mUnderstander.setListener(new SpeechUnderstanderListener() {@Override public void onResult(int type, String jsonResult) {switch (type) {case SpeechConstants.ASR_RESULT_NET: //网络识别结果 if (jsonResult.contains("net_asr")&& jsonResult.contains("net_nlu")){parseJsonData(jsonResult); } else {//取出语音识别结果 asrResultOperate(jsonResult); }break; case SpeechConstants.ASR_RESULT_LOCAL://本地识别结果 break; }}@Override public void onEvent(int type, int timeMs) {switch (type) {case SpeechConstants.ASR_EVENT_NET_END: //网络识别结束 statue = AsrStatus.idle; break; case SpeechConstants.ASR_EVENT_VOLUMECHANGE: //声音音量发生改变 // 说话音量实时返回可以通过progressbar显示 int volume = (Integer) mUnderstander.getOption(SpeechConstants.GENERAL_UPDATE_VOLUME); break; case SpeechConstants.ASR_EVENT_VAD_TIMEOUT://未说话超时自动停止说话 // 收到用户停止说话事件,停止录音 stopRecord(); break; case SpeechConstants.ASR_EVENT_RECORDING_STOP: //停止录音 statue = AsrStatus.recognizing; break; case SpeechConstants.ASR_EVENT_SPEECH_DETECTED://检测到说话 break; case SpeechConstants.ASR_EVENT_RECORDING_START://录音设备开启 statue = AsrStatus.recording; break; default:break; }}@Override public void onError(int type, String errorMSG) {if (errorMSG != null) {// 显示错误信息 hitErrorMsg(errorMSG); } else {YunSpeechSynthesisUtil.startYunSpeechSYnthesis(mContext, "我是小助手有什么可以帮您,请将"); }}}); }//语义理解json private void asrResultOperate(String jsonResult) {WeatherJavaBean weatherJavaBean = new Gson().fromJson(jsonResult, WeatherJavaBean.class); WeatherJavaBean.NetNluBean netNluBean = weatherJavaBean.net_nlu.get(0); String code = netNluBean.code; if (code.equals("FORECAST")){String header = netNluBean.data.header; String carWashIndexDesc = netNluBean.data.result.weatherDays.get(0).carWashIndexDesc; YunSpeechSynthesisUtil.startYunSpeechSYnthesis(mContext,header+carWashIndexDesc); }}private void stopRecord() {mUnderstander.stop(); }//语音识别json结果 private void parseJsonData(String jsonResult) {InitJava initJava = new Gson().fromJson(jsonResult, InitJava.class); List<InitJava.NetAsrBean> net_asr = initJava.net_asr; InitJava.NetAsrBean netAsrBean = net_asr.get(0); String status = netAsrBean.result_type; if (status.equals("full")){String result = netAsrBean.recognition_result; if (result!=null){YunSpeechSynthesisUtil.startYunSpeechSYnthesis(mContext,result.trim()); }else {YunSpeechSynthesisUtil.startYunSpeechSYnthesis(mContext, "抱歉,未听清"); }}}private void hitErrorMsg(String msg) {Toast.makeText(mContext, msg, Toast.LENGTH_LONG).show(); } }
public class InitJava {public List<NetAsrBean> net_asr; public List<NetNluBean> net_nlu; public static class NetAsrBean {public String engine_mode; public boolean last_result; public String recognition_result; public String result_type; public String sessionID; }public static class NetNluBean {public String code; public GeneralBean general; public String history; public String nluProcessTime; public int rc; public String responseId; public String service; public String text; public static class GeneralBean {public String text; public String type; }}
二,语音合成
private static SpeechSynthesizer mTTSPlayer; public static void startYunSpeechSYnthesis(Context context, String speechContent){// 创建语音合成对象 mTTSPlayer = new SpeechSynthesizer(context, Config.appKey, Config.secret); mTTSPlayer.setOption(SpeechConstants.TTS_SERVICE_MODE, SpeechConstants.TTS_SERVICE_MODE_NET); mTTSPlayer.init(""); mTTSPlayer.setTTSListener(new SpeechSynthesizerListener() {@Override public void onEvent(int type) {switch (type) {case SpeechConstants.TTS_EVENT_INIT:// 初始化成功回调 break; case SpeechConstants.TTS_EVENT_SYNTHESIZER_START:// 开始合成回调 break; case SpeechConstants.TTS_EVENT_SYNTHESIZER_END:// 合成结束回调 break; case SpeechConstants.TTS_EVENT_BUFFER_BEGIN:// 合成结束回调 break; case SpeechConstants.TTS_EVENT_BUFFER_READY:// 合成结束回调 break; case SpeechConstants.TTS_EVENT_PLAYING_START:// 开始播放回调 break; case SpeechConstants.TTS_EVENT_PLAYING_END:// 播放完成回调 break; case SpeechConstants.TTS_EVENT_PAUSE:// 暂停回调 break; case SpeechConstants.TTS_EVENT_RESUME:// 恢复回调 break; case SpeechConstants.TTS_EVENT_STOP:// 停止回调 break; case SpeechConstants.TTS_EVENT_RELEASE:// 释放资源回调 break; default:break; }}// 语音合成错误回调 @Override public void onError(int type, String errorMSG) {if (errorMSG != null) {System.out.println(errorMSG+"错误信息"); } else {System.out.println("对不起,说的没听清"); }}}); mTTSPlayer.playText(speechContent); }
三,语音唤醒
private Context mWakeContext; private SpeechUnderstander mWakeUpRecognizer; private static final String WAKEUP_TAG = "wakeup"; private Vibrator mVibrator; public YunWakeUpOffline(Context context){this.mWakeContext =context; }/** * 初始化本地离线唤醒 */ public void startWakeUp() {mWakeUpRecognizer = new SpeechUnderstander(mWakeContext, Config.appKey, null); mWakeUpRecognizer.setOption(SpeechConstants.ASR_SERVICE_MODE, SpeechConstants.ASR_SERVICE_MODE_LOCAL); mWakeUpRecognizer.setOption(SpeechConstants.WAKEUP_EVENT_SET_WAKEUPWORD_DONE,"你好,魔方");//设置唤醒词 mWakeUpRecognizer.init(""); mWakeUpRecognizer.setListener(new SpeechUnderstanderListener() {//成功结果 @Override public void onResult(int type, String jsonResult) {System.out.println(jsonResult+"语音唤醒jsonResult"); YunSpeechSynthesisUtil.startYunSpeechSYnthesis(mWakeContext,"你好"); }@Override public void onEvent(int type, int timeMs) {switch (type) {case SpeechConstants.WAKEUP_EVENT_RECOGNITION_SUCCESS: //识别成功 Log.d("TEMPLOG", "WAKEUP_EVENT_RECOGNITION_SUCCESS"); mVibrator.vibrate(300); YunSpeechSynthesisUtil.startYunSpeechSYnthesis(mWakeContext,"语音已唤醒"); break; case SpeechConstants.ASR_EVENT_RECORDING_START:Log.d("TEMPLOG", "ASR_EVENT_RECORDING_START"); //TODO 设置提醒 break; case SpeechConstants.ASR_EVENT_RECORDING_STOP:Log.d("TEMPLOG", "ASR_EVENT_RECORDING_STOP"); break; case SpeechConstants.ASR_EVENT_ENGINE_INIT_DONE:Log.d("TEMPLOG", "ASR_EVENT_ENGINE_INIT_DONE"); wakeUpStart(); break; default:break; }}@Override public void onError(int type, String errorMSG) {}}); }/** * 启动语音唤醒 */ protected void wakeUpStart() {mWakeUpRecognizer.start(WAKEUP_TAG); }
在实际开发中基本都是相互使用的,大家使用到的话根据自己需要来!
云知声语音语义识别,语音唤醒和语音合成简单工具类封装相关推荐
- 【AI测试】智能音箱--自然语言处理,语音语义识别测试
参考博客原址:https://blog.csdn.net/lhh08hasee/article/details/80306474 自己目前没有做过自然语言处理,语音语义识别测试,本文为听一场语音语义识 ...
- 一文读懂语音语义识别技术的现状与未来
[IT168 评论]我一直认为,人工智能应用的大前提是可以很自然的进行人机语言交互.近年来,在深度学习的驱动下,语音技术取得了重大进展,语音云用户规模达到了亿级规模,每日请求千万次,并且交互技术由单一 ...
- 语音情感识别--语音(声音的预处理)
语音信号(声音是什么) 声音是由物体振动产生的声波,是通过介质(空气或固体.液体)传播并能被人或动物听觉器官所感知的波动现象,最初发出振动的物体叫声源.声音(语音消息)的基本模拟形式是一种称为语音信号 ...
- 语音情感识别----语音特征集之eGeMAPS,ComParE,09IS,BoAW
一:LLDs特征和HSFs特征 (1)首先区分一下frame和utterance,frame就是一帧语音.utterance是一段语音,是比帧高一级的语音单位,通常指一句话,一个语音样本.uttera ...
- python百度语音实时识别成文字_python 语音合成
0树莓派 Python 使用 mpg123 播放声音 安装 mpg123 执行命令:sudo apt-get install mpg123 播放声音 import os os.system('mpg1 ...
- uniapp + 微信小程序 + 云开发。实现一个可以计算汽车油耗的工具类微信小程序
简介 是一款可以计算汽车油耗的小程序.根据加油量.所加油量跑的公里数.当时的油价.即可以计算出汽车的百公里油耗.每公里花费多少钱等数据.并且可以将每次数据永久记录下来,然后可以将多次的数据进行横向的对 ...
- 重磅!普惠AI--华为云语音语义万次调用1元购,有奖问答@评论区等你来!
活动快速入口:https://activity.huaweicloud.com/language_speech_promotion0.html 语音交互与自然语言处理 语音交互是一种人机交互方式,以开 ...
- 云知声原创技术再获肯定:多篇论文被国际语音顶会 INTERSPEECH 2020 收录
近日,全球语音顶会INTERSPEECH 2020 公布了论文接收结果,云知声联合上海师范大学.安徽大学等高校发表多篇论文成功入选.分别在中英文混合语音识别.大词汇量连续语音识别和多模态虚拟形象生成等 ...
- 疫情排查节时86%?不会代码也能玩转模型训练?腾讯大神揭秘语音语义及AutoML黑科技 | 内含福利...
出品 | AI科技大本营(ID:rgznai100) 2020年7月3日,AI ProCon 2020 AI开发者万人大会,隆重举行!作为CSDN策划并主办的系列技术「开发者大会」之一,本次大会通过线 ...
- 基于音频和文本的多模态语音情感识别(一篇极好的论文,值得一看哦!)
基于音频和文本的多模态语音情感识别 语音情感识别是一项具有挑战性的任务,在构建性能良好的分类器时,广泛依赖于使用音频功能的模型.本文提出了一种新的深度双循环编码器模型,该模型同时利用文本数据和音频信号 ...
最新文章
- Cowboy 源码分析(一)
- targetNamespace
- linux io重定向指令,Linux基础知识之 IO重定向
- WebHook 与jenkins
- Qt:OpenCV—Q图像处理基本操作(Code)
- Python自动绘制UML类图、函数调用图(Call Graph)
- 浅析微信支付:1前篇大纲
- python管道怎么使用_如何在多个流程中正确使用管道(2)
- 计算机无法播放所有视频文件,在电脑中打开flv视频文件显示空白无法播放怎么办...
- 在xp3下,Apache , PHP, Zend Studio怎样配置环境?
- 使用Java合并excel的sheet的操作
- linux-redis设置密码
- HHDBCS及HHDESK的资源加密功能
- shell脚本scp自动输入密码
- 【转】25个开发性能优化
- 显示如何用最少的20美元来付款
- java计算机毕业设计教师教学质量评估系统MyBatis+系统+LW文档+源码+调试部署
- ubuntu server 7.04(10.04版也行) 挂载移动硬盘
- Linux内核编译出错
- LeetCode ---Fizz和Buzz
热门文章
- 针对s3c2440芯片制作交叉编译工具链
- (demo)springboot接口suger_整合_hbase+phoenix
- 将人工智能(AI)应用于软件测试中
- android 日历动态图标,android 日历图标显示星期
- vue音乐播放器笔记
- 宏碁 Acer AS4738ZG-P622G32Mncc 驱动
- pandas报错:columns overlap but no suffix specified
- linux安装vscode(中标麒麟+龙芯CPU)
- C++游戏开发入门制作:经典游戏拳皇97
- 关于USB3.0的U盘正确用法