我有一个asp.net MVC应用程序,它有一个控制器动作,它接受一个字符串作为输入,并发送一个合成语音的响应wav文件.这是一个简化的例子:
public async Task<ActionResult> Speak(string text)
{
Task<FileContentResult> task = Task.Run(() =>
{
using (var synth = new System.Speech.Synthesis.SpeechSynthesizer())
using (var stream = new MemoryStream())
{
synth.SetOutputToWaveStream(stream);
synth.Speak(text);
var bytes = stream.GetBuffer();
return File(bytes, "audio/x-wav");
}
});
return await task;
}
Run Code Online (Sandbox Code Playgroud)
应用程序(特别是此操作方法)在2008 R2服务器,2012(非R2)服务器和我的8.1 dev PC上的服务器环境中运行良好.它在标准的Azure 2012 R2虚拟机上运行良好.但是,当我将其部署到三个2012 R2服务器(最终的永久主页)时,操作方法永远不会产生HTTP响应 - IIS工作进程无限期地最大化其中一个CPU核心.事件查看器中没有任何内容,并且在使用Procmon查看服务器时没有任何内容跳出来.我已经通过远程调试附加到进程,并且synth.Speak(text)永远不会返回.当synth.Speak(text)执行呼叫我立即看到在服务器的任务管理器失控W3wp.exe进程.
我的第一个倾向是相信一些过程在服务器上干扰语音合成,但是Windows讲述者工作正常,像这样的简单控制台应用程序也能正常工作:
static void Main(string[] args)
{
var synth = new System.Speech.Synthesis.SpeechSynthesizer();
synth.Speak("hello");
}
Run Code Online (Sandbox Code Playgroud)
所以显然我不能责怪服务器的语音合成.那么也许我的代码中存在问题,或者IIS配置中有什么奇怪的东西?如何在这些服务器上使此控制器操作正常工作?
这是测试操作方法的简单方法(只需url为路由获取正确的值):
<div>
<input type="text" id="txt" autofocus />
<button type="button" …Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc text-to-speech speech-synthesis windows-server-2012-r2