你可以使用語音合成標記語言(SSML)搭配文字轉語音來指定語音的發音方式。 例如,你可以用 SSML 搭配音素和自訂詞彙來改善發音。 你也可以用 SSML 來定義單字或數學表達式的發音。
請參閱以下章節,了解如何使用 SSML 元素來提升發音。 欲了解更多關於 SSML 語法的資訊,請參閱 SSML 文件結構與事件。
音素元素
該 phoneme 元素用於 SSML 文件中的語音發音。 務必提供人可讀的語音作為備用。
語音字母由電話組成,這些字母由字母、數字或字元組成,有時也會組合起來。 每支電話描述獨特的語音聲音。 音標字母與拉丁字母形成對比,拉丁字母中任何字母可能代表多個語音。 請考量字母「C」在 en-US 中的不同發音,例如「Candy」和「Cease」這兩個字中的「C」,或字母組合「Th」在「Thing」和「Those」這兩個字中的不同發音。
註
關於支援音素的地點列表,請參閱 語言支援 表中的腳註。
phoneme 元素屬性的使用詳情描述於下表中。
| 屬性 | 描述 | 必修或選修 |
|---|---|---|
alphabet |
在合成ph屬性中字串的發音時所使用的音標字母表。 指定字母表的字串必須以小寫字母表示。 以下是你可以指定的可能字母表:字母表僅適用於元素中的 phoneme。 |
可選 |
ph |
包含音素的字串,這些音素會在 phoneme 元素中指定字詞的發音。
每個地點都支援特定的電話組。 參見 SSML 音標。 若指定字串包含未識別的電話,文字轉語音服務會回傳 HTTP 400 錯誤,顯示 SSML 無效。對於 ipa,若要透過在音節前放置重音符號來強調某個音節,您需要標記該字詞的所有音節。 否則,系統會強調此重音符號前方的音節。 對於 sapi,如果你想重音一個音節,就需要在這個音節後加上重音符號,無論該詞的所有音節是否都被標記。 |
必須 |
音素範例
支援的屬性值在 phoneme 元素早已 說明過。 在前兩個例子中,ph="tə.ˈmeɪ.toʊ"或ph="təmeɪˈtoʊ"的值被指定以強調音節meɪ。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-AvaNeural">
<phoneme alphabet="ipa" ph="tə.ˈmeɪ.toʊ"> tomato </phoneme>
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-AvaNeural">
<phoneme alphabet="ipa" ph="təmeɪˈtoʊ"> tomato </phoneme>
</voice>
</speak>
<speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-AvaNeural">
<phoneme alphabet="sapi" ph="iy eh n y uw eh s"> en-US </phoneme>
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-AvaNeural">
<s>His name is Mike <phoneme alphabet="ups" ph="JH AU"> Zhou </phoneme></s>
</voice>
</speak>
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-AvaNeural">
<phoneme alphabet='x-sampa' ph='he."lou'>hello</phoneme>
</voice>
</speak>
自訂詞彙表
你可以透過 phoneme 和 sub 元素來定義 SSML 中如何讀取單一實體(例如公司、醫學術語或表情符號)。 要定義多個實體的讀取方式,請建立一個 XML 結構化的自訂詞彙檔案。 接著你上傳自訂的 Lexicon XML 檔案,並用 SSML lexicon 元素來參考它。
lexicon 元素屬性的使用詳情描述於下表中。
| 屬性 | 描述 | 必修或選修 |
|---|---|---|
uri |
公開可存取的自訂詞彙 XML 檔案的 URI,副檔名為 .xml or .pls 。 建議使用Azure Blob 儲存體,但非強制,GitHub URI及其他公開連結也被支援。 如果你不想讓自訂詞彙公開,可以用 SAS。 欲了解更多關於自訂詞彙檔案的資訊,請參閱發 音詞彙規範(PLS)版本 1.0。 |
必須 |
自訂詞彙範例
支援的屬性值在 lexicon 元素早已 說明過。
發佈自訂詞彙後,你可以從 SSML 參考它。 以下的 SSML 範例參考了一個已上傳至 https://www.example.com/customlexicon.xml的自訂詞彙表。 我們支援來自 Azure Blob 儲存體 的詞彙 URL。 不過,請注意其他公開網址可能不相容。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis"
xmlns:mstts="http://www.w3.org/2001/mstts"
xml:lang="en-US">
<voice name="en-US-AvaNeural">
<lexicon uri="https://www.example.com/customlexicon.xml"/>
BTW, we will be there probably at 8:00 tomorrow morning.
Could you help leave a message to Robert Benigni for me?
</voice>
</speak>
自訂詞彙檔案
要定義多個實體的讀取方式,你可以在自訂的詞彙 XML 檔案中定義它們,副檔名是 .xml 或 .pls 。
註
自訂詞彙檔案是有效的 XML 文件,但不能用作 SSML 文件。
以下是自訂詞彙檔案的一些限制:
- 檔案大小:自訂詞彙檔案大小限制為最大 100 KB。 若檔案大小超過 100 KB 限制,合成請求即告失敗。 你可以把詞彙集拆分成多個詞彙集,如果檔案大小超過 100 KB,可以把它們納入 SSML。
- 語彙快取重新整理:自訂語彙首次載入時,系統會以 URI 作為文字轉換語音的索引鍵來對其進行快取。 同一個 URI 的詞彙表在 15 分鐘內不會重新載入,因此自訂詞彙變更最多需要等 15 分鐘才能生效。
自訂詞彙 XML 檔案所支援的元素與屬性,已在發 音詞彙規範(PLS)版本 1.0 中說明。 以下是一些支援元素與屬性的範例:
- 該
lexicon元素至少包含一個lexeme元素。 Lexicon 包含必要的xml:lang屬性,用以指示應應用於哪個地區。 一個自訂詞彙本來就限制在一個地區,所以如果你套用在不同的地區,就無法使用。 該lexicon元素也有一個alphabet屬性,用來表示詞典中使用的字母表。 可能的值為ipa和x-microsoft-sapi。 - 每個
lexeme元素至少包含一個grapheme元素,以及一個或多個grapheme元素 、alias、 。phoneme在自訂詞典中,元素lexeme是以大小寫區分的。 例如,如果你只提供lexeme「Hello」的音素,那它就無法用於lexeme「hello」。 - 該
grapheme元素包含描述 正字法的文字。 - 這些
alias元素用來表示縮寫或縮寫詞的發音。 - 該
phoneme元素提供描述lexeme發音的文字。 音節邊界在國際音標中為 '.'。 使用IPA字母表時,元素phoneme不能包含空白。 - 當
alias和phoneme元素與grapheme元素相同時,alias具有更高的優先權。
Microsoft 提供一個 驗證工具,用於自訂詞彙,幫助你在自訂詞彙檔案中找到錯誤(附有詳細錯誤訊息)。 建議在將自訂 Lexicon XML 檔案與語音服務一起使用於生產環境之前,先使用此工具。
自訂詞彙檔案範例
以下的 XML 範例(非 SSML)會包含在自訂詞彙 .xml 檔案中。 當你使用這個自訂詞彙時,「BTW」會讀成「順帶一提」。「Benigni」則以提供的國際音標「bɛˈniːnji」讀作。
<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
alphabet="ipa" xml:lang="en-US">
<lexeme>
<grapheme>BTW</grapheme>
<alias>By the way</alias>
</lexeme>
<lexeme>
<grapheme>Benigni</grapheme>
<phoneme>bɛˈniːnji</phoneme>
</lexeme>
<lexeme>
<grapheme>😀</grapheme>
<alias>test emoji</alias>
</lexeme>
</lexicon>
你無法直接用自訂詞彙來設定片語的發音。 如果你需要設定縮寫的發音,首先指定一個 alias,然後將該 phoneme 與 alias 連結起來。 例如:
<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
alphabet="ipa" xml:lang="en-US">
<lexeme>
<grapheme>Scotland MV</grapheme>
<alias>ScotlandMV</alias>
</lexeme>
<lexeme>
<grapheme>ScotlandMV</grapheme>
<phoneme>ˈskɒtlənd.ˈmiːdiəm.weɪv</phoneme>
</lexeme>
</lexicon>
您也可以直接提供預期用於首字母縮略字或縮寫詞的 alias。 例如:
<lexeme>
<grapheme>Scotland MV</grapheme>
<alias>Scotland Media Wave</alias>
</lexeme>
前述自訂詞彙 XML 檔案範例使用 IPA 字母表,也稱為 IPA 電話組。 我們建議您使用國際音標(IPA),因為它是國際標準。 對於某些 IPA 字元,當它們用 Unicode 表示時,是「預組合」和「分解」版本。 自訂詞典僅支援分解後的 Unicode。
語音服務為以下語音地區定義了 sapi 語音集:en-US、en-CA、fr-FR、fr-CA、fr-BE、fr-CH、de-DE、de-AT、de-CH、es-ES、ja-JP、zh-CN、zh-HK、yue-CN 和 zh-TW。 欲了解更多詳細語音服務語音字母表資訊,請參閱 語音服務語音集合。
你可以用自訂詞彙表來使用 x-microsoft-sapi 作為alphabet屬性的值,如這裡示範的:
<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
alphabet="x-microsoft-sapi" xml:lang="en-US">
<lexeme>
<grapheme>BTW</grapheme>
<alias> By the way </alias>
</lexeme>
<lexeme>
<grapheme> Benigni </grapheme>
<phoneme> b eh 1 - n iy - n y iy </phoneme>
</lexeme>
</lexicon>
Say-as 元素
該 say-as 元素表示該元素文本的內容類型,例如編號或日期。 這個元素為語音合成引擎提供如何發音文字的指引。
say-as 元素屬性的使用詳情描述於下表中。
| 屬性 | 描述 | 必修或選修 |
|---|---|---|
interpret-as |
表示元素文本的內容類型。 關於類型的列表,請參見下表。 | 必須 |
format |
提供元素文本格式的具體細節資訊,適用於格式可能模糊的內容類型。 SSML 為使用這些格式的內容類型定義了格式。 請參見下表。 | 可選 |
detail |
指示要講述的細節程度。 例如,這個屬性可能會要求語音合成引擎發音標點符號。 目前沒有定義標準值。detail |
可選 |
以下內容類型支援 interpret-as 和 format 屬性。 只有當format欄位在表格中不是空的,才包含format該屬性。
註
所有文字轉換語音地區設定都支援 interpret-as 屬性的 characters 和 spell-out 值。
interpret-as其他屬性值適用於以下語言的所有地區:阿拉伯語、加泰隆尼亞語、中文、丹麥語、荷蘭語、英語、法語、芬蘭語、德語、印地語、義大利語、日語、韓語、挪威語、波蘭語、葡萄牙語、俄語、西班牙語及瑞典語。
| interpret-as | 格式 | 詮釋 |
|---|---|---|
characters、spell-out |
區分大小寫 | 文字以單字母形式朗讀(拼寫出來)。 語音合成引擎的發音如下:<say-as interpret-as="characters">Test</say-as>念為「T E S T」。 發音: <say-as interpret-as="characters" format="casesensitive">Test</say-as>如同「大寫 T E S T。」 |
alphanumeric |
咒語 | 文字以獨立字母(拼寫)形式朗讀,並適當停頓。 語音合成引擎的發音如下:<say-as interpret-as="alphanumeric" format="spell">ABCDEF</say-as>如同「A B C <暫停> D E F。」 你可以用「-」來指定暫停。 語音合成引擎的發音如下: <say-as interpret-as="alphanumeric" format="spell">AB-CD-EF</say-as>作為「A B <暫停>C D <暫停>E F」。 |
cardinal、number |
沒有 | 文字會以基數朗讀。 語音合成引擎的發音如下:There are <say-as interpret-as="cardinal">10</say-as> options就像「有十個選項。」 |
ordinal |
沒有 | 文本以序數形式朗讀。 語音合成引擎的發音如下:Select the <say-as interpret-as="ordinal">3rd</say-as> option就像「選擇第三個選項」一樣。 |
number_digit |
沒有 | 文字以一連串數字的形式朗讀。 語音合成引擎的發音如下:<say-as interpret-as="number_digit">123456789</say-as>像「1 2 3 4 5 6 7 8 9。」 |
fraction |
沒有 | 文字會以分數朗讀。 語音合成引擎的發音如下:<say-as interpret-as="fraction">3/8</say-as> of an inch作為「three eighths of an inch」。 |
date |
DMY、MDY、YMD、YM、MY、MD、DM、D、M、Y | 文字會以日期朗讀。 屬性 format 指定日期格式(d=日,m=月,y=年份)。 語音合成引擎的發音如下:Today is <say-as interpret-as="date">10-12-2016</say-as>就像「今天是2016年10月12日。」 發音: Today is <say-as interpret-as="date" format="dmy">10-12-2016</say-as>就像「今天是二零一六年十二月十日。」 |
time |
HMS12、HMS24 | 文字會以時間朗讀。
format 屬性會指定時間使用 12 小時制 (hms12) 或 24 小時制 (hms24)。 用冒號分隔代表小時、分鐘和秒的數字。 以下是一些有效的時間範例:12:35、1:14:32、08:15 和 02:50:45。 語音合成引擎的發音如下:The train departs at <say-as interpret-as="time" format="hms12">4:00am</say-as>正如「火車於凌晨四點發車。」 |
duration |
hms、hm、ms | 文字會以持續時間朗讀。 屬性 format 指定時長格式(h=小時,m=分鐘,s=秒)。 語音合成引擎的發音如下:<say-as interpret-as="duration">01:18:30</say-as>「一小時十八分三十秒」 發音: <say-as interpret-as="duration" format="ms">01:18</say-as>作為「one minute and eighteen seconds」。 此標籤僅支援英語和西班牙語。 |
telephone |
沒有 | 文字以電話號碼的形式被語音呈現。 語音合成引擎的發音如下:The number is <say-as interpret-as="telephone">(888) 555-1212</say-as>像是「我的號碼是區碼八八八五五五一二一二。」 |
currency |
沒有 | 文字會以貨幣朗讀。 語音合成引擎的發音如下:<say-as interpret-as="currency">99.9 USD</say-as>作為「ninety-nine US dollars and ninety cents」。 |
unit |
沒有 | 整段文字是作為一個整體來口述的。 語音合成引擎的發音如下:<say-as interpret-as="unit">10 m</say-as>好比說「十公尺」。 |
address |
沒有 | 文字以演說的方式口述。 語音合成引擎的發音如下:I'm at <say-as interpret-as="address">150th CT NE, Redmond, WA</say-as>例如「我現在在華盛頓州雷德蒙德東北150街」。 |
name |
沒有 | 文字會以人名朗讀。 語音合成引擎的發音如下:<say-as interpret-as="name">ED</say-as>如[æd]。 在中文名字中,有些字元出現在姓氏中時發音會不同。 例如,語音合成引擎在下面範例中念「仇」這個字時, <say-as interpret-as="name">仇先生</say-as>應使用[qiú]而不是[chóu]。 |
Say-as 範例
支援的屬性值在 say-as 元素早已 說明過。
語音合成引擎會將下列範例朗讀為「Your first request was for one room on October nineteenth twenty ten with early arrival at twelve thirty five PM」。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-Ava:DragonHDLatestNeural">
<p>
Your <say-as interpret-as="ordinal"> 1st </say-as> request was for <say-as interpret-as="cardinal"> 1 </say-as> room
on <say-as interpret-as="date" format="mdy"> 10/19/2010 </say-as>, with early arrival at <say-as interpret-as="time" format="hms12"> 12:35pm </say-as>.
</p>
</voice>
</speak>
子元素
使用 sub 元素,指出應朗讀 alias 屬性的文字值,而非元素括住的文字。 如此一來,SSML包含口語與書面兩種形式。
sub 元素屬性的使用詳情描述於下表中。
| 屬性 | 描述 | 必修或選修 |
|---|---|---|
alias |
應朗讀的文字值,而非元素括住的文字。 | 必須 |
子範例
支援的屬性值在 sub 元素早已 說明過。
語音合成引擎將以下範例讀作「World Wide Web Consortium」。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">
<voice name="en-US-Ava:DragonHDLatestNeural">
<sub alias="World Wide Web Consortium">W3C</sub>
</voice>
</speak>
閱讀 Markdown 文件
要閱讀 markdown 內容,你可以用 mstts:markdown 元素來包裝 markdown 文字。 TTS 只讀取 markdown 中的文字內容,忽略 markdown 的語法。
例如,以下 SSML 會讀出兩句話:「這是標題」和「這是粗體文字」,且不會讀取 markdown 語法。
<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts' xml:lang='en-US'>
<voice name='en-US-JennyNeural'>
<mstts:markdown># This is headline
And this is a **bold** text
</mstts:markdown>
</voice>
</speak>
支援的 markdown 語法規則
TTS 支援 CommonMark 標準中定義的 Markdown 語法,該標準是廣泛使用的 Markdown 規範。 欲了解更多關於 CommonMark 規範的資訊,請參見 CommonMark。
數學表達式的閱讀
數學表達式有兩種解讀方式:
搭配數學領域元素時,
將純文字數學表達式直接嵌入 SSML,並用
<mstts:prompt domain="Math" />來指定數學領域。請參閱章節: 閱讀純文字數學表達式
包含 MathML 元素
用 MathML 元素表示數學表達式。
請參見章節:用 MathML 閱讀數學表達式
註
目前支援以下地區:de-DE、en-AU、en-GB、en-US、所有英語相關區域、es-ES、es-MX、所有西班牙語相關區域、fr-CA、fr-FR、it-IT、ja-JP、ko-KR、pt-BR和 zh-CN。
閱讀純文字數學表達式
為了實現複雜的數學表達式閱讀,你可以加入 <mstts:prompt domain="Math" /> 元素來啟用數學專屬的發音規則。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
<voice name="en-US-AvaMultilingualNeural">
<mstts:prompt domain="Math" />
x = (-b ± √(b² - 4ac)) / 2a
</voice>
</speak>
預設情況下,數學表達式中不會讀出括號。
如果你想讀出括號,可以在 SSML 裡指定<mstts:mathspeechverbosity level="verbose" />
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
<voice name="en-US-AvaMultilingualNeural">
<mstts:prompt domain="Math" /><mstts:mathspeechverbosity level="verbose" />
x = (-b ± √(b² - 4ac)) / 2a
</voice>
</speak>
如果你想用多語言的語氣讀出表達式,請在 SSML 中指定 lang 元素。
<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="en-US">
<voice name="en-US-AvaMultilingualNeural">
<mstts:prompt domain="Math" />
<lang xml:lang="es-ES">x = (-b ± √(b² - 4ac)) / 2a</lang>
</voice>
</speak>
使用 MathML 閱讀數學表達式
數學標記語言(MathML)是一種符合 XML 標準的標記語言,用以描述數學內容與結構。 語音服務可將 MathML 作為輸入文字,正確發音輸出音訊中的數學符號。
MathML 2.0 與 MathML 3.0 規範中的所有元素均被支援,唯獨 MathML 3.0 基礎數學元素除外。
請注意以下 MathML 元素與屬性:
-
xmlns屬性 in<math xmlns="http://www.w3.org/1998/Math/MathML">是可選的。 -
semantics這些 、annotation和annotation-xml元素不會輸出語音,因此會被忽略。 - 如果某個元素未被識別,該元素會被忽略,但該元素中的子元素仍會被處理。
XML 語法不支援 MathML 實體,因此你必須使用對應的 Unicode 字元 來表示這些實體,例如, © 實體應該用它的 Unicode 字元 ©來表示,否則就會發生錯誤。
MathML 範例
此範例的文字轉語音輸出為「a 平方加 b 平方等於 c 平方」。
<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts' xml:lang='en-US'>
<voice name='en-US-JennyNeural'>
<math xmlns='http://www.w3.org/1998/Math/MathML'>
<msup>
<mi>a</mi>
<mn>2</mn>
</msup>
<mo>+</mo>
<msup>
<mi>b</mi>
<mn>2</mn>
</msup>
<mo>=</mo>
<msup>
<mi>c</mi>
<mn>2</mn>
</msup>
</math>
</voice>
</speak>