1. 程式人生 > >科大訊飛語音雲使用經歷

科大訊飛語音雲使用經歷

科大訊飛的語音識別是屬於一流的行列,那不多想當然選擇科大訊飛了。

在百度上輸:訊飛語音 就能找到,輸科大訊飛會直接出現官網,那裡面沒有。(ps我第一次就是這樣)

下載後會有三個檔案選擇。

一個是語音+  帶有語音+APP的。一個是含語音互動介面,一個是不含語音互動介面

簡單介紹下:

語音+ 看介紹就懂了。

語音互動介面 指的是訊飛提供的各種動畫效果。比如錄音時的麥克風動畫。等

沒有語音互動介面就也明白了。沒有上面那種動畫,只有底層的資料錄製,傳送,解析。等

我當初下載的時候用的是帶語音互動介面的。這個其實無所謂了。不想用可以自定義

下載好了之後 將

按照文件匯入包: Msc.Jar,  libmsc.so.

匯入後 第一步:註冊

在程式入口處初始化 SDK  

SpeechUtility.createUtility(this, "appid=53fd96ce");

這個初始化的是文字轉語音的物件 

mTts = SpeechSynthesizer.createSynthesizer(this, mTtsInitListener); // 初始化合成物件

mTtsInitListener 物件就是初始化的時候監聽,當初始化成功之後就代表你現在可是使用語音功能了

  1. private InitListener mTtsInitListener = new InitListener() {

  2. @Override

  3. public void onInit(int code) {

  4. Log.e("合成監聽監聽", "InitListener init() code = " + code);

  5. if (code == ErrorCode.SUCCESS) {

  6. btnWZ.setEnabled(true);

  7. text.setText("可以進行識別文字(文字轉聲音)\n");

  8. btnSY.setEnabled(true);

  9. text.append("可以進行識別聲音(聲音轉文字)\n");

  10. }

  11. }

  12. };

然後下一步,對於合成物件 進行相關屬性的設定。

還有一些其他屬性可以參考API文件進行理解和新增。這裡就不詳細說明了。

  1. // 設定合成

  2. if (mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {

  3. mTts.setParameter(SpeechConstant.ENGINE_TYPE,

  4. SpeechConstant.TYPE_CLOUD);

  5. } else {

  6. mTts.setParameter(SpeechConstant.ENGINE_TYPE,

  7. SpeechConstant.TYPE_LOCAL);

  8. }

  9. // 設定發音人

  10. mTts.setParameter(SpeechConstant.VOICE_NAME, voicer);

  11. // 設定語速

  12. mTts.setParameter(SpeechConstant.SPEED, "50");

  13. // 設定音調

  14. mTts.setParameter(SpeechConstant.PITCH, "50");

  15. // 設定音量

  16. mTts.setParameter(SpeechConstant.VOLUME, "50");

  17. // 設定播放器音訊流型別

  18. mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");

之後就進行上傳你要轉錄的文字和監聽介面了

int code = mTts.startSpeaking(context, mTtsListener);

context:是要合成的文字 

code:就是最後的結果了 如果是0 就代表了正常了。如果不為零就代表出現了錯誤,具體的值所代表的意思可參考ErrorCode類來對照。

new SpeechError(code).getPlainDescription(true)

可以使用上面的那段程式碼 將code 轉換成文字,錯誤的文字。

mTtsListener
  1. /**

  2. * 合成回撥監聽。

  3. */

  4. private SynthesizerListener mTtsListener = new SynthesizerListener() {

  5. @Override

  6. public void onSpeakBegin() {

  7. showTip("開始播放");

  8. }

  9. @Override

  10. public void onSpeakPaused() {

  11. showTip("暫停播放");

  12. }

  13. @Override

  14. public void onSpeakResumed() {

  15. showTip("繼續播放");

  16. }

  17. @Override

  18. public void onBufferProgress(int percent, int beginPos, int endPos,

  19. String info) {

  20. mPercentForBuffering = percent;

  21. upProgressBar();

  22. }

  23. @Override

  24. public void onSpeakProgress(int percent, int beginPos, int endPos) {

  25. mPercentForPlaying = percent;

  26. upProgressBar();

  27. }

  28. @Override

  29. public void onCompleted(SpeechError error) {

  30. if (error == null) {

  31. showTip("播放完成");

  32. } else if (error != null) {

  33. showTip(error.getPlainDescription(true));

  34. }

  35. }

  36. };

其中的showTip ()方法只是我的一個回撥顯示的方法,可根據自己的需求自定義設定。

其中的 onBufferProgress 方法返回的是資料快取的長度, 最大100 這個資料是從網路進行識別之後傳遞過來的資料

onSpeakProgress 播放的長度,當前播放進度, 最大值也是100

文字轉語音也就上面的那些內容了。

語音轉文字:

  1. <span style="font-size:12px;">mIat = SpeechRecognizer.createRecognizer(this, mTtsInitListener);

  2. iatDialog = new RecognizerDialog(this, mTtsInitListener);</span>

其中的這個iatDialog 方法就是訊飛自己的語音互動介面了。 會彈出一個麥克風的dialgo並帶有動畫。,能根據我的聲音大小進行動畫。

第二步那個就是一個初始化監聽。這個上面有介紹

第三步就是設定屬性了 設定mIat的屬性

  1. // 設定語言

  2. mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");

  3. // 設定語言

  4. mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");

  5. // 設定語言區域

  6. mIat.setParameter(SpeechConstant.ACCENT, "mandarin");

  7. // 設定語音前端點

  8. mIat.setParameter(SpeechConstant.VAD_BOS, "4000");

  9. // 設定語音後端點

  10. mIat.setParameter(SpeechConstant.VAD_EOS, "1000");

  11. // 設定標點符號

  12. mIat.setParameter(SpeechConstant.ASR_PTT, "1");

  13. // 設定音訊儲存路徑

  14. mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,

  15. "/sdcard/my/luyin.pcm");

設定完成之後就可以點選按鈕進行錄製了

點選按鈕 按鈕上的方法寫:

  1. iatDialog.setListener(recognizerDialogListener);

  2. iatDialog.show();

監聽方法 recognizerDialogListener

  1. /**

  2. * 聽寫UI監聽器

  3. */

  4. private RecognizerDialogListener recognizerDialogListener = new RecognizerDialogListener() {

  5. public void onResult(RecognizerResult results, boolean isLast) {

  6. String text = JsonParser.parseIatResult(results.getResultString());

  7. edit.append(text);

  8. edit.setSelection(edit.length());

  9. }

  10. /**

  11. * 識別回撥錯誤.

  12. */

  13. public void onError(SpeechError error) {

  14. showTip(error.getPlainDescription(true));

  15. }

  16. };

其中的onResult()方法會不斷的回撥,因為語音識別是一個字一個字識別併發送過來的。當然也有是一個詞的形式傳送過來。這個時候

我們就需要通過它來進行識別了

這個JsonParser類是直接從 訊飛提供的Demo中複製的。 

  1. public class JsonParser {

  2. public static String parseIatResult(String json) {

  3. StringBuffer ret = new StringBuffer();

  4. try {

  5. JSONTokener tokener = new JSONTokener(json);

  6. JSONObject joResult = new JSONObject(tokener);

  7. JSONArray words = joResult.getJSONArray("ws");

  8. for (int i = 0; i < words.length(); i++) {

  9. // 轉寫結果詞,預設使用第一個結果

  10. JSONArray items = words.getJSONObject(i).getJSONArray("cw");

  11. JSONObject obj = items.getJSONObject(0);

  12. ret.append(obj.getString("w"));

  13. // 如果需要多候選結果,解析陣列其他欄位

  14. // for(int j = 0; j < items.length(); j++)

  15. // {

  16. // JSONObject obj = items.getJSONObject(j);

  17. // ret.append(obj.getString("w"));

  18. // }

  19. }

  20. } catch (Exception e) {

  21. e.printStackTrace();

  22. }

  23. return ret.toString();

  24. }

  25. public static String parseGrammarResult(String json) {

  26. StringBuffer ret = new StringBuffer();

  27. try {

  28. JSONTokener tokener = new JSONTokener(json);

  29. JSONObject joResult = new JSONObject(tokener);

  30. JSONArray words = joResult.getJSONArray("ws");

  31. for (int i = 0; i < words.length(); i++) {

  32. JSONArray items = words.getJSONObject(i).getJSONArray("cw");

  33. for(int j = 0; j < items.length(); j++)

  34. {

  35. JSONObject obj = items.getJSONObject(j);

  36. if(obj.getString("w").contains("nomatch"))

  37. {

  38. ret.append("沒有匹配結果.");

  39. return ret.toString();

  40. }

  41. ret.append("【結果】" + obj.getString("w"));

  42. ret.append("【置信度】" + obj.getInt("sc"));

  43. ret.append("\n");

  44. }

  45. }

  46. } catch (Exception e) {

  47. e.printStackTrace();

  48. ret.append("沒有匹配結果.");

  49. }

  50. return ret.toString();

  51. }

  52. }

然後有人要說了 如果沒有使用訊飛提供的語音互動介面,那應該怎麼寫? 

簡單

在按鈕的處理方法中將上面的顯示iatDialog給替換成下面的程式碼就可以了。

  1. int ret = mIat.startListening(recognizerListener);

  2. if (ret != ErrorCode.SUCCESS) {

  1. <span style="font-size:14px;">/**

  2. * 聽寫監聽器。

  3. */

  4. private RecognizerListener recognizerListener = new RecognizerListener() {

  5. @Override

  6. public void onBeginOfSpeech() {

  7. showTip("開始說話");

  8. }

  9. @Override

  10. public void onError(SpeechError error) {

  11. showTip(error.getPlainDescription(true));

  12. }

  13. @Override

  14. public void onEndOfSpeech() {

  15. showTip("結束說話");

  16. }

  17. @Override

  18. public void onEvent(int eventType, int arg1, int arg2, String msg) {

  19. }

  20. @Override

  21. public void onResult(RecognizerResult results, boolean isLast) {

  22. String text = JsonParser.parseIatResult(results.getResultString());

  23. edit.append(text);

  24. edit.setSelection(edit.length());

  25. if (isLast) {

  26. // TODO 最後的結果

  27. }

  28. }

  29. @Override

  30. public void onVolumeChanged(int volume) {

  31. showTip("當前正在說話,音量大小:" + volume);

  32. }

  33. };</span>

大概就這樣了。

總結一下: 使用第三方的SDK 都不是一件麻煩的事情,只要你去看看API和Demo 就能往自己的專案中套了。

這個訊飛語音識別,也不復雜。

第一個 註冊SDK 將你申請到的APPID給賦值進去。  (所有的第三方 SDK都有這個要求)

第二步 根據你的需要來建立指定的物件。 

建立物件的時候繫結一個InitListener介面。來檢測 建立是否成功。

第三步 給物件設定基本屬性

第四步 物件開始工作。

第五步給工作的物件添加回調介面,實時瞭解物件工作狀態。

第六步 根據物件的狀態來寫各種不同的提示和說明。就是個互動的過程了。

--------------------- 本文來自 Zswx98 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/zy987654zy/article/details/38899795?utm_source=copy