.NET プロジェクトで Google Text-to-Speech API を使用する方法を知りたいです。Web サービスを使用するには URL を呼び出す必要があると思いますが、アイデアが明確ではありません。誰でも助けることができますか?
14 に答える
古い答え:
この URL を使用してみてください: http://translate.google.com/translate_tts?tl=en&q=Hello%20World 任意の .net プログラミングを介して HTTP 要求で簡単に取得できる wav ファイルが自動的に生成されます。
編集:
ああ、Google さん、薄っぺらな 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 に帰属します。(これにパッチを当てないでくれた Google にも感謝します)
Schahriar SaffarShargh の回答の更新で、Google は最近「Google の悪用」機能を実装しました。これにより、通常の古い HTTP GET を次のような URL に送信することができなくなりました。
http://translate.google.com/translate_tts?tl=ja&q=Hello%20World
以前はうまく機能していました。このようなリンクをたどると、CAPTCHA が表示されます。これは、ブラウザー外 (cURL など) の HTTP GET 要求にも影響します。これは、その URL を使用すると、不正使用防止ページ (CAPTCHA) にリダイレクトされるためです。
まず、クエリ パラメータclient
をリクエスト URLに追加する必要があります。
http://translate.google.com/translate_tts?tl=en&q=Hello%20World&client=t
Google 翻訳は を送信&client=t
するので、あなたもそうすべきです。
その HTTP 要求を行う前に、Referer
ヘッダーを設定していることを確認してください。
Referer: http://translate.google.com/
明らかに、User-Agent
ヘッダーも必要ですが、興味深いことに、空白にすることもできます。
User-Agent:
編集:注- Android 4.X などの一部のユーザー エージェントでは、カスタム User-Agent
ヘッダーが送信されません。つまり、Google はリクエストを処理しません。この問題を解決するためにUser-Agent
、 を などの有効なものに設定するだけですstagefright/1.2 (Linux;Android 5.0)
。Google のサーバーが応答しない場合は、 Wiresharkを使用してリクエストをデバッグし (私が行ったように)、これらのヘッダーがGET
! リクエストが失敗した場合、Google は で応答し503 Service Unavailable
、その後に CAPTCHA ページへのリダイレクトが続きます。
このソリューションは少し脆弱です。将来、Google がこれらのリクエストの処理方法を変更する可能性は十分にあります。そのため、最終的には、HTTP ヘッダーを偽造しても汚いと感じることなく使用できる本物のAPI エンドポイント (無料または有料) を作成するよう Google に依頼することをお勧めします。
編集 2 : 興味のある方のために、この cURL コマンドは英語でHelloの 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
お気づきかもしれませんが、リクエストにReferer
とヘッダーの両方を設定し、パラメーターをクエリ文字列に追加しました。の代わりに、お好みで使用できます。User-Agent
client=t
https
http
編集 3 : Google は、GET リクエストごとにトークンを要求するようになりました (tk
クエリ文字列に で示されています)。以下は、TTS mp3 を正しくダウンロードする改訂された cURL コマンドです。
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
クエリ文字列の&tk=995126.592330に注目してください。これが新しいトークンです。このトークンは、スピーカー アイコンを押してtranslate.google.com
GET リクエストを確認することで取得しました。このクエリ文字列パラメーターを前の cURL コマンドに追加しただけで、機能します。
注: 明らかに、このソリューションは非常に脆弱であり、リクエストに必要なトークンなどの新しいものを導入する Google のアーキテクトの気まぐれで壊れます。このトークンは明日は機能しない可能性があります (ただし、確認して報告します)...要点は、この方法に頼るのは賢明ではないということです。代わりに、特に TTS を本番環境で使用している場合は、商用の TTS ソリューションを使用する必要があります。
トークン生成の詳細とそれについてできることについては、Boude's answerを参照してください。
この解決策が将来的に機能しなくなった場合は、この回答にコメントを残してください。解決策を見つけることができます。
Chris' answerを拡張します。トークン生成プロセスをリバース エンジニアリングすることに成功しました。
リクエストのトークンは、ページ スクリプトで設定されたテキストとグローバル 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-tokenに移動されました。
編集 2: Google は API を変更しました (2016 年 5 月 10 日ごろ)。このメソッドにはいくつかの変更が必要です。私は現在これに取り組んでいます。その間、クライアントを tw-ob に変更するとうまくいくようです。
編集3:
変更はマイナーですが、控えめに言っても面倒です。TKK には 2 つの部分があります。のように見え406986.2817744745
ます。ご覧のとおり、最初の部分は同じままです。2 番目の部分は、一見乱数に見える 2 つの合計です。TKK=eval('((function(){var a\x3d2680116022;var b\x3d137628723;return 406986+\x27.\x27+(a+b)})())');
ここではとは\x3d
を意味します。a と b はどちらも UTC 分ごとに変わります。アルゴリズムの最終ステップの 1 つで、トークンは 2 番目の部分によって XOR されます。=
\x27
'
新しいトークン生成コードは次のとおりです。
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");
もちろん、a と b がどのように生成されるかがわからないため、有効な URL を生成することはできません。
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
楽しみ !!
http://www.translate.google.com/translate_tts?tl=en&q=Hello%20Worldを使用
www.translate.google.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)。
上記の URL を使用しました: http://translate.google.com/translate_tts?tl=en&q=Hello%20World
そしてPythonライブラリでリクエストされました..しかし、私は得ていますHTTP 403 FORBIDDEN
結局、成功するには、User-Agent
ヘッダーをブラウザーのヘッダーでモックする必要がありました。
ログインしconsole.developer.google.com
て API キーを取得するか、microsoft 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
テキスト読み上げの場合: this を使用します。
vbscript から vb/C# へのコンバーターを使用しなかった場合は、これを理解できると思います。
それでも私に連絡しませんでした。
私は以前にこれを行ったことがありますが、コードを見つけることができないため、コードを直接提供していません。
#! /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 エンジンを備えた別の非常に興味深いサイトがあります。
null iv0na.c0m を o に置き換えます
ごきげんよう