API texte-parole de Google

je veux savoir comment utiliser google text pour l'API de discours dans mon projet .net. Je pense que je dois appeler une URL pour utiliser le service web, mais l'idée pour moi n'est pas claire. quelqu'un peut-il aider à

67
demandé sur A_Di-Matteo 2012-03-27 19:56:00

14 réponses

ancienne réponse:

essayez D'utiliser cette URL: http://translate.google.com/translate_tts?tl=en&q=Hello%20World Il générera automatiquement un fichier wav que vous pouvez facilement obtenir avec une requête HTTP à travers n'importe quelle programmation .net.

Edit:

Ohh Google, vous avez pensé que vous pourriez empêcher les gens d'utiliser votre merveilleux service avec vérification d'en-tête http fragile.

Voici une solution pour obtenir une réponse dans plusieurs langues (j'essaierai d'en ajouter plus au fur et à mesure):

NodeJS

// npm install `request`
const fs = require('fs');
const request = require('request');
const text = 'Hello World';

const options = {
    url: `https://translate.google.com/translate_tts?ie=UTF-8&q=${encodeURIComponent(text)}&tl=en&client=tw-ob`,
    headers: {
        'Referer': 'http://translate.google.com/',
        'User-Agent': 'stagefright/1.2 (Linux;Android 5.0)'
    }
}

request(options)
    .pipe(fs.createWriteStream('tts.mp3'))

Curl

curl 'https://translate.google.com/translate_tts?ie=UTF-8&q=Hello%20Everyone&tl=en&client=tw-ob' -H 'Referer: http://translate.google.com/' -H 'User-Agent: stagefright/1.2 (Linux;Android 5.0)' > google_tts.mp3

notez que les en-têtes sont basés sur l'exemple de @Chris Cirefice, s'ils arrêtent de travailler à un moment donné, je vais essayer de recréer les conditions pour que ce code fonctionne. Tous les crédits pour les en-têtes actuels vont à lui et le merveilleux outil qui est WireShark. (merci aussi à Google de ne pas avoir corrigé cette erreur)

58
répondu Schahriar SaffarShargh 2017-10-28 08:24:52

dans une mise à jour de réponse de Schahriar SaffarShargh , Google a récemment mis en œuvre une fonctionnalité "Google abuse", ce qui rend impossible d'envoyer n'importe quel HTTP régulier obtenir à une URL telle que:

http://translate.google.com/translate_tts?tl=en&q=Hello%20World

qui fonctionnait très bien auparavant. Maintenant, en suivant un tel lien vous présente avec un CAPTCHA. Cela affecte également Les requêtes HTTP GET out-of-browser (comme avec cURL), parce que l'utilisation de cette URL donne une redirection de l'abus de la protection de la page (le CAPTCHA).

pour commencer, vous devez ajouter le paramètre de requête client à L'URL de la requête:

http://translate.google.com/translate_tts?tl=en&q=Hello%20World&client=t

Google Translate envoie &client=t , donc vous devriez aussi.

avant de faire cette requête HTTP, assurez-vous de définir l'en-tête Referer :

Referer: http://translate.google.com/

évidemment, l'en-tête User-Agent est également requis, mais il est intéressant de noter qu'il peut être vide:

User-Agent:

Edit : NOTE - sur certains agents utilisateurs, tels que Android 4.X, l'en-tête personnalisé User-Agent est Non envoyé , ce qui signifie que Google ne sera pas de service à la demande. Pour résoudre ce problème, j'ai simplement réglé le User-Agent à un valide, comme stagefright/1.2 (Linux;Android 5.0) . Utilisez Wireshark pour déboguer les requêtes (comme je l'ai fait) si les serveurs de Google ne répondent pas, et assurez-vous que ces en-têtes sont correctement positionnés dans le GET ! Google répondra par un 503 Service Unavailable si la requête échoue, suivi d'une redirection vers la page CAPTCHA.

cette solution est un peu fragile; elle il est tout à fait possible que Google change la façon dont ils traitent ces requêtes à l'avenir, donc à la fin, je suggérerais de demander à Google de faire un vrai point final de L'API (gratuit ou payé) que nous pouvons utiliser sans nous sentir sale pour simuler des en-têtes HTTP.


Edit 2 : pour ceux intéressés, cette commande cURL devrait fonctionner parfaitement pour télécharger un mp3 de Hello en Anglais:

curl 'http://translate.google.com/translate_tts?ie=UTF-8&q=Hello&tl=en&client=t' -H 'Referer: http://translate.google.com/' -H 'User-Agent: stagefright/1.2 (Linux;Android 5.0)' > google_tts.mp3

comme vous pouvez le remarquer, j'ai défini les en-têtes Referer et User-Agent dans la requête, ainsi que Ajouté le paramètre client=t au querystring. Vous pouvez utiliser https au lieu de http , votre choix!


Modifier 3 : Google a maintenant besoin d'un token pour chaque requête GET (noté par tk dans le querystring). Ci-dessous la courbe révisée commande qui téléchargera correctement un mp3 TTS:

curl 'https://translate.google.com/translate_tts?ie=UTF-8&q=hello&tl=en&tk=995126.592330&client=t' -H 'user-agent: stagefright/1.2 (Linux;Android 5.0)' -H 'referer: https://translate.google.com/' > google_tts.mp3

remarquez le &tk=995126.592330 dans le questionnaire; c'est le nouveau jeton. J'ai obtenu ce jeton en appuyant sur l'icône du haut-parleur sur translate.google.com et en regardant la demande GET. J'ai simplement ajouté ce paramètre querystring à la commande cURL précédente, et cela fonctionne.

NOTE : évidemment, cette solution est très fragile, et casse à la volonté des architectes de Google qui introduisent de nouvelles choses comme les jetons requis pour les requêtes. Ce jeton peut ne pas fonctionner demain (Bien que je vérifierai et rapporterai)... le point est, il n'est pas sage de compter sur cette méthode; au lieu de cela, on devrait se tourner vers une solution commerciale TTS, surtout si l'utilisation de TTS dans la production.

pour plus d'explications sur la génération token et ce que vous pourriez être en mesure de faire à ce sujet, voir Boude la réponse de .


si cette solution casse à un moment quelconque dans le futur, veuillez laisser un commentaire sur cette réponse afin que nous puissions essayer de trouver une solution pour elle!

46
répondu Chris Cirefice 2017-05-23 12:03:05

Élargir Chris " réponse . J'ai réussi à inverser le processus de génération de tokens.

le token pour la requête est basé sur le texte et une variable TKK globale définie dans le script de page. Ceux-ci sont hachés en JavaScript résultant ainsi en TK param.

quelque part dans le script de la page vous trouverez quelque chose comme ceci:

TKK='403413';

il s'agit du montant des heures se sont écoulées depuis l'époque.

le texte est pompé dans la fonction suivante (quelque peu désobfusé):

var query = "Hello person";
var cM = function(a) {
    return function() {
        return a
    }
};
var of = "=";
var dM = function(a, b) {
    for (var c = 0; c < b.length - 2; c += 3) {
        var d = b.charAt(c + 2),
            d = d >= t ? d.charCodeAt(0) - 87 : Number(d),
            d = b.charAt(c + 1) == Tb ? a >>> d : a << d;
        a = b.charAt(c) == Tb ? a + d & 4294967295 : a ^ d
    }
    return a
};

var eM = null;
var cb = 0;
var k = "";
var Vb = "+-a^+6";
var Ub = "+-3^+b+-f";
var t = "a";
var Tb = "+";
var dd = ".";
var hoursBetween = Math.floor(Date.now() / 3600000);
window.TKK = hoursBetween.toString();

fM = function(a) {
    var b;
    if (null === eM) {
        var c = cM(String.fromCharCode(84)); // char 84 is T
        b = cM(String.fromCharCode(75)); // char 75 is K
        c = [c(), c()];
        c[1] = b();
        // So basically we're getting window.TKK
        eM = Number(window[c.join(b())]) || 0
    }
    b = eM;

    // This piece of code is used to convert d into the utf-8 encoding of a
    var d = cM(String.fromCharCode(116)),
        c = cM(String.fromCharCode(107)),
        d = [d(), d()];
    d[1] = c();
    for (var c = cb + d.join(k) +
            of, d = [], e = 0, f = 0; f < a.length; f++) {
        var g = a.charCodeAt(f);

        128 > g ? d[e++] = g : (2048 > g ? d[e++] = g >> 6 | 192 : (55296 == (g & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (g = 65536 + ((g & 1023) << 10) + (a.charCodeAt(++f) & 1023), d[e++] = g >> 18 | 240, d[e++] = g >> 12 & 63 | 128) : d[e++] = g >> 12 | 224, d[e++] = g >> 6 & 63 | 128), d[e++] = g & 63 | 128)
    }


    a = b || 0;
    for (e = 0; e < d.length; e++) a += d[e], a = dM(a, Vb);
    a = dM(a, Ub);
    0 > a && (a = (a & 2147483647) + 2147483648);
    a %= 1E6;
    return a.toString() + dd + (a ^ b)
};

var token = fM(query);
var url = "https://translate.google.com/translate_tts?ie=UTF-8&q="  + encodeURI(query) + "&tl=en&total=1&idx=0&textlen=12&tk=" + token + "&client=t";
document.write(url);

j'ai réussi à le porter avec succès à python dans ma fourche de gTTS , donc je sais que cela fonctionne.

Edit: à présent le code de génération de token utilisé par gTTS a été déplacé dans gtts-token .

Edit 2: Google a changé l'API (quelque part vers 2016-05-10), cette méthode nécessite quelques modifications. Je suis actuellement en train de travailler sur ce. entre-temps changer le client en tw-ob semble fonctionner.

Edit 3:

les changements sont mineurs, mais pour le moins gênants. La TKK a maintenant deux parties. Quelque chose comme 406986.2817744745 . Comme vous pouvez le voir la première partie est restée la même. La deuxième partie est l' somme de deux nombres apparemment aléatoires. TKK=eval('((function(){var a\x3d2680116022;var b\x3d137628723;return 406986+\x27.\x27+(a+b)})())'); ici \x3d signifie = et \x27 est ' . A et b changent toutes les minutes UTC. À l'une des étapes finales de l'algorithme, le jeton est corrigé par la seconde partie.

le nouveau code de génération de token est:

var xr = function(a) {
    return function() {
        return a
    }
};
var yr = function(a, b) {
    for (var c = 0; c < b.length - 2; c += 3) {
        var d = b.charAt(c + 2)
          , d = "a" <= d ? d.charCodeAt(0) - 87 : Number(d)
          , d = "+" == b.charAt(c + 1) ? a >>> d : a << d;
        a = "+" == b.charAt(c) ? a + d & 4294967295 : a ^ d
    }
    return a
};
var zr = null;
var Ar = function(a) {
    var b;
    if (null  !== zr)
        b = zr;
    else {
        b = xr(String.fromCharCode(84));
        var c = xr(String.fromCharCode(75));
        b = [b(), b()];
        b[1] = c();
        b = (zr = window[b.join(c())] || "") || ""
    }
    var d = xr(String.fromCharCode(116))
      , c = xr(String.fromCharCode(107))
      , d = [d(), d()];
    d[1] = c();
    c = "&" + d.join("") + 
    "=";
    d = b.split(".");
    b = Number(d[0]) || 0;
    for (var e = [], f = 0, g = 0; g < a.length; g++) {
        var l = a.charCodeAt(g);
        128 > l ? e[f++] = l : (2048 > l ? e[f++] = l >> 6 | 192 : (55296 == (l & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (l = 65536 + ((l & 1023) << 10) + (a.charCodeAt(++g) & 1023),
        e[f++] = l >> 18 | 240,
        e[f++] = l >> 12 & 63 | 128) : e[f++] = l >> 12 | 224,
        e[f++] = l >> 6 & 63 | 128),
        e[f++] = l & 63 | 128)
    }
    a = b;
    for (f = 0; f < e.length; f++)
        a += e[f],
        a = yr(a, "+-a^+6");
    a = yr(a, "+-3^+b+-f");
    a ^= Number(d[1]) || 0;
    0 > a && (a = (a & 2147483647) + 2147483648);
    a %= 1E6;
    return c + (a.toString() + "." + (a ^ b))
}
;
Ar("test");

bien sûr, je ne peux plus générer d'url valide, car je ne sais pas comment a et b sont générés.

17
répondu Boude 2017-05-23 12:26:08

une autre variante est la suivante: responsivevoice.org un exemple simple JsFiddle est ici

HTML

<div id="container">
<input type="text" name="text">
<button id="gspeech" class="say">Say It</button>
<audio id="player1" src="" class="speech" hidden></audio>
</div>

JQuery

$(document).ready(function(){

 $('#gspeech').on('click', function(){

        var text = $('input[name="text"]').val();
        responsiveVoice.speak("" + text +"");
        <!--  http://responsivevoice.org/ -->
    });

});

Ressource Externe:

https://code.responsivevoice.org/responsivevoice.js

12
répondu DMSJax 2016-01-08 05:02:23

vous pouvez télécharger la voix en utilisant Wget: d

wget -q -U Mozilla "http://translate.google.com/translate_tts?tl=en&q=Hello"

Enregistrer la sortie dans un fichier mp3:

wget -q -U Mozilla "http://translate.google.com/translate_tts?tl=en&q=Hello" -O hello.mp3

Profitez-en !!

4
répondu Boumediene_Kaddour 2014-11-16 07:19:31

Google text to speech

<!DOCTYPE html>
<html>
    <head>
        <script>
            function play(id){
            var text = document.getElementById(id).value;
            var url = 'http://translate.google.com/translate_tts?tl=en&q='+text;
            var a = new Audio(url);
                a.play();
            }
        </script>
    </head>
    <body>
        <input type="text" id="text" />
        <button onclick="play('text');"> Speak it </button>
    </body>
</html>
4
répondu Panchal Deep 2015-04-28 04:24:32

très bien, donc Google a introduit des tokens (voir le paramètre tk dans la nouvelle url) et l'ancienne solution ne semble pas fonctionner. J'ai trouvé une alternative - que je trouve même meilleure-et j'ai plus de voix! La commande n'est pas jolie, mais il fonctionne. S'il vous plaît noter que c'est à des fins de test seulement (je l'utilise pour un petit projet domotica) et utiliser la version réelle de acapella-groupe si vous prévoyez d'utiliser ce Commercial.

curl $(curl --data 'MyLanguages=sonid10&MySelectedVoice=Sharon&MyTextForTTS=Hello%20World&t=1&SendToVaaS=' 'http://www.acapela-group.com/demo-tts/DemoHTML5Form_V2.php' | grep -o "http.*mp3") > tts_output.mp3

Certains de les voix soutenues sont;

  • Sharon
  • Ella (véritable voix d'enfant)
  • EmilioEnglish (véritable voix d'enfant)
  • Josh (Real child voice)
  • Karen
  • Kenny (artificielle voix d'enfant)
  • Laura
  • Micah
  • Nelly (artificielle voix d'enfant)
  • Rod
  • Ryan
  • Saul
  • Scott (véritable adolescent voix)
  • Tracy
  • ValeriaEnglish (véritable voix d'enfant)
  • Sera
  • WillBadGuy (de l'émotion de la voix)
  • WillFromAfar (de l'émotion de la voix)
  • WillHappy (de l'émotion de la voix)
  • Willlittlecreture (emotive voice)
  • WillOldMan (emotive la voix)
  • WillSad (de l'émotion de la voix)
  • WillUpClose (de l'émotion de la voix)

il prend également en charge plusieurs langues et plus de voix - pour que je vous réfère à leur site web; http://www.acapela-group.com /

4
répondu Rob Quist 2015-12-30 20:08:02
2
répondu Thomas A. Markel 2013-02-28 23:14:49

A partir de maintenant, le service officiel texte-parole de Google est disponible à https://cloud.google.com/text-to-speech/

c'est gratuit pour les 4 Premiers millions de caractères.

2
répondu Phakin 2018-03-28 07:32:05

j'ai utilisé l'url comme ci-dessus: http://translate.google.com/translate_tts?tl=en&q=Hello%20World

et demandé avec la bibliothèque python..cependant, je suis HTTP 403 FORBIDDEN

finalement, j'ai dû me moquer de l'en-tête User-Agent avec le navigateur pour réussir.

1
répondu Yth 2015-04-24 08:55:53

allez à console.developer.google.com connectez-vous et obtenez une clé API ou utilisez L'API de microsoft bing

https://msdn.microsoft.com/en-us/library/?f=255&MSPPError=-2147217396



ou encore mieux utiliser L'API de discours d'AT & T developer.att.com (payé un)

Pour la reconnaissance vocale

Public Class Voice_recognition

    Public Function convertTotext(ByVal path As String, ByVal output As String) As String
        Dim request As HttpWebRequest = DirectCast(HttpWebRequest.Create("https://www.google.com/speech-api/v1/recognize?xjerr=1&client=speech2text&lang=en-US&maxresults=10"), HttpWebRequest)
        'path = Application.StartupPath & "curinputtmp.mp3"
        request.Timeout = 60000
        request.Method = "POST"
        request.KeepAlive = True
        request.ContentType = "audio/x-flac; rate=8000"  
        request.UserAgent = "speech2text"

        Dim fInfo As New FileInfo(path)
        Dim numBytes As Long = fInfo.Length
        Dim data As Byte()

        Using fStream As New FileStream(path, FileMode.Open, FileAccess.Read)
            data = New Byte(CInt(fStream.Length - 1)) {}
            fStream.Read(data, 0, CInt(fStream.Length))
            fStream.Close()
        End Using

        Using wrStream As Stream = request.GetRequestStream()
            wrStream.Write(data, 0, data.Length)
        End Using

        Try
            Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
            Dim resp = response.GetResponseStream()

            If resp IsNot Nothing Then
                Dim sr As New StreamReader(resp)
                MessageBox.Show(sr.ReadToEnd())

                resp.Close()
                resp.Dispose()
            End If
        Catch ex As System.Exception
            MessageBox.Show(ex.Message)
        End Try

        Return 0
    End Function
End Class

et pour le texte à la parole: utilisez cette .

je pense que vous comprendrez cela

si ce n'est pas le cas, utilisez vbscript pour VB/C# converter.

n'a toujours pas alors contactez-Moi.

J'ai déjà fait ça ,Je ne trouve pas le code maintenant que c'est pour ça que je ne te le donne pas directement.

1
répondu IntellectualChestnut 2016-03-20 23:16:29

parce qu'il est venu dans le chat ici , et la première page pour googeling était celui-ci, j'ai décidé de laisser tout sur mes conclusions googling un peu plus XD

vous ne devez vraiment pas aller n'importe quelle longueur plus pour le faire fonctionner simplement se tenir sur les épaules des Géants:

il y a une norme

https://dvcs.w3.org/hg/speech-api/raw-file/tip/webspeechapi.html

et un exemple

http://html5-examples.craic.com/google_chrome_text_to_speech.html

au moins pour vos projets web cela devrait fonctionner (par exemple asp.net)

1
répondu Summer-Sky 2016-10-22 19:23:55
#! /usr/bin/python2
# -*- coding: utf-8 -*-

def run(cmd):
    import os
    import sys
    from subprocess import Popen, PIPE
    print(cmd)
    proc=Popen(cmd, stdin=None, stdout=PIPE, stderr=None, shell=True)
    while True:
        data = proc.stdout.readline()   # Alternatively proc.stdout.read(1024)
        if len(data) == 0:
            print("Finished process")
            break
        sys.stdout.write(data)

import urllib

msg='Hello preety world'
msg=urllib.quote_plus(msg)
# -v verbosity
cmd='curl '+ \
    '--output tts_responsivevoice.mp2 '+ \
    "\""+'https://code.responsivevoice.org/develop/getvoice.php?t='+msg+'&tl=en-US&sv=g2&vn=&pitch=0.5&rate=0.5&vol=1'+"\""+ \
    ' -H '+"\""+'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0'+"\""+ \
    ' -H '+"\""+'Accept: audio/webm,audio/ogg,audio/wav,audio/*;q=0.9,application/ogg;q=0.7,video/*;q=0.6,*/*;q=0.5'+"\""+ \
    ' -H '+"\""+'Accept-Language: pl,en-US;q=0.7,en;q=0.3'+"\""+ \
    ' -H '+"\""+'Range: bytes=0-'+"\""+ \
    ' -H '+"\""+'Referer: http://code.responsivevoice.org/develop/examples/example2.html'+"\""+ \
    ' -H '+"\""+'Cookie: __cfduid=ac862i73b6a61bf50b66713fdb4d9f62c1454856476; _ga=GA1.2.2126195996.1454856480; _gat=1'+"\""+ \
    ' -H '+"\""+'Connection: keep-alive'+"\""+ \
    ''
print('***************************')
print(cmd)
print('***************************')
run(cmd)

ligne:

/getvoice.php?t='+msg+'&tl=en-US&sv=g2&vn=&pitch=0.5&rate=0.5&vol=1'+"\""+ \

est responsable de la langue.

tl=en-US

il y a un autre site intéressant avec des moteurs tts qui peuvent être utilisés de cette manière.

substitut o pour les nuls iv0na.c0m

have a nice day

0
répondu krzywynos 2016-02-07 16:34:58