Как использовать Windows синтезатор речи в ASP.NET MVC

Я пытался использовать System.Speech класс для генерации речи в ASP.NET MVC приложении.

[HttpPost]
public  ActionResult TTS(string text)
{
   SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
   speechSynthesizer.Speak(text);
   return View();
}

Но это дает следующую ошибку.

 System.InvalidOperationException: 'An asynchronous operation cannot be 
 Started at this time. Asynchronous operations may only be started within an 
 asynchronous handler or module or during certain events in the Page lifecycle. 
 If this exception occurred while executing a Page, ensure that the Page is
 marked <%@ Page Async="true" %>. 
 This exception may also indicate an attempt to call an "async void" method, 
 which is generally unsupported within ASP.NET request processing. Instead, 
the asynchronous method should return a Task, and the caller should await it.

Я использовал класс System.Speech и асинхронные методы в приложениях wpf.

  1. Можно ли использовать класс System.Speech в приложении ASP.NET mvc?

  2. Как это сделать?

  3. Где должен быть <%@ Page Async="true" %> быть помещенным?

1 ответ

Решение

Ответ: да, вы можете использовать System.Speech класс в MVC.

Я думаю, что вы можете попробовать использовать async метод действия и использование контроллера SpeechSynthesizer.Speak с Task.Run метод как это:

[HttpPost]
public async Task<ActionResult> TTS(string text)
{
    Task<ViewResult> task = Task.Run(() =>
    {
        using (SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer())
        {
            speechSynthesizer.Speak(text);
            return View();
        }
    });
    return await task;
}

Однако, как в примере выше, сгенерированный звук воспроизводится на сервере, потому что приведенный выше код выполняется на стороне сервера, а не на стороне клиента. Чтобы включить игру на стороне клиента, вы можете использовать SetOutputToWaveFile метод и использование audio тег для воспроизведения аудио контента при возврате страницы просмотра, показанной в примере ниже (предполагается, что вы используете HTML 5 в представлении CSHTML):

контроллер

[HttpPost]
public async Task<ActionResult> TTS(string text)
{
    // you can set output file name as method argument or generated from text
    string fileName = "fileName";
    Task<ViewResult> task = Task.Run(() =>
    {
        using (SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer())
        {
            speechSynthesizer.SetOutputToWaveFile(Server.MapPath("~/path/to/file/") + fileName + ".wav");
            speechSynthesizer.Speak(text);

            ViewBag.FileName = fileName + ".wav";
            return View();
        }
    });
    return await task;
}

Посмотреть

<audio autoplay="autoplay" src="@Url.Content("~/path/to/file/" + ViewBag.FileName)">
</audio>

Или вы можете изменить тип действия на FileContentResult и использовать MemoryStream с SetOutputToWaveStream чтобы позволить пользователю воспроизводить аудио файл сам:

Task<FileContentResult> task = Task.Run(() =>
{
    using (SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer())
    {
        using (MemoryStream stream = new MemoryStream())
        {
            speechSynthesizer.SetOutputToWaveStream(stream);
            speechSynthesizer.Speak(text);
            var bytes = stream.GetBuffer();
            return File(bytes, "audio/x-wav");
        }
    }
});

Ссылка:

Использование асинхронных методов в ASP.NET MVC

Похожие проблемы:

Как использовать речь в MVC

System.Speech.Synthesis зависает с высокой загрузкой процессора на 2012 R2

Другие вопросы по тегам