本文件提供了語音合成CosyVoice iOS SDK的詳細使用指南,協助您將文字轉換為高品質、富有表現力的語音。
NeoNui
架構特點:
- 單例模式:透過
[StreamInputTts get_instance]取得全域唯一執行個體 - 回呼驅動:透過
StreamInputTtsDelegate協定接收事件和資料 - JSON 設定:參數透過 JSON 字串傳遞
使用流程
CosyVoice 支援一次性輸入和串流輸入兩種呼叫方式。
一次性輸入:適用於短文字合成、需要使用 SSML 標記語言的場景。
playStreamInputTts()或asyncPlayStreamInputTts()- 傳送一段完整的待合成文字並開始語音合成。前者為同步請求,合成完成後返回;後者為非同步請求,發起合成後立即返回onStreamInputTtsDataCallback()- 接收音訊資料TTS_EVENT_SYNTHESIS_COMPLETE- 語音合成結束
串流輸入:適用於即時對話、長文字「邊說邊合」的場景。此方式不支援 SSML 標記語言。
startStreamInputTts()- 初始化SDK,設定回呼介面和連線參數sendStreamInputTts()- 持續傳送待合成文字onStreamInputTtsDataCallback()- 接收音訊資料stopStreamInputTts()或asyncStopStreamInputTts()- 傳送合成結束請求。前者為同步請求,等待合成完成後返回;後者為非同步請求,發起請求後立即返回TTS_EVENT_SYNTHESIS_COMPLETE- 語音合成結束
startStreamInputTts
啟動串流語音合成任務,與伺服器建立連線。
方法簽章- (int) startStreamInputTts:(const char *)ticket parameters:(const char *)parameters sessionId:(const char *)sessionId logLevel:(NuiSdkLogLevel)logLevel saveLog:(BOOL)saveLog;
參數說明
| 參數 | 類型 | 說明 |
|---|---|---|
ticket | char* | JSON字串,包含鑑權、連線和偵錯參數。 |
parameters | char* | JSON字串,包含語音合成的具體效果參數。 |
sessionId | char* | 用戶端指定的會話 ID。若未傳入,伺服器端將自動產生。 |
logLevel | NuiSdkLogLevel | 控制 SDK 自身日誌的列印層級。 |
saveLog | BOOL | 是否儲存本機日誌。若為YES,須透過debug_path指定路徑,並可透過max_log_file_size設定檔案大小。 |
傳回錯誤碼。
ticket JSON範例:以下為 JSON 字串範例,參數未完整列出。請按實際需求在編碼時補充:
{
"url": "wss://dashscope.aliyuncs.com/api-ws/v1/inference",
"apikey": "st-****",
"device_id": "my_device_id"
}
ticket 參數說明
| 參數 | 類型 | 是否必須 | 說明 |
|---|---|---|---|
url | string | 是 | 服務位址:
呼叫時,請將 |
apikey | string | 是 | API Key。建議使用時效性短、安全性更高的 臨時 API Key,以降低長期有效 Key 外洩的風險。 |
device_id | string | 是 | 用於識別終端使用者的唯一字串,可設為應用程式內使用者 ID 或用戶端產生的裝置唯一識別碼。此 ID 主要用於日誌追蹤和問題排查。 |
complete_waiting_ms | int | 否 | 呼叫stopStreamInputTts介面後,等待合成完成事件(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 範例:以下為 JSON 字串範例,參數未完整列出。請按實際需求在編碼時補充:
{
"model": "cosyvoice-v3-plus",
"voice": "longanyang",
"format": "mp3",
"sample_rate": 24000,
"volume": 50,
"rate": 1,
"pitch": 1,
"language_hints": ["zh"],
"enable_ssml": false
}
parameters 參數說明
| 參數 | 類型 | 是否必須 | 說明 |
|---|---|---|---|
model | string | 是 | 模型名稱。 |
voice | string | 是 | 語音合成所使用的音色。
|
format | string | 否 | 音訊編碼格式。 取值範圍:
說明cosyvoice-v1不支援 opus 格式。 |
enable_audio_decoder | BOOL | 否 | 是否啟用 SDK 內部解碼器。預設值:NO。僅在音訊編碼格式為 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]。 說明cosyvoice-v1模型不支援此參數。 |
enable_ssml | boolean | 否 | 是否開啟SSML功能。 預設值:false。
SSML 的使用限制(支援的模型、音色和介面),請參閱 使用限制。 |
word_timestamp_enabled | boolean | 否 | 是否開啟字級別時間戳記。 預設值:false。 僅在串流輸出模式下可用。支援的音色範圍:cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash、cosyvoice-v3-plus、cosyvoice-v2模型的複製音色,以及CosyVoice音色清單中標記為支援的系統音色。其他模型的複製音色不支援此功能。
|
seed | int | 否 | 產生時使用的隨機數種子,使合成的效果產生變化。在模型版本、文字、音色及其他參數均相同的前提下,使用相同的 seed 可重現相同的合成結果。 預設值0。 取值範圍:[0, 65535]。 說明cosyvoice-v1不支援該參數。 |
language_hints | array[string] | 否 | 重要
指定語音合成的目標語言,提升合成效果。 說明cosyvoice-v1不支援此功能。 當數字、縮寫、符號等朗讀方式或者小語種合成效果不符合預期時使用,例如:
取值範圍
|
instruction | string | 否 | 設定指令,用於控制方言、情感或角色等合成效果。 使用說明請參閱 指令控制。 |
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 支援此功能。 |
hot_fix | object | 否 | 文字熱修復設定,用於自訂指定詞語的發音或對待合成文字進行替換。 說明cosyvoice-v2、cosyvoice-v1不支援此功能。 參數介紹:
範例: |
enable_markdown_filter | BOOL | 否 | 說明僅 cosyvoice-v3-flash 複製音色支援此功能。 是否啟用 Markdown 過濾。啟用後,系統會在合成語音前自動過濾輸入文字中的 Markdown 標記符號,避免將其朗讀為文字內容。 預設值: 取值範圍:
|
sendStreamInputTts
傳送待合成的文字,與 startStreamInputTts 搭配使用。
在呼叫 startStreamInputTts 後,使用此介面持續傳送文字。
所有文字傳送完畢後,需呼叫stopStreamInputTts或asyncStopStreamInputTts來結束傳送。
- (int) sendStreamInputTts:(const char *)text;
參數說明
| 參數 | 類型 | 說明 |
|---|---|---|
text | char* | 待合成文字。不支援 SSML。如果傳入的文字包含 SSML 標籤,這些標籤將被當作一般文字讀出,不會被剖析。 |
傳回錯誤碼。
stopStreamInputTts
同步介面,通知伺服器文字已全部傳送,並阻塞等待所有音訊資料合成並收到 TTS_EVENT_SYNTHESIS_COMPLETE。
封鎖等待的逾時時間由參數 complete_waiting_ms 控制。
- (int) stopStreamInputTts;
傳回值說明
傳回錯誤碼。
asyncStopStreamInputTts
非同步介面,通知伺服器端文字已全部傳送。呼叫後立即傳回,合成在背景繼續進行。
透過 TTS_EVENT_SYNTHESIS_COMPLETE 判斷合成是否完成。
- (int) asyncStopStreamInputTts;
傳回值說明
傳回錯誤碼。
cancelStreamInputTts
立即中斷與伺服器端的連線並終止目前合成任務。呼叫後不會再收到任何音訊資料回呼。
方法簽章- (int) cancelStreamInputTts;
傳回值說明
傳回錯誤碼。
playStreamInputTts
同步執行的一次性合成介面。該介面會傳送文字並阻塞等待接收所有音訊資料,直到合成完成後才返回。無需再呼叫stopStreamInputTts介面。
該介面預設啟用SSML,可透過parameters中的enable_ssml參數關閉。
- (int) playStreamInputTts:(const char *)ticket parameters:(const char *)parameters text:(const char *)text sessionId:(const char *)sessionId logLevel:(NuiSdkLogLevel)logLevel saveLog:(BOOL)saveLog;
參數說明
ticket、parameters等參數與startStreamInputTts介面中的定義相同。
| 參數 | 類型 | 說明 |
|---|---|---|
text | char* | 待合成文字。支援 SSML。 |
傳回錯誤碼。
asyncPlayStreamInputTts
此介面非同步傳送全部待合成文字。呼叫後立即返回,不等待合成資料。無需再呼叫stopStreamInputTts介面。
該介面預設啟用SSML,可透過parameters中的enable_ssml參數關閉。
- (int) asyncPlayStreamInputTts:(const char *)ticket parameters:(const char *)parameters text:(const char *)text sessionId:(const char *)sessionId logLevel:(NuiSdkLogLevel)logLevel saveLog:(BOOL)saveLog;
參數說明
ticket、parameters等參數與startStreamInputTts介面中的定義相同。
| 參數 | 類型 | 說明 |
|---|---|---|
text | char* | 待合成文字。支援 SSML。 |
傳回錯誤碼。
StreamInputTtsDelegate
CosyVoice 串流語音合成回呼協定,用於接收合成事件、音訊資料和日誌。
onStreamInputTtsEventCallback:監聽事件
方法簽章- (void)onStreamInputTtsEventCallback:(StreamInputTtsCallbackEvent)event taskId:(char*)taskid sessionId:(char*)sessionId ret_code:(int)ret_code error_msg:(char*)error_msg timestamp:(char*)timestamp all_response:(char*)all_response;
參數說明
| 參數 | 類型 | 說明 |
|---|---|---|
event | StreamInputTtsCallbackEvent | 回調事件。 |
taskid | char* | 語音合成任務ID。 |
sessionId | char* | 會話 ID。用戶端傳入則原樣傳回;未傳入時由伺服器端產生。 |
ret_code | int | 錯誤碼,僅在事件 TTS_EVENT_TASK_FAILED 中有效。參見錯誤碼。 |
error_msg | char* | 錯誤訊息,僅在事件 TTS_EVENT_TASK_FAILED 中有效。 |
timestamp | char* | 合成結果的時間戳記資訊。 |
all_response | char* | 完整的 JSON 字串回應。可剖析以取得所需資料。 |
onStreamInputTtsDataCallback:監聽音訊資料
合成過程中,SDK 會連續觸發此回呼,需在回呼中取得音訊資料。
方法簽章- (void)onStreamInputTtsDataCallback:(char*)buffer len:(int)len;
參數說明
| 參數 | 類型 | 說明 |
|---|---|---|
buffer | char* | 返回目前片段的音訊資料,可用於:
注意:
|
len | int | 音訊資料的長度(位元組)。 |
onStreamInputTtsLogTrackCallback:監聽追蹤日誌
此回調用於接收 SDK 內部的詳細日誌,方便進行問題定位和偵錯。
方法簽章- (void)onStreamInputTtsLogTrackCallback:(NuiSdkLogLevel)level
logMessage:(const char *)log;
參數說明
| 參數 | 類型 | 說明 |
|---|---|---|
level | NuiSdkLogLevel | 日誌層級。 |
log | char* | 日誌內容。 |
StreamInputTtsCallbackEvent
CosyVoice 串流語音合成事件類型列舉。
| 事件 | 說明 |
|---|---|
TTS_EVENT_SYNTHESIS_STARTED | 表示伺服器已成功接收請求並開始處理。通常在此事件後,onStreamInputTtsDataCallback將很快開始返回第一批音訊資料。 |
TTS_EVENT_SENTENCE_SYNTHESIS | 語音合成執行過程中的資訊,包括計費資訊等。 |
TTS_EVENT_SYNTHESIS_COMPLETE | 表示伺服器已傳送完全部音訊資料,此後 onStreamInputTtsDataCallback將不會再被呼叫。收到此事件是資料流結束的明確信號。 |
TTS_EVENT_TASK_FAILED | 表示任務失敗。此時可從onStreamInputTtsEventCallback的all_response取得task_id、error_code、error_message用於判斷具體錯誤。 |
NuiSdkLogLevel
SDK 日誌層級列舉,用於控制日誌輸出。
| 層級 | 說明 |
|---|---|
| 0:LOG_LEVEL_VERBOSE | 最詳細的日誌,包含所有偵錯資訊。 |
| 1:LOG_LEVEL_DEBUG | 偵錯層級日誌。 |
| 2:LOG_LEVEL_INFO | 常規資訊層級日誌(預設值)。 |
| 3:LOG_LEVEL_WARNING | 警告層級日誌。 |
| 4:LOG_LEVEL_ERROR | 錯誤層級日誌。 |
| 5:LOG_LEVEL_NONE | 關閉日誌輸出。 |
範例程式碼
- 取得API Key:取得與設定 API Key。
說明當您需要為第三方應用程式或使用者提供臨時存取權限,或者希望嚴格控制敏感資料存取、刪除等高風險操作時,建議使用臨時 API Key。臨時 API Key 擁有固定的 60 秒有效期,過期後需重新取得。
-
下載 SDK 並執行範例程式碼:
- 下載最新SDK整合包。
- 解壓縮 ZIP 套件,將其中的 nuisdk.framework 新增至專案。
- 在 Build Phases → Link Binary With Libraries 中新增 nuisdk.framework。
- 在 General → Frameworks, Libraries, and Embedded Content 中將 nuisdk.framework 設定為 Embed & Sign。
- 使用 Xcode 開啟範例專案。範例程式碼位於
DashCosyVoiceStreamInputTTSViewController.m,替換 API Key 後體驗功能。
呼叫方式
| 呼叫方式 | 說明 |
|---|---|
| 一次性輸入待合成文字 | 呼叫步驟:
|
| 串流輸入待合成文字 | 呼叫步驟:
|
進階功能
SSML 標記語言
目的:透過在文字中嵌入 XML 標籤,實現對發音、語速、停頓等細節的精確控制。
使用限制:僅支援一次性輸入待合成文字(playStreamInputTts 或 asyncPlayStreamInputTts 介面),不支援串流輸入待合成文字(sendStreamInputTts介面)。
使用方法:呼叫 playStreamInputTts 或 asyncPlayStreamInputTts 介面時,SDK 會自動啟用 SSML,此時直接在 text 參數中傳入包含 SSML 標籤的文字即可。
更多說明請參閱 SSML 與 LaTeX。
數學運算式
目的:使模型能夠正確朗讀常見的數學公式和運算式。
使用方法:直接在 text 參數中傳入包含 LaTeX 格式的數學運算式的文字即可。更多說明請參見 LaTeX 公式轉語音。