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
正如你可能注意到的,我在请求中设置了Referer
和User-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/ --> }); });
外部资源:
您可以使用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>
使用http://www.translate.google.com/translate_tts?tl=zh-CN&q=Hello%20World
请注意www.translate.google.com
我使用上面的url: http : //translate.google.com/translate_tts?tl=en&q=Hello%20World
并要求与python库..但是我得到HTTP 403 FORBIDDEN
最后,我不得不用模拟User-Agent
头与浏览器的成功。
访问console.developer.google.com
login并获取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
祝你今天愉快