text to speech - tts - Google Text-to-Speech API
google text to speech wavenet (14)
Quiero saber cómo puedo usar Google text to speech API en mi proyecto .net. Creo que necesito llamar a una URL para usar el servicio web, pero la idea para mí no está clara. Alguien puede ayudar
A partir de ahora, el servicio oficial Text-to-Speech de Google está disponible en https://cloud.google.com/text-to-speech/
Es gratis para los primeros 4 millones de caracteres.
Ampliando la respuesta de Chris . Logré realizar ingeniería inversa en el proceso de generación de tokens.
El token para la solicitud se basa en el texto y una variable global TKK establecida en el script de la página. Estos son hash en JavaScript, lo que resulta en el parametro tk.
En algún lugar del script de la página encontrarás algo como esto:
TKK=''403413'';
Esta es la cantidad de horas transcurridas desde la época.
El texto se bombea en la siguiente función (algo desubuscado):
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);
Pude portar esto con éxito a Python en mi fork de gTTS , así que sé que esto funciona.
Editar: ahora el código de generación de tokens utilizado por gTTS se ha movido a gTTS-token .
Editar 2: Google ha cambiado la API (alrededor del 2016-05-10), este método requiere algunas modificaciones. Actualmente estoy trabajando en esto. Mientras tanto, cambiar al cliente a tw-ob parece funcionar.
Editar 3:
Los cambios son menores, pero molestos por decir lo menos. El TKK ahora tiene dos partes. Mirando algo así como 406986.2817744745
. Como puede ver, la primera parte ha permanecido igual. La segunda parte es la suma de dos números aparentemente aleatorios. TKK=eval(''((function(){var a/x3d2680116022;var b/x3d137628723;return 406986+/x27./x27+(a+b)})())'');
Aquí /x3d
significa =
y /x27
es ''
. Tanto ayb cambian cada minuto UTC. En uno de los pasos finales del algoritmo, el token está XORed por la segunda parte.
El nuevo código de generación de tokens es:
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");
Por supuesto, ya no puedo generar una URL válida, ya que no sé cómo se generan a y b.
Debido a que apareció en el chat aquí, y la primera página para Googeling fue esta, decidí dejar todo en mis hallazgos Google un poco más XD
realmente no necesitas ir más lejos para hacerlo funcionar simplemente pararse sobre los hombros de gigantes:
hay un estándar
https://dvcs.w3.org/hg/speech-api/raw-file/tip/webspeechapi.html
y un ejemplo
http://html5-examples.craic.com/google_chrome_text_to_speech.html
al menos para sus proyectos web esto debería funcionar (ej. asp.net)
En una actualización de la respuesta de Schahriar SaffarShargh , Google ha implementado recientemente una función de "abuso de Google", por lo que es imposible enviar cualquier HTTP GET normal antiguo a una URL como:
http://translate.google.com/translate_tts?tl=en&q=Hello%20World
que funcionó bien y dandy previamente. Ahora, siguiendo dicho enlace, se presenta un CAPTCHA. Esto también afecta las solicitudes HTTP GET fuera del navegador (como con cURL), porque el uso de esa URL redirige a la página de protección contra abusos (CAPTCHA).
Para comenzar, debe agregar el client
parámetro de consulta a la URL de solicitud:
http://translate.google.com/translate_tts?tl=en&q=Hello%20World&client=t
Google Translate envía &client=t
, por lo que también debería hacerlo.
Antes de realizar esa solicitud HTTP, asegúrese de configurar el encabezado Referer
:
Referer: http://translate.google.com/
Evidentemente, también se requiere el encabezado User-Agent
, pero curiosamente puede estar en blanco:
User-Agent:
Editar : NOTA : en algunos agentes de usuario, como Android 4.X, el encabezado User-Agent
personalizado no se envía , lo que significa que Google no atenderá la solicitud. Para resolver ese problema, simplemente configuro User-Agent
a uno válido, como stagefright/1.2 (Linux;Android 5.0)
. Use Wireshark para depurar solicitudes (como hice yo) si los servidores de Google no responden, y asegúrese de que estos encabezados se configuren correctamente en el GET
. Google responderá con un 503 Service Unavailable
si la solicitud falla, seguido de un redireccionamiento a la página CAPTCHA.
Esta solución es un poco frágil; Es muy posible que Google cambie la forma en que manejan estas solicitudes en el futuro, por lo que al final sugeriría pedirle a Google que cree un punto final API real (gratuito o pagado) que podamos usar sin ensuciarnos por falsificar encabezados HTTP.
Edición 2 : para los interesados, este comando cURL debería funcionar perfectamente bien para descargar un mp3 de Hello in English:
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
Como habrás notado, he establecido los encabezados de Referer
y User-Agent
en la solicitud, así como también he añadido el parámetro client=t
a la cadena de consulta. ¡Puede usar https
lugar de http
, su elección!
Edición 3 : Google ahora requiere un token para cada solicitud GET (notado por tk
en la cadena de consulta). Debajo está el comando cURL revisado que descargará correctamente un TTS mp3:
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
Observe el & tk = 995126.592330 en la cadena de consulta; este es el nuevo token Obtuve este token presionando el icono de altavoz en translate.google.com
y mirando la solicitud GET. Simplemente agregué este parámetro querystring al comando cURL anterior, y funciona.
NOTA : obviamente, esta solución es muy frágil y se rompe al antojo de los arquitectos de Google que introducen cosas nuevas, como los tokens necesarios para las solicitudes. Es posible que este token no funcione mañana (aunque revisaré e informaré) ... el punto es que no es prudente confiar en este método; en su lugar, se debe recurrir a una solución TTS comercial, especialmente si se usa TTS en producción.
Para una explicación más detallada de la generación de tokens y lo que podrías hacer al respecto, ver la respuesta de Boude .
Si esta solución se rompe en cualquier momento en el futuro, ¡deje un comentario sobre esta respuesta para que podamos intentar encontrar una solución!
Google texto a voz
<!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>
He creado esto como: q = urlencode & tl = nombre de la lengua
Solo prueba esto:
Muy bien, Google ha introducido tokens (ver el parámetro tk en la nueva url) y la solución anterior no parece funcionar. He encontrado una alternativa, ¡que incluso creo que suena mejor y tiene más voces! El comando no es bonito, pero funciona. Tenga en cuenta que esto es solo para fines de prueba (lo uso para un pequeño proyecto domótica) y uso la versión real de acapella-group si planea usarlo comercialmente.
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
Algunas de las voces compatibles son;
- Sharon
- Ella (voz infantil genuina)
- EmilioEnglish (voz infantil genuina)
- Josh (voz genuina de niño)
- Karen
- Kenny (voz infantil artificial)
- Laura
- Micah
- Nelly (voz infantil artificial)
- Barra
- Ryan
- Saúl
- Scott (voz genuina de adolescente)
- Tracy
- ValeriaEnglish (voz infantil genuina)
- Será
- WillBadGuy (voz emotiva)
- WillFromAfar (voz emotiva)
- WillHappy (voz emotiva)
- WillLittleCreature (voz emotiva)
- WillOldMan (voz emotiva)
- WillSad (voz emotiva)
- WillUpClose (voz emotiva)
También es compatible con varios idiomas y más voces, por eso lo remito a su sitio web; http://www.acapela-group.com/
Puede descargar la voz usando Wget: D
wget -q -U Mozilla "http://translate.google.com/translate_tts?tl=en&q=Hello"
Guarde el resultado en un archivo mp3:
wget -q -U Mozilla "http://translate.google.com/translate_tts?tl=en&q=Hello" -O hello.mp3
¡Disfruta!
Respuesta anterior:
Intente utilizar esta URL: http://translate.google.com/translate_tts?tl=en&q=Hello%20World automáticamente un archivo wav que puede obtener fácilmente con una solicitud HTTP a través de cualquier programación .net.
Editar:
Ohh Google, pensaste que podrías evitar que las personas usen tu maravilloso servicio con la débil verificación de encabezado http.
Aquí hay una solución para obtener una respuesta en varios idiomas (intentaré agregar más a medida que avancemos):
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''))
Rizo
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
Tenga en cuenta que los encabezados se basan en el ejemplo de @Chris Cirefice; si dejan de funcionar en algún momento, intentaré recrear las condiciones para que este código funcione. Todos los créditos para los encabezados actuales van a él y la maravillosa herramienta que es WireShark. (también gracias a Google por no parchear esto)
Una alternativa adicional es: responsivevoice.org un ejemplo simple JsFiddle está Here
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/ -->
});
});
Recurso externo:
Use http://www.translate.google.com/translate_tts?tl=en&q=Hello%20World
tenga en cuenta el www.translate.google.com
Utilicé la URL como se indica arriba: http://translate.google.com/translate_tts?tl=en&q=Hello%20World
Y solicité con la biblioteca de Python ... sin embargo, estoy recibiendo HTTP 403 FORBIDDEN
Al final tuve que burlarme del encabezado User-Agent
con el del navegador para tener éxito.
Vaya al inicio de sesión de console.developer.google.com
y obtenga una clave API o use la API de microsoft bing
https://msdn.microsoft.com/en-us/library/?f=255&MSPPError=-2147217396
o mejor aún use el API de discurso de AT & T developer.att.com
(pagó uno)
Para reconocimiento de voz
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
Y para texto a voz: use esto .
Creo que entenderás esto
si no lo hizo, entonces use vbscript para convertidor vb / C #.
aún así no me contactó.
He hecho esto antes, no puedo encontrar el código ahora que esta es la razón por la que no te entrego directamente el código.
#! /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)
Línea:
/getvoice.php?t=''+msg+''&tl=en-US&sv=g2&vn=&pitch=0.5&rate=0.5&vol=1''+"/""+ /
es responsable del lenguaje.
tl=en-US
Hay otro sitio bastante interesante con motores TTS que se pueden usar de esta manera.
sustituto o por null iv0na.c0m
que tengas un buen día