最近项目在使用云知声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);
}

在实际开发中基本都是相互使用的,大家使用到的话根据自己需要来!

云知声语音语义识别,语音唤醒和语音合成简单工具类封装相关推荐

  1. 【AI测试】智能音箱--自然语言处理,语音语义识别测试

    参考博客原址:https://blog.csdn.net/lhh08hasee/article/details/80306474 自己目前没有做过自然语言处理,语音语义识别测试,本文为听一场语音语义识 ...

  2. 一文读懂语音语义识别技术的现状与未来

    [IT168 评论]我一直认为,人工智能应用的大前提是可以很自然的进行人机语言交互.近年来,在深度学习的驱动下,语音技术取得了重大进展,语音云用户规模达到了亿级规模,每日请求千万次,并且交互技术由单一 ...

  3. 语音情感识别--语音(声音的预处理)

    语音信号(声音是什么) 声音是由物体振动产生的声波,是通过介质(空气或固体.液体)传播并能被人或动物听觉器官所感知的波动现象,最初发出振动的物体叫声源.声音(语音消息)的基本模拟形式是一种称为语音信号 ...

  4. 语音情感识别----语音特征集之eGeMAPS,ComParE,09IS,BoAW

    一:LLDs特征和HSFs特征 (1)首先区分一下frame和utterance,frame就是一帧语音.utterance是一段语音,是比帧高一级的语音单位,通常指一句话,一个语音样本.uttera ...

  5. python百度语音实时识别成文字_python 语音合成

    0树莓派 Python 使用 mpg123 播放声音 安装 mpg123 执行命令:sudo apt-get install mpg123 播放声音 import os os.system('mpg1 ...

  6. uniapp + 微信小程序 + 云开发。实现一个可以计算汽车油耗的工具类微信小程序

    简介 是一款可以计算汽车油耗的小程序.根据加油量.所加油量跑的公里数.当时的油价.即可以计算出汽车的百公里油耗.每公里花费多少钱等数据.并且可以将每次数据永久记录下来,然后可以将多次的数据进行横向的对 ...

  7. 重磅!普惠AI--华为云语音语义万次调用1元购,有奖问答@评论区等你来!

    活动快速入口:https://activity.huaweicloud.com/language_speech_promotion0.html 语音交互与自然语言处理 语音交互是一种人机交互方式,以开 ...

  8. 云知声原创技术再获肯定:多篇论文被国际语音顶会 INTERSPEECH 2020 收录

    近日,全球语音顶会INTERSPEECH 2020 公布了论文接收结果,云知声联合上海师范大学.安徽大学等高校发表多篇论文成功入选.分别在中英文混合语音识别.大词汇量连续语音识别和多模态虚拟形象生成等 ...

  9. 疫情排查节时86%?不会代码也能玩转模型训练?腾讯大神揭秘语音语义及AutoML黑科技 | 内含福利...

    出品 | AI科技大本营(ID:rgznai100) 2020年7月3日,AI ProCon 2020 AI开发者万人大会,隆重举行!作为CSDN策划并主办的系列技术「开发者大会」之一,本次大会通过线 ...

  10. 基于音频和文本的多模态语音情感识别(一篇极好的论文,值得一看哦!)

    基于音频和文本的多模态语音情感识别 语音情感识别是一项具有挑战性的任务,在构建性能良好的分类器时,广泛依赖于使用音频功能的模型.本文提出了一种新的深度双循环编码器模型,该模型同时利用文本数据和音频信号 ...

最新文章

  1. Cowboy 源码分析(一)
  2. targetNamespace
  3. linux io重定向指令,Linux基础知识之 IO重定向
  4. WebHook 与jenkins
  5. Qt:OpenCV—Q图像处理基本操作(Code)
  6. Python自动绘制UML类图、函数调用图(Call Graph)
  7. 浅析微信支付:1前篇大纲
  8. python管道怎么使用_如何在多个流程中正确使用管道(2)
  9. 计算机无法播放所有视频文件,在电脑中打开flv视频文件显示空白无法播放怎么办...
  10. 在xp3下,Apache , PHP, Zend Studio怎样配置环境?
  11. 使用Java合并excel的sheet的操作
  12. linux-redis设置密码
  13. HHDBCS及HHDESK的资源加密功能
  14. shell脚本scp自动输入密码
  15. 【转】25个开发性能优化
  16. 显示如何用最少的20美元来付款
  17. java计算机毕业设计教师教学质量评估系统MyBatis+系统+LW文档+源码+调试部署
  18. ubuntu server 7.04(10.04版也行) 挂载移动硬盘
  19. Linux内核编译出错
  20. LeetCode ---Fizz和Buzz

热门文章

  1. 针对s3c2440芯片制作交叉编译工具链
  2. (demo)springboot接口suger_整合_hbase+phoenix
  3. 将人工智能(AI)应用于软件测试中
  4. android 日历动态图标,android 日历图标显示星期
  5. vue音乐播放器笔记
  6. 宏碁 Acer AS4738ZG-P622G32Mncc 驱动
  7. pandas报错:columns overlap but no suffix specified
  8. linux安装vscode(中标麒麟+龙芯CPU)
  9. C++游戏开发入门制作:经典游戏拳皇97
  10. 关于USB3.0的U盘正确用法