Как я могу использовать Google текст в речь API в форме Windows?

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

2 ответа

Решение

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


Вы можете использовать Google TTS API из вашего приложения 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,

мой 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 примерно такое же хорошее, как и оно.

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

Клиентскую версию Google.Cloud.TextToSpeech.NET можно найти здесь: 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);
Другие вопросы по тегам