wavenet tts online languages google convert text-to-speech google-text-to-speech

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



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.



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>



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:

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




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