System.Speech.Synthesis 在 2012 R2 上因 CPU 高而挂起

2024-03-12

我有一个 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;
    }

该应用程序(特别是此操作方法)在 2008 R2 服务器、2012(非 R2)服务器和我的 8.1 开发 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");
}

所以显然我不能总体上责怪服务器的语音合成。那么也许我的代码有问题,或者 IIS 配置有问题?如何使该控制器操作在这些服务器上正常工作?

这是测试操作方法的简单方法(只需获取url路由的值):

<div>
    <input type="text" id="txt" autofocus />
    <button type="button" id="btn">Speak</button>
</div>

<script>
    document.getElementById('btn').addEventListener('click', function () {
        var text = document.getElementById('txt').value;
        var url = window.location.href + '/speak?text=' + encodeURIComponent(text);
        var audio = document.createElement('audio');
        var canPlayWavFileInAudioElement = audio.canPlayType('audio/wav'); 
        var bgSound = document.createElement('bgsound');
        bgSound.src = url;
        var canPlayBgSoundElement = bgSound.getAttribute('src');

        if (canPlayWavFileInAudioElement) {
            // probably Firefox and Chrome
            audio.setAttribute('src', url);
            audio.setAttribute('autoplay', '');
            document.getElementsByTagName('body')[0].appendChild(audio);
        } else if (canPlayBgSoundElement) {
            // internet explorer
            document.getElementsByTagName('body')[0].appendChild(bgSound);
        } else {
            alert('This browser probably can\'t play a wav file');
        }
    });
</script>

我发现我可以在其他服务器(包括 Azure VM)上重现该问题,因此我排除了我们特定环境出现问题的可能性。

另外,我发现如果我以服务器管理员身份运行应用程序池,我可以让代码在 2012 R2 上正常工作并且之前已经登录过服务器。经过很长的排除权限问题的过程后,我认为一定是登录过程中发生的某些事情使 TTS API 调用能够正常工作。 (无论它是什么,我无法通过 procmon 痕迹挖掘找到它)。幸运的是,ApplicationPoolIdentity 可以通过在 IIS 中打开应用程序池的“高级设置”并设置来应用类似的登录魔法Load User Profile to True.

运行应用程序池的身份也需要读取权限HKU\.Default\Software\Microsoft\Speech可以通过使用本地服务器的位置来将其授予 ApplicationPoolIdentityIIS APPPOOL\.Net v4.5对于用户名(其中.Net v4.5是应用程序池的名称)。

一旦授予了 reg 密钥的读取权限,并且应用程序池配置为加载用户配置文件,上述代码就可以正常工作。在 Azure VM 和来自 MSDN ISO 的 vanilla 2012 R2 上进行了测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.Speech.Synthesis 在 2012 R2 上因 CPU 高而挂起 的相关文章

随机推荐

  • 当选择的日期超出最小或最大日期时,DatePicker 会崩溃。安卓5.1

    我有这个代码 public void onDateSet DatePicker view int year int monthOfYear int dayOfMonth Log v DateRangePicker Date CHANGED
  • IIS Express Web 服务器端口正在使用

    我通常可以毫无问题地调试我的 Web 服务 但现在我不断收到错误 无法启动 IIS Express Web 服务器 端口 3268 正在使用中 我已经看过之前的问题 但我被困住了 我使用哪个端口并不重要 重新启动 关闭网络浏览器 删除网络历
  • 如何查看URL的状态?

    我创建了一个宏 可以在其中从任何网页获取每个 URL 现在 我在列中包含了每个 URL 如何检查 URL 是否有效 如果这些 URL 中的任何一个不起作用 那么它应该在下一列中的 URL 旁边显示错误 不起作用 下面是我写的代码 Sub C
  • 让 NSRunLoop 等待设置标志的最佳方法?

    在苹果文档中NS运行循环 http developer apple com documentation Cocoa Reference Foundation Classes NSRunLoop Class Reference Referen
  • DirectoryInfo.GetFiles,如何在 C# 中获取不同类型的文件

    如何使用以下命令找到 gif 和 jpg 这两种文件类型DirectoryInfo GetFilesC 中的函数 当我尝试这段代码时 string pattern gif jpg FileInfo files dir GetFiles pa
  • 如何使用 Webpack 和 React create-react-app 在 Monaco 中加载 npm 模块类型定义

    我想在 React 应用程序中加载 Monaco 中的一些模块类型定义以用于教程目的 事实上 我在经历了很大的痛苦之后设法让它工作 但以一种非常hacky的方式 所以我不是问如何做 而是问如何正确地做 我希望能用 Webpack 解决的部分
  • cakephp:查找带有“包含”的语句

    以下用户模型函数来自 MilesJones 论坛插件 有人可以告诉我 find stmt txt 中的 contain 有什么用吗 我在 cakephp 食谱中找不到任何包含的示例 任何帮助表示赞赏 public function getP
  • 防止浏览器缓存角度模板

    我一直在研究这个问题 这很简单 现代浏览器 chrome FF 会缓存一些东西 比如 html 页面等等 当您发布新版本时 Angular 会获取这些模板 但是 由于浏览器提供这些页面的缓存版本 而不是新的更新版本 我读过大约 2000 篇
  • Python 中的滤波器设计和频率提取

    我正在开展一个项目 用 Python 查找多分量音频信号的瞬时频率 我目前正在使用巴特沃斯带通滤波器结合scipy signal lfilter提取我想要的频率区域 然后我使用分析信号 来自scipy signal hilbert 以获得瞬
  • Jquery 每 x 秒运行一次单击函数

    我有以下 jQuery
  • 最喜欢的 (G)Vim 插件/脚本? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 加载多个小型 JavaScript 文件和加载一个大型 JavaScript 文件哪个更好?

    我注意到在 Chrome 中 如果我将图像加载为 Base64 字符串 然后滚动浏览页面的该部分 速度会变慢 我还注意到 当我导航出包含 Javascript 的选项卡 然后移回该选项卡时 速度会慢几秒钟 就好像 V8 正在重新编译 js
  • Google 自定义搜索 API 自动完成?

    我们使用 Google 自定义搜索 API 付费服务器端 API 来支持我们的搜索结果 我想在搜索中添加自动完成功能 但是 有谁知道是否支持此功能 通过服务器端 API 或通过某种客户端 JSONP 我曾尝试使用 Google 自定义搜索的
  • Node.js 服务器没有响应

    我正在 Node js 主页上尝试这个简单的演示 var http require http http createServer function req res res writeHead 200 Content Type text pl
  • 如何防止应用程序在 Windows 7 中被固定?

    我试图阻止用户将我的 NET 应用程序固定到任务栏 我在上面找到了一些代码老新事物 http blogs msdn com b oldnewthing archive 2011 06 01 10170113 aspx就是这么做的 然而 它是
  • 如何在 C# 中使用箭头禁用 WinForm 上的导航?

    我需要禁用使用表单上的箭头改变焦点 有一个简单的方法可以做到吗 谢谢 大致如下 private void Form1 Load object sender EventArgs e foreach Control control in thi
  • 流星 0.5.7:如何处理/使用 Meteor.Collection.ObjectID?

    我昨天更新了流星并尝试使用新的Meteor Collection ObjectID 但此后一直没有成功 首先 我以这种方式更新了我的收藏 myCollection new Meteor Collection mycollection idG
  • 选择每一列,但重命名其中一列

    假设我有一个名为 Alphabet 的表 现在假设该表具有以下列 a b c d e z 现在我想从提到的表中选择所有内容 但选择 f 作为 aaa 但我不想这样做 select a b c d e f as aaa g z from Al
  • silverlight 画布装订

    我正在尝试创建一个画布 其中的项目位于画布上的指定位置 因为我无法将源和模板直接绑定到画布 我是否使用了 ItemsControl 但有一个问题 所有的项目都位于 0 0 我已经测试了绑定 它们不返回 0 0 我怎样才能完成这项工作 使物品
  • System.Speech.Synthesis 在 2012 R2 上因 CPU 高而挂起

    我有一个 asp net MVC 应用程序 它有一个控制器操作 该操作将字符串作为输入并发送合成语音的响应 wav 文件 这是一个简化的示例 public async Task