sapi語音朗讀的簡單用法(Unity中)

運行環境:win10, Unity5.6.2f1/Unity2018.2.6f1(兩個版本都試了,能夠)api

using SpeechLib;

//...
    SpVoice voice = new SpVoice();

書接上文Unity中使用Windows的sapi進行語音朗讀
上文例子中的代碼只是最最簡單的使用方法,實際用時是有問題的。
這樣直接異步

voice.Speak(str);

如上簡單粗暴的使用,會卡住當前Unity程序的主線程,在朗讀完畢以前會一直卡,包括關閉Unity程序,也仍是會一直讀完內容ide

首先解決卡主線程的問題
天然就想到了開子線程ui

Thread t=new Thread(()=>{
    voice.Speak(str);
});
t.Start();

這樣讓它朗讀文字,的確不卡主線程了
可是,關閉Unity程序時,依然仍是會一直讀完內容線程

那好,在關閉時先讓voice中止code

private void OnApplicationQuit()
{
    voice.Pause();
}

的確有用,關程序時,立刻就不朗讀了,可是,程序會卡住一下子,纔會關閉。blog

因此仍是有問題get

最終解決方案:string

  1. 不須要開子線程
  2. 根據個人需求,不須要暫停,只要中止,那麼不用voice.Pause()了

代碼:it

  1. 朗讀中止
    voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);

    執行上面語句,朗讀即刻中止,在程序關閉時可調用上述語句,好比加在OnApplicationQuit()方法中。

2.不開子線程,使朗讀不卡

voice.Speak(str, SpeechVoiceSpeakFlags.SVSFlagsAsync);

因此說voice.Speak方法,用兩個參數的,第二個參數很是重要

SVSFPurgeBeforeSpeak

若是正在朗讀,則中止,而後朗讀當前的內容

SVSFlagsAsync

這個看名字就知道,異步,不會卡主線程。

這樣一來,不用開子線程直接異步朗讀,不卡主線程,並且能夠隨時中止,實測關閉Unity程序(發佈出的Windows端程序)時也不會卡住,當即關閉

相關文章
相關標籤/搜索