Skip to main content

即時語音合成

了解即時語音合成的模型特性、串流呼叫方法和合成效果最佳化方式。

功能介紹

即時語音合成支援分段輸入文字、逐段傳回音訊,適合將大模型產生的文字即時轉換為語音。
  • 多語言與方言:根據目標語言選擇模型和音色,也可透過指令指定方言。參見方言。
  • 表現力控制:透過自然語言指令調整語速、情感等表達,或在文字中插入情感與副語言標籤。參見指令控制和情感與副語言標籤。
  • 自訂音色:透過聲音複製從音訊樣本建立音色,或透過聲音設計使用文字描述建立音色。
  • 精細控制與公式朗讀:使用 SSML 與 LaTeX控制停頓、發音等效果,或將公式轉換為語音。
  • 音訊控制:可調節語速、語調、音量和位元速率,輸出 PCM、WAV、MP3、Opus 等主流音訊格式,最高支援 48 kHz 取樣率。具體取值與支援範圍以對應 API 參數說明為準。
各模型及音色支援的能力有所不同,使用前請核對對應功能的支援範圍。需要透過 HTTP 一次提交完整文字時,請參見非即時語音合成。

開始使用

對延遲和弱網路下音訊傳輸穩定性要求較高的行動應用程式,可使用 AOQ 通訊協定。AOQ 的接入方式,以及 AOQ、WebRTC 和 WebSocket 的差異與模型支援範圍,請參見 Realtime API 概述。
  • Qwen-Audio-TTS(推薦)
  • CosyVoice
以下使用北京地區的 qwen-audio-3.1-tts-flash 和系統音色 longanhuan_v3.1,分段傳送文字並將傳回音訊儲存為 output.mp3。
Python
import os
import dashscope
from dashscope.audio.tts_v2 import SpeechSynthesizer, ResultCallback, AudioFormat

dashscope.api_key = os.environ["DASHSCOPE_API_KEY"]
dashscope.base_websocket_api_url = "wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference"

with open("output.mp3", "wb") as audio:
    class Callback(ResultCallback):
        def on_data(self, data: bytes):
            audio.write(data)

        def on_error(self, message):
            print(f"Synthesis failed: {message}")

    synthesizer = SpeechSynthesizer(
        model="qwen-audio-3.1-tts-flash",
        voice="longanhuan_v3.1",
        format=AudioFormat.MP3_24000HZ_MONO_256KBPS,
        callback=Callback(),
    )
    for text in ["你好,欢迎使用阿里云百炼。", "文本可以分段发送,音频会逐段返回。"]:
        synthesizer.streaming_call(text)
    synthesizer.streaming_complete()

合成效果最佳化

語言與發音

根據需要控制的內容,選擇對應方式:
需求使用方式
指定合成語音的目標語言使用 language_hints 指定整體合成語言,協助模型按目標語言朗讀數字、縮寫和符號,改善小語種合成效果。
修正特定詞語的發音或取代文字使用 hot_fix 為指定詞語標註拼音,或在合成前將詞語取代為目標文字,適合統一修正專有名詞等局部內容。
精細控制停頓、數字讀法或字詞發音使用 SSML 標籤標記需要控制的文字,按標籤設定停頓、讀法和發音等效果。
朗讀數學公式使用 CosyVoice 的 LaTeX 公式朗讀功能,將支援的數學公式轉換為中文語音。
參數適用模型和設定方法請參見 Qwen-Audio-TTS API或 CosyVoice API;SSML 與 LaTeX 的適用模型、音色、介面及用法請參見 SSML 與 LaTeX。
使用 SSML 時,需要一次提交完整的 SSML 文字,再逐段接收音訊,不支援分段輸入。

指令控制

透過 instruction 參數,用自然語言描述語速、情感或說話方式,控制合成語音的表現。
如需建立具有特定性別、年齡或音色特質的新音色,或參考聲音描述的撰寫建議與範例,請參見聲音設計。
  • Qwen-Audio-TTS
  • CosyVoice
qwen-audio-3.1-tts-plus、qwen-audio-3.1-tts-flash、qwen-audio-3.0-tts-plus、qwen-audio-3.0-tts-flash 的系統音色、複製音色和設計音色均支援在合成請求中透過 instruction 設定自然語言指令。例如,將 instruction 設為以下內容,可放慢語速:
请用非常缓慢的语速说话,每个字都慢慢说。

方言

透過方言功能,可將文字合成為河南話、四川話等中文方言語音。方言的選擇方式取決於模型和音色類型。
  • Qwen-Audio-TTS
  • CosyVoice
  • 系統音色:從 Qwen-Audio-TTS 音色清單中選擇支援目標方言的音色。直接支援該方言的音色無需額外設定;支援方言指令的音色使用 instruction 指定。
  • 複製音色:透過 instruction 指定方言,例如 请用河南话表达。。
使用 Qwen3-TTS 時,請從 Qwen3-TTS 音色清單中選擇支援目標方言的音色。

情感與副語言標籤

適用於 qwen-audio-3.1-tts-plus、qwen-audio-3.1-tts-flash、qwen-audio-3.0-tts-plus 和 qwen-audio-3.0-tts-flash。
情感與富語言標籤可控制語音的情感和風格,並在指定位置加入笑聲、嘆息等擬聲效果。將標籤直接寫入待合成文字 text,無需額外參數。

使用範例

以下文字先使用興奮語氣,在指定位置插入笑聲後繼續合成正文:
[excited]今天的天气真不错![laughing]我们一起出去玩吧!
以下文字在第二句切換為興奮語氣:
[serious]请注意安全事项。[excited]好了,现在让我们开始吧!

支援標籤

  • 控制類標籤
  • 副語言標籤
控制類標籤設定後續文字的情感或風格,直到出現下一個控制類標籤;長句被自動切分時,作用範圍以切分後的文字為界。
標籤說明
[sad]悲傷
[amazed]驚嘆
[deep and loud shouting]深沉大聲吶喊
[trembling]顫抖
[angry]憤怒
[excited]興奮
[sarcastic]諷刺
[curious]好奇
[like dracula]吸血鬼語氣
[bored]無聊
[tired]疲倦
[scornful]輕蔑
[shouting]大喊
[asmr]ASMR 輕聲
[panicked]驚慌
[mischievously]調皮
[empathetic]共情
[whispers]低聲耳語
[reluctantly]不情願
[crying]哭泣
[serious]嚴肅
[very slowly]非常緩慢
[very fast]非常快速

應用於生產環境

取消任務

使用 Qwen-Audio-TTS 或 CosyVoice 模型時,如需中斷目前輪次合成,可傳送取消指令。服務端會結束目前任務並傳回 task-finished。
呼叫方式版本要求使用方法
Python SDK1.26.4 及以上版本呼叫 SpeechSynthesizer.streaming_cancel()。
Java SDK2.22.26 及以上版本呼叫 SpeechSynthesizer.streamingCancel()。
WebSocket 原始協議無需 SDK傳送 finish-task 事件,並在 input 中設定 directive=cancel。

WebSocket 連線重用

同一 WebSocket 連線可依序處理多輪合成,各模型系列開啟下一輪的方式如下:
模型系列本輪結束事件開啟下一輪
Qwen-Audio-TTS、CosyVoicetask-finished必須使用新的 task_id 傳送 run-task,再按該系列的流程傳送文字。取消任務後也按此流程重用連線。
使用 Python SDK 呼叫 Qwen-Audio-TTS 或 CosyVoice 時,直接建立的 SpeechSynthesizer 會在任務結束或取消後關閉連線。需要重用連線時,從 SpeechSynthesizerObjectPool 借出物件。
Qwen3-TTSresponse.done在目前工作階段中繼續傳送 input_text_buffer.append。根據工作階段模式,由服務端觸發合成或傳送 input_text_buffer.commit;全部文字傳送完畢後再傳送 session.finish 結束工作階段。
SDK 物件集區設定與完整範例請參見語音合成高並發最佳實務。Qwen3-TTS 的工作階段流程請參見 WebSocket API。 Qwen-Audio-TTS、CosyVoice 任務結束後 60 秒內沒有新任務時,連線會自動中斷。連線已關閉或任務狀態異常時,應重新建立連線。

模型限流

按對應模型的限流規則控制請求頻率和並行數。限流條件、常見錯誤及處理方法請參見限流。

高並發最佳實務

透過物件集區重用合成物件與連線,並按業務需求設定並行、預熱和錯誤處理,具體請參見語音合成高並發最佳實務。

支援模型

  • 新加坡
  • 華北2(北京)
使用該地區的 API Key 和接入網域呼叫以下模型:
  • Qwen-Audio-TTS:qwen-audio-3.1-tts-plus、qwen-audio-3.1-tts-flash、qwen-audio-3.0-tts-plus、qwen-audio-3.0-tts-flash
  • CosyVoice:cosyvoice-v3-plus、cosyvoice-v3-flash
  • Qwen3-TTS:qwen3-tts-flash-realtime
系統音色與試聽分別參見 Qwen-Audio-TTS、CosyVoice和 Qwen3-TTS 音色清單。使用複製或設計音色時,合成模型須與建立音色時指定的目標模型一致。

API 參考

WebSocket 原始協議的完整呼叫範例見以下文件。

常見問題

使用複刻音色產生的音頻無聲音如何排查?

確認 voice 為建立成功的音色 ID,建立音色時的 target_model 與合成時的 model 一致。音色狀態、來源音訊要求及品質建議請參見聲音複刻。

為什麼語音合成的實際時間長度與 WAV 檔案顯示的時間長度不一致?

串流傳回 WAV 時,檔案標頭可能無法反映最終音訊長度。如需準確的時間長度資訊,可將 format 設為 pcm,接收完整音訊後新增包含實際長度的 WAV 檔案標頭。

為什麼音頻無法播放?

請按以下情境逐一排查:
  1. 音頻儲存為完整檔案(如 xx.mp3)的情況
    1. 音頻格式一致性:請求參數中的音頻格式須與檔案尾碼一致(如參數為 wav 則檔案須為 .wav)。
    2. 播放器相容性:確認播放器支援該音訊格式和採樣率。
  2. 流式播放音訊情況
    1. 將音頻流儲存為完整檔案,嘗試用播放器播放。如果檔案無法播放,請參考情境 1 的排查方法。
    2. 如果檔案可正常播放,則問題在流式播放實現。請確認播放器支援流式播放(如 ffmpeg、pyaudio、AudioFormat、MediaSource 等)。

為什麼音頻播放卡頓?

請按以下步驟逐一排查:
  1. 檢查文本發送速度:確保發送間隔合理,避免上段音頻播完後下段文本尚未到達。
  2. 檢查回呼函數效能:
    • 確認回呼函數中無阻塞性商務邏輯。
    • 回調運行在 WebSocket 線程,阻塞會影響資料接收。建議將音頻資料寫入獨立緩衝區,在其他線程中處理。
  3. 檢查網路穩定性:網路波動可能導致音頻傳輸中斷或延遲。

語音合成耗時較長是什麼原因?

分段輸入時,過長的文字傳送間隔會增加合成總時長;首次呼叫還包含 WebSocket 建立連線的開銷。高並行情境下的預熱與耗時統計,請參見語音合成高並發最佳實務。

如何限制 API Key 僅用於語音合成服務(許可權隔離)?

通過建立業務空間並僅授權特定模型,可限制 API Key 的使用範圍。請參見業務空間管理。