0

在尝试使用 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;
}
4

0 回答 0