文字轉語音最自然接近人聲的機器配音技術 – 用 SSML 語音標記輕鬆為短片配音
相關文章
很多人喜歡做教學影片,不管是記錄還是分享,都是用心良苦且立意良善,但可能是對自己的聲音沒信心,或有語言障礙,或者其他原因?所以就只有用音樂來陪襯,甚至有的連配樂都省了,只見游標在螢幕上跑來跑去,就算多看幾次搞懂了,眼睛也累了...
現在有了微軟的文字轉語音的服務,就可以輕鬆的為短片加上如真人發音般的旁白,不必擔心吃螺絲或唸錯字,不用付薪水也不會罷工,更不必擔心生病或請假,重點是可以免費使用,雖然有字數限制,但對短視頻來說,應該都夠用...
使用合成標記語言 (SSML) 做文字轉換語音,相較於使用純文字,SSML 可微調文字轉換語音輸出的音調、停頓、說話速度、音量等等。也可用於對話或說故事等需要多重配音的場景,讓語音合成更真實自然且靈活,稍懂 HTML 的人應該也不陌生,標籤一樣是成對的出現,有開始標籤,就有結束標籤,最外層一定是
<speak xmlns="https://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xmlns:emo="https://www.w3.org/2009/10/emotionml" version="1.0" xml:lang="en-US"> 因為要用多人配音,所以使用 en-US </speak> xmlns、xmlns:mstts、xmlns:emo 照抄就可以,版本 version 目前是 1.0,xml:lang 是使用地區的語言,臺灣就是 zh-TW,大陸就是 zh-CN,如果想用多語系語音,xml:lang 設定為 en-US,就能使用 SSML 來設定其他地區的語言。voice 的 name 屬性是用來指定配音者的,識別輸出所使用的聲音,參閱完整語言支援
voice 是 SSML 的第二層,放在 speak 裡面,像這樣:
<speak xmlns="https://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xmlns:emo="https://www.w3.org/2009/10/emotionml" version="1.0" xml:lang="en-US"> <voice name="zh-CN-XiaoyiNeural"> zh-CN-XiaoyiNeural 就是配音者為大陸的曉藝 </voice> </speak>
mstts:express-as 用來指定配音者說話時的情境,包括chat = 聊天、customerservice = 客戶服務、narration-professional = 旁白-專業、newscast-casual = 新聞廣播-休閒、newscast-formal = 新聞廣播正式、cheerful = 愉快、empathetic = 善解人意、angry = 生氣的、sad = 傷心、excited = 興奮的、friendly = 友誼賽、terrified = 嚇壞了、shouting = 大喊大叫、unfriendly = 不友好、whispering = 耳語、hopeful = 充滿希望、newscast = 新聞廣播、assistant = 助手、calm = 冷靜的、fearful = 可怕、disgruntled = 不滿、serious = 嚴肅的、gentle = 溫和的、affectionate = 親熱、embarrassed = 尷尬的、depressed = 鬱悶、envious = 羨慕、lyrical = 抒情的、poetry-reading = 讀詩、advertisement-upbeat = 廣告樂觀、Narration-relaxed = 敘述輕鬆、Sports_commentary = 體育評論、Sports_commentary_excited = 體育解說興奮、documentary-narration = 紀錄片-旁白等 35 種。每一個配音者可用的情境不盡相同,詳細可參考這裡
說話時的情境是可以忽略的,如果沒有指定,就會使用預設的情境,mstts 裡還有一個 styledegree 屬性,用來設定風格的強度,可是好像沒什麼差...
使用 mstts:silence type="Leading" 在段落開頭、 type="Tailing" 在段落結尾、 type="Sentenceboundary" 在每個換行之間" 增加靜音,時間由 value="100ms~5000ms"
mstts 必須放在 voice 標籤內,像這樣:
<speak xmlns="https://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xmlns:emo="https://www.w3.org/2009/10/emotionml" version="1.0" xml:lang="en-US"> <voice name="zh-CN-XiaoyiNeural"> <mstts:silence type="Sentenceboundary" value="2000ms"/> <mstts:express-as style="sad"> sad = 傷心的語氣 </mstts:express-as> </voice> </speak>
說話的速度和音調、音量都可以在 prosody 內指定,速度 rate 和音調 pitch 都可以從 -100% 到 100%,速度和音調也是可以忽略的,如果沒有指定,就會使用預設的速度和音調,prosody 裡還有一個 role 屬性,用來讓語音模仿不同的年齡和性別。例如,男性語音可以提高音調並變更語調來模仿女性聲音,但語音名稱不變。
prosody 也是放在 voice 標籤內,像這樣:
<speak xmlns="https://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xmlns:emo="https://www.w3.org/2009/10/emotionml" version="1.0" xml:lang="en-US"> <voice name="zh-CN-XiaoyiNeural"> <prosody rate="-10%" pitch="0%" volume="-50%"> rate="說話速度" pitch="說話音調" volumn="音量" </prosody> <prosody rate="-20%" pitch="50%" volume="+50%"> <mstts:express-as style="sad"> 音量以 0% 為基準,請在百分比之前加上 +(大聲)或 -(小聲) </mstts:express-as> </prosody> </voice> </speak>
如果要移除或改變文字或片語間的停頓時間,可以使用 <break strength="none" /> 自動插入韻律中斷。 而 <break time="?ms" /> 可以改變停頓時間,1000ms = 1秒,不過為了減少 SSML 程式碼佔用最多 1000 字的字數限制,建議還是多用標點符號(,。、?!)代替 break
底下展示一段使用 SSML 文字轉語音的實例,由餘字數限制,因此分開兩次轉換,你可以將這些代碼複製到 Microsoft azure 播放看看,是不是和真人發音一樣...
裡面有些多音字使用了同音字代替,並非錯字喔!
<speak xmlns="https://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xmlns:emo="https://www.w3.org/2009/10/emotionml" version="1.0" xml:lang="zh-TW"> <voice name="zh-CN-XiaoyiNeural"> <prosody rate="-20%" pitch="0%"> 你知道自己屬什麼嗎? 有屬小白兔的,有屬大老虎的!那有屬貓的嗎? 當然沒有,怎麼有屬老鼠的,沒有屬貓的呢? 讓我來告訴你 為什麽吧? 在很久很久以前,有一天,人們說: </prosody> <prosody rate="-20%" pitch="-30%"> ‘我們要選十二種動物作為人的生肖,一年一腫動物。’ </prosody> <prosody rate="-20%" pitch="0%"> 可是天下的動物有多少呀? 要怎麼個選法呢? </prosody> <prosody rate="-20%" pitch="-30%"> 這樣吧,先定好一個日子,這一天,動物們來報名,就選先到的十二腫動物為十二生肖。 </prosody> <prosody rate="-20%" pitch="0%"> 貓和老鼠是鄰居,又是好朋友,它們都想去報名。 貓說: </prosody> </voice> <voice name="zh-CN-YunxiNeural"> <mstts:express-as style="sad"> <prosody rate="-10%" pitch="0%"> ‘咱們得一早起來去報名,可是我愛睡懶較,怎麼辦呢?’ </prosody> </mstts:express-as> </voice> <voice name="zh-CN-XiaoyiNeural"> <prosody rate="0%" pitch="0%"> 老鼠說: </prosody> <prosody rate="10%" pitch="100%"> ‘別著急,你儘管睡你的大較,我一醒來,就去叫你,咱們一塊兒去。’ </prosody> </voice> </speak> <speak xmlns="https://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xmlns:emo="https://www.w3.org/2009/10/emotionml" version="1.0" xml:lang="zh-TW"> <voice name="zh-CN-XiaoyiNeural"> <prosody rate="-20%" pitch="0%"> 貓聽了很高興,說: </prosody> </voice> <voice name="zh-CN-YunxiNeural"> <mstts:express-as style="cheerful"> <prosody rate="-10%" pitch="0%"> ‘你真是我的好朋友,謝謝你了。’ </prosody> </mstts:express-as> </voice> <voice name="zh-CN-XiaoyiNeural"> <prosody rate="-20%" pitch="0%"> 結果到了報名那天早晨,老鼠早就醒來了,可是它光想到自己的事,把好朋友貓的事給忘了。就自己去報名了。 結果,老鼠被選上了。貓呢? 貓因為睡懶較,起床太遲了,等它趕到時,十二腫動物已被選定了。 貓沒有被選上,就生老鼠的氣,怪老鼠沒有叫它,從這以後,貓見了老鼠就要吃它,老鼠就只好拼命地逃。 直到現在還是這樣。 故事說完了,希望你會喜歡, 記得按讚加分享喔! </prosody> </voice> </speak>