Как использовать 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.
Можно ли использовать класс System.Speech в приложении ASP.NET mvc?
Как это сделать?
- Где должен быть
<%@ 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
Похожие проблемы:
System.Speech.Synthesis зависает с высокой загрузкой процессора на 2012 R2