关于讯飞语音的Android开发

时间:2022-01-31 01:01:26

今天来用下科大讯飞的语音功能,代码也非常的简单,在讯飞官方API文档中都写的非常清楚。今天主要实现讯飞里面的语音识别语音合成两个功能。

准备工作

  1. 需要在讯飞官网注册或登录后
  2. 打开控制平台,创建自己的应用,会得到一个Appid,这个id会用到,如下图:
    关于讯飞语音的Android开发
  3. 下载SDK, 将下载后的zip解压然后打开libs如图:
    关于讯飞语音的Android开发
  4. 如使用讯飞语音UI的话,需要将下载SDK中的assets文件夹拷贝到项目中。最终项目结构就是这样的如图:
  5. 关于讯飞语音的Android开发
    好了准备条件都做完了,接下来就开始实际的编码开发

代码编写

这里由于xml文件代码比较简单就不贴出来了,只贴功能实现代码
1. 添加权限

<!--连接网络权限,用于执行云端语音能力 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!--读取网络信息状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--获取当前wifi状态 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--允许程序改变网络连接状态 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <!--读取手机信息权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!--读取联系*限,上传联系人需要用到此权限 -->
   <!-- <uses-permission android:name="android.permission.READ_CONTACTS" />-->

2.语音听写

初始化识别对象 ,在Activity创建时进行初始化

// 初始化识别对象 注意:“=”和自己appid中间不要有字符串和字符
        SpeechUtility.createUtility(this, SpeechConstant.APPID + "=自己的Appid");

初始化RecognizerDialog对象,在点击Button的时候调用下面代码就OK了

 public void initSpeech() {
        //1.创建RecognizerDialog对象
        RecognizerDialog recognizerDialog = new RecognizerDialog(mIChatView.getContext(), null);
        //2.设置accent、language等参数
        recognizerDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//语种,这里可以有zh_cn和en_us
        recognizerDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//设置口音,这里设置的是汉语普通话 具体支持口音请查看讯飞文档,
        recognizerDialog.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");//设置编码类型

        //其他设置请参考文档http://www.xfyun.cn/doccenter/awd
        //3.设置讯飞识别语音后的回调监听
        recognizerDialog.setListener(new RecognizerDialogListener() {
            @Override
            public void onResult(RecognizerResult recognizerResult, boolean b) {//返回结果
                if (!b) {
// Log.i("讯飞识别的结果", recognizerResult.getResultString());
                    mTextView.showSpeak(parseJsonVoice(recognizerResult.getResultString()));
                }
            }

            @Override
            public void onError(SpeechError speechError) {//返回错误
               Log.e("返回的错误码", speechError.getErrorCode() + "");

            }

        });
        //显示讯飞语音识别视图
        recognizerDialog.show();

解析语音json

 private String parseJsonVoice(String resultString) {
        JSONObject jsonObject = JSON.parseObject(resultString);
        JSONArray jsonArray = jsonObject.getJSONArray("ws");
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject1 = jsonArray.getJSONObject(i);
            JSONArray jsonArray1 = jsonObject1.getJSONArray("cw");
            JSONObject jsonObject2 = jsonArray1.getJSONObject(0);
            String w = jsonObject2.getString("w");
            stringBuffer.append(w);
        }
        Log.i("识别结果", stringBuffer.toString());
        return stringBuffer.toString();
    }
//上面是用到fastjson来解析的需要在gradle添加包
compile 'com.alibaba:fastjson:1.2.8'

3.语音合成

点击Button,调用下面方法将EditText文字传入要要合成语音的地方就OK了

 public void initSpeechCompound() {
        SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(this, null);
        mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaohua");//设置发音人
        mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速
        mTts.setParameter(SpeechConstant.VOLUME, "50");//设置音量,范围0~100
        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);//设置云端
// mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH,"./sdcard/iflytek.pcm");//声音保存路径,可以自定义
        mTts.startSpeaking("这里就是你要传入合成语音的文字", mSynListener);//开始合成

    }

    private SynthesizerListener mSynListener = new SynthesizerListener() {
        @Override
        public void onSpeakBegin() {
            //开始播放
        }

        @Override
        public void onBufferProgress(int i, int i1, int i2, String s) {
            //缓冲进度回调
        }

        @Override
        public void onSpeakPaused() {
            //暂停播放
        }

        @Override
        public void onSpeakResumed() {
            //恢复播放回调接口
        }

        @Override
        public void onSpeakProgress(int i, int i1, int i2) {
            //播放进度回调
        }

        @Override
        public void onCompleted(SpeechError speechError) {
            //会话结束回调接口
        }

        @Override
        public void onEvent(int i, int i1, int i2, Bundle bundle) {
            //会话事件回调接口
        }
    };

好了,看了语音识别听写和语音合成是不是感觉很简单,大家有兴趣也可以尝试下讯飞的其他功能吧。
感谢大家的阅读,谢谢~