整合訊飛語音播報、語音合成;
阿新 • • 發佈:2018-11-29
整合訊飛語音播報:
地圖導航沒有語音播報,只給出了語音的文字,所以需要自己整合一個語音播報的功能,把導航返回的文字給說出來;
語音這方面選擇了科大訊飛,https://www.xfyun.cn/,註冊使用者、新建專案,下載SDK;訊飛會把你需要的服務生成一個sdk,下載就行了;建立完成後會給你一個APPID,初始化語音時會使用到;
按照指示新增so和jar:
在build.gradle中Android{}中新增:
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
1、先初始化,最好放在AppLocation中吧;APPID就是建立專案時給的;
SpeechUtility.createUtility(mC.getApplicationContext(), SpeechConstant.APPID +"=12345678");
2、在使用的類中初始化合成物件和設定引數:
private void initTts() { if (mTts == null){ mTts = SpeechSynthesizer.createSynthesizer(mC, new InitListener() { @Override public void onInit(int i) { if ( i != ErrorCode.SUCCESS){ Log.i("TTS", "語音初始化失敗,錯誤碼:"+i); } } });} //設定發音人 mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoqi"); //設定語速,值範圍:[0, 100],預設值:50 mTts.setParameter(SpeechConstant.SPEED, "49"); //設定音量 mTts.setParameter(SpeechConstant.VOLUME, "tts_volume"); //設定語調 mTts.setParameter(SpeechConstant.PITCH, "tts_pitch"); }
3、開始合成語音、語音播報;
mTts.startSpeaking("你好",null); //第一個引數是需要播報的文字,第二個引數是回撥;
好了這樣就完成了;可以先試一下效果;
整合在導航中:
我在使用模擬導航時,語音播報會特別快;有時第一句話還沒有說完再呼叫startSpeaking方法,就把第一句停掉開始說第二句了;於是做了一些處理;把傳過來的文字放在List集合中,逐條去播放;
public class TtsUtils { private Context mC; //初始化 public TtsUtils(Context mC){ this.mC = mC; } private SpeechSynthesizer mTts; public TtsUtils init(){ SpeechUtility.createUtility(mC.getApplicationContext(), SpeechConstant.APPID +"=5bc6d436"); initTts(); return this; } private void initTts() { if (mTts == null){ mTts = SpeechSynthesizer.createSynthesizer(mC, new InitListener() { @Override public void onInit(int i) { if ( i != ErrorCode.SUCCESS){ Log.i("TTS", "語音初始化失敗,錯誤碼:"+i); } } });} //設定發音人 mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoqi"); //設定語速,值範圍:[0, 100],預設值:50 mTts.setParameter(SpeechConstant.SPEED, "49"); //設定音量 mTts.setParameter(SpeechConstant.VOLUME, "tts_volume"); //設定語調 mTts.setParameter(SpeechConstant.PITCH, "tts_pitch"); } private int position = 0; private boolean isSpeak = false; private ArrayList<String> mTtsDatas = new ArrayList(); public void startSpeakingOrAddText(String s){ Log.i("TTS", "Tts: "+s+",第幾條 = "+(++position)); //如果傳過來的文字 不是空 就加入到列表中 if (!TextUtils.isEmpty(s)){ mTtsDatas.add(s); } //如果不是正在說話,並且文字列表大於0,就去說話; if (!isSpeak && mTtsDatas.size() > 0){ mTts.startSpeaking(mTtsDatas.get(0),c); //說完後把當前這條刪除了 mTtsDatas.remove(0); } } private SynthesizerListener c = new SynthesizerListener() { @Override public void onSpeakBegin() { //開始說了; isSpeak = true; } @Override public void onBufferProgress(int i, int i1, int i2, String s) { } @Override public void onSpeakPaused() { isSpeak = true; } @Override public void onSpeakResumed() { isSpeak = true; } @Override public void onSpeakProgress(int i, int i1, int i2) { } @Override public void onCompleted(SpeechError speechError) { //說完了 isSpeak = false; new Thread(new Runnable() { @Override public void run() { SystemClock.sleep(200); //延遲0.2秒 startSpeakingOrAddText(null); //傳遞null,讓語音繼續輪播播報下一條; } }).start(); } @Override public void onEvent(int i, int i1, int i2, Bundle bundle) { } }; public void destroy(){ mTtsDatas = null; if( null != mTts ){ mTts.stopSpeaking(); // 退出時釋放連線 mTts.destroy(); } } }
使用:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et);
mC = this;
mTts = new TtsUtils(mC).init();
}
public void click(View view) {
mTts.startSpeakingOrAddText(et.getText().toString());
}
OK!