環境搭建::個人覺得訊飛的資料寫的馬馬虎虎,不如BAT的,也不像ShareSDK一樣可以免費的一對一的問。
解壓SDK,找到要用的Lib文件夾:
一看便知有.jar的放到項目裏的lib文件夾下。點開online
開發過百度地圖的一看就明白要用到jni 所以要在mian目錄下建立jniLibs文件夾,將這些文件夾都烤進去
添加必要的權限,開發久遠,不記得那些了,自己去官網找。
1.程序主入口處(傳入申請的id)
// XUNFEI語音測評
SpeechUtility.createUtility(getApplicationContext(), Contacts.XF_LANGUAGE_TEST_APPID);
2.初始化參數
private void initXunFeiCePingParams(Context context, String playerTime,String recordpath) {
mSpeechEvaluator = SpeechEvaluator.createEvaluator(context, null);
// 設置評測語種
mSpeechEvaluator.setParameter(SpeechConstant.LANGUAGE, "en_us");//英語
// 設置評測題型
mSpeechEvaluator.setParameter(SpeechConstant.ISE_CATEGORY, "read_sentence");//句子
// 設置試題編碼類型
mSpeechEvaluator.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");
// 設置前、後端點超時
//// 設置語音前端點:靜音超時時間,即用戶多長時間不說話則當做超時處理
mSpeechEvaluator.setParameter(SpeechConstant.VAD_BOS, "5000");
// 設置語音後端點:後端點靜音檢測時間,即用戶停止說話多長時間內即認爲不再輸入, 自動停止錄音
mSpeechEvaluator.setParameter(SpeechConstant.VAD_EOS, "5000");
// 設置錄音超時,設置成-1則無超時限制 // 語音輸入超時時間,即用戶最多可以連續說多長時間;
mSpeechEvaluator.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT, playerTime);
// 設置結果等級,不同等級對應不同的詳細程度
mSpeechEvaluator.setParameter(SpeechConstant.RESULT_LEVEL, "complete");
// 設置音頻保存路徑,保存音頻格式支持pcm、wav,設置路徑爲sd卡請注意WRITE_EXTERNAL_STORAGE權限
// 注:AUDIO_FORMAT參數語記需要更新版本才能生效
mSpeechEvaluator.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
MyRecordPath = new StringBuffer().append(FileUtils.getDiskCacheDir(context, "My Recording").getAbsolutePath()).append("/").append(recordpath).append(".wav").toString();
mSpeechEvaluator.setParameter(SpeechConstant.ISE_AUDIO_PATH, MyRecordPath);//第二個參數爲錄音存儲路徑
}
3.調用以上的方法
myRecordMp3Path=FileUtils.hashKeyForDisk(currentContent.getContent_en());
initXunFeiCePingParams(context, playtime,myRecordMp3Path);//初始化訊飛測評的參數
mSpeechEvaluator.startEvaluating(sb_senc.toString(), null, mEvaluatorListener);
4.回調監聽:
private EvaluatorListener mEvaluatorListener = new EvaluatorListener() {
// 結果回調,評測過程中可能會多次調用該方法,isLast爲true則爲最後結果
public void onResult(EvaluatorResult result, boolean isLast) {
if (isLast) {
Log.d("YYYYYYY", "evaluator result :" + result.getResultString());
//解析返回的XML
mPassListenerXMLAsyncTask = new PassListenerXMLAsyncTask();
mPassListenerXMLAsyncTask.execute(result.getResultString());
}
}
// 出錯回調
public void onError(SpeechError error) {
if (error != null) {
switch (error.getErrorCode()) {
case 11401:
Log.i("ExamineAdapter::::", "ERROR:" + "無語音或音量小");
break;
case 11402:
Log.i("ExamineAdapter::::", "ERROR:" + "信噪比低或有效語音過短");
case 11405:
Log.i("ExamineAdapter::::", "ERROR:" + "錄音格式有誤");
break;
case 11406:
Log.i("ExamineAdapter::::", "ERROR:" + "其他評測數據異常, 包括錯讀、 漏讀、\n" +
"惡意錄入、試卷內容等錯誤");
break;
case 11408:
Log.i("ExamineAdapter::::", "ERROR:" + "存在未登錄詞, 即引擎中沒有該詞語\n" +
"的信息");
break;
}
}
Log.d("YYYYYYY", "SpeechError error :" + error);
}
@Override
public void onVolumeChanged(int i, byte[] bytes) {
Log.d("YYYYYYY", "onVolumeChanged" + i);
Message msg = Message.obtain();
msg.what = VOICE_CHANGE;
msg.obj = i;
mHandler.sendMessage(msg);
}
// 開始說話回調
public void onBeginOfSpeech() {
Log.d("YYYYYYY", "onBeginOfSpeech");
}
// 說話結束回調
public void onEndOfSpeech() {
Log.d("YYYYYYY:::::", "onEndOfSpeech" + playtime);
}
// 音量回調 0-30
public void onVolumeChanged(int volume) {
Log.i("volume:?????",volume+"");
}
// 擴展接口,暫時沒有回調
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
}
};
5.解析::官方demo裏有:
XmlResultParser.class
Result.class
XmlResultParser resultParser = new XmlResultParser();
Result result = resultParser.parse(params[0]);