使用 SSML 的發音

你可以使用語音合成標記語言(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>

自訂詞彙表

你可以透過 phonemesub 元素來定義 SSML 中如何讀取單一實體(例如公司、醫學術語或表情符號)。 要定義多個實體的讀取方式,請建立一個 XML 結構化的自訂詞彙檔案。 接著你上傳自訂的 Lexicon XML 檔案,並用 SSML lexicon 元素來參考它。

關於支援自訂詞彙的地點列表,請參閱 語言支援 表中的腳註。

這個 lexicon 元素不被 Long Audio API 支援。 若要進行長文文字轉語音,請改用 批次合成 API (預覽)。

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 屬性,用來表示詞典中使用的字母表。 可能的值為 ipax-microsoft-sapi
  • 每個lexeme元素至少包含一個grapheme元素,以及一個或多個grapheme元素 、 alias、 。phoneme 在自訂詞典中,元素 lexeme 是以大小寫區分的。 例如,如果你只提供 lexeme 「Hello」的音素,那它就無法用於 lexeme 「hello」。
  • grapheme 元素包含描述 正字法的文字。
  • 這些 alias 元素用來表示縮寫或縮寫詞的發音。
  • phoneme 元素提供描述 lexeme 發音的文字。 音節邊界在國際音標中為 '.'。 使用IPA字母表時,元素 phoneme 不能包含空白。
  • aliasphoneme 元素與 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,然後將該 phonemealias 連結起來。 例如:

<?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-USen-CAfr-FRfr-CAfr-BEfr-CHde-DEde-ATde-CHes-ESja-JPzh-CNzh-HKyue-CNzh-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-asformat 屬性。 只有當format欄位在表格中不是空的,才包含format該屬性。

所有文字轉換語音地區設定都支援 interpret-as 屬性的 charactersspell-out 值。 interpret-as其他屬性值適用於以下語言的所有地區:阿拉伯語、加泰隆尼亞語、中文、丹麥語、荷蘭語、英語、法語、芬蘭語、德語、印地語、義大利語、日語、韓語、挪威語、波蘭語、葡萄牙語、俄語、西班牙語及瑞典語。

interpret-as 格式 詮釋
charactersspell-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」。
cardinalnumber 沒有 文字會以基數朗讀。 語音合成引擎的發音如下:

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.0MathML 3.0 規範中的所有元素均被支援,唯獨 MathML 3.0 基礎數學元素除外。

請注意以下 MathML 元素與屬性:

  • xmlns屬性 in <math xmlns="http://www.w3.org/1998/Math/MathML"> 是可選的。
  • semantics這些 、 annotationannotation-xml 元素不會輸出語音,因此會被忽略。
  • 如果某個元素未被識別,該元素會被忽略,但該元素中的子元素仍會被處理。

XML 語法不支援 MathML 實體,因此你必須使用對應的 Unicode 字元 來表示這些實體,例如, &copy; 實體應該用它的 Unicode 字元 &#x00A9;來表示,否則就會發生錯誤。

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>

下一步