API do Google Text-To-Speech

quero saber como posso usar o google text para a API de fala no meu Projecto.Net. Eu acho que eu preciso chamar um URL para usar o serviço web, mas a idéia para mim não é clara. alguém pode ajudar?

Author: A_Di-Matteo, 2012-03-27

14 answers

Resposta antiga:

tente usar este URL: http://translate.google.com/translate_tts?tl=en&q=Hello%20World Ele irá gerar automaticamente um arquivo wav que você pode facilmente obter com um pedido HTTP através de qualquer programação.net.

Editar:

Ohh Google, você pensou que poderia impedir as pessoas de usar o seu maravilhoso serviço com verificação de cabeçalho http frágil.

Aqui está uma solução para obter uma resposta em várias línguas (vou tentar adicionar mais à medida que avançamos.

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'))

Curva

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

Note que os cabeçalhos são baseados no exemplo de @Chris Cirefice, se eles deixarem de trabalhar em algum momento tentarei recriar as condições para que este código funcione. Todos os créditos para os cabeçalhos atuais vão para ele e a ferramenta maravilhosa que é WireShark. (também graças ao Google por não corrigir isso)

 58
Author: Schahriar SaffarShargh, 2017-10-28 08:24:52

Numa actualização para a resposta de Schahriar SaffarShargh , O Google implementou recentemente uma funcionalidade de 'abuso do Google', tornando impossível enviar qualquer HTTP normal e antigo para um URL como:

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

Que funcionou muito bem anteriormente. Agora, seguindo tal link apresenta - lhe um CAPTCHA. Isso também afeta HTTP GET requisições fora do navegador (como com cURL), porque usando essa URL dá um redirecionamento para a página de proteção contra abusos (CAPTCHA).

Para iniciar, tem de adicionar o parâmetro da consulta client ao URL do pedido:

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

O Google Translate envia &client=t, por isso você também deve.

Antes de fazer esse pedido de HTTP, certifique - se que definiu o cabeçalho Referer:

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

Evidentemente, o cabeçalho User-Agent também é necessário, mas curiosamente o suficiente pode estar em branco:

User-Agent:

Editar : nota - em alguns user-agents, tais como Android 4.X, O personalizado User-Agent header is not sent , meaning that Google will not service the request. A fim de resolver esse problema, eu simplesmente configuro o User-Agent para um válido, como stagefright/1.2 (Linux;Android 5.0). Use Wireshark para depurar pedidos (como eu fiz) Se os servidores do Google não estão a responder, e certifique-se de que estes cabeçalhos estão a ser configurados correctamente no GET! O Google responderá com um 503 Service Unavailable se o pedido falhar, seguido por um redirecionamento para a página CAPTCHA.

Esta solução é um pouco frágil; é inteiramente possível que o Google altere a forma como eles lidam com estes pedidos no futuro, por isso, no final, eu sugeriria pedir ao Google para fazer um real API endpoint (gratuito ou pago) que podemos usar sem nos sentirmos Sujos para falsificar cabeçalhos HTTP.


Edit 2 : para os interessados, este comando cURL deve funcionar perfeitamente para obter um mp3 de Hello em Inglês:

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 você pode notar, eu defini tanto os cabeçalhos Referer e User-Agent no pedido, bem como adicionei o parâmetro client=t para o querystring. Você pode usar https em vez de http, sua escolha!


Edit 3 : O Google necessita agora de um token para cada pedido de obtenção (anotado por tk no querystring). Abaixo está o comando cURL revisto que irá obter correctamente um 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

Notice the &tk=995126.592330 in the querystring; este é o novo símbolo. Eu obtive este token pressionando o ícone do altifalante em translate.google.com e olhando para o pedido do GET. Eu simplesmente adicionei este parâmetro de querystring ao comando cURL anterior, e ele funciona.

nota: obviamente, esta solução é muito frágil, e quebra por capricho dos arquitetos do Google que introduzem coisas novas como fichas necessárias para os pedidos. Este símbolo pode não funcionar amanhã (embora eu vou verificar e informar de volta)... ponto is, it is not wise to rely on this method; instead, one should turn to a commercial TTS solution, especially if using TTS in production.

Para mais explicações sobre a geração token e o que você poderia ser capaz de fazer sobre isso, veja a resposta de Boude.


Se esta solução quebra a qualquer momento no futuro, por favor, deixe um comentário sobre esta resposta para que possamos tentar encontrar uma solução para ele!

 46
Author: Chris Cirefice, 2017-05-23 12:03:05

A expandir a resposta do Chris. Consegui reverter o processo de geração de token.

O token para o pedido é baseado no texto e numa variável global TKK definida no script da página. Estes são hashed em JavaScript, resultando assim no TK param.

Em algum lugar no script da página você vai encontrar algo assim:

TKK='403413';

Esta é a quantidade de horas passadas desde a época.

O texto é bombeado do seguinte modo: função (algo desobfuscada):

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

eu consegui portá-lo com sucesso para python em meu garfo de gTTS, Então eu sei que isso funciona.

Editar: até agora o código de geração do token usado pelo gTTS foi movido para gtts-token.

Edit 2: o Google alterou a API (algures por volta de 2016-05-10), este método requer alguma modificação. Estou a trabalhar nisto. entretanto mudar o cliente para TW-ob parece funcionar.

Editar 3:

As mudanças são menores, mas no mínimo aborrecidas. O TKK tem agora duas partes. Algo parecido com ... Como podem ver, a primeira parte permaneceu a mesma. A segunda parte é a soma de dois números aparentemente aleatórios. TKK=eval('((function(){var a\x3d2680116022;var b\x3d137628723;return 406986+\x27.\x27+(a+b)})())'); Aqui \x3d significa = e \x27 é '. Tanto a como b mudam a cada minuto UTC. Em um dos passos finais no algoritmo o token é representado pela segunda parte.

O novo o código de geração do token é:

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");

Claro que não posso gerar mais uma url válida, já que não sei como a e b são gerados.

 17
Author: Boude, 2017-05-23 12:26:08

Uma alternativa adicional é: responsivevoice.org um exemplo simples de JsFiddle é aqui

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

 12
Author: DMSJax, 2016-01-08 05:02:23

Pode obter a voz usando o Wget: D

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

Gravar o resultado num ficheiro mp3:

wget -q -U Mozilla "http://translate.google.com/translate_tts?tl=en&q=Hello" -O hello.mp3
Divirtam-se !!
 4
Author: 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
Author: Panchal Deep, 2015-04-28 04:24:32

Tudo bem, então o Google introduziu tokens (veja o parâmetro tk no novo url) e a solução antiga não parece funcionar. Eu encontrei uma alternativa-que eu até acho que é melhor-soando, e tem mais vozes! O comando não é bonito, mas funciona. Por favor, note que isto é apenas para fins de teste (eu uso-o para um pequeno projeto domotica) e usar a versão real do acapella-group se você está planejando usar isso 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
Algumas das vozes apoiadas are;
  • Sharon
  • Ella (voz de criança genuína) EmilioEnglish (voz de criança genuína) Josh (voz de criança genuína)
  • Karen
  • Kenny (voz infantil artificial) Laura
  • Micah
  • Nelly (voz artificial de criança)
  • Rod
  • Ryan
  • Saul
  • Scott (voz de adolescente genuína) Tracy ... ValeriaEnglish (voz de criança genuína)
  • Will
  • WillBadGuy (emotivo voz)
  • WillFromAfar (voz emotiva)
  • WillHappy (voz emotiva)
  • WillLittleCreature (voz emotiva)
  • WillOldMan (voz emotiva)
  • WillSad (voz emotiva)
  • WillUpClose (voz emotiva)

Ele também suporta várias línguas e mais vozes-para isso, eu remeto para o site deles; http://www.acapela-group.com/

 4
Author: Rob Quist, 2015-12-30 20:08:02

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

Note o seguinte: www.translate.google.com

 2
Author: Thomas A. Markel, 2013-02-28 23:14:49
A partir de agora, o serviço oficial de texto-para-voz do Google está disponível em https://cloud.google.com/text-to-speech/ É grátis para os primeiros 4 milhões de caracteres.
 2
Author: Phakin, 2018-03-28 07:32:05

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

E solicitado na biblioteca python..seja como for HTTP 403 FORBIDDEN

No final eu tive que zombar do cabeçalho User-Agent com o navegador um para ter sucesso.

 1
Author: Yth, 2015-04-24 08:55:53

Vá ao login console.developer.google.com e obtenha uma chave de API ou usar a API da microsoft bing
https://msdn.microsoft.com/en-us/library/?f=255&MSPPError=-2147217396

ou ainda melhor utilização na API de fala da&T developer.att.com(paga uma)
Para reconhecimento 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

E para texto para fala: usa isto .

Acho que vais entender isto. if didn't then use vbscript to vb/C# converter.
ainda não me contactou. Já fiz isto antes, não consigo encontrar o código agora que é por isso que não te estou a dar directamente o código. codigo.
 1
Author: IntellectualChestnut, 2016-03-20 23:16:29
Porque surgiu aqui no chat, e a primeira página para o Google foi esta, decidi contar tudo sobre as minhas descobertas no Google a pesquisar mais XD. Você realmente não precisa ir mais longe para fazê-lo funcionar simplesmente ficar sobre os ombros de gigantes: {[[2]}

Existe um padrão

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

E um exemplo

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

Pelo menos para os seus projectos web isto deve funcionar (ex. asp.net)

 1
Author: 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)

Linha:

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

É responsável pela linguagem.

tl=en-US
Há outro site interessante com motores tts que pode ser usado desta forma.

Substituir o por null iv0na.c0m

Tem um bom dia.
 0
Author: krzywynos, 2016-02-07 16:34:58