asp.net使用SpeechSynthesizer类生成语音文件部署到iis遇到的几个坑

Posted duwolfcn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net使用SpeechSynthesizer类生成语音文件部署到iis遇到的几个坑相关的知识,希望对你有一定的参考价值。

首先需要引入命名空间System.Speech.Synthesis,代码如下:

using (var speechSyn = new SpeechSynthesizer())
{
    speechSyn.Volume = 60;//语速
    speechSyn.Rate = -2;//音量

    speechSyn.SetOutputToDefaultAudioDevice();
    speechSyn.SetOutputToWaveFile(fullFileName);//"D:\Record.wav"
    speechSyn.Speak(message);
}

这段代码在winform  exe执行没有问题,但部署到iis上就会报异常:

  现在无法开始异步操作。异步操作只能在异步处理程序或模块中开始,或在页生存期中的特定事件过程中开始。如果此异常在执行 Page 时发生,请确保 Page 标记为 <%@ Page Async="true" %>。此异常也可能表明试图调用“异步无效”方法,在 ASP.NET 请求处理内一般不支持这种方法。相反,该异步方法应该返回一个任务,而调用方应该等待该任务。

接下来对代码进行改进:

try
{
    var task = Task.Run(() =>
    {
        using (var speechSyn = new SpeechSynthesizer())
        {
            speechSyn.Volume = 60;//语速
            speechSyn.Rate = -2;//音量

            speechSyn.SetOutputToDefaultAudioDevice();
            speechSyn.SetOutputToWaveFile(fullFileName);//"D:\Record.wav"
            speechSyn.Speak(message);
        }
    });
    Task.WaitAll(task);
}
catch (AggregateException ae)
{
    var sb = new StringBuilder();
    foreach (var item in ae.InnerExceptions)
    {
        var t = item.GetType();
        sb.AppendLine(t.Namespace + "." + t.Name + " " + item.Message);
    }
    System.IO.File.AppendAllText(Server.MapPath("~/a.txt"), sb.ToString());
}

发现能正常生成音频文件,但是文件为0kb,文件异常信息为:

  System.InvalidOperationException 系统上未安装语音,或没有当前安全设置可用的语音。

 

接下来排查各种原因:

1.文件夹权限问题,添加各种用户权限仍然无效。

2.声卡问题,但发现winform程序可以生成语音文件。

3.iis线程释放问题,因为是异步操作,让当前线程休眠n秒任然不行。

 

是权限问题:

 把应用程序池的进程标识改成LocalSystem,能正常生成语音文件了。

以上是关于asp.net使用SpeechSynthesizer类生成语音文件部署到iis遇到的几个坑的主要内容,如果未能解决你的问题,请参考以下文章

[译] ASP.NET 生命周期 – ASP.NET 请求生命周期

类型:.net;问题:ASP.NET路由;结果:ASP.NET 路由 .NET Framework 4

ASP与ASP.NET的区别

ASP.NET_基础

ASP.NET 使用Ajax

ASP.NET Core 入门教程 1使用ASP.NET Core 构建第一个Web应用