Как я могу использовать текст Google для речи API в форме Windows? - PullRequest
1 голос
/ 11 февраля 2012

Я хочу использовать Google Text to Speech в моем приложении Windows Form, оно будет читать ярлык.Я добавил ссылку System.Speech.Как он может прочитать ярлык с событием нажатия кнопки?http://translate.google.com/translate_tts?q=testing+google+speech Это API Google Text to Speech или как я могу использовать нативный текст Microsoft в речь?

Ответы [ 2 ]

6 голосов
/ 12 февраля 2012

ОБНОВЛЕНИЕ Google TTS API больше не является общедоступным. Примечания внизу о TTS от Microsoft по-прежнему актуальны и обеспечивают эквивалентную функциональность.


Вы можете использовать API TTS Google из своего приложения WinForm, проиграв ответ, используя вариант ответа на этот вопрос (это заняло у меня некоторое время, но у меня реальное решение ):

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.FormClosing += (sender, e) =>
            {
                if (waiting)
                    stop.Set();
            };
    }

    private void ButtonClick(object sender, EventArgs e)
    {
        var clicked = sender as Button;
        var relatedLabel = this.Controls.Find(clicked.Tag.ToString(), true).FirstOrDefault() as Label;

        if (relatedLabel == null)
            return;

        var playThread = new Thread(() => PlayMp3FromUrl("http://translate.google.com/translate_tts?q=" + HttpUtility.UrlEncode(relatedLabel.Text)));
        playThread.IsBackground = true;
        playThread.Start();
    }

    bool waiting = false;
    AutoResetEvent stop = new AutoResetEvent(false);
    public void PlayMp3FromUrl(string url)
    {
        using (Stream ms = new MemoryStream())
        {
            using (Stream stream = WebRequest.Create(url)
                .GetResponse().GetResponseStream())
            {
                byte[] buffer = new byte[32768];
                int read;
                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
            }

            ms.Position = 0;
            using (WaveStream blockAlignedStream =
                new BlockAlignReductionStream(
                    WaveFormatConversionStream.CreatePcmStream(
                        new Mp3FileReader(ms))))
            {
                using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
                {
                    waveOut.Init(blockAlignedStream);
                    waveOut.PlaybackStopped += (sender, e) =>
                    {
                        waveOut.Stop();
                    };

                    waveOut.Play();
                    waiting = true;
                    stop.WaitOne(10000);
                    waiting = false;
                }
            }
        }
    }
}

ПРИМЕЧАНИЕ: Приведенный выше код требует работы NAudio (свободный / открытый исходный код) и операторов using для System.Web, System.Threading и NAudio.Wave.

My Form1 имеет 2 элемента управления:

  1. Метка с именем label1
  2. Кнопка с именем button1 с Tag из label1 (используется для привязки кнопки к ее метке)

Приведенный выше код можно немного упростить, если у вас есть разные события для каждой комбинации кнопок / меток, используя что-то вроде (не проверено):

    private void ButtonClick(object sender, EventArgs e)
    {
        var clicked = sender as Button;

        var playThread = new Thread(() => PlayMp3FromUrl("http://translate.google.com/translate_tts?q=" + HttpUtility.UrlEncode(label1.Text)));
        playThread.IsBackground = true;
        playThread.Start();
    }

Есть проблемы с этим решением, хотя (этот список, вероятно, не полный; я уверен, что комментарии и реальное использование найдут другие):

  1. Обратите внимание на stop.WaitOne(10000); в первом фрагменте кода. 10000 представляет максимум 10 секунд звука для воспроизведения, поэтому его необходимо настроить, если для чтения вашего ярлыка требуется больше времени. Это необходимо, потому что текущая версия NAudio (v1.5.4.0), похоже, имеет проблемы с определением, когда закончится воспроизведение потока. Это может быть исправлено в более поздней версии или, возможно, есть обходной путь, который я не нашел времени, чтобы найти. Один временный обходной путь - использовать ParameterizedThreadStart, который бы использовал таймаут в качестве параметра для потока. Это допускает переменные таймауты, но технически не решит проблему.
  2. Что еще более важно, API Google TTS является неофициальным (то есть не предназначенным для использования приложениями, не относящимися к Google), и может быть изменено без уведомления в любое время. Если вам нужно что-то, что будет работать в коммерческой среде, я бы предложил либо решение MS TTS (как предполагает ваш вопрос), либо одну из многих коммерческих альтернатив. Хотя ничего из этого не бывает таким простым.

Чтобы ответить на другую сторону вашего вопроса:

Класс System.Speech.Synthesis.SpeechSynthesizer намного проще в использовании, и вы можете рассчитывать на его надежную доступность (тогда как с Google API он может исчезнуть завтра).

Это действительно так же просто, как включить ссылку на ссылку System.Speech и:

public void SaySomething(string somethingToSay)
{
    var synth = new System.Speech.Synthesis.SpeechSynthesizer();

    synth.SpeakAsync(somethingToSay);
}

Это просто работает .

Попытка использовать Google TTS API была забавным экспериментом, но мне было бы трудно предложить его для производственного использования, и если вы не хотите платить за коммерческую альтернативу, решение Microsoft примерно так же хорошо, как и оно. становится.

2 голосов
/ 30 апреля 2018

Я знаю, что этот вопрос несколько устарел, но недавно Google опубликовал Google Cloud Text To Speech API.

.NET Клиентская версия Google.Cloud.TextToSpeech можно найти здесь: https://github.com/jhabjan/Google.Cloud.TextToSpeech.V1

Вот краткий пример использования клиента:

GoogleCredential credentials =
    GoogleCredential.FromFile(Path.Combine(Program.AppPath, "jhabjan-test-47a56894d458.json"));

TextToSpeechClient client = TextToSpeechClient.Create(credentials);

SynthesizeSpeechResponse response = client.SynthesizeSpeech(
    new SynthesisInput()
    {
        Text = "Google Cloud Text-to-Speech enables developers to synthesize natural-sounding speech with 32 voices"
    },
    new VoiceSelectionParams()
    {
        LanguageCode = "en-US",
        Name = "en-US-Wavenet-C"
    },
    new AudioConfig()
    {
        AudioEncoding = AudioEncoding.Mp3
    }
);

string speechFile = Path.Combine(Directory.GetCurrentDirectory(), "sample.mp3");

File.WriteAllBytes(speechFile, response.AudioContent);
...