创建将文本转换为语音的ASP.NET应用程序
我在创建一个在ASP.NET中将文本转换为语音的应用程序时寻求一些见解。 从我最初的研究来看,似乎:
-
MS SAPI要求客户端下载ActiveX组件,并且可以支持大量要转换的文本。 我们的客户不愿意在他们的系统上安装任何组件,因此这种方法可能会或可能不会飞。
-
我确实理解.NET 3.0,我们有System.Speech.Synthesis命名空间。 转换是否发生在服务器上? 如果是这样,我将如何向客户提供服务?
我们的要求是能够转换大量文本,应该是可扩展和可靠的。 哪种技术“生产就绪”能够在短时间内服务于大量请求。
任何想法都表示赞赏。
默认情况下,ASP.Net应用程序无法以足够的权限运行以访问语音合成,并且尝试运行Larsenal的代码将失败并出现安全性错误。
我通过在服务器上运行单独的WCF服务作为常规Windows服务,在应用程序中解决了这个问题。 然后,ASP.Net应用程序与该服务进行通信。 该服务只包含Larsenal的代码,返回一个字节数组,给定一串文本。
还有,一兆字节的文字? 这是一部大小合适的小说。
编辑,11-12-09,回答一些评论:
System.Speech可以返回一个字节数组,也可以保存到wav文件中,然后可以将其提供给用户页面上嵌入的媒体播放器。 当我构建我的谈话网页时,它的工作方式如下:
1)Page.aspx包含一个’embed’标签,用于将Windows Media Player放在页面上。 来源是“PlayText.aspx?Textid = what”。
2)PlayText.aspx加载适当的文本,并(通过WCF)与speechreader服务进行通信,将文本交给读取。
3)Speechreader服务创建一个MemoryStream并调用SpeechSynthesiser.SetOutputToWaveStream,然后将该流作为单个字节数组返回。 这个数组是Response.Write() – 编辑给客户端。
这是SpeechReader服务的核心:
byte[] ITextReader.SpeakText(string text) { using (SpeechSynthesizer s = new SpeechSynthesizer()) { using (MemoryStream ms = new MemoryStream()) { s.SetOutputToWaveStream(ms); s.Speak(text); return ms.GetBuffer(); } } }
我很确定在后端,这会返回一个巨大的XML字节数组,而且非常低效。 我只是将其作为概念certificate,所以没有研究过。 如果您打算在生产中使用它,请确保它不会在内部返回如下内容:
23 42 117 ...
使用SpeechSynthesizer,您可以输出到WAV文件。 然后,您可以根据需要进行辅助进程压缩或转换为其他格式。 所有这些都可以在服务器上完成,然后通过浏览器发送。
这篇CodeProject文章是对.NET语音合成的一个很好的介绍。
如果你想看看它如何用很多文本执行….添加对System.Speech的引用,然后使用以下作为起点:
using System; using System.Speech.Synthesis; namespace SpeakToMe { class Program { static void Main(string[] args) { SpeechSynthesizer synth = new SpeechSynthesizer(); synth.SetOutputToWaveFile("c:\\test.wav"); synth.Speak("Hello, world."); synth.SetOutputToDefaultAudioDevice(); Console.ReadLine(); } } }
在我相对较快的机器上快速测试44,700字(238KB)的文件…
- 在55秒内完成
- 生成一个626 MB的WAV文件
我搜索了Google中的“将文本转换为Asp.Net中的语音”,并找到了一个非常好用且有用的链接:
http://codeprojectdownload.com/asp-net-2/convert-text-into-speech-in-asp-net/#.T0ScXIfXDZE
它也可能对您有用。
我通过使用codeBehind运行运行text-to-speech命令的javascript函数来实现此目的:
代码隐藏:
Page.ClientScript.RegisterStartupScript( GetType(), "anythingHere", "nameOfFunction();", true);
JavaScript的:
我在我的博客上写了一篇文章: http : //weblogs.asp.net/ricardoperes/archive/2014/04/08/speech-synthesis-with-asp-net-and-html5.aspx 。 我使用AJAX和数据URI在客户端和服务器之间来回发送语音数据。