訊飛語音識別SDK整合 語音識別 語音合成 訊飛英語識別
阿新 • • 發佈:2019-01-10
最近專案集成了訊飛語音識別功能,由此記錄簡單的整合流程
demo效果(logcat)
資源下載
1、首先用as建一個model (這個不用介紹)
2、登入訊飛開發者平臺,進入控制檯,建立應用生成appid
1、 建立應用
2、生成appid
3、下載SDK(非常重要,必須下載,因為每個appid和so和jar一一相對,所以要下載sdk拿到相應的so檔案和jar檔案,使用別人的是不行的哦,除非使用對應的appid)
1、下載SDK;
2、新增需要的功能
3、sdk文件(libs資料夾下是需要的so庫和jar包,smaple資料夾下是官方demo)
4、複製lib資料夾下的so庫和jar包到demo中(so放在libs下記得builder中新增引用)
1、複製so庫和新增依賴
2、as中相關配置
5、初始化訊飛(新建一個application 在OnCreate()中配置就好)
6、前期sdk整合工作已經完成,好了,開始愉快的引用了(下面是小木子寫的簡單識別功能,同時能切換英語識別,順便吐槽下自己的英語,著實爛)
1、新增許可權(測試的時候記得給許可權)
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
2、acticity中的程式碼:
public class MainActivity extends AppCompatActivity implements InitListener {
private static final String TAG = "MainActivity";
// 語音聽寫物件
private SpeechRecognizer mIat;
private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
// 引擎型別
private String mEngineType = SpeechConstant.TYPE_CLOUD;
int ret = 0; // 函式呼叫返回值
private static String LANGUAGE_E = "en_us";
private static String LANGUAGE_C = "zh_cn";
private String currLanguage = LANGUAGE_C;
private TextView text_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text_result = findViewById(R.id.text_result);
initDtat();
findViewById(R.id.start).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startIflySpeechRecognize(LANGUAGE_C);
}
});
findViewById(R.id.language).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (currLanguage.equals(LANGUAGE_C)) {
currLanguage = LANGUAGE_E;
}
}
});
}
private void initDtat() {
mIat = SpeechRecognizer.createRecognizer(this, this);
}
/**
* SpeechRecognizer 初始化監聽
*
* @param code
*/
@Override
public void onInit(int code) {
Log.d(TAG, "SpeechRecognizer init() code = " + code);
if (code != ErrorCode.SUCCESS) {
Log.d(TAG, "初始化失敗,錯誤碼: " + code);
}
}
/**
* 開始訊飛語音識別
*/
private void startIflySpeechRecognize(String language) {
if (null == mIat) {
// 建立單例失敗,與 21001 錯誤為同樣原因,參考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688
Log.d(TAG, "建立物件失敗,請確認 libmsc.so 放置正確,且有呼叫 createUtility 進行初始化");
return;
}
// 移動資料分析,收集開始聽寫事件
FlowerCollector.onEvent(this, "iat_recognize");
mIatResults.clear();
// 設定引數
setParam(language);
// 不顯示聽寫對話方塊
ret = mIat.startListening(mRecognizerListener);
if (ret != ErrorCode.SUCCESS)
Log.d(TAG, "聽寫失敗,錯誤碼:" + ret);
}
/**
* 引數設定
*
* @return
*/
public void setParam(String language) {
// 清空引數
mIat.setParameter(SpeechConstant.PARAMS, null);
// 設定聽寫引擎
mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
// 設定返回結果格式
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
if (language.equals("en_us")) {
// 設定語言
mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");
mIat.setParameter(SpeechConstant.ACCENT, null);
//Log.d(TAG, "設定語言-英文");
} else {
// 設定語言
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
// 設定語言區域
mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
//Log.d(TAG, "設定語言-中文");
}
// 設定語音前端點:靜音超時時間,即使用者多長時間不說話則當做超時處理
mIat.setParameter(SpeechConstant.VAD_BOS, "8000");
// 設定語音後端點:後端點靜音檢測時間,即使用者停止說話多長時間內即認為不再輸入, 自動停止錄音
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");
}
/**
* 聽寫監聽器。
*/
private RecognizerListener mRecognizerListener = new RecognizerListener() {
@Override
public void onBeginOfSpeech() {
// 此回調錶示:sdk內部錄音機已經準備好了,使用者可以開始語音輸入
Log.d(TAG, "開始說話");
}
@Override
public void onError(SpeechError error) {
// Tips:
// 錯誤碼:10118(您沒有說話),可能是錄音機許可權被禁,需要提示使用者開啟應用的錄音許可權。
if (error.getErrorCode() == 14002) {
// Log.d(TAG, error.getPlainDescription(true) + "\n請確認是否已開通翻譯功能");
} else {
// Log.d(TAG, error.getPlainDescription(true));
}
// TODO 重新開啟語音識別監聽
startIflySpeechRecognize(currLanguage);
}
@Override
public void onEndOfSpeech() {
// 此回調錶示:檢測到了語音的尾端點,已經進入識別過程,不再接受語音輸入
Log.d(TAG, "結束說話");
}
@Override
public void onResult(RecognizerResult results, boolean isLast) {
// Log.d(TAG, "**********************" + results.getResultString());
printResult(results);
}
@Override
public void onVolumeChanged(int volume, byte[] data) {
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
// 以下程式碼用於獲取與雲端的會話id,當業務出錯時將會話id提供給技術支援人員,可用於查詢會話日誌,定位出錯原因
// 若使用本地能力,會話id為null
if (SpeechEvent.EVENT_SESSION_ID == eventType) {
String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
// Log.d(TAG, "session id =" + sid);
}
// TODO 重新開啟語音識別監聽
}
};
/**
* 處理結果
*
* @param results
*/
private void printResult(RecognizerResult results) {
String text = JsonParser.parseIatResult(results.getResultString());
String sn = null;
// 讀取json結果中的sn欄位
try {
JSONObject resultJson = new JSONObject(results.getResultString());
sn = resultJson.optString("sn");
} catch (JSONException e) {
e.printStackTrace();
}
mIatResults.put(sn, text);
StringBuffer resultBuffer = new StringBuffer();
for (String key : mIatResults.keySet()) {
resultBuffer.append(mIatResults.get(key));
}
String result = resultBuffer.toString();
text_result.setText(result);
Log.d(TAG, "結果:" + result);
// if (mIFlyTTS != null)
// mIFlyTTS.playText(result);
// TODO 處理結果 然後重新開啟
startIflySpeechRecognize(currLanguage);
}
}