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 à
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)
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!
É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.
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:
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 !!
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>
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 /
utiliser http://www.translate.google.com/translate_tts?tl=en&q=Hello%20World
note www.translate.google.com
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.
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.
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.
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)
j'ai créé ce comme : q= urlencode & tl = nom de la langue
essayez ceci:
#! /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