Chuyển từ văn bản ra âm thanh

Chào Ace

Hiện nay mình đang muốn viết 1 phần mềm, mục đích là chuyển 1 đoạn văn bản ra âm thanh, tận dụng cái trình đọc trong google translate (mặc dù trình đọc này nghe rất chán).

Không đặt nặng sử dụng ngôn ngữ gì, mà chủ yếu là vấn đề request đến server gg translate kiểu gì để cho nó trả về file audio.

Mình xin ví dụ thế này, muốn gg translate trả về audio 2 chữ “xin chào” thì url get sẽ theo dạng:
https://translate.google.com/translate_tts?ie=UTF-8&q=xin%20chào&tl=vi&total=1&idx=0&textlen=8&tk=278975.146101&client=t&prev=input
url này mình lấy từ chrome develop tool, đọc luồng request của file audio.

Vấn đề ở đây, là trong mỗi url request sẽ có 1 khóa là tk, như trong url trên thì tk=278975.146101. Và đây là khóa không thể thiếu trong url. Mình hiện nay đang không rõ khóa này lấy kiểu gì, vì đọc code nó rent từ mấy file js loằng ngoằng mãi chả hiểu.

Ace ai đã từng có kinh nghiệm thì giúp mình với. Trân trọng cảm ơn

1 Like

Có google cloud text 2 speech: https://cloud.google.com/text-to-speech/
Miễn phí 4 triệu char mỗi tháng

5 Likes

Tks huy. Mình cũng từng tính đến api này. Tuy nhiên nó chưa support tiếng việt. Hixx

1 Like

Bạn dùng thư xem rồi
https://docs.openfpt.vn/#gi-i-thi-u30

5 Likes

Tks Evil Artist, đúng thứ mình đang tìm =))

2 Likes

Nếu làm app trên Android thì Google Text To Speech hỗ trợ tận răng.
Các nền tảng khác thì chưa thử.
p/s: OpenFPT mình thử cách đây 6 tháng thì chậm như rùa :confused:

3 Likes

Chính xác. Mình chỉ muốn giới thiệu hàng VN cho người VN thôi. Lỡ mai các thủ trưởng có chặn google

2 Likes

Tks songtotnhe, bạn cho mình xin link đến api đấy dc ko.

Vì text to speech của gg mình đọc thì chưa hỗ trợ vietnam. Theo link sau: https://cloud.google.com/text-to-speech/docs/voices

Mặc dù speech to text nó lại có hỗ trợ vietnam

1 Like

Trong Android thì nó có tích hợp sẵn API text to speech (cả speech to text nữa) chứ không cần gọi link gì cả.
Hỗ trợ tiếng Việt luôn. Tốc độ thì siêu nhanh.
https://developer.android.com/reference/android/speech/tts/TextToSpeech

Các nền tảng khác (web, phần mềm desktop) thì mình không biết :sweat_smile:

2 Likes

đâu cần tk key gì đấy đâu nhỉ?
https://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&client=tw-ob&tl=vi&q=tê%20ka%20key%20là%20cái%20gì%20vậy?

4 Likes

Tks Dung
Cách này rất hiệu quả, sáng tỏ ra nhiều vấn đề

trân trọng

2 Likes

[Đào mộ?]
Mấy cái code loằng ngoằng thật ra là code đã được minify lại. Mã tk theo mình đoán là dùng để chống bot, hiện tại mình đã mò ra được hàm tạo mã tk sau mấy tiếng đồng hộ vọc, debug, dùng được cho cả tính năng âm thanh và dịch của Google dịch:

function gen_tk(str){
//Hàm tạo mã tk, str là văn bản đầu vào.
//Nguồn: Hàm ru (ru=function(a)) tại https://translate.google.com/translate/releases/twsfe_w_20200928_RC00/r/js/translate_m_vi.js
    function pu(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
    }
    const tkk = "445065.3487808933" //Rút gọn hết đống code dài nhằng thì được cái này, mấy cái bên dưới xin chịu thua 🏳️ 
    let demical_comp = tkk.split(".");
    let frac_part = Number(demical_comp[0]) || 0;
    let e = [], f = 0
    for (let g = 0; g < str.length; g++) {
        let h = str.charCodeAt(g);
        128 > h ? e[f++] = h : (2048 > h ? e[f++] = h >> 6 | 192 : (55296 == (h & 64512) && g + 1 < str.length && 56320 == (str.charCodeAt(g + 1) & 64512) ? (h = 65536 + ((h & 1023) << 10) + (str.charCodeAt(++g) & 1023),
            e[f++] = h >> 18 | 240,
            e[f++] = h >> 12 & 63 | 128) : e[f++] = h >> 12 | 224,
            e[f++] = h >> 6 & 63 | 128),
            e[f++] = h & 63 | 128)
    }
    str = frac_part;
    for (f = 0; f < e.length; f++)
        str += e[f],
            str = pu(str, "+-a^+6");
    str = pu(str, "+-3^+b+-f");

    str ^= Number(demical_comp[1]) || 0;
    0 > str && (str = (str & 2147483647) + 2147483648);
    str %= 1E6;
    return str.toString() + "." + (str ^ frac_part)
}

Nếu dùng không cẩn thận, bị Google ban cả hệ thống mạng thì mình xin được phép không chịu trách nhiệm :penguin:

3 Likes

Làm gì có tiếng Việt bác ơi

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?