【问题标题】:Creating a ASP.NET application converting text to speech创建将文本转换为语音的 ASP.NET 应用程序
【发布时间】:2009-11-11 16:37:33
【问题描述】:

我想了解如何在 ASP.NET 中创建将文本转换为语音的应用程序。根据我最初的研究,似乎:

  1. MS SAPI 要求客户端下载 ActiveX 组件,并且可以支持大量文本进行转换。我们的客户不愿意在他们的系统上安装任何组件,所以这种方法可能行得通,也可能行不通。

  2. 我确实理解 .NET 3.0,我们有 System.Speech.Synthesis 命名空间。转换是否发生在服务器上?如果是这样,我将如何将其提供给客户?

我们的要求是能够转换大量文本,并且应该具有可扩展性和可靠性。哪种技术已经“生产就绪”,能够在短时间内处理大量请求。

感谢任何想法。

【问题讨论】:

    标签: c# .net asp.net


    【解决方案1】:

    默认情况下,ASP.Net 应用程序运行时没有足够的权限来访问语音合成,尝试运行 Larsenal 的代码将失败并出现安全错误。

    通过在服务器上运行单独的 WCF 服务(作为常规 Windows 服务),我能够在应用程序中解决此问题。然后 ASP.Net 应用程序与该服务进行通信。该服务只是包装了 Larsenal 的代码,返回一个字节数组,给定一个文本字符串。

    还有,一兆字节的文本?那是一本不错的小说。

    编辑,11-12-09,回答一些 cmets:

    System.Speech 可以返回一个字节数组,也可以保存到一个 wav 文件,然后您可以将该文件馈送到嵌入在用户页面上的媒体播放器。当我建立我的谈话网页时,它是这样工作的:

    1) Page.aspx 包含一个“嵌入”标签,用于在页面上放置一个 Windows Media Player。来源是“PlayText.aspx?Textid=whatever”。
    2) PlayText.aspx 加载适当的文本,并(通过 WCF)与语音阅读器服务通信,将要阅读的文本交给它。
    3) Speechreader 服务创建一个 MemoryStream 并调用 SpeechSynthesiser.SetOutputToWaveStream,然后将流作为单个字节数组返回。这个数组是 Response.Write()-ed 给客户端的。

    这是 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 字节数组,而且效率极低。我只是将其作为概念证明,因此没有进行研究。如果您打算在生产中使用它,请确保它不会在内部返回如下内容:

    <byte>23</byte>
    <byte>42</byte>
    <byte>117</byte>
    ...
    

    【讨论】:

    • 我自己在这个问题上研究了很长时间,现在我有了答案。谢谢。
    • @Aric - 使用您的方法,我不必将 wav 文件保存在服务器上?服务返回的“字节数组”——如何在客户端机器上播放?
    • 关于安全性的要点。提供了我的示例,以便 OP 可以使用他所描述的大量文本来测试 System.Speech。
    • @Aric - 是的,文本大小很有挑战性,这就是为什么我想在将其呈现给决策者之前评估不同的选项
    • 检查我的答案以获取 44k 字的快速测试结果。
    【解决方案2】:

    使用 SpeechSynthesizer,您可以输出到 WAV 文件。然后,如果需要,您可以进行辅助过程压缩或转换为另一种格式。所有这些都可以在服务器上完成,然后通过浏览器发送出去。

    This CodeProject article 很好地介绍了 .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 文件

    【讨论】:

    • SpeechSynthesizer 是否具有转换大量文本(> 1mb)的能力?这项技术是否已准备好用于生产应用程序?此外,最好在服务器上创建它并通过浏览器发送它。看来我必须将 wav 文件保存在服务器上,这可能会占用大量空间?如果我想在用户使用后清除文件,什么触发器是可靠的(关闭浏览器窗口?)谢谢
    • 为了节省空间,您可以有一个转换为 MP3 的辅助进程。如果该文件打算让用户只听到一次,您可能希望定期清除文件(例如,每晚)。如果用户需要返回相同的转换,您需要某种方式首先检查您是否还有 MP3,如果没有,则重建它。就它转换大量文本的能力而言……试试吧。 CP 文章是一个很好的起点。
    【解决方案3】:

    我在 Google 中搜索了“在 Asp.Net 中将文本转换为语音”,发现一个非常好用的链接:

    http://codeprojectdownload.com/asp-net-2/convert-text-into-speech-in-asp-net/#.T0ScXIfXDZE

    它也可能对你有用。

    【讨论】:

      【解决方案4】:

      我通过使用 codeBehind 运行一个运行 text-to-speech 命令的 javascript 函数来实现这一点:

      代码隐藏:

      Page.ClientScript.RegisterStartupScript(
      GetType(), 
      "anythingHere", 
      "nameOfFunction();", 
      true);
      

      javascript:

      <script>
        function nameOfFunction()
          {//start
             var msg = new SpeechSynthesisUtterance('READ ME!');
             window.speechSynthesis.speak(msg);
          }//end
      </script>
      

      【讨论】:

        【解决方案5】:

        我在我的博客上写了一篇关于此的文章:http://weblogs.asp.net/ricardoperes/archive/2014/04/08/speech-synthesis-with-asp-net-and-html5.aspx。我使用 AJAX 和数据 URI 在客户端和服务器之间来回发送语音数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-09
          • 2011-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多