android 訊飛文件中語音停頓合成技巧
阿新 • • 發佈:2019-01-01
最近寫android的時候碰到一個需求,就是當我們想要自己合成語音的時候,需要在播報一句話的某些位置進行幾秒鐘的停頓,比如想要合成這樣的語音:"大家好,【停頓一秒】歡迎【停頓兩秒】來到我的部落格,如果有用【停頓一秒】,頂一下唄"。在訊飛的文件中,我沒看到有實現這樣功能的方法(看的並不仔細,android也才看了一個月)
我的實現方法是把這段文字先拆分,用split(String regex)把文字拆成字串陣列,引數當然是“【停頓一秒】”,這個停頓兩秒怎麼處理?當然是用兩個【停頓一秒】代替,
這樣就把原字串切割成了多個字串,再遍歷陣列播報出來就行了(每播報完一個停頓一秒)。這裡【停頓兩秒】會生成一個空字串存進陣列,當然也是有用的。空字串不會發出聲音,但是會形成停頓效果。其實還是很簡單的。不多說,上程式碼:
//搞個工具類,
//private SpeechSynthesizer mTts;
//private int flag = 0;
public void startSpeaking(String playText) { final String[] texts = playText.split("【停頓一秒】"); // 進行語音合成. if (mTts != null){
//為了不影響主執行緒,重新開個非同步執行緒 new AsyncTask(){ @Override protected Object doInBackground(Object[] params) { for(int i = 0; i < texts.length; i++) {
//這是咱們訊飛文件中SpeechSynthesizer提供的播報語音方法 mTts.startSpeaking(texts[i],new SynthesizerListener(){
//這裡實現SynthesizerListener中該實現的方法即可,在這些方法中,我們主要用到onCompleted()這個方法,在這個方法中做以下控制
//播放完語音會自動呼叫這個方法
@Override public void onCompleted(SpeechError speechError) { flag= 100; try {
//休眠1秒 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }
});
//這裡要讓一定要卡住,我是用了死迴圈卡在這裡,不讓其自動往下走,否則會發現基本上只播報了陣列中最後一段語音,因為程式碼執行的速度很快,
//第一句話還沒說完,可能剛發出第一個字的第一個音就會再次執行mTts.startSpeaking(texts[i+1],...)了 while (true){
//搞個標示在這,只要當前語音播放完,就修改標識的值,讓其跳出這個死迴圈,讓他繼續播放下一段語音,當然跳出之後需要再次賦值成0,否則下一次進來這裡的時候,
//就卡不住了 if (flag != 0){ break; } } flag = 0; } return null; } }.execute(); } }
OK,現在呼叫這個方法,把我們需要播放的字串傳進去,就這麼簡單。
另一種方法,中文頓號"、"即可停頓,想停長時間,可多加幾個。在來自http://blog.csdn.net/eastlhu/article/details/25436973看到的。