pcwu's TIL Notes


TTS API: Text To Speech API

TTS: Text To Speech 就是指將文字轉成語音的服務,也就是大家熟知的 Google 小姐。

以前隨便大家用到高興的 Google Translate TTS API 不知從什麼時候開始突然不能用了。查了一下發現 Google 推出語音轉文字的商品時,也將這個服務包成商品來販賣了。 Microsoft 也有推出相同的商品。

Bing TTS API 簡介

微軟推出的 TTS 服務我覺得發音比 Google 好一點,而且每種語言同時都有男聲/女聲可以選擇,但他提供的語言數量沒有很多,只有十種左右。有興趣可以到 Bing Speech API 官網 試看看。

如果申請帳號的話,可以免費試用,像 TTS API 就是一個月可以發 5000 requests,每次限800個字元。

Bing TTS API 使用

Bing TTS API 弄得很麻煩,要先用 token 向某個 server 簽發一個效期10分鐘的 JWT (JSON Web Token),然後再另外向另一台 server 發出一個請求得到音檔,要塞很多 header 然後 body 也要塞很多資料弄成 SSML 格式。

用 Postman 搞了一陣子一直失敗,乾脆上 Github 查看看有沒有人家的範例,結果查到 Microsoft 的 repo,直接看他 NodeJS 的範例 就會清楚很多。

SSML
var ssml_doc = xmlbuilder.create('speak')
    .att('version', '1.0')
    .att('xml:lang', 'en-us')
    .ele('voice')
    .att('xml:lang', 'en-us')
    .att('xml:gender', 'Female')
    .att('name', 'Microsoft Server Speech Text to Speech Voice (en-US, ZiraRUS)')
    .txt('This is a demo to call Microsoft text to speech service.')
    .end();
JWT Request
request.post({
  url: 'https://api.cognitive.microsoft.com/sts/v1.0/issueToken',
    headers: {
        'Ocp-Apim-Subscription-Key' : apiKey
    }
}, ......
Speech Request
request.post({
    url: 'https://speech.platform.bing.com/synthesize',
    body: ssml_doc.toString(),
    headers: {
        'content-type' : 'application/ssml+xml',
        'X-Microsoft-OutputFormat' : 'riff-16khz-16bit-mono-pcm',
        'Authorization': 'Bearer ' + access_token,
        'X-Search-AppId': '07D3234E49CE426DAA29772419F436CA',
        'X-Search-ClientID': '1ECFAE91408841A480F00935DC390960',
        'User-Agent': 'TTSNodeJS'
    }, ......

Google TTS API

後來回頭查發現 Google TTS API 也不是完全不能用了,在原本的網址最後面加上一個client的欄位 &client=tw-ob 就可以了,但不確定什麼時候會再關掉。

測試:Hello World

http://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&textlen=32&client=tw-ob&q=Hello%20World&tl=en-gb

如果要下載的話

wget -q -U Mozilla -O output.mp3 "http://translate.google.com/translate_tts?ie=UTF-8&total=1&idx=0&textlen=32&client=tw-ob&q=Test&tl=En-gb"

也有人提到如果都不行的話,應該是要加上一個 tk 的欄位,至於 tk 要怎麼計算,這邊有一個 repo 裡面有實作了:

https://github.com/guyrotem/google-translate-server

Reference