通過DashScope Java SDK進行CosyVoice語音合成。
介面地址
SDK的介面地址需在初始化前設定為下方地址(包含WorkspaceId)。如需切換到其他地區,請修改 Constants.baseWebsocketApiUrl為對應地區的URL。
- 新加坡
- 華北2(北京)
wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inference調用時請將{WorkspaceId}替換為真實的Workspace ID。SpeechSynthesizer
包路徑:com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer
構造方法
param:語音合成參數,通過SpeechSynthesisParam .builder()構建callback:回呼函數,用於流式調用。非流式調用時傳入null
call() - 非流式/單向流式合成
方法簽名:
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
text | String | 是 | 待合成的文本,長度不得超過20000字元。 |
ByteBuffer 或 null。非流式調用時返回完整音頻資料;單向流式調用時音頻通過回調返回,此方法返回null。
streamingCall() - 雙向流式合成
方法簽名:
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
text | String | 是 | 待合成的文本,長度不得超過20000字元。可多次調用追加文本。 |
streamingComplete() - 結束雙向流式調用
方法簽名:
streamingCancel() - 取消雙向流式調用
方法簽名:
SpeechSynthesizer 執行個體。
callAsFlowable() - 單向流式合成(響應式)
方法簽名:
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
text | String | 是 | 待合成的文本。 |
Flowable< SpeechSynthesisResult > 響應式流。
streamingCallAsFlowable() - 雙向流式合成(響應式)
方法簽名:
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
textStream | Flowable<String> | 是 | 文本的響應式流。 |
Flowable< SpeechSynthesisResult > 響應式流。
getDuplexApi().close() - 關閉WebSocket串連
方法簽名:
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
code | int | 是 | 關閉碼。 |
reason | String | 是 | 關閉原因。 |
boolean,是否成功關閉。
getLastRequestId() - 擷取請求ID
方法簽名:
String,請求ID。
getFirstPackageDelay() - 擷取首包延遲
方法簽名:
long,首包延遲(ms),從發送第一包到收到首包結果。
SpeechSynthesisParam
包路徑:com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam
樣本:
Builder 方法
| 方法 | 參數類型 | 必填 | 說明 |
|---|---|---|---|
model(String) | String | 是 | 模型名稱。 |
voice(String) | String | 是 | 語音合成所使用的音色。
|
format(SpeechSynthesisAudioFormat) | enum | 否 | 音頻編碼格式及採樣率。預設值:SpeechSynthesisAudioFormat.MP3_22050HZ_MONO_256KBPS。SpeechSynthesisAudioFormat包路徑:com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisAudioFormat。 |
volume(int) | int | 否 | 音量。預設值:50。取值範圍:[0, 100]。 |
speechRate(float) | float | 否 | 語速。預設值:1.0。取值範圍:[0.5, 2.0]。 |
pitchRate(float) | float | 否 | 音調。預設值:1.0。取值範圍:[0.5, 2.0]。 |
enableWordTimestamp(boolean) | boolean | 否 | 是否開啟字層級時間戳記。預設值:false。僅在流式輸出模式下可用。支援的音色範圍:cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2模型的複刻音色,以及CosyVoice音色列表中標記為支援的系統音色。其他模型的複刻音色不支援此功能。 |
seed(int) | int | 否 | 產生時使用的隨機數種子,使合成的效果產生變化。在模型版本、文本、音色及其他參數均相同的前提下,使用相同的seed可複現相同的合成結果。預設值0。取值範圍:[0, 65535]。SDK版本低於2.21.7時,seed需要通過擴充參數進行設定。 |
languageHints(List<String>) | List<String> | 否 | 指定語音合成的目標語言,提升合成效果。當數字、縮寫、符號等朗讀方式或者小語種合成效果不符合預期時使用,例如:
取值範圍
|
instruction(String) | String | 否 | 設定指令,用於控制方言、情感或角色等合成效果。使用說明請參見指令控制。 |
hotFix(ParamHotFix) | ParamHotFix | 否 | 文本熱修複配置,用於自訂指定詞語的發音或對待合成文本進行替換。 cosyvoice-v2不支援該功能。
|
parameter(String key, Object value) | String, Object | 否 | 設定擴充參數。 |
parameters(Map<String, Object>) | Map | 否 | 設定擴充參數。 |
擴充參數
通過 parameter() 或 parameters() 設定。
樣本:
| 參數名 | 類型 | 必填 | 說明 |
|---|---|---|---|
bit_rate | integer | 否 | 音頻碼率(kbps)。音頻格式為mp3或opus時,支援通過bit_rate參數調整碼率。預設值:32。取值範圍:[6, 510]。 |
enable_aigc_tag | boolean | 否 | 是否在產生的音頻中添加AIGC隱性標識。設定為true時,會將隱性標識嵌入到支援格式(wav/mp3/opus)的音頻中。預設值:false。 僅cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2支援該功能。 |
aigc_propagator | String | 否 | 設定AIGC隱性標識中的 ContentPropagator 欄位,用於標識內容的傳播者。僅在 enable_aigc_tag 為 true 時生效。預設值:阿里雲UID。僅cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2支援該功能。 |
aigc_propagate_id | String | 否 | 設定AIGC隱性標識中的 PropagateID 欄位,用於唯一標識一次具體的傳播行為。僅在 enable_aigc_tag 為 true 時生效。預設值:本次語音合成請求Request ID。僅cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2支援該功能。 |
enable_markdown_filter | boolean | 否 | 僅cosyvoice-v3-flash複刻音色支援該功能。
|
ResultCallback
包路徑:com.alibaba.dashscope.common.ResultCallback
onEvent() - 接收音頻資料
方法簽名:
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
result | SpeechSynthesisResult | 是 | 接收到合成事件時觸發,包含音訊框架、時間戳記資訊和輸出資訊(事件類型、原始文本等)。 |
onComplete() - 合成完成
方法簽名:
onError() - 錯誤處理
方法簽名:
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
e | Exception | 是 | 發生錯誤時觸發,包含異常資訊。 |
SpeechSynthesisResult
包路徑:com.alibaba.dashscope.audio.tts.SpeechSynthesisResult
getAudioFrame() - 擷取音頻資料幀
方法簽名:
ByteBuffer,音頻資料幀。
getTimestamp() - 擷取時間戳記資訊
方法簽名:
Sentence,時間戳記資訊。
getOutput() - 擷取輸出資訊
方法簽名:
com.google.gson.JsonObject,合成事件的輸出資訊,包含事件類型和常值內容。需要SDK版本 >= 2.22.0。
句子層級時間戳記資訊(Sentence)
Sentence封裝了句子層級時間戳記資訊。
getBeginTime() - 擷取句子開始時間
方法簽名:
getEndTime() - 擷取句子結束時間
方法簽名:
getWords() - 擷取字層級時間戳記
方法簽名:
List集合,批量擷取字層級時間戳記資訊,可能為空白。
字層級時間戳記資訊(Word)
Word封裝了字層級時間戳記資訊。
getBeginTime() - 擷取詞開始時間
方法簽名:
getEndTime() - 擷取詞結束時間
方法簽名:
getText() - 擷取文本資訊
方法簽名:
String,文本資訊。
getPhonemes() - 擷取音素層級時間戳記
方法簽名:
List集合,批量擷取音素層級時間戳記資訊,可能為空白。
音素層級時間戳記資訊(Phoneme)
Phoneme封裝了音素層級時間戳記資訊。
getBeginTime() - 擷取音素開始時間
方法簽名:
getEndTime() - 擷取音素結束時間
方法簽名:
getText() - 擷取文本資訊
方法簽名:
String,文本資訊。
getTone() - 擷取音調
方法簽名:
- 英文中,0、1、2分別代表輕音、重音和次重音。
- 拼音中,1、2、3、4、5分別代表一聲、二聲、三聲、四聲和輕聲。
輸出資訊(output)
getOutput()返回JsonObject,封裝了合成事件的輸出資訊。在onEvent回調或Flowable流中擷取。包含以下欄位:
| 欄位 | 類型 | 說明 |
|---|---|---|
type | String | 事件類型。取值:sentence-begin(句子開始,返回待合成的常值內容)、sentence-synthesis(標識音頻資料區塊,表示當前正在合成音頻)、sentence-end(句子結束,返迴文本內容和字層級時間戳記)。 |
original_text | String | 當前句子的原始常值內容。在sentence-begin和sentence-end事件中返回。 |
sentence | JsonObject | 句子資訊,包含句子編號(index)和字層級時間戳記(words)。在sentence-end事件中包含完整的字層級時間戳記資訊。 |
範例程式碼
SDK提供了語音合成的關鍵介面,支援以下幾種調用方式:
- 非流式調用:阻塞式,一次性發送完整文本,直接返回完整音頻。適合短文本語音合成情境。
- 單向流式調用:非阻塞式,一次性發送完整文本,通過回呼函數接收音頻資料(可能分區)。適用於對即時性要求高的短文本語音合成情境。
- 雙向流式調用:非阻塞式,可分多次發送文本片段,通過回呼函數即時接收增量合成的音頻流。適合即時性要求高的長文本語音合成情境。
- 非流式調用
- 單向流式調用
- 雙向流式調用
發送的文本長度不得超過20000字元。
通過Flowable調用
Flowable是一個用於工作流程和商務程序管理的開源架構,它基於Apache 2.0許可證發布。關於Flowable的使用,請參見Flowable API詳情。
使用Flowable前需確保已整合RxJava庫,並瞭解響應式編程基礎概念。
單次發送文本長度不得超過 20000 字元,且累計發送文本總長度不得超過 20 萬字元。
- 單向流式調用
- 雙向流式調用
以下樣本展示了通過Flowable對象的
blockingForEach介面,阻塞式地擷取每次流式返回的SpeechSynthesisResult類型資料。