AI · AI 音訊
文字轉語音(TTS)是怎麼運作的?什麼是神經網路 TTS?
簡答
文字轉語音(TTS)把文字變成音訊,分三個階段:先將文字正規化(數字、日期、縮寫),再轉成發音,最後生成波形。神經網路 TTS 使用以錄音訓練的網路,節奏和語氣更自然。瀏覽器透過 Web Speech API 提供的語音來自裝置或其廠商,所以手機和電腦上的聽感不同。
開啟文字轉語音TTS 系統的三個階段
- 文字正規化。系統把文字改寫成可以唸出來的字詞。「Dr. Lee paid $25 on 3/4」必須變成類似「Doctor Lee paid twenty-five dollars on March fourth」的樣子(或依地區唸成「the third of April」)。很多念錯的狀況其實出在這一步,而不是聲音本身。
- 語言分析。字詞被轉成音素,也就是一種語言的發音單位,系統再預測重音、斷句和語調。拼法相同但唸法不同的字,例如現在式與過去式的「read」,或有多種讀音的漢字,必須靠上下文才能判斷。
- 波形生成。聲音及其時間點被轉成音訊取樣。較早的系統把錄好的片段拼接起來(拼接式合成),或使用共振峰模型,聽起來很機械。神經網路系統則用網路來預測音訊。
經典的神經網路設計 Tacotron 2 清楚呈現了現代的分工:一個網路把文字對應到梅爾頻譜圖(語音的時間—頻率圖像),第二個網路,也就是聲碼器(vocoder),再把這張圖轉成波形。在作者的聽力測試中,它的得分接近專業錄音。較新的系統常把這些階段合併,或用語言模型風格的網路生成壓縮的音訊 token,因此只需一小段樣本就能複製說話者的聲音。
神經網路 TTS 與瀏覽器的系統語音
網頁不需要自己的模型,就能透過 Web Speech API 發聲。speechSynthesis 物件會用平台提供的其中一種聲音,朗讀一個 SpeechSynthesisUtterance。
| 瀏覽器系統語音(Web Speech API) | 神經網路 TTS 服務或模型 | |
|---|---|---|
| 聲音來源 | 作業系統或瀏覽器廠商;有些在本機,有些在遠端 | 你自己執行的模型,或你呼叫的雲端 API |
| 語音選擇 | 取決於安裝了什麼;Windows、macOS、Android、iOS 各不相同 | 固定的語音目錄、自訂語音,有時可複製聲音 |
| 品質 | 從機械感到相當自然都有,視裝置而定 | 通常很自然,節奏與情緒表現更好 |
| 費用與設定 | 免費、不需金鑰,本機語音可離線使用 | 需要 API 金鑰並依字元數計費,或下載大型模型 |
| 取得音檔 | API 不提供;只會從喇叭播放 | 通常會回傳 MP3、WAV 或類似格式 |
| 聲音複製 | 不支援 | 部分服務支援,並設有同意檢查 |
每個語音都會回報 localService 旗標。規格說明,本機合成器為 true,遠端服務則為 false;遠端語音可能需要網路,也可能增加延遲。
const u = new SpeechSynthesisUtterance("Your order has shipped.");
u.lang = "en-GB";
u.rate = 0.9; // 1 is normal; spec allows 0.1 to 10
u.pitch = 1.0; // 0 to 2, 1 is the voice default
u.volume = 1.0; // 0 to 1
const voices = speechSynthesis.getVoices();
u.voice = voices.find(v => v.lang === "en-GB") || null;
speechSynthesis.speak(u);語音常常在頁面啟動之後才載入,所以 getVoices() 一開始可能回傳空清單;請監聽 voiceschanged 事件。例如 cv.cm 的文字轉語音工具,用的就是這些內建語音,並提供語速和音調控制。它適合快速試聽草稿,而不是神經網路語音生成器,且語音清單取決於你的裝置。
SSML:控制停頓與發音
語音合成標記語言(SSML)是 W3C 標準,是一種告訴 TTS 引擎如何朗讀文字的 XML。大多數雲端 TTS 服務都接受它。Web Speech 規格允許在發話內容中使用 SSML,但不支援某些標籤的引擎必須移除標籤、只讀剩下的文字,因此瀏覽器的支援並不一致。
<speak>
Your code is <say-as interpret-as="characters">A7K</say-as>.
<break time="500ms"/>
Please call <sub alias="World Health Organization">WHO</sub>
before <prosody rate="90%" pitch="+2st">Friday at noon</prosody>.
The word is <phoneme alphabet="ipa" ph="təˈmɑːtoʊ">tomato</phoneme>,
and it is <emphasis level="strong">not</emphasis> optional.
</speak>| 元素 | 作用 | 範例值 |
|---|---|---|
| break | 插入停頓 | time 250ms 或 2s;strength 從 weak 到 x-strong |
| prosody | 改變語速、音調、音量 | rate 90% 或 slow;pitch +2st 或 high;volume +6dB 或 soft |
| emphasis | 強調一個字 | level 為 strong、moderate、reduced |
| say-as | 當作字元、日期或數字來唸 | interpret-as 的值依引擎而定 |
| sub | 唸出別名而不是書寫的文字 | WHO 唸成 World Health Organization |
| phoneme | 指定精確發音 | alphabet 為 ipa;支援是選配 |
| voice、lang | 在文字中途切換語音或語言 | 英文句子中引用的外語片名 |
如果服務忽略 SSML,你仍然可以用純文字來引導:用逗號和句號製造停頓、把數字寫成文字,以及用近似音拼寫難唸的名字。
寫出唸起來好聽的文字
- 使用短句。長句會讓聲音找不到自然的換氣點。
- 在重要時,把數字寫成該唸的方式:「兩千零二十六」或「二〇二六」。
- 展開聽眾需要聽到的縮寫與單位:「km/h」可能被逐字母唸出來。
- 設定正確的語言與地區。用 en-US 語音唸西班牙語人名,或用 zh-CN 語音唸英文,都會用錯發音系統。
- 發布前把完整成果聽一遍,檢查人名、數字和有兩種讀音的字。
聲音複製:同意與法律
現代模型只要一小段錄音,就能模仿一個人的聲音。這對於替自己的影片配音,或把聲音還給失去聲音的人很有用,但也被用於詐騙,例如模仿親人或公司董事的來電。請把任何聲音都視為屬於說話者本人的個人資料。
| 地區 | 規定摘要 | 狀態 |
|---|---|---|
| 中國大陸 | 對人臉、人聲等進行編輯的服務,必須提示使用者告知被編輯的個人並取得其單獨同意(《互聯網信息服務深度合成管理規定》第 14 條)。可能造成誤導的合成人聲與仿聲,必須作顯著標識(第 17 條)。2025 年的標識辦法另增顯式標識與中繼資料標識,並禁止移除。 | 2023-01-10 起施行;標識辦法自 2025-09-01 起施行 |
| 歐盟 | 歐盟《人工智慧法》第 50 條:提供者必須以機器可讀的方式標記合成音訊,發布深偽音訊或影片的人必須揭露其為人工生成。個人資料規範同樣適用於聲音錄音。 | 依第 113 條自 2026 年 8 月 2 日起適用;請留意後續修正 |
| 美國 | 撰文時沒有統一的聯邦聲音複製法。保護來自各州的肖像權(right of publicity)與隱私法,以及現行的詐欺與消費者保護規範。 | 各州不同 |
信譽良好的聲音複製服務,會在建立聲音之前要求說話者錄一段同意聲明。如果某個工具讓你不經任何檢查,就能從任何片段複製任何人的聲音,請不要把它用在要公開發布的內容上。
常見問題
為什麼同一個網頁在手機和筆電上聽起來不一樣?
Web Speech API 使用每台裝置上安裝的語音,或其廠商提供的語音。Windows、macOS、Android 和 iOS 內建的語音各不相同,所以同樣的程式碼會產生不同的聲音。
可以從 Web Speech API 下載 MP3 嗎?
無法直接下載。這個 API 只會透過喇叭播放語音,不會回傳音訊資料。要取得檔案,你需要能輸出音訊的 TTS 服務或模型,或使用螢幕或音訊錄製軟體。
複製名人的聲音合法嗎?
在多數地方,未經許可就把知名人物的聲音用於廣告、產品或可能誤導聽眾的內容,會因肖像權、隱私、消費者保護或深度合成規範而產生法律風險。請先取得許可,並標示成果。
TTS 和聲音轉換有什麼差別?
TTS 是從文字產生語音。聲音轉換則是拿一個人說話的錄音,改成另一個人的聲音,同時保留原本的節奏與情緒。
為什麼 TTS 會唸錯人名?
模型是根據拼寫和訓練資料來猜發音。罕見的人名、外來語和有多種讀音的字,常常猜錯。請使用 SSML 的 phoneme 或 sub 標籤,或用近似音重新拼寫人名。