本文件提供了語音合成Qwen-Audio-TTS Android SDK的詳細使用指南,協助您將文字轉換為高品質、富有表現力的語音。
NativeNui
本 SDK 支援建立多個 NativeNui 執行個體,並透過回呼機制處理語音合成事件。
架構特點:
-
多例模式:透過
new NativeNui(Constants.ModeType.MODE_STREAM_INPUT_TTS)建立執行個體 -
回呼驅動:透過
INativeStreamInputTtsCallback介面接收事件和資料 -
事件類型:
STREAM_INPUT_TTS_EVENT_SYNTHESIS_STARTED:合成任務開始onStreamInputTtsDataCallback:音訊資料傳回STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE:合成任務結束STREAM_INPUT_TTS_EVENT_TASK_FAILED:合成出錯
使用流程
Qwen-Audio-TTS 支援一次性輸入和串流輸入兩種呼叫方式。
一次性輸入:適用於短文字合成、需要使用 SSML 標記語言的場景。
playStreamInputTts()或asyncPlayStreamInputTts()- 傳送一段完整的待合成文字並開始語音合成。前者為同步請求,合成完成後返回;後者為非同步請求,發起合成後立即返回onStreamInputTtsDataCallback()- 接收音訊資料STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE- 語音合成結束
串流輸入:適用於即時對話、長文字「邊說邊合」的場景。此方式不支援 SSML 標記語言。
startStreamInputTts()- 初始化 SDK,設定回呼介面和連線參數sendStreamInputTts()- 持續傳送待合成文字onStreamInputTtsDataCallback()- 接收音訊資料stopStreamInputTts()或asyncStopStreamInputTts()- 傳送合成結束請求。前者為同步請求,等待合成完成後返回;後者為非同步請求,發起請求後立即返回STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE- 語音合成結束
startStreamInputTts
啟動雙向串流語音合成,建立與伺服器端的連線,並註冊回呼以接收事件和音訊資料。
此介面可能會引起阻塞,應在非UI執行緒呼叫。
方法簽章:public synchronized int startStreamInputTts(INativeStreamInputTtsCallback callback,
String ticket,
String parameters,
String session_id,
int log_level,
boolean save_log)
參數說明:
| 參數 | 類型 | 說明 |
|---|---|---|
callback | INativeStreamInputTtsCallback | 事件和資料回調介面的實作。 |
ticket | String | JSON 字串,包含驗證、連線和偵錯參數。詳見下方 ticket 參數說明。 |
parameters | String | JSON 字串,包含語音合成的具體效果參數。詳見下方 parameters 參數說明。 |
session_id | String | 用戶端指定的會話 ID。若未傳入,伺服器端將自動產生。 |
log_level | int | 控制 SDK 自身日誌的列印層級。 取值範圍:
|
save_log | boolean | 是否儲存本機日誌。若為 true,須在 ticket 參數中透過 debug_path 指定路徑,並可透過 max_log_file_size 設定檔案大小。 |
傳回錯誤碼。
ticket JSON 範例:
{
"url": "wss://dashscope.aliyuncs.com/api-ws/v1/inference",
"apikey": "sk-****",
"device_id": "my_device_id"
}
ticket 參數說明:
| 參數 | 類型 | 是否必須 | 說明 |
|---|---|---|---|
url | String | 是 | 服務位址:
呼叫時,請將 |
apikey | String | 是 | API Key。建議使用時效性短、安全性更高的 臨時 API Key,以降低長期有效 Key 外洩的風險。 |
device_id | String | 是 | 用於識別終端使用者的唯一字串,可設為應用程式內使用者 ID 或用戶端產生的裝置唯一識別碼。此 ID 主要用於日誌追蹤和問題排查。 |
complete_waiting_ms | int | 否 | 呼叫stop介面後,等待合成完成事件(STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE)的逾時時間(毫秒)。預設值:10000。 |
debug_path | String | 否 | 日誌檔案的儲存路徑。 此參數僅在呼叫 本機最多保留兩個日誌檔案。 |
max_log_file_size | int | 否 | 設定日誌檔案的最大位元組數。 此參數僅在呼叫 預設值:104857600(100 * 1024 * 1024 位元組,即 100MiB)。 |
log_track_level | int | 否 | 控制透過日誌回呼(onStreamInputTtsLogTrackCallback)對外傳送的日誌內容的過濾層級。預設值:2。 取值範圍:
注意: |
parameters JSON 範例:
{
"model": "qwen-audio-3.0-tts-flash",
"voice": "longanlingxi",
"format": "mp3",
"volume": 50,
"rate": 1.0,
"pitch": 1.0
}
parameters 參數說明:
| 參數 | 類型 | 是否必須 | 說明 |
|---|---|---|---|
model | String | 是 | 模型名稱。 |
voice | String | 是 | 語音合成所使用的音色。
|
format | String | 否 | 音訊編碼格式。 取值範圍:
|
enable_audio_decoder | boolean | 否 | 是否啟用 SDK 內部解碼器。預設值:false。 僅在音訊編碼格式為 opus 或 mp3 時生效。啟用後,SDK 會將 opus 或 mp3 音訊資料解碼為 PCM 資料後傳回。 |
volume | int | 否 | 音量。 預設值:50。 取值範圍:[0, 100]。 |
sample_rate | int | 否 | 音訊取樣率(Hz)。 取值範圍:8000, 16000, 22050(預設), 24000, 44100, 48000。 |
rate | float | 否 | 語速。 預設值:1.0。 取值範圍:[0.5, 2.0]。 |
pitch | float | 否 | 音調。 預設值:1.0。 取值範圍:[0.5, 2.0]。 |
bit_rate | int | 否 | 音訊位元率(kbps)。音訊格式為 mp3 或 opus 時,支援透過 bit_rate 參數調整位元率。預設值:32。 取值範圍:[6, 510]。 |
enable_ssml | boolean | 否 | 是否開啟SSML功能。 預設值:false。
SSML 的使用限制(支援的模型、音色和介面),請參閱 使用限制。 |
word_timestamp_enabled | boolean | 否 | 是否開啟字級別時間戳記。 預設值:false。 僅在串流輸出模式下可用。支援複製音色;支援的系統音色請參見Qwen-Audio-TTS音色清單。
|
seed | int | 否 | 產生時使用的隨機數種子,使合成的效果產生變化。在模型版本、文字、音色及其他參數均相同的前提下,使用相同的 seed 可重現相同的合成結果。 預設值0。 取值範圍:[0, 65535]。 |
language_hints | String[] | 否 | 重要
指定語音合成的目標語言,提升合成效果。 當數字、縮寫、符號等朗讀方式或者小語種合成效果不符合預期時使用,例如:
取值範圍
|
instruction | String | 否 | 設定指令,用於控制方言、情感或角色等合成效果。 使用說明請參閱 指令控制。 |
enable_aigc_tag | boolean | 否 | 是否在產生的音訊中新增 AIGC 隱性標識。設定為 true 時,會將隱性標識嵌入到支援格式(wav/mp3/opus)的音訊中。 預設值:false。 |
aigc_propagator | String | 否 | 設定 AIGC 隱性標識中的 ContentPropagator 欄位,用於標識內容的傳播者。僅在 enable_aigc_tag 為 true 時生效。預設值:阿里雲UID。 |
aigc_propagate_id | String | 否 | 設定 AIGC 隱性標識中的 PropagateID 欄位,用於唯一標識一次具體的傳播行為。僅在 enable_aigc_tag 為 true 時生效。預設值:本次語音合成請求 Request ID。 |
hot_fix | object | 否 | 文字熱修復設定,用於自訂指定詞語的發音或對待合成文字進行替換。 參數介紹:
範例: |
sendStreamInputTts
傳送待合成的文字,與 startStreamInputTts 搭配使用。
在呼叫 startStreamInputTts 後,使用此介面持續傳送文字。
所有文字傳送完畢後,需呼叫stopStreamInputTts或asyncStopStreamInputTts來結束傳送。
public synchronized int sendStreamInputTts(String text)
參數說明:
| 參數 | 類型 | 說明 |
|---|---|---|
text | String | 待合成文字。不支援 SSML。如果傳入的文字包含 SSML 標籤,這些標籤將被當作一般文字讀出,不會被剖析。 |
傳回錯誤碼。
stopStreamInputTts
同步介面,通知伺服器文字已全部傳送,並阻塞等待所有音訊資料合成並收到 STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE。
封鎖等待的逾時時間由參數 complete_waiting_ms 控制。
public synchronized int stopStreamInputTts()
傳回值說明:
傳回錯誤碼。
asyncStopStreamInputTts
非同步介面,通知伺服器端文字已全部傳送。呼叫後立即傳回,合成在背景繼續進行。
透過 STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE 事件判斷合成是否完成。
public synchronized int asyncStopStreamInputTts()
傳回值說明:
傳回錯誤碼。
cancelStreamInputTts
立即中斷與伺服器端的連線並終止目前合成任務。呼叫後不會再收到任何音訊資料回呼。
方法簽章:public synchronized int cancelStreamInputTts()
傳回值說明:
傳回錯誤碼。
playStreamInputTts
同步執行的一次性合成介面。此介面會傳送文字、封鎖並等待接收所有音訊資料,直到合成完成後才傳回。無需再呼叫 stop 介面。
此介面預設啟用 SSML。如果明確設定 enable_ssml,則以使用者設定為準。
此介面應在非UI執行緒呼叫。
方法簽章:public synchronized int playStreamInputTts(INativeStreamInputTtsCallback callback,
String ticket,
String parameters,
String text,
String session_id,
int log_level,
boolean save_log)
參數說明:
callback、ticket 等參數與 startStreamInputTts 介面中的定義相同。
| 參數 | 類型 | 說明 |
|---|---|---|
text | String | 待合成文字。支援 SSML。 |
傳回錯誤碼。
asyncPlayStreamInputTts
非同步執行的一次性合成介面。呼叫後立即傳回,合成任務在背景進行,結果透過回呼傳回。無需再呼叫 stop 介面。
此介面預設啟用 SSML。如果明確設定 enable_ssml,則以使用者設定為準。
public synchronized int asyncPlayStreamInputTts(INativeStreamInputTtsCallback callback,
String ticket,
String parameters,
String text,
String session_id,
int log_level,
boolean save_log)
參數說明:
callback、ticket 等參數與 startStreamInputTts 介面中的定義相同。
| 參數 | 類型 | 說明 |
|---|---|---|
text | String | 待合成文字。支援 SSML。 |
傳回錯誤碼。
INativeStreamInputTtsCallback
Qwen-Audio-TTS 串流語音合成回呼介面,用於接收合成事件、音訊資料和日誌。
onStreamInputTtsEventCallback:監聽事件
方法簽章:void onStreamInputTtsEventCallback(StreamInputTtsEvent event,
String task_id,
String session_id,
int ret_code,
String error_msg,
String timestamp,
String all_response);
參數說明:
| 參數 | 類型 | 說明 |
|---|---|---|
event | StreamInputTtsEvent | 回調事件。 |
task_id | String | 語音合成任務ID。 |
session_id | String | 會話 ID。用戶端傳入則原樣傳回;未傳入時由伺服器端產生。 |
ret_code | int | 錯誤碼,僅在事件 STREAM_INPUT_TTS_EVENT_TASK_FAILED 中有效。 |
error_msg | String | 錯誤訊息,僅在事件 STREAM_INPUT_TTS_EVENT_TASK_FAILED 中有效。 |
timestamp | String | 合成結果的時間戳記資訊。 |
all_response | String | 完整的 JSON 字串回應。可剖析以取得所需資料。 |
onStreamInputTtsDataCallback:監聽音訊資料
合成過程中,SDK 會連續觸發此回呼,需在回呼中取得音訊資料。
方法簽章:void onStreamInputTtsDataCallback(byte[] data);
參數說明:
| 參數 | 類型 | 說明 |
|---|---|---|
data | byte[] | 返回目前片段的音訊資料,可用於:
注意:
|
onStreamInputTtsLogTrackCallback:監聽追蹤日誌
此回調用於接收 SDK 內部的詳細日誌,方便進行問題定位和偵錯。
方法簽章:default void onStreamInputTtsLogTrackCallback(Constants.LogLevel level, String log)
StreamInputTtsEvent
Qwen-Audio-TTS 串流語音合成事件類型列舉。
| 事件 | 說明 |
|---|---|
STREAM_INPUT_TTS_EVENT_SYNTHESIS_STARTED | 表示伺服器已成功接收請求並開始處理。通常在此事件後,onStreamInputTtsDataCallback將很快開始返回第一批音訊資料。 |
STREAM_INPUT_TTS_EVENT_SENTENCE_SYNTHESIS | 語音合成執行過程中的資訊,包括計費資訊等。 |
STREAM_INPUT_TTS_EVENT_SYNTHESIS_COMPLETE | 表示伺服器已傳送完全部音訊資料,此後 onStreamInputTtsEventCallback將不會再被呼叫。收到此事件是資料流結束的明確信號。 |
STREAM_INPUT_TTS_EVENT_TASK_FAILED | 表示任務失敗。此時可從INativeStreamInputTtsCallback的all_response取得task_id、error_code、error_message用於判斷具體錯誤。 |
範例程式碼
-
取得 API Key:取得與設定 API Key,為安全起見,建議將 API Key 設定至環境變數。
說明當您需要為第三方應用程式或使用者提供臨時存取權限,或者希望嚴格控制敏感資料存取、刪除等高風險操作時,建議使用臨時 API Key。臨時 API Key 擁有固定的 60 秒有效期,過期後需重新取得。
-
下載 SDK 並執行範例程式碼:
- 下載最新SDK整合包。
- 解壓縮 ZIP 套件。在
app/libs目錄中取得 AAR 格式 SDK,並新增至專案相依性。
需要 Android CPP 接入時,使用 ZIP 套件內的android_libs與android_include取得動態連結庫和標頭檔。 - 使用 Android Studio 開啟專案。範例程式碼位於
DashCosyVoiceStreamTtsActivity.java,替換 API Key 後體驗功能。
呼叫方式
| 呼叫方式 | 說明 |
|---|---|
| 一次性輸入待合成文字 | 呼叫步驟:
|
| 串流輸入待合成文字 | 呼叫步驟:
|
進階功能
SSML 標記語言
目的:透過在文字中嵌入 XML 標籤,實現對發音、語速、停頓等細節的精確控制。
使用限制:僅支援一次性輸入待合成文字(playStreamInputTts 或 asyncPlayStreamInputTts 介面),不支援串流輸入待合成文字(sendStreamInputTts 介面)。
使用方法:呼叫 playStreamInputTts 或 asyncPlayStreamInputTts 介面時,SDK 會自動啟用 SSML,此時直接在 text 參數中傳入包含 SSML 標籤的文字即可。
更多說明請參閱 SSML 與 LaTeX。
數學運算式
目的:使模型能夠正確朗讀常見的數學公式和運算式。
使用方法:直接在 text 參數中傳入包含 LaTeX 格式的數學運算式的文字即可。更多說明請參見 LaTeX 公式轉語音。