热门标签 | 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根本就是技术选型错误。


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


推荐阅读
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文探讨了如何选择一个合适的序列化版本ID(serialVersionUID),包括使用生成器还是简单的整数,以及在不同情况下应如何处理序列化版本ID。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 编码unicode解决了语言不通的问题.但是.unicode又有一个新问题.由于unicode是万国码.把所有国家的文字都编进去了.这就导致一个unicode占用的空间会很大.原来 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 本文探讨了在AspNetForums平台中实施基于角色的权限控制系统的方法,旨在为不同级别的用户提供合适的访问权限,确保系统的安全性和可用性。 ... [详细]
  • 在开发过程中,有时需要提供用户创建数据库的功能。本文介绍了如何利用 .NET 和 ADOX 在应用程序中实现创建 Access 数据库,并详细说明了创建数据库及表的具体步骤。 ... [详细]
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社区 版权所有