CosyVoice聲音複刻服務基於產生式語音大模型,使用10~20秒音頻樣本即可產生高度相似且自然的定製聲音,無需傳統訓練過程。聲音複刻與語音合成是前後關聯的兩個步驟。本文檔聚焦於介紹聲音複刻的參數和介面細節,語音合成請參見即時語音合成-CosyVoice/Sambert。
使用者指南:關於模型介紹和選型建議請參見即時語音合成-CosyVoice/Sambert。
本文檔專用於CosyVoice聲音複刻介面;若您使用的是千問模型,請參見聲音複刻(Qwen)。
音頻要求
高品質的輸入音頻是獲得優質複刻效果的基礎。
|
專案 |
要求 |
|
支援格式 |
WAV (16bit), MP3, M4A |
|
音頻時間長度 |
推薦10~20秒,最長不得超過60秒 |
|
檔案大小 |
≤ 10 MB |
|
採樣率 |
≥ 16 kHz |
|
聲道 |
單聲道 / 雙聲道,雙聲道音頻僅處理首聲道,請確保首聲道包含有效人聲 |
|
內容 |
音頻必須包含至少5秒連續清晰朗讀(無背景音),其餘部分僅允許短暫停頓(≤2秒);整段音頻應避免背景音樂、噪音或其他人聲,確保核心朗讀內容品質;請使用正常說話音頻作為輸入,不要上傳歌曲或唱歌音頻,以確保複刻效果準確和可用。 |
|
語言 |
因驅動音色的語音合成模型(通過
當前聲音複刻僅支援上述列出的語言(中文普通話及表中列出的方言、英文、法語、德語、日語、韓語、俄語),暫不支援西班牙語、意大利語等其他語種的聲音複刻。 |
快速開始:從複刻到合成
1. 工作流程
聲音複刻與語音合成是緊密關聯的兩個獨立步驟,遵循“先建立,後使用”的流程:
-
建立音色
調用建立音色介面,上傳一段音頻。系統會分析該音頻,建立一個專屬的複刻音色。此步驟必須指定
target_model/targetModel,聲明建立的音色將由哪個語音合成模型驅動。若已有建立好的音色(調用查詢音色列表介面查看),可跳過這一步直接進行下一步。
-
使用音色進行語音合成
使用建立音色介面建立音色成功後,系統會返回一個
voice_id/voiceID:-
該
voice_id/voiceID可直接作為語音合成介面或各語言 SDK 中的voice參數使用,用於後續的文本轉語音。 -
支援多種調用形態,包括非流式、單向流式以及雙向流式合成。
-
合成時指定的語音合成模型必須與建立音色時的
target_model/targetModel保持一致,否則合成會失敗。
-
2. 模型配置與準備工作
選擇合適的模型並完成準備工作。
模型配置
在國際部署模式(新加坡地區)下,cosyvoice-v3-plus和cosyvoice-v3-flash不支援聲音複刻功能,請選擇其他模型。
聲音複刻時需要指定以下兩個模型:
-
聲音複刻模型:voice-enrollment
-
驅動音色的語音合成模型:
在資源與預算允許的情況下,推薦使用
cosyvoice-v3-plus以獲得最佳效果。版本
適用情境
cosyvoice-v3-plus
追求最佳音質與表現力,預算充足
cosyvoice-v3-flash
平衡效果與成本,綜合性價比高
cosyvoice-v2
相容舊版或低要求情境
準備工作
-
擷取API Key:擷取API Key與API Host,為安全起見,推薦將API Key配置到環境變數。
-
安裝SDK:確保已安裝最新版DashScope SDK。
-
準備音頻URL:將符合音頻要求的音頻檔案上傳至公網可訪問的位置,如阿里雲Object Storage Service,並確保URL可公開訪問。
3. 端到端樣本:從複刻到合成
以下樣本示範了如何在語音合成中使用聲音複刻產生的專屬音色,實現與原音高度相似的輸出效果。
-
關鍵原則:聲音複刻時,
target_model(驅動音色的語音合成模型)必須與後續調用語音合成介面時指定的語音合成模型一致,否則會合成失敗。 -
注意將樣本中的
AUDIO_URL替換為實際的音頻URL。
import os
import time
import dashscope
from dashscope.audio.tts_v2 import VoiceEnrollmentService, SpeechSynthesizer
# 1. 環境準備
# 推薦通過環境變數配置API Key
# export DASHSCOPE_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
if not dashscope.api_key:
raise ValueError("DASHSCOPE_API_KEY environment variable not set.")
# 2. 定義複刻參數
TARGET_MODEL = "cosyvoice-v3-plus"
# 為音色起一個有意義的首碼
VOICE_PREFIX = "myvoice" # 僅允許數字和小寫字母,小於十個字元
# 公網可訪問音頻URL
AUDIO_URL = "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/cosyvoice/cosyvoice-zeroshot-sample.wav" # 樣本URL,請替換為自己的
# 3. 建立音色 (非同步任務)
print("--- Step 1: Creating voice enrollment ---")
service = VoiceEnrollmentService()
try:
voice_id = service.create_voice(
target_model=TARGET_MODEL,
prefix=VOICE_PREFIX,
url=AUDIO_URL
)
print(f"Voice enrollment submitted successfully. Request ID: {service.get_last_request_id()}")
print(f"Generated Voice ID: {voice_id}")
except Exception as e:
print(f"Error during voice creation: {e}")
raise e
# 4. 輪詢查詢音色狀態
print("\n--- Step 2: Polling for voice status ---")
max_attempts = 30
poll_interval = 10 # 秒
for attempt in range(max_attempts):
try:
voice_info = service.query_voice(voice_id=voice_id)
status = voice_info.get("status")
print(f"Attempt {attempt + 1}/{max_attempts}: Voice status is '{status}'")
if status == "OK":
print("Voice is ready for synthesis.")
break
elif status == "UNDEPLOYED":
print(f"Voice processing failed with status: {status}. Please check audio quality or contact support.")
raise RuntimeError(f"Voice processing failed with status: {status}")
# 對於 "DEPLOYING" 等中間狀態,繼續等待
time.sleep(poll_interval)
except Exception as e:
print(f"Error during status polling: {e}")
time.sleep(poll_interval)
else:
print("Polling timed out. The voice is not ready after several attempts.")
raise RuntimeError("Polling timed out. The voice is not ready after several attempts.")
# 5. 使用複刻音色進行語音合成
print("\n--- Step 3: Synthesizing speech with the new voice ---")
try:
synthesizer = SpeechSynthesizer(model=TARGET_MODEL, voice=voice_id)
text_to_synthesize = "恭喜,已成功複刻併合成了屬於自己的聲音!"
# call()方法返回二進位音頻資料
audio_data = synthesizer.call(text_to_synthesize)
print(f"Speech synthesis successful. Request ID: {synthesizer.get_last_request_id()}")
# 6. 儲存音頻檔案
output_file = "my_custom_voice_output.mp3"
with open(output_file, "wb") as f:
f.write(audio_data)
print(f"Audio saved to {output_file}")
except Exception as e:
print(f"Error during speech synthesis: {e}")
API參考
使用不同 API 時,請確保使用同一帳號進行操作。
建立音色
上傳用於複刻的音頻,建立自訂音色。
Python SDK
介面說明
def create_voice(self, target_model: str, prefix: str, url: str, language_hints: List[str] = None) -> str:
'''
建立一個新的定製音色。
param: target_model 驅動音色的語音合成模型,必須與後續調用語音合成介面時使用的語音合成模型一致,否則合成會失敗。推薦 cosyvoice-v3-flash 或 cosyvoice-v3-plus。
param: prefix 為音色指定一個便於識別的名稱(僅允許數字、大小寫字母和底線,不超過10個字元)。建議選用與角色、情境相關的標識。該關鍵字會在複刻的音色名中出現,產生的音色名格式為:模型名-首碼-唯一標識,如cosyvoice-v3-plus-myvoice-xxxxxxxx。
param: url 用於複刻音色的音頻檔案URL,要求公網可訪問。
param: language_hints 指定用於提取目標音色特徵的樣本音頻語種,僅適用於 cosyvoice-v3-flash 和 cosyvoice-v3-plus 模型。
該參數用於輔助模型識別樣本音頻(原始參考音頻)的語種,從而更準確地提取音色特徵,提升複刻效果。
若設定的語言提示與實際音頻語言不符(例如為中文音頻設定 en),系統將忽略此提示,並依據音頻內容自動檢測語言。
取值範圍:zh(預設值)、en、fr、de、ja、ko、ru。此參數為數組,但目前的版本僅處理第一個元素,建議只傳入一個值。
return: voice_id 音色ID,可直接用於語音合成介面的voice參數。
'''
-
target_model:驅動音色的語音合成模型,須和後續調用語音合成介面時使用的語音合成模型一致,否則合成會失敗 -
language_hints:指定用於提取目標音色特徵的樣本音頻語種,僅適用於cosyvoice-v3-flash和cosyvoice-v3-plus模型功能說明:該參數用於輔助模型識別樣本音頻(原始參考音頻)的語種,從而更準確地提取音色特徵,提升複刻效果。若設定的語言提示與實際音頻語言不符(例如為中文音頻設定
en),系統將忽略此提示,並依據音頻內容自動檢測語言。取值範圍:
-
zh:中文(預設值)
-
en:英文
-
fr:法語
-
de:德語
-
ja:日語
-
ko:韓語
-
ru:俄語
對於中文方言(例如東北話、粵語等),建議仍將
language_hints設定為zh,方言風格應在後續語音合成調用中通過常值內容或instruct等參數進行控制。注意:此參數為數組,但目前的版本僅處理第一個元素,因此建議只傳入一個值。
-
請求樣本
from dashscope.audio.tts_v2 import VoiceEnrollmentService
service = VoiceEnrollmentService()
# 避免頻繁調用。每次調用都會建立新音色,達到配額上限後將無法建立。
voice_id = service.create_voice(
target_model='cosyvoice-v3-plus',
prefix='myvoice',
url='https://your-audio-file-url',
language_hints=['zh']
)
print(f"Request ID: {service.get_last_request_id()}")
print(f"Voice ID: {voice_id}")
Java SDK
介面說明
/**
* 建立一個新的定製音色。
*
* @param targetModel 驅動音色的語音合成模型,必須與後續調用語音合成介面時使用的語音合成模型一致,否則合成會失敗。推薦 cosyvoice-v3-flash 或 cosyvoice-v3-plus。
* @param prefix 為音色指定一個便於識別的名稱(僅允許數字、大小寫字母和底線,不超過10個字元)。建議選用與角色、情境相關的標識。該關鍵字會在複刻的音色名中出現,產生的音色名格式為:模型名-首碼-唯一標識,如cosyvoice-v3-plus-myvoice-xxxxxxxx。
* @param url 用於複刻音色的音頻檔案URL,要求公網可訪問。
* @param customParam 自訂參數。可在此處指定languageHints。
* languageHints指定用於提取目標音色特徵的樣本音頻語種,僅適用於 cosyvoice-v3-flash 和 cosyvoice-v3-plus 模型。
* 該參數用於輔助模型識別樣本音頻(原始參考音頻)的語種,從而更準確地提取音色特徵,提升複刻效果。
* 若設定的語言提示與實際音頻語言不符(例如為中文音頻設定 en),系統將忽略此提示,並依據音頻內容自動檢測語言。
* 取值範圍:zh(預設值)、en、fr、de、ja、ko、ru。此參數為數組,但目前的版本僅處理第一個元素,建議只傳入一個值。
* @return Voice 新建立的音色,通過Voice的getVoiceId方法能夠擷取音色ID,可直接用於語音合成介面的voice參數。
* @throws NoApiKeyException 如果apikey為空白。
* @throws InputRequiredException 如果必須參數為空白。
*/
public Voice createVoice(String targetModel, String prefix, String url, VoiceEnrollmentParam customParam) throws NoApiKeyException, InputRequiredException
-
targetModel:驅動音色的語音合成模型,須和後續調用語音合成介面時使用的語音合成模型一致,否則合成會失敗 -
languageHints:指定用於提取目標音色特徵的樣本音頻語種,僅適用於cosyvoice-v3-flash和cosyvoice-v3-plus模型功能說明:該參數用於輔助模型識別樣本音頻(原始參考音頻)的語種,從而更準確地提取音色特徵,提升複刻效果。若設定的語言提示與實際音頻語言不符(例如為中文音頻設定
en),系統將忽略此提示,並依據音頻內容自動檢測語言。取值範圍:
-
zh:中文(預設值)
-
en:英文
-
fr:法語
-
de:德語
-
ja:日語
-
ko:韓語
-
ru:俄語
對於中文方言(例如東北話、粵語等),建議仍將
language_hints設定為zh,方言風格應在後續語音合成調用中通過常值內容或instruct等參數進行控制。注意:此參數為數組,但目前的版本僅處理第一個元素,因此建議只傳入一個值。
-
請求樣本
import com.alibaba.dashscope.audio.ttsv2.enrollment.Voice;
import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentParam;
import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collections;
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
String apiKey = System.getenv("DASHSCOPE_API_KEY");
String targetModel = "cosyvoice-v3-plus";
String prefix = "myvoice";
String fileUrl = "https://your-audio-file-url";
String cloneModelName = "voice-enrollment";
try {
VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey);
Voice myVoice = service.createVoice(
targetModel,
prefix,
fileUrl,
VoiceEnrollmentParam.builder()
.model(cloneModelName)
.languageHints(Collections.singletonList("zh")).build());
logger.info("Voice creation submitted. Request ID: {}", service.getLastRequestId());
logger.info("Generated Voice ID: {}", myVoice.getVoiceId());
} catch (Exception e) {
logger.error("Failed to create voice", e);
}
}
}
RESTful API
基本資料
|
URL |
中國內地:
國際:
|
|
要求方法 |
POST |
|
要求標頭 |
|
|
訊息體 |
包含所有請求參數的訊息體如下,對於可選欄位,在實際業務中可根據需求省略: 重要
|
請求參數
|
參數 |
類型 |
預設值 |
是否必須 |
說明 |
|
model |
string |
- |
是 |
聲音複刻模型,固定為 |
|
action |
string |
- |
是 |
操作類型,固定為 |
|
target_model |
string |
- |
是 |
驅動音色的語音合成模型,推薦 cosyvoice-v3-flash 或 cosyvoice-v3-plus。 必須與後續調用語音合成介面時使用的語音合成模型一致,否則合成會失敗。 |
|
prefix |
string |
- |
是 |
為音色指定一個便於識別的名稱(僅允許數字、大小寫字母和底線,不超過10個字元)。建議選用與角色、情境相關的標識。 該關鍵字會在複刻的音色名中出現,產生的音色名格式為: |
|
url |
string |
- |
是 |
用於複刻音色的音頻檔案URL,要求公網可訪問。 |
|
language_hints |
array[string] |
["zh"] |
否 |
指定用於提取目標音色特徵的樣本音頻語種,僅適用於 cosyvoice-v3-flash 和 cosyvoice-v3-plus 模型。 功能說明:該參數用於輔助模型識別樣本音頻(原始參考音頻)的語種,從而更準確地提取音色特徵,提升複刻效果。若設定的語言提示與實際音頻語言不符(例如為中文音頻設定 取值範圍:
對於中文方言(例如東北話、粵語等),建議仍將 注意:此參數為數組,但目前的版本僅處理第一個元素,因此建議只傳入一個值。 |
響應參數
|
參數 |
類型 |
說明 |
|
voice_id |
string |
音色ID,可直接用於語音合成介面的 |
查詢音色列表
分頁查詢已建立的音色列表。
Python SDK
介面說明
def list_voices(self, prefix=None, page_index: int = 0, page_size: int = 10) -> List[dict]:
'''
查詢已建立的所有音色
param: prefix 音色自訂首碼,僅允許數字和小寫字母,長度小於10個字元。
param: page_index 查詢的頁索引
param: page_size 查詢頁大小
return: List[dict] 音色列表,包含每個音色的id,建立時間,修改時間,狀態。格式為:[{'gmt_create': '2025-10-09 14:51:01', 'gmt_modified': '2025-10-09 14:51:07', 'status': 'OK', 'voice_id': 'cosyvoice-v3-myvoice-xxx'}]
音色狀態有三種:
DEPLOYING: 審核中
OK:審核通過,可調用
UNDEPLOYED:審核不通過,不可調用
'''
請求樣本
from dashscope.audio.tts_v2 import VoiceEnrollmentService
service = VoiceEnrollmentService()
# 按首碼篩選,或設為None查詢所有
voices = service.list_voices(prefix='myvoice', page_index=0, page_size=10)
print(f"Request ID: {service.get_last_request_id()}")
print(f"Found voices: {voices}")
響應樣本
[
{
"gmt_create": "2024-09-13 11:29:41",
"voice_id": "yourVoiceId",
"gmt_modified": "2024-09-13 11:29:41",
"status": "OK"
},
{
"gmt_create": "2024-09-13 13:22:38",
"voice_id": "yourVoiceId",
"gmt_modified": "2024-09-13 13:22:38",
"status": "OK"
}
]
響應參數
|
參數 |
類型 |
說明 |
|
voice_id |
string |
音色ID。 |
|
gmt_create |
string |
建立音色的時間。 |
|
gmt_modified |
string |
修改音色的時間。 |
|
status |
string |
音色狀態:
|
Java SDK
介面說明
// 音色狀態有三種:
// DEPLOYING: 審核中
// OK:審核通過,可調用
// UNDEPLOYED:審核不通過,不可調用
/**
* 查詢已建立的所有音色 預設的頁索引為0,預設的頁大小為10
*
* @param prefix 音色自訂首碼,僅允許數字和小寫字母,長度小於10個字元。可以為null。
* @return Voice[] 音色對象數組。Voice封裝了音色的id,建立時間,修改時間,狀態。
* @throws NoApiKeyException 如果apikey為空白。
* @throws InputRequiredException 如果必須參數為空白。
*/
public Voice[] listVoice(String prefix) throws NoApiKeyException, InputRequiredException
/**
* 查詢已建立的所有音色
*
* @param prefix 音色自訂首碼,僅允許數字和小寫字母,長度小於10個字元。
* @param pageIndex 查詢的頁索引。
* @param pageSize 查詢的頁大小。
* @return Voice[] 音色對象數組。Voice封裝了音色的id,建立時間,修改時間,狀態。
* @throws NoApiKeyException 如果apikey為空白。
* @throws InputRequiredException 如果必須參數為空白。
*/
public Voice[] listVoice(String prefix, int pageIndex, int pageSize) throws NoApiKeyException, InputRequiredException
請求樣本
需要引入第三方庫com.google.gson.Gson。
import com.alibaba.dashscope.audio.ttsv2.enrollment.Voice;
import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // 如果您沒有配置環境變數,請在此處用您的API-KEY進行替換
private static String prefix = "myvoice"; // 請按實際情況進行替換
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args)
throws NoApiKeyException, InputRequiredException {
VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey);
// 查詢音色
Voice[] voices = service.listVoice(prefix, 0, 10);
logger.info("List successful. Request ID: {}", service.getLastRequestId());
logger.info("Voices Details: {}", new Gson().toJson(voices));
}
}
響應樣本
[
{
"gmt_create": "2024-09-13 11:29:41",
"voice_id": "yourVoiceId",
"gmt_modified": "2024-09-13 11:29:41",
"status": "OK"
},
{
"gmt_create": "2024-09-13 13:22:38",
"voice_id": "yourVoiceId",
"gmt_modified": "2024-09-13 13:22:38",
"status": "OK"
}
]
響應參數
|
參數 |
類型 |
說明 |
|
voice_id |
string |
音色ID。 |
|
gmt_create |
string |
建立音色的時間。 |
|
gmt_modified |
string |
修改音色的時間。 |
|
status |
string |
音色狀態:
|
RESTful API
基本資料
|
URL |
中國內地:
國際:
|
|
要求方法 |
POST |
|
要求標頭 |
|
|
訊息體 |
包含所有請求參數的訊息體如下,對於可選欄位,在實際業務中可根據需求省略: 重要
|
請求參數
|
參數 |
類型 |
預設值 |
是否必須 |
說明 |
|
model |
string |
- |
是 |
聲音複刻模型,固定為 |
|
action |
string |
- |
是 |
操作類型,固定為 |
|
prefix |
string |
null |
否 |
音色自訂首碼,僅允許數字和小寫字母,長度小於10個字元。 |
|
page_index |
integer |
0 |
否 |
頁碼索引,從0開始計數。 |
|
page_size |
integer |
10 |
否 |
每頁包含資料條數。 |
響應參數
|
參數 |
類型 |
說明 |
|
voice_id |
string |
音色ID。 |
|
gmt_create |
string |
建立音色的時間。 |
|
gmt_modified |
string |
修改音色的時間。 |
|
status |
string |
音色狀態:
|
查詢指定音色
擷取特定音色的詳細資料
Python SDK
介面說明
def query_voice(self, voice_id: str) -> List[str]:
'''
查詢指定音色的詳細資料
param: voice_id 需要查詢的音色ID
return: List[str] 音色詳細資料,包含狀態、建立時間、音頻連結等
'''
請求樣本
from dashscope.audio.tts_v2 import VoiceEnrollmentService
service = VoiceEnrollmentService()
voice_id = 'cosyvoice-v3-plus-myvoice-xxxxxxxx'
voice_details = service.query_voice(voice_id=voice_id)
print(f"Request ID: {service.get_last_request_id()}")
print(f"Voice Details: {voice_details}")
響應樣本
{
"gmt_create": "2024-09-13 11:29:41",
"resource_link": "https://yourAudioFileUrl",
"target_model": "cosyvoice-v3-plus",
"gmt_modified": "2024-09-13 11:29:41",
"status": "OK"
}
響應參數
|
參數 |
類型 |
說明 |
|
resource_link |
string |
被複刻的音訊URL。 |
|
target_model |
string |
驅動音色的語音合成模型,推薦 cosyvoice-v3-flash 或 cosyvoice-v3-plus。 必須與後續調用語音合成介面時使用的語音合成模型一致,否則合成會失敗。 |
|
gmt_create |
string |
建立音色的時間。 |
|
gmt_modified |
string |
修改音色的時間。 |
|
status |
string |
音色狀態:
|
Java SDK
介面說明
/**
* 查詢指定音色的詳細資料
*
* @param voiceId 需要查詢的音色ID
* @return Voice 音色詳細資料,包含狀態、建立時間、音頻連結等
* @throws NoApiKeyException 如果apikey為空白
* @throws InputRequiredException 如果必須參數為空白
*/
public Voice queryVoice(String voiceId) throws NoApiKeyException, InputRequiredException
請求樣本
需要引入第三方庫com.google.gson.Gson。
import com.alibaba.dashscope.audio.ttsv2.enrollment.Voice;
import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // 如果您沒有配置環境變數,請在此處用您的API-KEY進行替換
private static String voiceId = "cosyvoice-v3-plus-myvoice-xxx"; // 請按實際情況進行替換
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args)
throws NoApiKeyException, InputRequiredException {
VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey);
Voice voice = service.queryVoice(voiceId);
logger.info("Query successful. Request ID: {}", service.getLastRequestId());
logger.info("Voice Details: {}", new Gson().toJson(voice));
}
}
響應樣本
{
"gmt_create": "2024-09-13 11:29:41",
"resource_link": "https://yourAudioFileUrl",
"target_model": "cosyvoice-v3-plus",
"gmt_modified": "2024-09-13 11:29:41",
"status": "OK"
}
響應參數
|
參數 |
類型 |
說明 |
|
resource_link |
string |
被複刻的音訊URL。 |
|
target_model |
string |
驅動音色的語音合成模型,推薦 cosyvoice-v3-flash 或 cosyvoice-v3-plus。 必須與後續調用語音合成介面時使用的語音合成模型一致,否則合成會失敗。 |
|
gmt_create |
string |
建立音色的時間。 |
|
gmt_modified |
string |
修改音色的時間。 |
|
status |
string |
音色狀態:
|
RESTful API
基本資料
|
URL |
中國內地:
國際:
|
|
要求方法 |
POST |
|
要求標頭 |
|
|
訊息體 |
包含所有請求參數的訊息體如下,對於可選欄位,在實際業務中可根據需求省略: 重要
|
請求參數
|
參數 |
類型 |
預設值 |
是否必須 |
說明 |
|
model |
string |
- |
是 |
聲音複刻模型,固定為 |
|
action |
string |
- |
是 |
操作類型,固定為 |
|
voice_id |
string |
- |
是 |
需要查詢的音色ID。 |
響應參數
|
參數 |
類型 |
說明 |
|
resource_link |
string |
被複刻的音訊URL。 |
|
target_model |
string |
驅動音色的語音合成模型,推薦 cosyvoice-v3-flash 或 cosyvoice-v3-plus。 必須與後續調用語音合成介面時使用的語音合成模型一致,否則合成會失敗。 |
|
gmt_create |
string |
建立音色的時間。 |
|
gmt_modified |
string |
修改音色的時間。 |
|
status |
string |
音色狀態:
|
更新音色
使用新的音頻檔案更新一個已存在的音色。
Python SDK
介面說明
def update_voice(self, voice_id: str, url: str) -> None:
'''
更新音色
param: voice_id 音色id
param: url 用於聲音複刻的音頻檔案url
'''
請求樣本
from dashscope.audio.tts_v2 import VoiceEnrollmentService
service = VoiceEnrollmentService()
service.update_voice(
voice_id='cosyvoice-v3-plus-myvoice-xxxxxxxx',
url='https://your-new-audio-file-url'
)
print(f"Update submitted. Request ID: {service.get_last_request_id()}")
Java SDK
介面說明
/**
* 更新音色
*
* @param voiceId 需要更新的音色
* @param url 用於聲音複刻的音頻檔案url
* @throws NoApiKeyException 如果apikey為空白
* @throws InputRequiredException 如果必須參數為空白
*/
public void updateVoice(String voiceId, String url)
throws NoApiKeyException, InputRequiredException
請求樣本
import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // 如果您沒有配置環境變數,請在此處用您的API-KEY進行替換
private static String fileUrl = "https://your-audio-file-url"; // 請按實際情況進行替換
private static String voiceId = "cosyvoice-v3-plus-myvoice-xxx"; // 請按實際情況進行替換
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args)
throws NoApiKeyException, InputRequiredException {
VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey);
// 更新音色
service.updateVoice(voiceId, fileUrl);
logger.info("Update submitted. Request ID: {}", service.getLastRequestId());
}
}
RESTful API
基本資料
|
URL |
中國內地:
國際:
|
|
要求方法 |
POST |
|
要求標頭 |
|
|
訊息體 |
包含所有請求參數的訊息體如下,對於可選欄位,在實際業務中可根據需求省略: 重要
|
請求參數
|
參數 |
類型 |
預設值 |
是否必須 |
說明 |
|
model |
string |
- |
是 |
聲音複刻模型,固定為 |
|
action |
string |
- |
是 |
操作類型,固定為 |
|
voice_id |
string |
- |
是 |
待更新的音色ID。 |
|
url |
string |
- |
是 |
用於更新音色的音頻檔案URL。該URL要求公網可訪問。 如何錄製音頻請參見錄音操作指南。 |
刪除音色
刪除一個不再需要的音色以釋放配額。此操作無法復原。
Python SDK
介面說明
def delete_voice(self, voice_id: str) -> None:
'''
刪除音色
param: voice_id 需要刪除的音色
'''
請求樣本
from dashscope.audio.tts_v2 import VoiceEnrollmentService
service = VoiceEnrollmentService()
service.delete_voice(voice_id='cosyvoice-v3-plus-myvoice-xxxxxxxx')
print(f"Deletion submitted. Request ID: {service.get_last_request_id()}")
Java SDK
介面說明
/**
* 刪除音色
*
* @param voiceId 需要刪除的音色
* @throws NoApiKeyException 如果apikey為空白
* @throws InputRequiredException 如果必須參數為空白
*/
public void deleteVoice(String voiceId) throws NoApiKeyException, InputRequiredException
請求樣本
import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // 如果您沒有配置環境變數,請在此處用您的API-KEY進行替換
private static String voiceId = "cosyvoice-v3-plus-myvoice-xxx"; // 請按實際情況進行替換
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args)
throws NoApiKeyException, InputRequiredException {
VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey);
// 刪除音色
service.deleteVoice(voiceId);
logger.info("Deletion submitted. Request ID: {}", service.getLastRequestId());
}
}
RESTful API
基本資料
|
URL |
中國內地:
國際:
|
|
要求方法 |
POST |
|
要求標頭 |
|
|
訊息體 |
包含所有請求參數的訊息體如下,對於可選欄位,在實際業務中可根據需求省略: 重要
|
請求參數
|
參數 |
類型 |
預設值 |
是否必須 |
說明 |
|
model |
string |
- |
是 |
聲音複刻模型,固定為 |
|
action |
string |
- |
是 |
操作類型,固定為 |
|
voice_id |
string |
- |
是 |
待刪除的音色ID。 |
音色配額與自動清理規則
-
總數限制:1000個音色/帳號
當前介面不提供音色數量查詢功能,可通過調用查詢音色列表介面自行統計音色數目
-
自動清理:若單個音色在過去一年內未被用於任何語音合成請求,系統將自動將其刪除
計費說明
-
聲音複刻:建立、查詢、更新、刪除音色免費
-
使用複刻產生的專屬音色進行語音合成:按量(文本字元數)計費,參見即時語音合成-CosyVoice/Sambert
著作權與合法性
您需對所提供聲音的所有權及合法使用權負責,請注意閱讀服務合約。
錯誤碼
如遇報錯問題,請參見錯誤資訊進行排查。
常見問題
功能特性
Q:如何調節自訂音色的語速、音量?
與使用預置音色完全相同。在調用語音合成API時,傳入相應的參數即可,例如 speech_rate (Python) / speechRate (Java) 用於調節語速,volume 用於調節音量。詳情請參見語音合成API文檔(Java SDK/Python SDK/WebSocket API)
Q:除了Java和Python,其他語言(如Go, C#, Node.js)如何調用?
對於音色管理,請直接使用文檔中提供的RESTful API。對於語音合成,請使用WebSocket API,並將複刻得到的 voice_id 作為 voice 參數傳入。
故障排查
如遇代碼報錯問題,請根據錯誤碼中的資訊進行排查。
Q:使用複刻音色合成時音頻中出現額外內容如何處理?
若使用複刻音色合成音頻時,發現輸出的音頻中包含輸入文本以外的額外字元或雜音,請按以下步驟排查:
-
檢查源音頻品質
複刻音頻品質直接影響合成效果。確保源音頻滿足以下要求:
-
無背景雜音和雜音
-
音質清晰(建議採樣率≥16kHz)
-
音頻格式:WAV格式優於MP3(避免有損壓縮)
-
單聲道(立體聲可能引入幹擾)
-
無靜音段或過長停頓
-
語速適中(過快的語速影響特徵提取)
-
-
檢查輸入文本
確認輸入文本中不包含特殊符號或標記:
-
避免使用
**、""、''等特殊符號 -
若非用於LaTeX公式包裹,建議預先處理過濾特殊符號
-
-
驗證音色複刻參數
確保建立音色時,語言參數(
language_hints/languageHints)設定正確 -
嘗試重新複刻
使用品質更高的源音頻重新進行複刻,並測試合成效果。
-
對比系統音色
使用系統預置音色測試相同文本,確認是否為複刻音色特定問題。
Q:使用複刻音色產生的音頻無聲音如何排查?
-
確認音色狀態
調用查詢指定音色介面,查看音色
status是否為OK。 -
檢查模型版本一致性
確保複刻音色時使用的
target_model參數與語音合成時的model參數完全一致。例如:-
複刻時使用
cosyvoice-v3-plus -
合成時也必須使用
cosyvoice-v3-plus
-
-
驗證源音頻品質
檢查複刻音色時使用的源音頻是否符合音頻要求:
-
音頻時間長度:10-20秒
-
音質清晰
-
無背景雜音
-
-
檢查請求參數
確認語音合成時請求參數
voice設定為複刻音色的ID。
Q:聲音複刻後合成效果不穩定或語音不完整如何處理?
如果複刻音色後合成的語音出現以下問題:
-
語音播放不完整,唯讀出部分文字
-
合成效果不穩定,時好時壞
-
語音中包含異常停頓或靜音段
可能原因:源音頻品質不符合要求
解決方案:檢查源音頻是否符合如下要求,建議按照錄音操作指南重新錄製
-
檢查音頻連續性:確保源音頻中語音內容連續,避免長時間停頓或靜音段(超過2秒)。如果音頻中存在明顯的空白段,會導致模型將靜音或雜訊作為音色特徵的一部分,影響產生效果
-
檢查語音活動比例:確保有效語音占音頻總時間長度的60%以上。如果背景雜訊、非語音段過多,會干擾音色特徵提取
-
驗證音頻品質細節:
-
音頻時間長度:10-20秒(推薦15秒左右)
-
發音清晰,語速平穩
-
無背景雜音、迴音、雜音
-
語音能量集中,無長時間靜音段
-
Q:為什麼找不到 VoiceEnrollmentService 類?
SDK版本過低。請安裝最新版SDK。
Q:聲音複刻效果不佳,有雜音或不清晰怎麼辦?
這通常是由於輸入音頻品質不高導致的。請嚴格遵循錄音操作指南重新錄製並上傳音頻。
Q:為什麼使用複刻音色合成很短的文本(例如單個詞語)時,前面會出現較長的靜音或音頻整體時間長度異常?
聲音複刻模型會學習樣本音頻中的停頓與節奏,如果原始錄音中包含較長的起始靜音或停頓,合成結果也可能保留類似模式。對於單字或極短文本,這種靜音比例會被放大,看起來像“音頻很長但幾乎都是靜音”。建議在錄製樣本音頻時避免長時間靜音,合成時盡量使用完整句子或較長文本;如必須對單個詞語進行合成,可在前後補充少量上下文或使用同音替換詞以規避極端情況。