Google Text-To-Speech API

我想知道如何在我的.net项目中使用Google文本到语音API。 我想我需要调用一个URL来使用Web服务,但对我来说这个想法还不清楚。 任何人都可以帮忙

老答案:

尝试使用此url: http : //translate.google.com/translate_tts? tl=en&q=Hello% 20World它会自动生成一个wav文件,您可以通过任何.net编程轻松获得HTTP请求。

编辑:

哦谷歌,你认为你可以防止人们使用你的精彩服务与脆弱的HTTP头validation。

这里有一个解决scheme来获得多种语言的回应(我会尝试添加更多,因为我们去):

的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 

请注意,标题是基于@Chris Cirefice的例子,如果他们停止工作,我会尝试重新创build此代码的function条件。 当前头文件的所有功劳都归功于他和WireShark的精彩工具。 (也感谢谷歌没有修补这个)

在Schahriar SaffarShargh的回答中 ,Google最近实施了一项“Google滥用”function,使得不可能将任何普通的旧HTTP GET发送到URL,例如:

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

以前工作得很好。 现在,通过这样的链接向您提供一个CAPTCHA。 这也会影响浏览器外的HTTP GET请求(比如使用cURL),因为使用该URL可以redirect到滥用防护页面(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:

编辑注意 – 在一些用户代理,如Android 4.X, 自定义 User-Agent标题不发送 ,这意味着谷歌不会服务的请求。 为了解决这个问题,我简单地设置User-Agent为一个有效的,如stagefright/1.2 (Linux;Android 5.0) 。 如果Google的服务器没有响应,使用Wireshark来debugging请求(就像我做的那样),并确保这些头文件在GET正确设置! 如果请求失败,Google会回复503 Service Unavailable ,然后redirect到CAPTCHA页面。

这个解决scheme有点脆弱, Google将完全有可能改变他们将来处理这些请求的方式,所以最后我build议让Google制作一个真正的 API端点(免费或付费),这样我们就可以使用,而不会因为伪造HTTP头而感到肮脏。


编辑2 :对于那些有兴趣,这个cURL命令应该工作得很好,下载一个英文的Hello

 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头,并且在查询string中添加了client=t参数。 您可以使用https而不是http ,您的select!


编辑3 :Google现在需要每个GET请求的标记(在查询string中由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

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

注意 :显然这个解决scheme是非常脆弱的,并且突破了Google的架构师的心血来潮,他们引入了新的东西,比如请求所需的令牌。 这个令牌明天可能不起作用(虽然我会检查并报告回来)…重点是,依靠这种方法是不明智的; 相反,人们应该转向商业TTS解决scheme,尤其是在生产中使用TTS的情况下。

有关令牌生成的更多解释以及您可能能做些什么,请参阅Boude的答案 。


如果这个解决scheme将来有任何问题,请在这个答案上留下评论,这样我们可以尝试find一个解决scheme!

扩大克里斯的答案 。 我设法对令牌生成过程进行反向工程。

该请求的标记是基于页面脚本中设置的文本和全局TKKvariables。 这些在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); 

另一个select是: responsivevoice.org一个简单的例子JsFiddle就在这里

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

外部资源:

responsivevoice.js

您可以使用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 

请享用 !!

好吧,所以Google引入了令牌(参见新的url中的tk参数),旧的解决scheme似乎不起作用。 我发现了另外一个select – 我甚至认为这个select更好听,并且有更多的声音! 该命令不是很漂亮,但它的工作原理。 请注意,这只是为了testing目的(我用它来做一个小domotica项目),并使用acapella-group的真实版本,如果你打算在商业上使用它。

 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 

一些支持的声音是;

  • 沙龙
  • 埃拉(真正的小孩声音)
  • EmilioEnglish(真正的小孩声音)
  • 乔什(真正的孩子的声音)
  • 卡伦
  • 肯尼(人造小孩的声音)
  • 劳拉
  • 米卡
  • 耐莉(人造小孩声音)
  • 竿
  • 瑞安
  • 索尔
  • 斯科特(真正的less年声音)
  • 特雷西
  • ValeriaEnglish(真正的小孩声音)
  • WillBadGuy(情绪化的声音)
  • WillFromAfar(情绪化的声音)
  • WillHappy(情绪化的声音)
  • WillLittleCreature(情绪化的声音)
  • WillOldMan(感情的声音)
  • WillSad(情绪化的声音)
  • WillUpClose(感情的声音)

它也支持多种语言和更多的声音 – 因为我把你引向他们的网站; http://www.acapela-group.com/

Google文本到语音

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

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

并要求与python库..但是我得到HTTP 403 FORBIDDEN

最后,我不得不用模拟User-Agent头与浏览器的成功。

访问console.developer.google.comlogin并获取API密钥或使用Microsoft的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#转换器。
还是没有联系我。

我之前做过这个,现在找不到代码,这就是为什么我不直接得到你的代码。

因为它在这里聊天,而googeling的第一页是这个,所以我决定让我的研究结果googling一些更多的XD

你真的不需要去任何长度,使其工作简单站在巨人的肩膀上:

有一个标准

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

并举例说明

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

至less对于您的Web项目,这应该工作(如asp.net)

 #! /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代替为iv0na.c0m

祝你今天愉快

Interesting Posts