#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. Идеально! Спасибо вам за обходной путь.