工程目錄如下:
源碼下載本地語句的方法,下載了才能使用本地聽寫
/** * 選擇本地聽寫 判斷是否安裝語記,未安裝則跳轉到提示安裝頁面 源碼: */ if (!SpeechUtility.getUtility().checkServiceInstalled()) { mInstaller.install();// 語記安裝助手類 } else { String result = FucUtil.checkLocalResource(); if (!TextUtils.isEmpty(result)) { showTip(result); } }
1.語音轉文字,注意這里需要聯網,如果是本地聽寫需要下載... MainActivity.java:
import java.util.List; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.iflytek.cloud.InitListener; import com.iflytek.cloud.RecognizerListener; import com.iflytek.cloud.RecognizerResult; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.SpeechRecognizer; import com.iflytek.cloud.SpeechUtility; import com.iflytek.cloud.ui.RecognizerDialog; import com.iflytek.cloud.ui.RecognizerDialogListener; public class MainActivity extends Activity { private RecognizerDialog iatDialog; //帶UI界面顯示的對話框 private SpeechRecognizer mIat;//不帶UI界面的語音識別器 private ImageView image; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化 SpeechUtility.createUtility(this, SpeechConstant.APPID +"=57e79517"); image = (ImageView) findViewById(R.id.image); } public void btnClick(View view){ switch (view.getId()) { case R.id.button1://使用訊飛自帶的語音傾聽的UI界面 beUiVoice(); break; case R.id.button2://使用自己的傾聽語音的UI界面(這里我使用的幀動畫) noUIVoice(); break; } } /** * 使用訊飛自帶的UI傾聽界面 */ private void beUiVoice(){ //初始化有交互動畫的語音識別器 iatDialog = new RecognizerDialog(MainActivity.this, new InitListener() { @Override public void onInit(int arg0) { Toast.makeText(MainActivity.this, "初始化失敗,錯誤碼:" + arg0, 0).show(); } }); //設置監聽,實現聽寫結果的回調 iatDialog.setListener(new RecognizerDialogListener() { String resultJson = "[";//放置在外邊做類的變量則報錯,會造成json格式不對(?) @Override public void onResult(RecognizerResult recognizerResult, boolean isLast) { if (!isLast) { resultJson += recognizerResult.getResultString() + ","; } else { resultJson += recognizerResult.getResultString() + "]"; } if (isLast) { //解析語音識別后返回的json格式的結果 Gson gson = new Gson(); List<DictationResult> resultList = gson.fromJson(resultJson, new TypeToken<List<DictationResult>>() { }.getType()); String result = ""; for (int i = 0; i < resultList.size() - 1; i++) { result += resultList.get(i).toString(); } System.out.println("結果:"+result); Toast.makeText(MainActivity.this, result, 1).show(); } System.out.println("調用onResult方法:"+recognizerResult.getResultString()); } @Override public void onError(SpeechError speechError) { //自動生成的方法存根 speechError.getPlainDescription(true); } }); //開始聽寫,需將sdk中的assets文件下的文件夾拷入項目的assets文件夾下(沒有的話自己新建) iatDialog.show(); } /** * 使用自己的UI界面 */ private void noUIVoice(){ //1.創建語音識別器對象,第二個參數:本地聽寫時傳InitListener mIat= SpeechRecognizer.createRecognizer(MainActivity.this, null); //2.設置聽寫參數,詳見《科大訊飛MSC API手冊(Android)》SpeechConstant類 mIat.setParameter(SpeechConstant.DOMAIN, "iat");//短信和日常用語的引擎 mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//漢語 mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");//設置為普通話 // 設置語音前端點:靜音超時時間,即用戶多長時間不說話則當做超時處理 mIat.setParameter(SpeechConstant.VAD_BOS, "4000"); // 設置語音后端點:后端點靜音檢測時間,即用戶停止說話多長時間內即認為不再輸入, 自動停止錄音 mIat.setParameter(SpeechConstant.VAD_EOS, "1000"); // 設置標點符號,設置為"0"返回結果無標點,設置為"1"返回結果有標點 mIat.setParameter(SpeechConstant.ASR_PTT, "1"); //設置音頻保存路徑,保存音頻格式支持pcm、wav,設置路徑為sd卡請注意WRITE_EXTERNAL_STORAGE權限(有需要) //注:AUDIO_FORMAT參數語記需要更新版本才能生效 //mIat.setParameter(SpeechConstant.AUDIO_FORMAT,"wav"); //mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/iat.wav"); //3.開始監聽聽寫 mIat.startListening(mRecoListener); mIat.startListening(mRecoListener); } private RecognizerListener mRecoListener = new RecognizerListener() { String resultJson = "["; private AnimationDrawable ad;//自定義的傾聽UI界面動畫對象 // 聽寫結果回調接口(返回Json格式結果,用戶可參見附錄12.1); // 一般情況下會通過onResults接口多次返回結果,完整的識別內容是多次結果的累加; // 關於解析Json的代碼可參見MscDemo中JsonParser類; // isLast等於true時會話結束。 public void onResult(RecognizerResult results, boolean isLast) { if (!isLast) { resultJson += results.getResultString() + ","; } else { resultJson += results.getResultString() + "]"; } if (isLast) { //解析語音識別后返回的json格式的結果 Gson gson = new Gson(); List<DictationResult> resultList = gson.fromJson(resultJson, new TypeToken<List<DictationResult>>() { }.getType()); String result = ""; for (int i = 0; i < resultList.size() - 1; i++) { result += resultList.get(i).toString(); } System.out.println("結果:"+result); Toast.makeText(MainActivity.this, result, 1).show();//輸出結果 //將光標定位到文字最后,以便修改 //etText.setSelection(result.length()); } System.out.println("調用onResult方法:"+results.getResultString()); } // 會話發生錯誤回調接口 public void onError(SpeechError error) { error.getPlainDescription(true); // 獲取錯誤碼描述 ad.stop(); image.setVisibility(View.GONE);//隱藏圖片 } // 開始錄音 public void onBeginOfSpeech() { // 此回調表示:sdk內部錄音機已經准備好了,用戶可以開始語音輸入 image.setBackgroundResource(R.drawable.anim_iconset);//加載圖片xml文件 ad=(AnimationDrawable) image.getBackground();//將圖片轉化成動畫 image.setVisibility(View.VISIBLE);//顯示圖片 ad.start();//開啟動畫 } // 結束錄音 public void onEndOfSpeech() { // 此回調表示:檢測到了語音的尾端點,已經進入識別過程,不再接受語音輸入 ad.stop(); image.setVisibility(View.GONE);//隱藏圖片 } // 擴展用接口 public void onEvent(int eventType, int arg1, int arg2, Bundle obj) { } // 音量值0~30 @Override public void onVolumeChanged(int arg0, byte[] arg1) { //("當前正在說話,音量大小:" + arg0); } }; @Override protected void onDestroy() { super.onDestroy(); // 退出時釋放連接 mIat.cancel(); mIat.destroy(); } }
用來接收轉換 語音聽寫結果的類
/** * 解析 語音聽寫返回結果Json格式字符串 的模板類(多重嵌套Json) * * 語音識別結果Json數據格式(單條數據): * {"sn":1,"ls":true,"bg":0,"ed":0,"ws":[ * {"bg":0,"cw":[{"w":"今天","sc":0}]}, * {"bg":0,"cw":[{"w":"的","sc":0}]}, * {"bg":0,"cw":[{"w":"天氣","sc":0}]}, * {"bg":0,"cw":[{"w":"怎么樣","sc":0}]}, * {"bg":0,"cw":[{"w":"。","sc":0}]} * ]} * * sn number :第幾句 * ls boolean: 是否最后一句 * bg number :開始 * ed number :結束 * ws array :詞 * cw array :中文分詞 * w string :單字 * sc number :分數 */ public class DictationResult { private String sn; private String ls; private String bg; private String ed; private List<Words> ws; public static class Words { private String bg; private List<Cw> cw; public static class Cw { private String w; private String sc; public String getW() { return w; } public void setW(String w) { this.w = w; } public String getSc() { return sc; } public void setSc(String sc) { this.sc = sc; } @Override public String toString() { return w; } } public String getBg() { return bg; } public void setBg(String bg) { this.bg = bg; } public List<Cw> getCw() { return cw; } public void setCw(List<Cw> cw) { this.cw = cw; } @Override public String toString() { String result = ""; for (Cw cwTmp : cw) { result += cwTmp.toString(); } return result; } } public String getSn() { return sn; } public void setSn(String sn) { this.sn = sn; } public String getLs() { return ls; } public void setLs(String ls) { this.ls = ls; } public String getBg() { return bg; } public void setBg(String bg) { this.bg = bg; } public String getEd() { return ed; } public void setEd(String ed) { this.ed = ed; } public List<Words> getWs() { return ws; } public void setWs(List<Words> ws) { this.ws = ws; } @Override public String toString() { String result = ""; for (Words wsTmp : ws) { result += wsTmp.toString(); } return result; } }
自定義的UI界面動畫:anim_iconset.xml
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <!-- oneshot為false代表重復播放動畫 這里作為傾聽說話時的動畫--> <item android:drawable="@drawable/voice_empty" android:duration="500"/> <item android:drawable="@drawable/voice_full" android:duration="500"/> </animation-list>
2.語音的合成:將文本轉換為語音:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化 SpeechUtility.createUtility(this, SpeechConstant.APPID +"=57e79517"); //1.創建SpeechSynthesizer對象, 第二個參數:本地合成時傳InitListener SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null); //2.合成參數設置,詳見《科大訊飛MSC API手冊(Android)》SpeechSynthesizer 類 mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//設置發音人 mTts.setParameter(SpeechConstant.SPEED, "50");//設置語速 mTts.setParameter(SpeechConstant.VOLUME, "80");//設置音量,范圍0~100 mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //設置雲端 //設置合成音頻保存位置(可自定義保存位置),保存在“./sdcard/iflytek.pcm” //保存在SD卡需要在AndroidManifest.xml添加寫SD卡權限 //如果不需要保存合成音頻,注釋該行代碼 mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm"); //3.開始合成 int code = mTts.startSpeaking("在這里放置需要進行合成的文本", mSynListener); if (code != ErrorCode.SUCCESS) { if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) { //上面的語音配置對象為初始化時: Toast.makeText(MainActivity.this, "語音組件未安裝", Toast.LENGTH_LONG).show(); } else { Toast.makeText(MainActivity.this, "語音合成失敗,錯誤碼: " + code, Toast.LENGTH_LONG).show(); } } } // 合成監聽器 private SynthesizerListener mSynListener = new SynthesizerListener() { // 會話結束回調接口,沒有錯誤時,error為null public void onCompleted(SpeechError error) { } // 緩沖進度回調 // percent為緩沖進度0~100,beginPos為緩沖音頻在文本中開始位置,endPos表示緩沖音頻在文本中結束位置,info為附加信息。 public void onBufferProgress(int percent, int beginPos, int endPos, String info) { } // 開始播放,可以執行一些界面美化的操作 public void onSpeakBegin() { } // 暫停播放 public void onSpeakPaused() { } // 播放進度回調 // percent為播放進度0~100,beginPos為播放音頻在文本中開始位置,endPos表示播放音頻在文本中結束位置. public void onSpeakProgress(int percent, int beginPos, int endPos) { } // 恢復播放回調接口 public void onSpeakResumed() { } // 會話事件回調接口 public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) { } }; }