Comment puis-je utiliser google text pour utiliser l'api de parole sous la forme de windows?

je veux utiliser google text pour parler dans mon application windows form, il lira une étiquette. J'ai ajouté du Système.Référence de discours. Comment peut-il lire une étiquette avec un événement de clic de bouton? http://translate.google.com/translate_tts?q=testing+google+speech il s'agit de l'api Google text to speech, ou comment puis-je utiliser le texte natif de microsoft pour speech?

1
demandé sur İlker Korkut 2012-02-11 23:56:34

2 réponses

UPDATE L'API TTS de Google n'est plus accessible au public. Les notes en bas de page sur les TTS de Microsoft sont toujours pertinentes et offrent des fonctionnalités équivalentes.


vous pouvez utiliser L'API TTS de Google à partir de votre application WinForm en jouant la réponse en utilisant une variation de cette question 'S réponse (il m'a fallu un certain temps, mais j'ai une vraie solution):

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;
                }
            }
        }
    }
}

NOTE: le code ci-dessus exige que NAudio travaille (libre/open source) et using déclarations pour System.Web , System.Threading , et NAudio.Wave .

Mon Form1 a 2 contrôles:

  1. une étiquette nommée label1
  2. un bouton nommé button1 avec un Tag de label1 (utilisé pour lier le bouton à son étiquette)

le code ci-dessus peut être légèrement simplifié si vous avez des événements différents pour chaque combinaison bouton / étiquette en utilisant quelque chose comme (non testé):

    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();
    }

il y a des problèmes avec cette solution cependant (cette liste n'est probablement pas complète; je suis sûr que les commentaires et l'utilisation du monde réel en trouveront d'autres):

  1. Notez le stop.WaitOne(10000); dans le premier extrait de code. Les 10000 représentent un maximum de 10 quelques secondes de son à jouer pour qu'il doive être modifié si votre label met plus de temps à lire. Ceci est nécessaire car la version actuelle de NAudio (v1.5.4.0) semble avoir un problème pour déterminer quand le flux est fini de jouer. Il peut être corrigé dans une version ultérieure ou il y a peut-être une solution que je n'ai pas pris le temps de trouver. Une solution temporaire consiste à utiliser un ParameterizedThreadStart qui prendrait le délai comme paramètre dans le thread. Cela permettrait des délais variables mais ne résoudrait pas techniquement le problème.
  2. plus important encore, L'API TTS de Google n'est pas officielle (ce qui signifie qu'elle ne doit pas être utilisée par des applications autres que Google). Si vous avez besoin de quelque chose qui fonctionne dans un environnement commercial, je suggère soit la solution MS TTS (comme votre question suggère) ou l'une des nombreuses alternatives commerciales. Rien de tout cela n'a tendance à être aussi simple.

pour répondre À l'autre côté de votre question:

la classe System.Speech.Synthesis.SpeechSynthesizer est beaucoup plus facile à utiliser et vous pouvez compter sur elle étant disponible de manière fiable (où avec L'API Google, il pourrait être allé demain).

il est vraiment aussi facile que d'inclure une référence à la System.Speech référence et:

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

    synth.SpeakAsync(somethingToSay);
}

Ce fonctionne .

essayer d'utiliser L'API Google TTS a été une expérience amusante, mais j'aurais du mal à le Suggérer pour une utilisation en production, et si vous ne voulez pas payer pour une alternative commerciale, la solution de Microsoft est à peu près aussi bonne qu'elle obtient.

6
répondu M.Babcock 2017-05-23 12:13:49

je sais que cette question est un peu dépassée, mais récemment Google a publié Google Cloud Text To Speech API.

.NET Version Client de Google.Nuage.Synthèse vocale peut être trouvé ici: https://github.com/jhabjan/Google.Cloud.TextToSpeech.V1

voici un court exemple d'utilisation du client:

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);
2
répondu HABJAN 2018-04-30 12:25:44