Создание приложения ASP.NET для преобразования текста в речь

Я ищу некоторое понимание в создании приложения, которое преобразует текст в речь в ASP.NET. Из моего первоначального исследования выясняется, что:

  1. MS SAPI требует от клиента загрузки компонента ActiveX и может поддерживать большое количество текста для преобразования. Наши клиенты не желают устанавливать какие-либо компоненты в свои системы, поэтому такой подход может не сработать.

  2. Я понимаю, что в.NET 3.0 у нас есть пространство имен System.Speech.Synthesis. Происходит ли конвертация на сервере? Если так, как бы я подал это клиенту?

Наши требования - способность конвертировать большое количество текста, должны быть масштабируемыми и надежными. Какая технология "готова к производству" и способна обслуживать большое количество запросов за короткий промежуток времени.

Любые мысли приветствуются.

5 ответов

Решение

По умолчанию приложения ASP.Net не запускаются с достаточными разрешениями для доступа к синтезу речи, и при попытке запуска кода Ларсенала произойдет ошибка безопасности.

Мне удалось обойти это в приложении, запустив отдельную службу WCF на сервере, как обычную службу Windows. Затем приложение ASP.Net связалось с этим сервисом. Этот сервис только обернул код Ларсенала, возвращая массив байтов с заданной строкой текста.

Кроме того, один мегабайт текста? Это роман хорошего размера.

Редактировать, 11-12-09, отвечая на некоторые комментарии:

System.Speech может либо вернуть массив байтов, либо сохранить его в файл wav, который затем можно передать на медиаплеер, встроенный в страницу пользователя. Когда я создавал свою говорящую веб-страницу, она работала так:

1) Page.aspx содержит тег "embed", который помещает проигрыватель Windows Media на страницу. Источник "PlayText.aspx?Textid= что угодно".
2) PlayText.aspx загружает соответствующий текст и передает (через WCF) службе речевого чтения, передавая ему текст для чтения.
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 и ужасно неэффективен. Я просто сделал это как доказательство концепции, и поэтому не исследовал это. Если вы намереваетесь использовать это в работе, убедитесь, что он не возвращает что-то вроде этого:

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

Я добился этого, используя codeBehind для запуска функции JavaScript, которая запускает команду преобразования текста в речь:

CodeBehind:

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

JavaScript:

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

С SpeechSynthesizer вы можете выводить в файл WAV. Затем вы можете при необходимости сжать вторичный процесс или преобразовать его в другой формат. Все это может быть сделано на сервере, а затем отправлено через браузер.

Эта статья CodeProject является хорошим введением в.NET Speech Synthesis.

Если вы хотите увидеть, как это работает с большим количеством текста.... Добавьте ссылку на 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 слов (238 КБ) на моей относительно быстрой машине...

  • Завершено за 55 секунд
  • Сгенерирован 626 МБ WAV-файл

Я искал "Преобразовать текст в речь в Asp.Net" в Google и нашел очень красивую и полезную ссылку:

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

Это также может быть полезно для вас.

Я написал статью об этом в своем блоге: http://weblogs.asp.net/ricardoperes/archive/2014/04/08/speech-synthesis-with-asp-net-and-html5.aspx. Я использовал AJAX и Data URI для отправки голосовых данных между клиентом и сервером.

Другие вопросы по тегам