• 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,能正常生成语音文件了。

  • 相关阅读:
    HashMap源码解析
    编程语言java-并发(锁)
    标日第八课—词汇
    mysql 全文搜索的FULLTEXT
    Objective-C基础1:OC中类的继承和组合
    Xcode常用快捷键
    win7 64位,vs2012配置Qt5教程
    数据结构视频
    剑指offer(一)
    [转]SQL语句优化技术分析
  • 原文地址:https://www.cnblogs.com/dujuncn/p/9267649.html
Copyright © 2020-2023  润新知