Использование синтезатора речи в веб-приложении ASP.NET застревает

В веб-приложении MVC я использую класс SpeechSynthesizer для передачи некоторого текста в файл .wav во время функции, вызываемой обработчиком действий контроллера, который возвращает представление. Код выполняется, записывает файл, и дескриптор действия возвращается, но сервер разработки обычно, но не всегда, никогда не возвращается со страницей возврата. Это код преобразования текста в речь:

string threadMessage = null;
bool returnValue = true;

var t = new System.Threading.Thread(() =>
{
    try
    {
        SpeechEngine.SetOutputToWaveFile(wavFilePath);
        SpeechEngine.Speak(text);
        SpeechEngine.SetOutputToNull();
    }
    catch (Exception exception)
    {
        threadMessage = "Error doing text to speech to file: " + exception.Message;
        returnValue = false;
    }
});
t.Start();
t.Join();

if (!returnValue)
{
    message = threadMessage;
    return returnValue;
}

Я видел пару сообщений об аналогичной проблеме в сервисе, который советовал выполнять операцию в потоке, отсюда и вышеупомянутый поток.

На самом деле, использование SpeechSynthesizer для других целей тоже может зависнуть. У меня была страница, на которой только что перечислялись голоса, но она тоже зависала. Поскольку в любом потоке нет пользовательского кода, если я приостанавливаю отладчик, я понятия не имею, как его отлаживать.

Я пробовал впоследствии Dispose'ing объекта SpeechSynthesizer, вызывая SetOutputToDefaultVoice, но безрезультатно. Я пробовал его как в Windows 8.1, так и в Windows 8, работая с сервером разработки под отладчиком или работая с IIS Express отдельно.

Любые идеи? Могу ли я дать еще одну полезную информацию?

Спасибо.

-Джон


person jtsoftware    schedule 23.05.2014    source источник
comment
Почему вы вообще делаете это в ветке? Я стараюсь не просто добавлять потоки в свой код без уважительной причины.   -  person mason    schedule 23.05.2014
comment
Почему вы делаете это в отдельном потоке, если вам нужно дождаться завершения операции, прежде чем продолжить?   -  person Dominic Zukiewicz    schedule 23.05.2014
comment
Выше я упоминал, что добавил ветку, потому что это было предложено в другом сообщении StackOverflow, но нет никакой разницы в проблеме с потоком или без него. Я удалю поток, когда у меня будет реальное исправление, если оно не понадобится.   -  person jtsoftware    schedule 27.05.2014
comment
Вот ответы, которые я получил от forum.asp.net: forum.asp.net/p/1989192/ Очевидно, использование синтезатора речи не разрешено, но, поскольку это все еще кажется немного сомнительным, я пока оставляю этот вопрос открытым.   -  person jtsoftware    schedule 03.06.2014


Ответы (1)


Пытаться

Public void Speak(string wavFilePath, string text)
{
        using (var synthesizer = new SpeechSynthesizer())
        {
            synthesizer.SetOutputToWaveFile(wavFilePath);
            synthesizer.Speak(text);
            return outputFile;
        }
}

Task.Run(() => Speak("path", "text")).Result;

У меня это сработало в IIS Express

person ozba    schedule 24.07.2018