温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

unity中sapi语音朗读的简单用法

发布时间:2021-10-27 09:08:44 来源:亿速云 阅读:187 作者:柒染 栏目:游戏开发

这期内容当中小编将会给大家带来有关unity中sapi语音朗读的简单用法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

运行环境: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();
}

的确有用,关程序时,马上就不朗读了,但是,程序会卡住一会儿,才会关闭。

所以还是有问题

最终解决方案:

  1. 不需要开子线程

  2. 根据我的需求,不需要暂停,只要停止,那么不用voice.Pause()了

代码:

  1. 朗读停止

    voice.Speak(string.Empty, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);

    执行上面语句,朗读即刻停止,在程序关闭时可调用上述语句,比如加在OnApplicationQuit()方法中。

2.不开子线程,使朗读不卡

voice.Speak(str, SpeechVoiceSpeakFlags.SVSFlagsAsync);

所以说voice.Speak方法,用两个参数的,第二个参数非常重要

SVSFPurgeBeforeSpeak

如果正在朗读,则停止,然后朗读当前的内容

SVSFlagsAsync

这个看名字就知道,异步,不会卡主线程。

这样一来,不用开子线程直接异步朗读,不卡主线程,而且可以随时停止,实测关闭Unity程序(发布出的Windows端程序)时也不会卡住,立即关闭

上述就是小编为大家分享的unity中sapi语音朗读的简单用法了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI