Есть ли способ использовать StopSpeakingAsync в SpeechSynthesizer без зависания?

#text-to-speech #com-interop #azure-cognitive-services #safehandle

Вопрос:

При попытке использовать синтезатор речи от корпорации Майкрософт.Когнитивные услуги.Sdk для речи, я заметил, что Dispose() зависает, если он вызывается после вызова StopSpeakingAsync.

Есть ли способ обойти это? Я сделал короткое консольное приложение, которое иллюстрирует проблему ниже. Я использовал Рефлектор, чтобы попытаться понять, что происходит внутри библиотеки, но обнаружил только, что, похоже 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;
}
 

Комментарии:

1. Привет, я инженер, работающий над SDK. Не могли бы вы рассказать мне, какой SDK вы используете? И, может быть, вы поделитесь со мной журналом

2. Привет! Конечно, я использую последнюю стабильную версию: 1.18.0. Файл журнала находится здесь .

3. Хорошо, спасибо! Похоже, это ошибка, и мы ее изучим. В качестве обходного пути вы можете подождать StopSpeakingAsync() завершения (не использовать await ), прежде чем утилизировать синтезатор.

4. Идеально! Спасибо вам за обходной путь.