text-to-speech - برنامج - text voice apk




Google Text-To-Speech API (10)

أريد أن أعرف كيف يمكنني استخدام نص google في واجهة برمجة تطبيقات الكلام في مشروع .net الخاص بي. أعتقد أنني بحاجة إلى الاتصال بعنوان URL لاستخدام خدمة الويب ، لكن الفكرة بالنسبة لي ليست واضحة. هل أستطيع مساعدتك




التوسيع على جواب كريس . تمكنت من عكس مهندس عملية توليد رمزية.

يستند الرمز المميز للطلب إلى النص ومتغير TKK عام تم تعيينه في البرنامج النصي للصفحة. يتم تجزئتها في جافا سكريبت مما يؤدي إلى المعلمة المعارف التقليدية.

في مكان ما في نص الصفحة ستجد شيئًا كهذا:

TKK='403413';

هذا هو مقدار الساعات التي مرت منذ العهد.

يتم ضخ النص في الوظيفة التالية (deobfuscated إلى حد ما):

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

تمكنت من نقل هذا بنجاح إلى python في شوكي gTTS ، لذلك أعرف أن هذا يعمل.

تعديل: في الوقت الحالي ، تم نقل رمز الجيل المميز المستخدم من قبل gTTS إلى gTTS-token .

تعديل 2: قامت Google بتغيير واجهة برمجة التطبيقات (API في مكان ما حول 2016-05-10) ، تتطلب هذه الطريقة بعض التعديل. أنا أعمل حاليا على هذا. في غضون ذلك ، يبدو أن تغيير العميل إلى tw-ob يعمل.

تحرير 3:

التغييرات طفيفة ، ولكن مزعج على أقل تقدير. لدى TKK الآن جزئين. أبحث عن شيء ما مثل 406986.2817744745 . كما ترون فقد بقي الجزء الأول على حاله. الجزء الثاني هو مجموع اثنين من الأرقام العشوائية. TKK=eval('((function(){var a\x3d2680116022;var b\x3d137628723;return 406986+\x27.\x27+(a+b)})())'); هنا \x3d تعني = و \x27 هي ' . كل من b و b يغيران كل دقيقة UTC. في إحدى الخطوات النهائية في الخوارزمية ، يكون الرمز المميز هو 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.


الجواب القديم:

حاول استخدام عنوان URL هذا: http://translate.google.com/translate_tts?tl=en&q=Hello%20World سيؤدي تلقائيًا إلى إنشاء ملف wav يمكنك الحصول عليه بسهولة من خلال طلب HTTP من خلال أي برنامج .net.

تصحيح:

أوه جوجل ، كنت تعتقد أنه يمكن منع الناس من استخدام الخدمة الرائعة الخاصة بك مع التحقق رأس 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 لعدم تصحيح هذا)


بديل إضافي هو: 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>

مسج

$(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


جوجل النص إلى الكلام

<!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 ، نفّذت Google مؤخرًا ميزة "إساءة استخدام Google" ، مما يجعل من المستحيل إرسال أي HTTP GET قديم إلى عنوان URL مثل:

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

التي عملت على ما يرام ومدهش سابقا. الآن ، بعد هذا الرابط يقدم لك اختبار CAPTCHA. يؤثر هذا أيضًا على طلبات HTTP GET خارج المتصفح (مثل cURL) ، لأن استخدام عنوان URL هذا يعيد التوجيه إلى صفحة الحماية من إساءة الاستخدام (CAPTCHA).

للبدء ، يجب عليك إضافة client معلمة طلب البحث إلى عنوان URL للطلب:

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

يرسل Google Translate &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) . استخدم Wireshark لتصحيح الطلبات (كما فعلت) إذا كانت خوادم Google لا تستجيب ، وتأكد من أن هذه الرؤوس يتم ضبطها بشكل صحيح في GET ! سترد Google 503 Service Unavailable حالة فشل الطلب ، متبوعًا بإعادة توجيه إلى صفحة اختبار CAPTCHA.

هذا الحل هش قليلاً من المحتمل تمامًا أن تغير Google طريقة تعاملها مع هذه الطلبات في المستقبل ، لذلك أقترح في النهاية أن أطلب من Google إنشاء نقطة نهاية API حقيقية (مجانية أو مدفوعة) يمكننا استخدامها دون الشعور بالسوخة لتزييف رؤوس HTTP.

تحرير 2 : للمهتمين ، يجب أن يعمل أمر cURL هذا بشكل جيد لتحميل ملف mp3 من 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 في الطلب ، بالإضافة إلى إضافة المعلمة client=t إلى سلسلة الاستعلام. يمكنك استخدام https بدلاً من http ، اختيارك!

التعديل 3 : تتطلب Google الآن رمزًا مميزًا لكل طلب GET (تمت الإشارة إليه بواسطة tk في سلسلة البحث). فيما يلي أمر cURL الذي تمت مراجعته والذي سيقوم بتنزيل mp3 TTS بشكل صحيح:

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 في querystring؛ هذا هو الرمز الجديد. حصلت على هذا الرمز عن طريق الضغط على رمز مكبر الصوت على translate.google.com والنظر في طلب GET. لقد أضفت ببساطة معلمة querystring هذه إلى أمر cURL السابق ، وهو يعمل.

ملاحظة : من الواضح أن هذا الحل ضعيف للغاية ، وينكسر عند نزوة المهندسين المعماريين في Google الذين يقدمون أشياء جديدة مثل الرموز المميزة للطلبات. قد لا يعمل هذا الرمز غدًا (على الرغم من أنني سأراجعه وأبلغ عنه) ... النقطة هي أنه ليس من الحكمة الاعتماد على هذه الطريقة ؛ بدلا من ذلك ، ينبغي للمرء أن يتحول إلى حل TTS التجارية ، وخاصة إذا كان استخدام TTS في الإنتاج.

لمزيد من التوضيح لجيل الرمز المميز وما يمكنك فعله حيال ذلك ، راجع إجابة Boude .

إذا كان هذا الحل يكسر أي وقت في المستقبل ، يرجى ترك تعليق على هذه الإجابة حتى نتمكن من محاولة إيجاد حل لها!



يمكنك تنزيل الصوت باستخدام 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

استمتع !!


#! /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 التي يمكن استخدامها بهذه الطريقة.

بديلا عن فارغة iv0na.c0m

أتمنى لك نهارا سعيد





google-text-to-speech