Google 文本到语音 API

我想知道如何使用谷歌文本到语音 API 在我的。NET 项目。我认为我需要调用一个网址来使用网络服务,但我的想法是不清楚的。有人能帮忙吗?

171322 次浏览

老答案:

尝试使用这个网址: Http://translate.google.com/translate_tts?tl=en&q=hello%20world 它将自动生成一个 wav 文件,您可以通过任何.net 编程轻松地通过 HTTP 请求获得该文件。

编辑:

哦,谷歌,你认为你可以防止人们使用你的伟大服务与脆弱的 http 头验证。

下面是一个用多种语言获得响应的解决方案(我将尝试添加更多内容) :

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

请注意,这些头是基于@Chris Cirefice 的示例的,如果它们在某个时候停止工作,我将尝试重新创建这段代码运行的条件。所有当前标题的荣誉归于他和神奇的工具是 WireShark。(还要感谢谷歌没有对此进行修补)

您可以使用 Wget: D 下载语音

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

将输出保存到 mp3文件中:

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

好好享受吧!

我使用了上面的 URL: http://translate.google.com/translate_tts?tl=en&q=Hello%20World

并要求与蟒蛇库. . 但我得到 HTTP 403 FORBIDDEN

最后,我不得不用 浏览器是一来模拟 User-Agent头文件以获得成功。

谷歌文本演讲

<!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>

在对 Schahriar SaffarShargh 的回答的更新中,谷歌最近实现了一个“谷歌滥用”功能,使得不可能将任何普通的旧 HTTP GET 发送到一个 URL,比如:

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

之前一切都很顺利。现在,跟随这样的链接,你会看到一个验证码。这也会影响浏览器外的 HTTP GET 请求(比如 cURL) ,因为使用该 URL 会重定向到滥用保护页面(CAPTCHA)。

首先,您必须将查询参数 client添加到请求 URL:

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

谷歌翻译发送 &client=t,所以你也应该。

在发出 HTTP 请求之前,请确保设置了 Referer头:

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

显然,User-Agent头文件也是必需的,但有趣的是,它可以是空白的:

User-Agent:

编辑 : < em > 注意事项 -在一些用户代理上,比如 Android 4.X,习俗User-Agent头是 不是发送,这意味着 Google 将不会为请求提供服务。为了解决这个问题,我只需将 User-Agent设置为一个有效的 User-Agent,例如 stagefright/1.2 (Linux;Android 5.0)。如果 Google 的服务器没有响应,使用 金线鲨调试请求(就像我一样) ,并确保这些头在 GET中设置正确!如果请求失败,Google 会回复 503 Service Unavailable,然后重定向到 CAPTCHA 页面。

这个解决方案有点脆弱; 谷歌完全有可能在未来改变他们处理这些请求的方式,所以最后我建议要求谷歌制作一个 真的 API 端点(免费或付费) ,我们可以使用这个端点而不会因为伪造 HTTP 头而感到肮脏。


编辑2 : 对于那些感兴趣的人,这个 cURL 命令应该可以很好地用英语下载一个 你好的 mp3:

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

正如您可能注意到的,我已经在请求中设置了 RefererUser-Agent头,并将 client=t参数添加到 querystring 中。您可以使用 https代替 http,这是您的选择!


编辑3 : Google 现在需要每个 GET 请求都有一个令牌(在 querystring 中由 tk指出)。下面是修改后的 cURL 命令,它可以正确下载 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

注意 querystring 中的 & tk = 995126.592330; 这是新的标记。我通过按 translate.google.com上的扬声器图标并查看 GET 请求来获得这个令牌。我只是将这个 querystring 参数添加到前面的 cURL 命令中,它就可以工作了。

注意 : 显然,这个解决方案非常脆弱,并且随着 Google 架构师的心血来潮而中断,这些架构师引入了诸如请求所需的令牌之类的新东西。这个标记明天可能不起作用(尽管我会检查并报告) ... ... 关键是,依赖这种方法是不明智的; 相反,人们应该转向商业 TTS 解决方案,尤其是在生产中使用 TTS 的情况下。

有关标记生成的进一步说明以及您可以对此做些什么,请参阅 Boude 的回答


如果此解决方案在将来的任何时候中断,请在此答案上留下评论,以便我们可以尝试找到一个修复!

好吧,Google 已经引入了令牌(参见新 URL 中的 tk 参数) ,而旧的解决方案似乎不起作用。我已经找到了另一种选择——我甚至认为这种选择听起来更好,而且有更多的声音!这个命令并不漂亮,但是很有效。请注意,这只是为了测试目的(我使用它的一个小 domotica 项目) ,并使用真正的版本从无伴奏组,如果你打算使用这个商业。

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

一些支持的声音是:

  • 莎伦
  • 艾拉(真正的孩子的声音)
  • 埃米利奥英语(真正的孩子的声音)
  • 乔什(真正的孩子的声音)
  • 凯伦
  • 肯尼(假孩子的声音)
  • 劳拉
  • 麦卡
  • Nelly (假孩子的声音)
  • 罗德
  • 莱恩
  • 索尔
  • 斯科特(真正的青少年声音)
  • 崔西
  • ValeriaEnglish (真正的孩子的声音)
  • 威尔
  • WillBadGuy (感性的声音)
  • WillFromAfar (动情的声音)
  • 意志快乐(情绪化的声音)
  • WillLittle 生物(情绪化的声音)
  • WillOldMan (动情的声音)
  • WillSad (情绪化的声音)
  • WillUpClose (动情的声音)

它还支持多种语言和更多的声音-为此,我推荐你到他们的网站; http://www.acapela-group.com/

另一种选择是: Responsivevoice.org一个简单的例子 JsFiddle 是 给你

超文本标示语言

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


});

外部资源:

Https://code.responsivevoice.org/responsivevoice.js

扩展了 Chris 的回答。我设法逆向工程令牌生成过程。

请求的令牌基于文本和页面脚本中设置的全局 TKK 变量。它们在 JavaScript 中被散列,因此产生 tk 参数。

在页面脚本的某个地方,你会发现这样的东西:

TKK='403413';

这是新纪元以来的小时数。

文本在以下函数中输入(有些混淆) :

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

我成功地在 我的 GTTS 叉子中将其移植到 python,所以我知道这是可行的。

编辑: 到目前为止,gTTS 使用的令牌生成代码已经移动到 GTTS- 令牌中。

编辑2: Google 改变了 API (大约在2016-05-10) ,这个方法需要一些修改。我正在查。与此同时,将客户改为两个工作似乎是有效的。

编辑3:

这些变化很小,但至少可以说很烦人。TKK 现在有两部分。看起来像 406986.2817744745。如你所见,第一部分保持不变。第二部分是两个看似随机的数的和。这里 \x3d表示 =\x27表示 '。A 和 b 每分钟都在变化。在算法的最后一个步骤中,令牌由第二部分 XORed。

新的令牌生成代码是:

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

当然,我不能再生成有效的 url 了,因为我不知道 a 和 b 是如何生成的。

转到 console.developer.google.com登录并获得一个 API 密钥 或者使用微软 Bing 的 API
https://msdn.microsoft.com/en-us/library/?f=255&MSPPError=-2147217396

或者更好地使用 AT & T 的语音 API developer.att.com(付费的)
语音识别

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

文本转换为演讲: 用这个

我想你会明白的
如果没有使用 vbscript 到 vb/C # 转换器。
还是没有联系我。

我以前做过这个,现在找不到代码了,所以我没有直接给你代码。 < br/>

#! /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)

热线:

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

负责语言。

tl=en-US

还有一个非常有趣的网站与 tts 引擎,可以用这种方式使用。

用 o 代替 null Ivna.com

祝你愉快

因为它出现在这里的聊天,和谷歌的第一页是这一个,我决定让所有在我的发现谷歌一些 XD

你真的不需要再做任何努力,只需要站在巨人的肩膀上:

有一个标准

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

还有一个例子

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

至少对于你的 web 项目来说,这是可行的(例如 asp.net)

到目前为止,谷歌的官方文本到语音服务可以在 https://cloud.google.com/text-to-speech/上获得

前四百万个角色可以免费看。