运行环境: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
代码:it
voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);
执行上面语句,朗读即刻中止,在程序关闭时可调用上述语句,好比加在OnApplicationQuit()方法中。
2.不开子线程,使朗读不卡
voice.Speak(str, SpeechVoiceSpeakFlags.SVSFlagsAsync);
因此说voice.Speak方法,用两个参数的,第二个参数很是重要
SVSFPurgeBeforeSpeak
若是正在朗读,则中止,而后朗读当前的内容
SVSFlagsAsync
这个看名字就知道,异步,不会卡主线程。
这样一来,不用开子线程直接异步朗读,不卡主线程,并且能够随时中止,实测关闭Unity程序(发布出的Windows端程序)时也不会卡住,当即关闭