在尝试使用 Microsoft.CognitiveServices.Speech sdk 中的 SpeechSynthesizer 时,我注意到如果在调用 StopSpeakingAsync 之后调用 Dispose(),它就会挂起。
有没有办法绕过这个?我做了一个简短的控制台应用程序来说明下面的问题。我使用 Reflector 试图了解图书馆内部发生的事情,但发现它似乎SpxExceptionThrower.LogErrorIfFail
挂起。
我正在使用 1.18.0 版的 sdk。
(请注意,需要订阅认知服务/语音服务并在.FromSubscription
通话中输入密钥和区域)
谢谢!
static async Task Main(string[] args)
{
var config = SpeechConfig.FromSubscription("your-own-subscription-key", "your-region");
var synthesizer = new SpeechSynthesizer(config);
var task = synthesizer.SpeakTextAsync("Some long speech that keeps going on forever and ever and ever...");
task.Wait(2000);
await synthesizer.StopSpeakingAsync();
synthesizer.Dispose();
Console.WriteLine("This line will never be reached");
}
// Microsoft.CognitiveServices.Speech.Internal.InteropSafeHandle
protected override bool ReleaseHandle()
{
if (this.releaseHandleFunc != null)
{
// LogErrorIfFail appears to hang
SpxExceptionThrower.LogErrorIfFail(this.releaseHandleFunc(base.handle));
this.releaseHandleFunc = null;
base.handle = IntPtr.Zero;
}
return true;
}