web-dev-qa-db-ja.com

Google Text-To-Speech API

.NETプロジェクトでGoogle Text-to-Speech APIを使用する方法を知りたい。 Webサービスを使用するにはURLを呼び出す必要があると思いますが、私にとってのアイデアは明確ではありません。誰でも助けることができますか?

70
user1296017

古い答え:

次のURLを使用してみてください: 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というすばらしいツールにあります。 (これにパッチを適用しないことについてもGoogleに感謝します)

Schahriar SaffarShargh's answer のアップデートで、Googleは最近、「Googleの悪用」機能を実装しました。

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

以前はうまく機能していました。さて、このようなリンクをたどると、CAPTCHAが表示されます。また、URLを使用すると不正使用保護ページ(CAPTCHA)にリダイレクトされるため、これはブラウザ外のHTTP GET要求(cURLなど)にも影響します。

開始するには、クエリパラメータ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:

EditNOTE-Android 4.Xなどの一部のユーザーエージェントでは、customUser-Agentヘッダーは送信されません。つまり、Googleはリクエストを処理しません。この問題を解決するには、User-Agentstagefright/1.2 (Linux;Android 5.0)などの有効なものに設定するだけです。 Googleのサーバーが応答しない場合はWiresharkを使用してリクエストをデバッグし、GET!でこれらのヘッダーが適切に設定されていることを確認してください!リクエストが失敗した場合、Googleは503 Service Unavailableで応答し、CAPTCHAページへのリダイレクトが続きます。

このソリューションは少し脆弱です。 Googleがこれらのリクエストの処理方法を将来変更する可能性があるため、最終的にはrealAPIエンドポイント(無料または有料)を作成するようGoogleに依頼することをお勧めします。 HTTPヘッダーを偽造することを汚さずに使用できます。


Edit 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を使用することもできます。


Edit 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コマンドに追加しただけで、機能します。

NOTE:明らかにこの解決策は非常に脆弱であり、建築家の気まぐれで壊れますリクエストに必要なトークンのような新しいものを導入するGoogle。このトークンは明日機能しない可能性があります(ただし、確認して報告します)...要点は、この方法に依存することは賢明ではありません。代わりに、特に本番環境でTTSを使用する場合は、市販のTTSソリューションを使用する必要があります。

トークン生成の詳細と、トークン生成に関してできることについては、 Boude's answer を参照してください。


この解決策が将来中断される場合は、この回答にコメントを残して、修正を見つけられるようにしてください!

46
Chris Cirefice

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のfork で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=を意味し、\x27'を意味します。 aとbは両方ともUTC分ごとに変化します。アルゴリズムの最終ステップの1つで、トークンは2番目の部分でXORされます。

新しいトークン生成コードは次のとおりです。

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をもう生成できません。

17
Boude

追加の代替手段: responsivevoice.org JsFiddleの簡単な例は Here です

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

});

外部リソース:

https://code.responsivevoice.org/responsivevoice.js

12
DMSJax

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
Panchal Deep

よし、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

サポートされている音声の一部は次のとおりです。

  • シャロン
  • エラ(本物の子供の声)
  • EmilioEnglish(本物の子供の声)
  • ジョシュ(本物の子供の声)
  • カレン
  • ケニー(人工的な子供の声)
  • ローラ
  • ミカ
  • ネリー(人工の子供の声)
  • ロッド
  • ライアン
  • ソール
  • スコット(本物のティーンエイジャーの声)
  • トレーシー
  • ValeriaEnglish(本物の子供の声)
  • 意志
  • WillBadGuy(感情的な声)
  • WillFromAfar(感情的な声)
  • WillHappy(感情的な声)
  • WillLittleCreature(感情的な声)
  • WillOldMan(感情的な声)
  • WillSad(感情的な声)
  • WillUpClose(感情的な声)

また、複数の言語とより多くの声をサポートしています-そのために、私はあなたのウェブサイトを参照します; http://www.acapela-group.com/

4
Rob Quist

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

楽しい !!

4
Th3carpenter
4

現在のところ、Googleの公式の音声合成サービスは https://cloud.google.com/text-to-speech/ で利用できます。

最初の400万文字は無料です。

2
Phakin

http://www.translate.google.com/translate_tts?tl=en&q=Hello%20World を使用します

www.translate.google.comに注意してください

2

上記のURLを使用しました: http://translate.google.com/translate_tts?tl=en&q=Hello%20World

pythonライブラリで要求されました。しかし、HTTP 403 FORBIDDENを取得しています

最後に、User-Agentヘッダーを ブラウザの1 でモックする必要がありました。

1
ythdelmar

ここでチャットが行われ、googelingの最初のページはこのページだったので、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)

1
Summer-Sky

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

テキスト読み上げの場合: se this

これがわかると思います
vbscript to 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エンジンを備えたもう1つの興味深いサイトがあります。

null iv0na.c0mの代わりにoを使用

ごきげんよう

0
krzywynos