1. 程式人生 > >科大訊飛 語音評測 + 保存錄音 解決wav 錄音無法播放問題

科大訊飛 語音評測 + 保存錄音 解決wav 錄音無法播放問題


// 設定評測語種
    //en_us 英文,zh_cn 漢語
      mSpeechEvaluator.setParameter(SpeechConstant.LANGUAGE, "en_us");

            // 設定評測題型評測題型,可選值:
                        read_syllable(單字,漢語專有)、read_word(詞語)、
                    read_sentence(句子)、read_chapter(篇章)
            mSpeechEvaluator.setParameter(SpeechConstant.ISE_CATEGORY, "read_sentence");

            // 設定結果等級,不同等級對應不同的詳細程度 plain complete
            mSpeechEvaluator.setParameter(SpeechConstant.RESULT_LEVEL, "plain");

            // 設定語音前端點:靜音超時時間,即使用者多長時間不說話則當做超時處理
            mSpeechEvaluator.setParameter(SpeechConstant.VAD_BOS, "5000");

            // 設定語音後端點:後端點靜音檢測時間,即使用者停止說話多長時間內即認為不再輸入, 自動停止錄音
            mSpeechEvaluator.setParameter(SpeechConstant.VAD_EOS, "1800");


            // 設定音訊儲存路徑,儲存音訊格式支援pcm、wav,設定路徑為sd卡請注意WRITE_EXTERNAL_STORAGE許可權
            // 注:AUDIO_FORMAT引數語記需要更新版本才能生效
            //這句話必須加,否則音訊檔案無法播放
            mSpeechEvaluator.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
           

            //設定儲存語音路徑
            mSpeechEvaluator.setParameter(SpeechConstant.ISE_AUDIO_PATH, Environment.getExternalStorageDirectory()+ path);

           


            // mSpeechEvaluator.setParameter(SpeechConstant.ISE_AUDIO_PATH, Environment.getExternalStorageDirectory().getAbsolutePath() + "/msc/ise.wav");
            //通過writeaudio方式直接寫入音訊時才需要此設定
            //mSpeechEvaluator.setParameter(SpeechConstant.AUDIO_SOURCE,"-1");

            Log.e("swt1111", mSpeechEvaluator.getParameter(SpeechConstant.ISE_AUDIO_PATH));


            // evaText 為試題內容
            mSpeechEvaluator.startEvaluating(model.getAnswer().get(mCurrentButtonPosition).getEnglish(), null, new EvaluatorListener() {

                @Override
                public void onVolumeChanged(int i, byte[] bytes) {

                }

                @Override
                public void onBeginOfSpeech() {
                }

                @Override
                public void onEndOfSpeech() {
                }

                @Override
                public void onResult(EvaluatorResult result, boolean b) {
             


                    if (b) {
                        StringBuilder builder = new StringBuilder();

                        builder.append(result.getResultString());

                        FinalResult result1 = null;
                        try {
                            result1 = XmlPull(result.getResultString());
                        } catch (Exception e) {
                            e.printStackTrace();

                        }
                       

                        if (result != null) {

                            switch (result1.getRet()) {

                                //只有0的情況為正常情況,但是為了使用者體驗,所有情況均設定分數
                                case 0:
                                case 28673:
                                    //無語音輸入或音量太小
//                                    ToastUtil.show(mContext, "無語音輸入或音量太小,請重試");
                                case 28676:
                                    //檢測到語音為亂說型別
                                case 28680:
                                    //音訊資料信噪比太低
                                case 28690:
                                    //音訊資料出現截幅
//                                    ToastUtil.show(mContext, "請重試");
                                    setAnimation(mBinding.tvCenterScore, result1.getTotal_score());
                                default:
                                    break;

                            }

                        } else {

                            ToastUtil.show(mContext, "沒有獲取到結果,請重錄");
                        }


                    } else {

//                        ToastUtil.show(mContext,"無法識別,請重錄");
                       
                    }
                }

                @Override
                public void onError(SpeechError speechError) {

                    ToastUtil.show(mContext, speechError.toString());

                
                }

                @Override
                public void onEvent(int i, int i1, int i2, Bundle bundle) {
                  
                }
            });