[Google API] 有靈魂的Google小姐,使用 SSML技術強化Text-to-Speech

什麼是SSML(Speech Synthesis Markup Language)

語音合成標記語言(SSML)可以讓語音生成更有靈魂!它是 XML-formatted標記語法,提供更多生音生成的細節,透過提供關於eg. 暫停的細節,以及應該被審查的首字母縮寫、日期、時間、縮寫或文本的音頻格式,從而允許對音頻響應進行更多客製。

參數介紹

您可以使用 SSML 標記來自訂語音,例如加入停頓點、數字、日期與時間格式設定,以及其他發音指示。完整的標記共有12種,以下

Untitled.png

簡介參數

  1. <break>可以設定延遲若干毫秒,或是尾音變弱

    • 延遲
    • 控制尾音變弱
  2. <say-as> 用來處理數字,看到 “1”

    • 我們可以指定讀作ordinal “First”,而不是One
  3. <sub> 用來處理縮寫的文字發音

    • W3C, 我們要指定唸為”World Wide Web Consortium” 而不是W3C單一字母發音
  4. <prosody> 除全文的pitch設定之外,你還可以針對各別句字、文字的設定pitch

  5. <s> 除了text中的句號之外,可以自已指定句字的範圍

SSML操作

  • 了解一下SSM置入的位置
    我們可以從官方體驗頁面,可以看到標記<break time="400ms"/>
  • 範例的應用是使句尾延遲 400ms,讓語音不要太早到下一個段落,好使聽者有時間思考

Untitled1.png

實作

Step 1. Create synthetic speech from text

  • Token準備:使用當前auth token
    gcloud auth application-default print-access-token

  • 選擇發音的語系voice source,可以參考以下
    https://cloud.google.com/text-to-speech/docs/voices

  • 再來就是最重要的部驟,需要生成一個json檔:synthesize-text.json

    其中JSON-formatted 參數值如下,分成三大塊

    1. input 主要生成語音的文字內容
    2. voice 生成聲音的語言、發音版本、是否使用SSML
    3. audioConfig 聲音編碼的格式

Step 2: Create synthetic speech from SSML

  • 範例 synthesize-ssml.json,採用了以下
    <speak> <s> <emphasis>
    <prosody> <say-as> <break>
  • 讓整體語音聽起真像是真的人說話的感覺,對於英文來說intonation,意思就是可以讓聽眾更清楚你講話的重點
1
{
2
    'input':{
3
        'ssml':'<speak><s>
4
           <emphasis level="moderate">Cloud Text-to-Speech API</emphasis>
5
           allows developers to include natural-sounding
6
           <break strength="x-weak"/>
7
           synthetic human speech as playable audio in their
8
           applications.</s>
9
           <s>The Text-to-Speech API converts text or
10
           <prosody rate="slow">Speech Synthesis Markup Language</prosody>
11
           <say-as interpret-as=\"characters\">SSML</say-as>
12
           input into audio data
13
           like <say-as interpret-as=\"characters\">MP3</say-as> or
14
           <sub alias="linear sixteen">LINEAR16</sub>
15
           <break strength="weak"/>
16
           (the encoding used in
17
           <sub alias="wave">WAV</sub> files).</s></speak>'
18
    },
19
    'voice':{
20
        'languageCode':'en-gb',
21
        'name':'en-GB-Standard-A',
22
        'ssmlGender':'FEMALE'
23
    },
24
    'audioConfig':{
25
        'audioEncoding':'MP3'
26
    }
27
}

執行代碼

1
curl -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
2
  -H "Content-Type: application/json; charset=utf-8" \
3
  -d @synthesize-ssml.json "https://texttospeech.googleapis.com/v1/text:synthesize" \
4
  > synthesize-ssml.txt

運行結果

Untitled2.png

Step 3. python decode

  • 這邊一邊需要decode動作,來把加密的text先解密再轉換成語音
1
python tts_decode.py --input "synthesize-ssml.txt" --output "synthesize-ssml-audio.mp3"
  • index.html
1
<html>
2
  <body>
3
  <h1>Cloud Text-to-Speech Demo</h1>
4
  <p>
5
  Output from synthesizing text:
6
  </p>
7
  <audio controls>
8
    <source src="synthesize-text-audio.mp3" />
9
  </audio>
10
  <p>
11
  Output from synthesizing SSML:
12
  </p>
13
  <audio controls>
14
    <source src="synthesize-ssml-audio.mp3" />
15
  </audio>
16
  </body>
17
</html>

Step 4.語音驗證

  • 最後最出2個檔案,分別是有無使用SSML生成語音,可以比較二種不同的感覺
  • 因為範例把SSML運用得淋淋盡致,使得效果非常的明顯
  • 如果你沒法執行程式,可以直接使用Google官方測試頁面體驗,把Step 2代表直接貼進去

Untitled3.png

References:

  1. WaveNet Wiki
  2. It Speaks! Create Synthetic Speech Using Cloud Text-to-Speech
  3. Google Text-to-Speech