chrome.ttsEngine

說明

使用 chrome.ttsEngine API,透過擴充功能實作文字轉語音(TTS) 引擎。如果擴充功能使用這個 API 註冊,當任何擴充功能或 Chrome 應用程式使用 tts API 生成語音時,擴充功能就會收到含有待說語音和其他參數的事件。擴充功能接著可以使用任何可用的網頁技術合成及輸出語音,並將事件傳回呼叫函式,以回報狀態。

權限

ttsEngine

總覽

擴充功能可以自行註冊為語音引擎。這樣一來,攔截器就能攔截部分或所有對 tts.speaktts.stop 等函式的呼叫,並提供替代實作方式。擴充功能可免費使用任何可用的網路技術提供語音,包括從伺服器串流音訊、HTML5 音訊。擴充功能甚至可以對語音輸入內容執行其他操作,例如在彈出式視窗中顯示隱藏式輔助字幕,或將語音輸入內容以記錄訊息的形式傳送至遠端伺服器。

資訊清單

如要實作 TTS 引擎,擴充功能必須宣告「ttsEngine」權限,然後在擴充功能資訊清單中宣告提供的所有語音,如下所示:

{
  "name": "My TTS Engine",
  "version": "1.0",
  "permissions": ["ttsEngine"],
  "tts_engine": {
    "voices": [
      {
        "voice_name": "Alice",
        "lang": "en-US",
        "event_types": ["start", "marker", "end"]
      },
      {
        "voice_name": "Pat",
        "lang": "en-US",
        "event_types": ["end"]
      }
    ]
  },
  "background": {
    "page": "background.html",
    "persistent": false
  }
}

擴充功能可以指定任意數量的語音。

voice_name 參數為必填。名稱應含有足以識別語音名稱和所用引擎的描述。萬一有兩個擴充功能註冊了同名的語音,用戶端可以指定應執行合成作業的擴充功能 ID。

lang 參數為選用參數,但我們強烈建議使用。語音幾乎只能合成單一語言的語音。如果引擎支援多種語言,可以輕鬆為每種語言註冊不同的聲音。在極少數情況下,單一語音可以處理多種語言,最簡單的方法是列出兩種不同的語音,並在內部使用相同的邏輯處理。不過,如要建立可處理任何語言語音的聲音,請從擴充功能的資訊清單中省略 lang 參數。

最後,如果引擎可以傳送事件來更新用戶端語音合成進度,則必須提供 event_types 參數。強烈建議至少支援 'end' 事件類型,指出語音何時結束,否則 Chrome 無法排定佇列中的語音。

載入後,擴充功能可以呼叫 chrome.ttsEngine.updateVoices,取代已宣告的語音清單。(請注意,以程式輔助方式呼叫 updateVoices 時使用的參數為駝峰式大小寫,例如 voiceName,與使用 voice_name 的資訊清單檔案不同)。

您可以傳送的事件類型,對應於 speak() 方法接收的事件類型:

  • 'start':引擎已開始朗讀語音。
  • 'word':已達字界。使用 event.charIndex 判斷目前的語音位置。
  • 'sentence':已達句子界線。使用 event.charIndex 判斷目前的語音位置。
  • 'marker':已到達 SSML 標記。使用 event.charIndex 判斷目前的語音位置。
  • 'end':引擎已完成語音輸出。
  • 'error':發生引擎專屬錯誤,無法說出這段話。在 event.errorMessage 中傳遞更多資訊。

語音引擎不會傳送 'interrupted''cancelled' 事件,而是由 Chrome 自動產生。

假設您已註冊語音事件監聽器 (如下所述),文字轉語音用戶端可以呼叫 tts.getVoices,從擴充功能的資訊清單取得語音資訊。

處理語音事件

如要應用戶端要求生成語音,擴充功能必須為 onSpeakonStop 註冊接聽程式,如下所示:

const speakListener = (utterance, options, sendTtsEvent) => {
  sendTtsEvent({type: 'start', charIndex: 0})

  // (start speaking)

  sendTtsEvent({type: 'end', charIndex: utterance.length})
};

const stopListener = () => {
  // (stop all speech)
};

chrome.ttsEngine.onSpeak.addListener(speakListener);
chrome.ttsEngine.onStop.addListener(stopListener);

系統會根據擴充功能是否支援資訊清單中的指定語音參數,以及是否已註冊 onSpeakonStop 的監聽器,決定是否將特定語音要求傳送至擴充功能。換句話說,擴充功能無法接收語音要求,並動態決定是否要處理。

類型

AudioBuffer

Chrome 92 以上版本

包含音訊緩衝區和相關聯資料的參數。

屬性

  • audioBuffer

    ArrayBuffer

    文字轉語音引擎的音訊緩衝區。長度應與 audioStreamOptions.bufferSize 完全相同,並以單聲道形式編碼,取樣率為 audioStreamOptions.sampleRate,且為線性 PCM,32 位元帶正負號的浮點數,也就是 JavaScript 中的 Float32Array 型別。

  • charIndex

    數字 選填

    與這個音訊緩衝區相關聯的字元索引。

  • isLastBuffer

    布林值 選填

    如果這個音訊緩衝區是所說文字的最後一個緩衝區,則為 True。

AudioStreamOptions

Chrome 92 以上版本

包含引擎預期產生的音訊串流格式。

屬性

  • bufferSize

    數字

    音訊緩衝區內的樣本數。

  • sampleRate

    數字

    音訊緩衝區中預期的取樣率。

LanguageInstallStatus

Chrome 132 以上版本

語音的安裝狀態。

列舉

「notInstalled」

「installing」

「installed」

「failed」

LanguageStatus

Chrome 132 以上版本

語言的安裝狀態。

屬性

  • 錯誤

    字串 選填

    安裝失敗的詳細資料。如果語言安裝失敗,則可選擇填入這項資訊。

  • installStatus

    安裝狀態。

  • lang

    字串

    語言字串,格式為語言代碼-地區代碼,地區代碼可省略。例如:en、en-AU、zh-CH。

LanguageUninstallOptions

Chrome 132 以上版本

解除安裝指定語言的選項。

屬性

  • uninstallImmediately

    布林值

    如果 TTS 用戶端希望立即解除安裝語言,則為 True。引擎可能會根據這個參數和要求者資訊,選擇是否或何時解除安裝語言。如果為 false,系統可能會使用其他條件 (例如近期使用情況) 判斷何時解除安裝。

SpeakOptions

Chrome 92 以上版本

指定給 tts.speak() 方法的選項。

屬性

  • 性別

    VoiceGender 選填

    Chrome 92 版起已淘汰

    系統會忽略已淘汰的性別。

    合成語音的性別。

  • lang

    字串 選填

    合成語音時使用的語言,格式為 語言-區域。例如:「en」、「en-US」、「en-GB」、「zh-CN」。

  • 投球

    數字 選填

    說話音調介於 0 到 2 之間,0 為最低,2 為最高。1.0 代表這個聲音的預設音調。

  • 費用

    數字 選填

    相對於這個語音預設速率的說話速率。1.0 是預設語速,通常約為每分鐘 180 到 220 字。2.0 為兩倍速,0.5 為一半的速度。這個值保證介於 0.1 和 10.0 之間 (含頭尾)。如果語音不支援這個完整範圍的速率,請勿傳回錯誤。請改為將速率剪輯到語音支援的範圍。

  • voiceName

    字串 選填

    用於合成的語音名稱。

  • 磁碟區

    數字 選填

    說話音量介於 0 到 1 之間 (含 0 和 1),0 為最低音量,1 為最高音量,預設值為 1.0。

TtsClient

Chrome 131 以上版本

要求狀態的用戶端 ID。

屬性

  • id

    字串

    用戶端發出語言管理要求。如果是擴充功能,這是指專屬擴充功能 ID。如果是 Chrome 功能,這是指功能的人類可讀名稱。

  • 要求者類型。

TtsClientSource

Chrome 131 以上版本

要求者類型。

列舉

「chromefeature」

「extension」

VoiceGender

Chrome 54 以上版本 Chrome 70 以上版本已淘汰

系統會忽略已淘汰的性別。

列舉

「male」

「female」

方法

updateLanguage()

Chrome 132 以上版本
chrome.ttsEngine.updateLanguage(
  status: LanguageStatus,
)
: void

引擎嘗試安裝或解除安裝語言時,會呼叫此方法。也會在回應用戶端的狀態要求時呼叫。安裝或解除安裝語音時,引擎也應呼叫 ttsEngine.updateVoices 註冊語音。

參數

updateVoices()

Chrome 66 以上版本
chrome.ttsEngine.updateVoices(
  voices: TtsVoice[],
)
: void

引擎會呼叫這個方法,更新語音清單。這份清單會覆寫擴充功能資訊清單中宣告的任何語音。

參數

事件

onInstallLanguageRequest

Chrome 131 以上版本
chrome.ttsEngine.onInstallLanguageRequest.addListener(
  callback: function,
)

當 TTS 用戶端要求安裝新語言時觸發。引擎應嘗試下載並安裝語言,然後使用結果呼叫 ttsEngine.updateLanguage。成功後,引擎也應呼叫 ttsEngine.updateVoices,註冊新提供的語音。

參數

  • callback

    函式

    callback 參數如下:

    (requestor: TtsClient, lang: string) => void

onLanguageStatusRequest

Chrome 132 以上版本
chrome.ttsEngine.onLanguageStatusRequest.addListener(
  callback: function,
)

當 TTS 用戶端要求語言的安裝狀態時觸發。

參數

  • callback

    函式

    callback 參數如下:

    (requestor: TtsClient, lang: string) => void

onPause

chrome.ttsEngine.onPause.addListener(
  callback: function,
)

選用:如果引擎支援暫停事件,則應暫停目前正在朗讀的語音 (如有),直到收到繼續或停止事件為止。請注意,停止事件也應清除暫停狀態。

參數

  • callback

    函式

    callback 參數如下:

    () => void

onResume

chrome.ttsEngine.onResume.addListener(
  callback: function,
)

選用:如果引擎支援暫停事件,也應支援繼續事件,以便繼續朗讀目前的語音內容 (如有)。請注意,停止事件也應清除暫停狀態。

參數

  • callback

    函式

    callback 參數如下:

    () => void

onSpeak

chrome.ttsEngine.onSpeak.addListener(
  callback: function,
)

使用者呼叫 tts.speak(),且擴充功能資訊清單中的其中一個語音是第一個符合選項物件的語音時,系統會呼叫這個函式。

參數

  • callback

    函式

    callback 參數如下:

    (utterance: string, options: SpeakOptions, sendTtsEvent: function) => void

    • 話語

      字串

    • 選項
    • sendTtsEvent

      函式

      sendTtsEvent 參數如下:

      (event: tts.TtsEvent) => void

      • 活動

        文字轉語音引擎的事件,指出這段語音的狀態。

onSpeakWithAudioStream

Chrome 92 以上版本
chrome.ttsEngine.onSpeakWithAudioStream.addListener(
  callback: function,
)

當使用者呼叫 tts.speak(),且擴充功能資訊清單中的其中一個語音是第一個符合選項物件的語音時,系統會呼叫這個函式。與 ttsEngine.onSpeak 不同的是,Chrome 提供音訊播放服務,並處理 tts 事件的調度。

參數

  • callback

    函式

    callback 參數如下:

    (utterance: string, options: SpeakOptions, audioStreamOptions: AudioStreamOptions, sendTtsAudio: function, sendError: function) => void

    • 話語

      字串

    • 選項
    • audioStreamOptions
    • sendTtsAudio

      函式

      sendTtsAudio 參數如下:

      (audioBufferParams: AudioBuffer) => void

      • audioBufferParams

        包含音訊緩衝區和相關聯資料的參數。

    • sendError

      函式

      Chrome 94 以上版本

      sendError 參數如下:

      (errorMessage?: string) => void

      • 錯誤訊息

        字串 選填

        描述錯誤的字串。

onStop

chrome.ttsEngine.onStop.addListener(
  callback: function,
)

在對 tts.stop 進行呼叫時觸發,而這個擴充功能可能正在說話。如果擴充功能收到 onStop 的呼叫,且語音已停止,則應不執行任何動作 (不會引發錯誤)。如果語音處於暫停狀態,這項操作應會取消暫停狀態。

參數

  • callback

    函式

    callback 參數如下:

    () => void

onUninstallLanguageRequest

Chrome 132 以上版本
chrome.ttsEngine.onUninstallLanguageRequest.addListener(
  callback: function,
)

當 TTS 用戶端指出不再需要某種語言時,就會觸發這個事件。

參數