sapi語音朗讀的簡單用法(Unity中)
阿新 • • 發佈:2019-03-21
方案 start pause async ... blog speech https unity5 運行環境:win10, Unity5.6.2f1/Unity2018.2.6f1(兩個版本都試了,可以)
using SpeechLib;
//...
SpVoice voice = new SpVoice();
書接上文Unity中使用Windows的sapi進行語音朗讀
上文例子中的代碼只是最最簡單的使用方法,實際用時是有問題的。
這樣直接
voice.Speak(str);
如上簡單粗暴的使用,會卡住當前Unity程序的主線程,在朗讀完畢之前會一直卡,包括關閉Unity程序,也還是會一直讀完內容
首先解決卡主線程的問題
自然就想到了開子線程
Thread t=new Thread(()=>{ voice.Speak(str); }); t.Start();
這樣讓它朗讀文字,的確不卡主線程了
但是,關閉Unity程序時,依然還是會一直讀完內容
那好,在關閉時先讓voice停止
private void OnApplicationQuit()
{
voice.Pause();
}
的確有用,關程序時,馬上就不朗讀了,但是,程序會卡住一會兒,才會關閉。
所以還是有問題
最終解決方案:
- 不需要開子線程
- 根據我的需求,不需要暫停,只要停止,那麽不用voice.Pause()了
代碼:
- 朗讀停止
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
執行上面語句,朗讀即刻停止,在程序關閉時可調用上述語句,比如加在OnApplicationQuit()方法中。
2.不開子線程,使朗讀不卡
voice.Speak(str, SpeechVoiceSpeakFlags.SVSFlagsAsync);
所以說voice.Speak方法,用兩個參數的,第二個參數非常重要
SVSFPurgeBeforeSpeak
如果正在朗讀,則停止,然後朗讀當前的內容
SVSFlagsAsync
這個看名字就知道,異步,不會卡主線程。
這樣一來,不用開子線程直接異步朗讀,不卡主線程,而且可以隨時停止,實測關閉Unity程序(發布出的Windows端程序)時也不會卡住,立即關閉
sapi語音朗讀的簡單用法(Unity中)