1. 程式人生 > >科大訊飛 線上語音識別 音訊來源為【檔案】的java接入實現, 適用於初學者

科大訊飛 線上語音識別 音訊來源為【檔案】的java接入實現, 適用於初學者

 ****科大訊飛的語音識別提供了兩種音訊來源方式,一個是通過麥克風,一個是來自音訊檔案。這裡介紹本人自己寫的通過音訊
 檔案識別的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包裡面有啊,不用問我要,在這

這裡寫圖片描述