1. 程式人生 > >android 訊飛文件中語音停頓合成技巧

android 訊飛文件中語音停頓合成技巧

最近寫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看到的。