科大訊飛語音雲使用經歷
科大訊飛的語音識別是屬於一流的行列,那不多想當然選擇科大訊飛了。
在百度上輸:訊飛語音 就能找到,輸科大訊飛會直接出現官網,那裡面沒有。(ps我第一次就是這樣)
下載後會有三個檔案選擇。
一個是語音+ 帶有語音+APP的。一個是含語音互動介面,一個是不含語音互動介面
簡單介紹下:
語音+ 看介紹就懂了。
語音互動介面 指的是訊飛提供的各種動畫效果。比如錄音時的麥克風動畫。等
沒有語音互動介面就也明白了。沒有上面那種動畫,只有底層的資料錄製,傳送,解析。等
我當初下載的時候用的是帶語音互動介面的。這個其實無所謂了。不想用可以自定義
下載好了之後 將
按照文件匯入包: Msc.Jar, libmsc.so.
匯入後 第一步:註冊
在程式入口處初始化 SDK
SpeechUtility.createUtility(this, "appid=53fd96ce");
這個初始化的是文字轉語音的物件
mTts = SpeechSynthesizer.createSynthesizer(this, mTtsInitListener); // 初始化合成物件
mTtsInitListener 物件就是初始化的時候監聽,當初始化成功之後就代表你現在可是使用語音功能了
-
private InitListener mTtsInitListener = new InitListener() { -
@Override -
public void onInit(int code) { -
Log.e("合成監聽監聽", "InitListener init() code = " + code); -
if (code == ErrorCode.SUCCESS) { -
btnWZ.setEnabled(true); -
text.setText("可以進行識別文字(文字轉聲音)\n"); -
btnSY.setEnabled(true); -
text.append("可以進行識別聲音(聲音轉文字)\n"); -
} -
} -
};
然後下一步,對於合成物件 進行相關屬性的設定。
還有一些其他屬性可以參考API文件進行理解和新增。這裡就不詳細說明了。
-
// 設定合成 -
if (mEngineType.equals(SpeechConstant.TYPE_CLOUD)) { -
mTts.setParameter(SpeechConstant.ENGINE_TYPE, -
SpeechConstant.TYPE_CLOUD); -
} else { -
mTts.setParameter(SpeechConstant.ENGINE_TYPE, -
SpeechConstant.TYPE_LOCAL); -
} -
// 設定發音人 -
mTts.setParameter(SpeechConstant.VOICE_NAME, voicer); -
// 設定語速 -
mTts.setParameter(SpeechConstant.SPEED, "50"); -
// 設定音調 -
mTts.setParameter(SpeechConstant.PITCH, "50"); -
// 設定音量 -
mTts.setParameter(SpeechConstant.VOLUME, "50"); -
// 設定播放器音訊流型別 -
mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
之後就進行上傳你要轉錄的文字和監聽介面了
int code = mTts.startSpeaking(context, mTtsListener);
context:是要合成的文字
code:就是最後的結果了 如果是0 就代表了正常了。如果不為零就代表出現了錯誤,具體的值所代表的意思可參考ErrorCode類來對照。
new SpeechError(code).getPlainDescription(true)
可以使用上面的那段程式碼 將code 轉換成文字,錯誤的文字。
mTtsListener
-
/** -
* 合成回撥監聽。 -
*/ -
private SynthesizerListener mTtsListener = new SynthesizerListener() { -
@Override -
public void onSpeakBegin() { -
showTip("開始播放"); -
} -
@Override -
public void onSpeakPaused() { -
showTip("暫停播放"); -
} -
@Override -
public void onSpeakResumed() { -
showTip("繼續播放"); -
} -
@Override -
public void onBufferProgress(int percent, int beginPos, int endPos, -
String info) { -
mPercentForBuffering = percent; -
upProgressBar(); -
} -
@Override -
public void onSpeakProgress(int percent, int beginPos, int endPos) { -
mPercentForPlaying = percent; -
upProgressBar(); -
} -
@Override -
public void onCompleted(SpeechError error) { -
if (error == null) { -
showTip("播放完成"); -
} else if (error != null) { -
showTip(error.getPlainDescription(true)); -
} -
} -
};
其中的showTip ()方法只是我的一個回撥顯示的方法,可根據自己的需求自定義設定。
其中的 onBufferProgress 方法返回的是資料快取的長度, 最大100 這個資料是從網路進行識別之後傳遞過來的資料
onSpeakProgress 播放的長度,當前播放進度, 最大值也是100
文字轉語音也就上面的那些內容了。
語音轉文字:
-
<span style="font-size:12px;">mIat = SpeechRecognizer.createRecognizer(this, mTtsInitListener); -
iatDialog = new RecognizerDialog(this, mTtsInitListener);</span>
其中的這個iatDialog 方法就是訊飛自己的語音互動介面了。 會彈出一個麥克風的dialgo並帶有動畫。,能根據我的聲音大小進行動畫。
第二步那個就是一個初始化監聽。這個上面有介紹
第三步就是設定屬性了 設定mIat的屬性
-
// 設定語言 -
mIat.setParameter(SpeechConstant.LANGUAGE, "en_us"); -
// 設定語言 -
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); -
// 設定語言區域 -
mIat.setParameter(SpeechConstant.ACCENT, "mandarin"); -
// 設定語音前端點 -
mIat.setParameter(SpeechConstant.VAD_BOS, "4000"); -
// 設定語音後端點 -
mIat.setParameter(SpeechConstant.VAD_EOS, "1000"); -
// 設定標點符號 -
mIat.setParameter(SpeechConstant.ASR_PTT, "1"); -
// 設定音訊儲存路徑 -
mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, -
"/sdcard/my/luyin.pcm");
設定完成之後就可以點選按鈕進行錄製了
點選按鈕 按鈕上的方法寫:
-
iatDialog.setListener(recognizerDialogListener); -
iatDialog.show();
監聽方法 recognizerDialogListener
-
/** -
* 聽寫UI監聽器 -
*/ -
private RecognizerDialogListener recognizerDialogListener = new RecognizerDialogListener() { -
public void onResult(RecognizerResult results, boolean isLast) { -
String text = JsonParser.parseIatResult(results.getResultString()); -
edit.append(text); -
edit.setSelection(edit.length()); -
} -
/** -
* 識別回撥錯誤. -
*/ -
public void onError(SpeechError error) { -
showTip(error.getPlainDescription(true)); -
} -
};
其中的onResult()方法會不斷的回撥,因為語音識別是一個字一個字識別併發送過來的。當然也有是一個詞的形式傳送過來。這個時候
我們就需要通過它來進行識別了
這個JsonParser類是直接從 訊飛提供的Demo中複製的。
-
public class JsonParser { -
public static String parseIatResult(String json) { -
StringBuffer ret = new StringBuffer(); -
try { -
JSONTokener tokener = new JSONTokener(json); -
JSONObject joResult = new JSONObject(tokener); -
JSONArray words = joResult.getJSONArray("ws"); -
for (int i = 0; i < words.length(); i++) { -
// 轉寫結果詞,預設使用第一個結果 -
JSONArray items = words.getJSONObject(i).getJSONArray("cw"); -
JSONObject obj = items.getJSONObject(0); -
ret.append(obj.getString("w")); -
// 如果需要多候選結果,解析陣列其他欄位 -
// for(int j = 0; j < items.length(); j++) -
// { -
// JSONObject obj = items.getJSONObject(j); -
// ret.append(obj.getString("w")); -
// } -
} -
} catch (Exception e) { -
e.printStackTrace(); -
} -
return ret.toString(); -
} -
public static String parseGrammarResult(String json) { -
StringBuffer ret = new StringBuffer(); -
try { -
JSONTokener tokener = new JSONTokener(json); -
JSONObject joResult = new JSONObject(tokener); -
JSONArray words = joResult.getJSONArray("ws"); -
for (int i = 0; i < words.length(); i++) { -
JSONArray items = words.getJSONObject(i).getJSONArray("cw"); -
for(int j = 0; j < items.length(); j++) -
{ -
JSONObject obj = items.getJSONObject(j); -
if(obj.getString("w").contains("nomatch")) -
{ -
ret.append("沒有匹配結果."); -
return ret.toString(); -
} -
ret.append("【結果】" + obj.getString("w")); -
ret.append("【置信度】" + obj.getInt("sc")); -
ret.append("\n"); -
} -
} -
} catch (Exception e) { -
e.printStackTrace(); -
ret.append("沒有匹配結果."); -
} -
return ret.toString(); -
} -
}
然後有人要說了 如果沒有使用訊飛提供的語音互動介面,那應該怎麼寫?
簡單
在按鈕的處理方法中將上面的顯示iatDialog給替換成下面的程式碼就可以了。
-
int ret = mIat.startListening(recognizerListener); -
if (ret != ErrorCode.SUCCESS) {
-
<span style="font-size:14px;">/** -
* 聽寫監聽器。 -
*/ -
private RecognizerListener recognizerListener = new RecognizerListener() { -
@Override -
public void onBeginOfSpeech() { -
showTip("開始說話"); -
} -
@Override -
public void onError(SpeechError error) { -
showTip(error.getPlainDescription(true)); -
} -
@Override -
public void onEndOfSpeech() { -
showTip("結束說話"); -
} -
@Override -
public void onEvent(int eventType, int arg1, int arg2, String msg) { -
} -
@Override -
public void onResult(RecognizerResult results, boolean isLast) { -
String text = JsonParser.parseIatResult(results.getResultString()); -
edit.append(text); -
edit.setSelection(edit.length()); -
if (isLast) { -
// TODO 最後的結果 -
} -
} -
@Override -
public void onVolumeChanged(int volume) { -
showTip("當前正在說話,音量大小:" + volume); -
} -
};</span>
大概就這樣了。
總結一下: 使用第三方的SDK 都不是一件麻煩的事情,只要你去看看API和Demo 就能往自己的專案中套了。
這個訊飛語音識別,也不復雜。
第一個 註冊SDK 將你申請到的APPID給賦值進去。 (所有的第三方 SDK都有這個要求)
第二步 根據你的需要來建立指定的物件。
建立物件的時候繫結一個InitListener介面。來檢測 建立是否成功。
第三步 給物件設定基本屬性
第四步 物件開始工作。
第五步給工作的物件添加回調介面,實時瞭解物件工作狀態。
第六步 根據物件的狀態來寫各種不同的提示和說明。就是個互動的過程了。
--------------------- 本文來自 Zswx98 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/zy987654zy/article/details/38899795?utm_source=copy
