科大訊飛 線上語音識別 音訊來源為【檔案】的java接入實現, 適用於初學者
阿新 • • 發佈:2018-11-08
****科大訊飛的語音識別提供了兩種音訊來源方式,一個是通過麥克風,一個是來自音訊檔案。這裡介紹本人自己寫的通過音訊
檔案識別的java程式碼。****
【離線識別參考我的另一篇】用java呼叫科大訊飛的離線語音識別dll實現離線識別(JNA實現)
之前的註冊、獲得註冊碼、以及SDK的下載這裡不再贅述,直接上程式碼:
注意:
1、msc.jar一定要匯入啊
2、本功能實現是在 線上情況下,離線情況下暫時用不了。
package com.iflytek; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import com.iflytek.cloud.speech.RecognizerListener; import com.iflytek.cloud.speech.RecognizerResult; import com.iflytek.cloud.speech.Setting; import com.iflytek.cloud.speech.SpeechConstant; import com.iflytek.cloud.speech.SpeechError; import com.iflytek.cloud.speech.SpeechRecognizer; import com.iflytek.cloud.speech.SpeechUtility; public class VoiceTest { private static final String APPID="5a******1";//這裡是自己的APPID private static VoiceTest mObject; private static StringBuilder mResult=new StringBuilder(); private String fileName="test.pcm";//這裡要將檔案拷貝至根目錄下,必須是.pcm檔案 //main方法,是否顯示日誌,語音實用程式驗證程式的id public static void main(String[] args) { if(null!=args&&args.length>0&&args[0].equals("true")) { //顯示日誌 Setting.setShowLog(true); } SpeechUtility.createUtility("appid="+APPID); getVoiceObj().Recognize(); } //單例模式,建立物件 private static VoiceTest getVoiceObj() { if(mObject==null) { mObject=new VoiceTest(); } return mObject; } //建立語音識別物件 private boolean mIsEndOfSpeech=false; private void Recognize() { if(SpeechRecognizer.getRecognizer()==null) { SpeechRecognizer.createRecognizer(); } mIsEndOfSpeech=false; RecogizePcmFileBite(); } //識別音訊檔案 private void RecogizePcmFileBite() { //獲取語音識別物件 SpeechRecognizer recognizer=SpeechRecognizer.createRecognizer(); //設定基本的識別引數,聲音來源是音訊,結果是自然語言文字 recognizer.setParameter(SpeechConstant.AUDIO_SOURCE, "-1"); recognizer.setParameter(SpeechConstant.RESULT_TYPE, "plain"); //開始監聽,引數是監聽器物件 recognizer.startListening(recListener); //建立檔案輸入流 FileInputStream fis=null; //建立位元組陣列,長度為64K byte[] data=new byte[64*1024]; try { fis=new FileInputStream(new File("./"+fileName)); //檔案剩餘長度如果沒有,就顯示沒有了 if(0==fis.available()) { mResult.append("no audio avaible!"); //取消語音識別 recognizer.cancel(); //否則有語音檔案 }else { int len=data.length;//此時為64*1024即有這麼長 while(data.length==len&&!mIsEndOfSpeech) { //讀取檔案 len=fis.read(data); //寫出檔案 recognizer.writeAudio(data, 0, len); } //停止語音識別 recognizer.stopListening(); } }catch(Exception e) { e.printStackTrace(); }finally { try { if(null !=fis) { fis.close(); fis=null; } } catch (IOException e) { e.printStackTrace(); } } } //聽寫監聽器 private RecognizerListener recListener=new RecognizerListener() { @Override public void onBeginOfSpeech() { DebugLog.Log("onBeginOfSpeech enter"); DebugLog.Log("*****開始錄音*****"); } @Override public void onVolumeChanged(int volume) { DebugLog.Log( "onVolumeChanged enter" ); if (volume > 0) DebugLog.Log("*************音量值:" + volume + "*************"); } @Override public void onResult(RecognizerResult result, boolean isLast) { DebugLog.Log( "onResult enter" ); //獲取監聽結果的字串 mResult.append(result.getResultString()); //如果是結尾 if(isLast) { DebugLog.Log("識別結果為:"+mResult.toString()); mIsEndOfSpeech=true; mResult.delete(0, mResult.length()); } } @Override public void onEvent(int arg0, int arg1, int arg2, String arg3) { // TODO Auto-generated method stub } @Override public void onError(SpeechError arg0) { // TODO Auto-generated method stub } @Override public void onEndOfSpeech() { DebugLog.Log("onEndOfSpeech enter"); DebugLog.Log("*****結束錄音*****"); mIsEndOfSpeech=true; } }; }
這裡如果需要顯示日誌,記得把工具類粘上(裡面的程式碼都不用動)
package com.iflytek; import java.text.SimpleDateFormat; public class DebugLog { public static void Log(String tag,String log) { if(true) System.out.println(log); } public static void Log(String log) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date=dateFormat.format(new java.util.Date()); if(true) System.out.println("<" + date + ">" + log); } public static boolean isEmpty(String string){ if(string == null) { return true; } if(string.isEmpty()) { return true; } return false; } }
最後直接run起來,就會將test.pcm這個音訊檔案的內容變為漢字輸出到控制檯
結果如下:
<2018-09-12 16:25:23>語音識別的結果是:漢堡包多少錢?一個英文怎麼說?
test.pcm這個檔案,SDK包裡面有啊,不用問我要,在這