热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET使用TTS实现语音合成,生成的文件为零如何解决?

web需要进行声音预警,当报警发生时候,就用相关的字符串发给后台,由TTS负责生成语音wav文件,然后将wav的URL地址发给前端的flash播放器,播放,在应用的过程,经常出现当请求的数
  web需要进行声音预警,当报警发生时候,就用相关的字符串发给后台,由TTS负责生成语音wav文件,然后将wav的URL地址
发给前端的flash播放器,播放,在应用的过程,
经常出现当请求的数据量大时,后台生成的语音文件长度为零。而在WinForm下则没有这个问题。
请问为什么?
部分代码。

          ISpeechVoice v = new SpVoiceClass();
            ISpeechObjectTokens isots = v.GetVoices("name=ScanSoft Mei-Ling_Full_22kHz", "");
            if(isots.Count==0)
                isots = v.GetVoices("name=Microsoft Lili", "");//win7或win2008下已安装lili
            if (isots.Count > 0)
            {
                SpFileStream s = new SpFileStream();
                try
                {
                    //s.Format.Type = SpeechAudioFormatType.SAFT22kHz16BitMono;
                    s.Format.Type = SpeechAudioFormatType.SAFT16kHz8BitMono;
                    s.Open(filePath, SpeechStreamFileMode.SSFMCreateForWrite, false);
                    
                    v.AudioOutputStream = s;
                    v.Voice = isots.Item(0);
                    v.Volume = 100;
                    v.Rate = -3;          
                    v.Speak(speechText, SpeechVoiceSpeakFlags.SVSFDefault);
                 
                    s.Close();
                    if (new FileInfo(filePath).Length > 1000)//有时显示成功,但实际没成功,文件大小只有110个字节。
                    {
                        context.Response.Write("../wavs/" + fileName);
                    }
                    else
                    {
                        File.Delete(filePath);
                      //文件生成失败。
                    }
                }
                catch (Exception ex)
                {
                    s.Close();
                    File.Delete(filePath);
                }
            }

10 个解决方案

#1


你也说了,请求量大的时候会有问题。
本来SpeechSDK也不是给高并发设计的吧?
另外,你一个web站点,提示难道都是毫无规律可循的?各种提示内容总是有限的吧?预先录制好了返回不好么?即便像动态生成,那么每种提示生成之后就缓存起来,不再重复生成会不会好点?

#2


引用 1 楼 wjq 的回复:
你也说了,请求量大的时候会有问题。
本来SpeechSDK也不是给高并发设计的吧?
另外,你一个web站点,提示难道都是毫无规律可循的?各种提示内容总是有限的吧?预先录制好了返回不好么?即便像动态生成,那么每种提示生成之后就缓存起来,不再重复生成会不会好点?

多谢,每次播放的内容是变动的,因此不可能提前录制。
有可能是并发引起来的,
但是 web中没有多线程的概念,不知道如何将不同客户端的请求 排队生成 或许好一点。

#3


继续请教。。。

#4


引用 2 楼 ponydph 的回复:
Quote: 引用 1 楼 wjq 的回复:

你也说了,请求量大的时候会有问题。
本来SpeechSDK也不是给高并发设计的吧?
另外,你一个web站点,提示难道都是毫无规律可循的?各种提示内容总是有限的吧?预先录制好了返回不好么?即便像动态生成,那么每种提示生成之后就缓存起来,不再重复生成会不会好点?

多谢,每次播放的内容是变动的,因此不可能提前录制。
有可能是并发引起来的,
但是 web中没有多线程的概念,不知道如何将不同客户端的请求 排队生成 或许好一点。
web里每个请求就是一个线程。
就算用列队,并发量大的时候,也来不及。我表示很好奇,到底什么样的业务逻辑能让你每次提示都不一样,用户名字么?那也可以在用户注册的时候预录名字的wav,其他相同提示预录,提示的时候合起来就好。

#5


如果你需要高并发,那么filePath别写死,用guid试试
每个线程自己操作自己的文件,不要都往一个文件里写入

高并发状态下,取系统时间也不见得不会重复,精确到毫秒可能能好一些,但也不一定

#6


那就把代码移动到winform里去。 

asp.net 的运行环境中,各种COM组件可能无法工作

在ASP.NET里,就直接向数据库里 记录需要合成的数据。

 另一个winfrom定期检查数据库的表【或则信号量通知】,然后执行操作。最后把wav文件写到ASP.NET的数据文件目录下。

#7


引用 4 楼 wjq 的回复:
Quote: 引用 2 楼 ponydph 的回复:

Quote: 引用 1 楼 wjq 的回复:

你也说了,请求量大的时候会有问题。
本来SpeechSDK也不是给高并发设计的吧?
另外,你一个web站点,提示难道都是毫无规律可循的?各种提示内容总是有限的吧?预先录制好了返回不好么?即便像动态生成,那么每种提示生成之后就缓存起来,不再重复生成会不会好点?

多谢,每次播放的内容是变动的,因此不可能提前录制。
有可能是并发引起来的,
但是 web中没有多线程的概念,不知道如何将不同客户端的请求 排队生成 或许好一点。
web里每个请求就是一个线程。
就算用列队,并发量大的时候,也来不及。我表示很好奇,到底什么样的业务逻辑能让你每次提示都不一样,用户名字么?那也可以在用户注册的时候预录名字的wav,其他相同提示预录,提示的时候合起来就好。

是监测值,比如温度超限, 如果把数值读出来,则肯定不能提前合成。

#8


引用 6 楼 okkk 的回复:
那就把代码移动到winform里去。 

asp.net 的运行环境中,各种COM组件可能无法工作

在ASP.NET里,就直接向数据库里 记录需要合成的数据。

 另一个winfrom定期检查数据库的表【或则信号量通知】,然后执行操作。最后把wav文件写到ASP.NET的数据文件目录下。

这个是备选方案,如果IIS不可靠的话,肯定通过数据库中中介了。


#9


引用 7 楼 ponydph 的回复:
Quote: 引用 4 楼 wjq 的回复:

Quote: 引用 2 楼 ponydph 的回复:

Quote: 引用 1 楼 wjq 的回复:

你也说了,请求量大的时候会有问题。
本来SpeechSDK也不是给高并发设计的吧?
另外,你一个web站点,提示难道都是毫无规律可循的?各种提示内容总是有限的吧?预先录制好了返回不好么?即便像动态生成,那么每种提示生成之后就缓存起来,不再重复生成会不会好点?

多谢,每次播放的内容是变动的,因此不可能提前录制。
有可能是并发引起来的,
但是 web中没有多线程的概念,不知道如何将不同客户端的请求 排队生成 或许好一点。
web里每个请求就是一个线程。
就算用列队,并发量大的时候,也来不及。我表示很好奇,到底什么样的业务逻辑能让你每次提示都不一样,用户名字么?那也可以在用户注册的时候预录名字的wav,其他相同提示预录,提示的时候合起来就好。

是监测值,比如温度超限, 如果把数值读出来,则肯定不能提前合成。
怎么就不能,你这些数值都不能,那些导航的路信息部更不能了?
你就这点数值,把0-9.十百千万亿点几个音录好,需要的时候组装就好了。这个用TTS根本就是技术选型错误。

#10


引用 9 楼 wjq 的回复:
Quote: 引用 7 楼 ponydph 的回复:

Quote: 引用 4 楼 wjq 的回复:

Quote: 引用 2 楼 ponydph 的回复:

Quote: 引用 1 楼 wjq 的回复:

你也说了,请求量大的时候会有问题。
本来SpeechSDK也不是给高并发设计的吧?
另外,你一个web站点,提示难道都是毫无规律可循的?各种提示内容总是有限的吧?预先录制好了返回不好么?即便像动态生成,那么每种提示生成之后就缓存起来,不再重复生成会不会好点?

多谢,每次播放的内容是变动的,因此不可能提前录制。
有可能是并发引起来的,
但是 web中没有多线程的概念,不知道如何将不同客户端的请求 排队生成 或许好一点。
web里每个请求就是一个线程。
就算用列队,并发量大的时候,也来不及。我表示很好奇,到底什么样的业务逻辑能让你每次提示都不一样,用户名字么?那也可以在用户注册的时候预录名字的wav,其他相同提示预录,提示的时候合起来就好。

是监测值,比如温度超限, 如果把数值读出来,则肯定不能提前合成。
怎么就不能,你这些数值都不能,那些导航的路信息部更不能了?
你就这点数值,把0-9.十百千万亿点几个音录好,需要的时候组装就好了。这个用TTS根本就是技术选型错误。


我说的是一方面 还有状态信息呢,比如超过多少度一级,超过多少 二级 等。非常多的状态。
如果有上千个点,需要保存多少个信息。


推荐阅读
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本指南详细介绍了如何利用华为云对象存储服务构建视频点播(VoD)平台。通过结合开源技术如Ceph、WordPress、PHP和Nginx,用户可以高效地实现数据存储、内容管理和网站搭建。主要内容涵盖华为云对象存储系统的配置步骤、性能优化及安全设置,为开发者提供全面的技术支持。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
author-avatar
专业破解王_920
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有