CosyVoice声音复刻服务基于生成式语音大模型,使用10~20秒音频样本即可生成高度相似且自然的定制声音,无需传统训练过程。声音设计通过文本描述生成定制化音色,支持多语言和多维度音色特征定义,适用于广告配音、角色塑造、有声内容创作等多种应用。声音复刻/设计与语音合成是前后关联的两个步骤。本文档聚焦于介绍声音复刻/设计的参数和接口细节,语音合成请参见实时语音合成-CosyVoice。
用户指南:关于模型介绍和选型建议请参见实时语音合成-CosyVoice。
本文档专用于CosyVoice声音复刻/设计接口;若您使用的是千问模型,请参见声音复刻(Qwen)和声音设计(Qwen)。
CosyVoice 声音设计基于 FunAudioGen-VD 模型能力。
支持的模型
声音复刻:
cosyvoice-v3.5-plus、cosyvoice-v3.5-flash
cosyvoice-v3-plus、cosyvoice-v3-flash
cosyvoice-v2
声音设计:
cosyvoice-v3.5-plus、cosyvoice-v3.5-flash
cosyvoice-v3-plus、cosyvoice-v3-flash
支持的语言
声音复刻:因驱动音色的语音合成模型(通过
target_model/targetModel参数指定)而异:cosyvoice-v2:中文(普通话)、英文
cosyvoice-v3-flash:中文(普通话、广东话、东北话、甘肃话、贵州话、河南话、湖北话、江西话、闽南话、宁夏话、山西话、陕西话、山东话、上海话、四川话、天津话、云南话)、英文、法语、德语、日语、韩语、俄语、葡萄牙语、泰语、印尼语、越南语
cosyvoice-v3-plus:中文(普通话)、英文、法语、德语、日语、韩语、俄语
cosyvoice-v3.5-plus、cosyvoice-v3.5-flash:中文(普通话、广东话、河南话、湖北话、闽南话、宁夏话、陕西话、山东话、上海话、四川话)、英文、法语、德语、日语、韩语、俄语、葡萄牙语、泰语、印尼语、越南语
当前声音复刻暂不支持西班牙语、意大利语等语种。
声音设计:中文、英文。
快速开始:从声音复刻到语音合成
声音复刻与语音合成是紧密关联的两个独立步骤,遵循“先创建,后使用”的流程:
准备录音文件
将符合声音复刻:输入音频格式的音频文件上传至公网可访问的位置,如阿里云对象存储OSS,并确保URL可公开访问。
创建音色
调用创建音色接口。此步骤必须指定
target_model/targetModel,声明创建的音色将由哪个语音合成模型驱动。若已有创建好的音色(调用查询音色列表接口查看),可跳过这一步直接进行下一步。
使用音色进行语音合成
使用创建音色接口创建音色成功后,系统会返回一个
voice_id/voiceID:该
voice_id/voiceID可直接作为语音合成接口或各语言 SDK 中的voice参数使用,用于后续的文本转语音。支持多种调用形态,包括非流式、单向流式以及双向流式合成。
合成时指定的语音合成模型必须与创建音色时的
target_model/targetModel保持一致,否则合成会失败。
示例代码:
import os
import time
import dashscope
from dashscope.audio.tts_v2 import VoiceEnrollmentService, SpeechSynthesizer
# 1. 环境准备
# 推荐通过环境变量配置API Key
# 新加坡和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# 若没有配置环境变量,请用百炼API Key将下行替换为:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
if not dashscope.api_key:
raise ValueError("DASHSCOPE_API_KEY environment variable not set.")
# 以下为新加坡地域WebSocket url,若使用北京地域的模型,需将url替换为:wss://dashscope.aliyuncs.com/api-ws/v1/inference
dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference'
# 以下为新加坡地域HTTP url,若使用北京地域的模型,需将url替换为:https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
# 2. 定义复刻参数
TARGET_MODEL = "cosyvoice-v3.5-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}")快速开始:从声音设计到语音合成
声音设计与语音合成是紧密关联的两个独立步骤,遵循“先创建,后使用”的流程:
准备声音设计所需的声音描述与试听文本。
声音描述(voice_prompt):定义目标音色的特征(关于如何编写请参见“声音设计:如何编写高质量的声音描述?”)。
试听文本(preview_text):目标音色生成的预览音频朗读的内容(如“大家好,欢迎收听”)。
调用创建音色接口,创建一个专属音色,获取音色名和预览音频。
此步骤必须指定
target_model,声明创建的音色将由哪个语音合成模型驱动试听获取预览音频来判断是否符合预期;若符合要求,继续下一步,否则,重新设计。
若已有创建好的音色(调用查询音色列表接口查看),可跳过这一步直接进行下一步。
使用音色进行语音合成
使用创建音色接口创建音色成功后,系统会返回一个
voice_id/voiceID:该
voice_id/voiceID可直接作为语音合成接口或各语言 SDK 中的voice参数使用,用于后续的文本转语音。支持多种调用形态,包括非流式、单向流式以及双向流式合成。
合成时指定的语音合成模型必须与创建音色时的
target_model/targetModel保持一致,否则合成会失败。
示例代码:
生成专属音色并试听效果,若对效果满意,进行下一步;否则重新生成。
Python
import requests import base64 import os def create_voice_and_play(): # 新加坡和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key = "sk-xxx" api_key = os.getenv("DASHSCOPE_API_KEY") if not api_key: print("错误: 未找到DASHSCOPE_API_KEY环境变量,请先设置API Key") return None, None, None # 准备请求数据 headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } data = { "model": "voice-enrollment", "input": { "action": "create_voice", "target_model": "cosyvoice-v3.5-plus", "voice_prompt": "A composed middle-aged male announcer with a deep, rich and magnetic voice, a steady speaking speed and clear articulation, is suitable for news broadcasting or documentary commentary.", "preview_text": "Dear listeners, hello everyone. Welcome to the evening news.", "prefix": "announcer" }, "parameters": { "sample_rate": 24000, "response_format": "wav" } } # 以下为新加坡地域url,若使用北京地域的模型,需将url替换为:https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization url = "https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization" try: # 发送请求 response = requests.post( url, headers=headers, json=data, timeout=60 # 添加超时设置 ) if response.status_code == 200: result = response.json() # 获取音色ID voice_id = result["output"]["voice_id"] print(f"音色ID: {voice_id}") # 获取预览音频数据 base64_audio = result["output"]["preview_audio"]["data"] # 解码Base64音频数据 audio_bytes = base64.b64decode(base64_audio) # 保存音频文件到本地 filename = f"{voice_id}_preview.wav" # 将音频数据写入本地文件 with open(filename, 'wb') as f: f.write(audio_bytes) print(f"音频已保存到本地文件: {filename}") print(f"文件路径: {os.path.abspath(filename)}") return voice_id, audio_bytes, filename else: print(f"请求失败,状态码: {response.status_code}") print(f"响应内容: {response.text}") return None, None, None except requests.exceptions.RequestException as e: print(f"网络请求发生错误: {e}") return None, None, None except KeyError as e: print(f"响应数据格式错误,缺少必要的字段: {e}") print(f"响应内容: {response.text if 'response' in locals() else 'No response'}") return None, None, None except Exception as e: print(f"发生未知错误: {e}") return None, None, None if __name__ == "__main__": print("开始创建语音...") voice_id, audio_data, saved_filename = create_voice_and_play() if voice_id: print(f"\n成功创建音色 '{voice_id}'") print(f"音频文件已保存: '{saved_filename}'") print(f"文件大小: {os.path.getsize(saved_filename)} 字节") else: print("\n音色创建失败")Java
需要导入Gson依赖,若是使用Maven或者Gradle,添加依赖方式如下:
Maven
在
pom.xml中添加如下内容:<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.13.1</version> </dependency>Gradle
在
build.gradle中添加如下内容:// https://mvnrepository.com/artifact/com.google.code.gson/gson implementation("com.google.code.gson:gson:2.13.1")import com.google.gson.JsonObject; import com.google.gson.JsonParser; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.Base64; public class Main { public static void main(String[] args) { Main example = new Main(); example.createVoice(); } public void createVoice() { // 新加坡和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key // 若没有配置环境变量,请用百炼API Key将下行替换为:String apiKey = "sk-xxx" String apiKey = System.getenv("DASHSCOPE_API_KEY"); // 创建JSON请求体字符串 String jsonBody = "{\n" + " \"model\": \"voice-enrollment\",\n" + " \"input\": {\n" + " \"action\": \"create_voice\",\n" + " \"target_model\": \"cosyvoice-v3.5-plus\",\n" + " \"voice_prompt\": \"A composed middle-aged male announcer with a deep, rich and magnetic voice, a steady speaking speed and clear articulation, is suitable for news broadcasting or documentary commentary.\",\n" + " \"preview_text\": \"Dear listeners, hello everyone. Welcome to the evening news.\",\n" + " \"prefix\": \"announcer\"\n" + " },\n" + " \"parameters\": {\n" + " \"sample_rate\": 24000,\n" + " \"response_format\": \"wav\"\n" + " }\n" + "}"; HttpURLConnection connection = null; try { // 以下为新加坡地域url,若使用北京地域的模型,需将url替换为:https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization URL url = new URL("https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization"); connection = (HttpURLConnection) url.openConnection(); // 设置请求方法和头部 connection.setRequestMethod("POST"); connection.setRequestProperty("Authorization", "Bearer " + apiKey); connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true); connection.setDoInput(true); // 发送请求体 try (OutputStream os = connection.getOutputStream()) { byte[] input = jsonBody.getBytes("UTF-8"); os.write(input, 0, input.length); os.flush(); } // 获取响应 int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // 读取响应内容 StringBuilder response = new StringBuilder(); try (BufferedReader br = new BufferedReader( new InputStreamReader(connection.getInputStream(), "UTF-8"))) { String responseLine; while ((responseLine = br.readLine()) != null) { response.append(responseLine.trim()); } } // 解析JSON响应 JsonObject jsonResponse = JsonParser.parseString(response.toString()).getAsJsonObject(); JsonObject outputObj = jsonResponse.getAsJsonObject("output"); JsonObject previewAudioObj = outputObj.getAsJsonObject("preview_audio"); // 获取音色名称 String voiceId = outputObj.get("voice_id").getAsString(); System.out.println("音色ID: " + voiceId); // 获取Base64编码的音频数据 String base64Audio = previewAudioObj.get("data").getAsString(); // 解码Base64音频数据 byte[] audioBytes = Base64.getDecoder().decode(base64Audio); // 保存音频到本地文件 String filename = voiceId + "_preview.wav"; saveAudioToFile(audioBytes, filename); System.out.println("音频已保存到本地文件: " + filename); } else { // 读取错误响应 StringBuilder errorResponse = new StringBuilder(); try (BufferedReader br = new BufferedReader( new InputStreamReader(connection.getErrorStream(), "UTF-8"))) { String responseLine; while ((responseLine = br.readLine()) != null) { errorResponse.append(responseLine.trim()); } } System.out.println("请求失败,状态码: " + responseCode); System.out.println("错误响应: " + errorResponse.toString()); } } catch (Exception e) { System.err.println("请求发生错误: " + e.getMessage()); e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); } } } private void saveAudioToFile(byte[] audioBytes, String filename) { try { File file = new File(filename); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(audioBytes); } System.out.println("音频已保存到: " + file.getAbsolutePath()); } catch (IOException e) { System.err.println("保存音频文件时发生错误: " + e.getMessage()); e.printStackTrace(); } } }使用上一步生成的专属音色进行语音合成。
这里参考了非流式调用示例代码,将
voice参数替换为声音设计生成的专属音色进行语音合成。关键原则:声音设计时使用的模型 (
target_model) 必须与后续进行语音合成时使用的模型 (model) 保持一致,否则会导致合成失败。Python
# coding=utf-8 import dashscope from dashscope.audio.tts_v2 import * import os # 新加坡地域和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key # 若没有配置环境变量,请用百炼API Key将下行替换为:dashscope.api_key = "sk-xxx" dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY') # 以下为新加坡地域url,若使用北京地域的模型,需将url替换为:wss://dashscope.aliyuncs.com/api-ws/v1/inference dashscope.base_websocket_api_url='wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference' # 声音设计、语音合成要使用相同的模型 model = "cosyvoice-v3.5-plus" # 将voice参数替换为声音设计生成的专属音色 voice = "your_voice" # 实例化SpeechSynthesizer,并在构造方法中传入模型(model)、音色(voice)等请求参数 synthesizer = SpeechSynthesizer(model=model, voice=voice) # 发送待合成文本,获取二进制音频 audio = synthesizer.call("今天天气怎么样?") # 首次发送文本时需建立 WebSocket 连接,因此首包延迟会包含连接建立的耗时 print('[Metric] requestId为:{},首包延迟为:{}毫秒'.format( synthesizer.get_last_request_id(), synthesizer.get_first_package_delay())) # 将音频保存至本地 with open('output.mp3', 'wb') as f: f.write(audio)Java
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam; import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer; import com.alibaba.dashscope.utils.Constants; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; public class Main { // 声音设计、语音合成要使用相同的模型 private static String model = "cosyvoice-v3.5-plus"; // 将voice参数替换为声音设计生成的专属音色 private static String voice = "your_voice_id"; public static void streamAudioDataToSpeaker() { // 请求参数 SpeechSynthesisParam param = SpeechSynthesisParam.builder() // 新加坡地域和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key // 若没有配置环境变量,请用百炼API Key将下行替换为:.apiKey("sk-xxx") .apiKey(System.getenv("DASHSCOPE_API_KEY")) .model(model) // 模型 .voice(voice) // 音色 .build(); // 同步模式:禁用回调(第二个参数为null) SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null); ByteBuffer audio = null; try { // 阻塞直至音频返回 audio = synthesizer.call("今天天气怎么样?"); } catch (Exception e) { throw new RuntimeException(e); } finally { // 任务结束关闭websocket连接 synthesizer.getDuplexApi().close(1000, "bye"); } if (audio != null) { // 将音频数据保存到本地文件“output.mp3”中 File file = new File("output.mp3"); // 首次发送文本时需建立 WebSocket 连接,因此首包延迟会包含连接建立的耗时 System.out.println( "[Metric] requestId为:" + synthesizer.getLastRequestId() + "首包延迟(毫秒)为:" + synthesizer.getFirstPackageDelay()); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(audio.array()); } catch (IOException e) { throw new RuntimeException(e); } } } public static void main(String[] args) { // 以下为新加坡地域url,若使用北京地域的模型,需将url替换为:wss://dashscope.aliyuncs.com/api-ws/v1/inference Constants.baseWebsocketApiUrl = "wss://dashscope-intl.aliyuncs.com/api-ws/v1/inference"; streamAudioDataToSpeaker(); System.exit(0); } }
API参考
使用不同 API 时,请确保使用同一账号进行操作。
Java和Python DashScope SDK不支持声音设计。使用声音设计功能时请参见RESTful API。
创建音色
RESTful API
URL
中国内地:
POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization国际:
POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization请求头
参数
类型
是否必须
说明
Authorization
string
鉴权令牌,格式为
Bearer <your_api_key>,使用时,将“<your_api_key>”替换为实际的API Key。Content-Type
string
请求体中传输的数据的媒体类型。固定为
application/json。消息体
包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略。
重要注意区分如下参数:
model:声音复刻/设计模型,固定为voice-enrollmenttarget_model:驱动音色的语音合成模型,须和后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败
声音复刻
{ "model": "voice-enrollment", "input": { "action": "create_voice", "target_model": "cosyvoice-v3.5-plus", "prefix": "myvoice", "url": "https://yourAudioFileUrl", "language_hints": ["zh"] } }声音设计
{ "model": "voice-enrollment", "input": { "action": "create_voice", "target_model": "cosyvoice-v3.5-plus", "voice_prompt": "沉稳的中年男性播音员,音色低沉浑厚,富有磁性,语速平稳,吐字清晰,适合用于新闻播报或纪录片解说。", "preview_text": "各位听众朋友,大家好,欢迎收听晚间新闻。", "prefix": "announcer", "language_hints": ["zh"] }, "parameters": { "sample_rate": 24000, "response_format": "wav" } }请求参数
参数
类型
默认值
是否必须
说明
model
string
-
声音复刻/设计模型,固定为
voice-enrollment。action
string
-
操作类型,固定为
create_voice。target_model
string
-
驱动音色的语音合成模型(参见支持的模型)。
必须与后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败。
url
string
-
重要仅在声音复刻时必须使用该参数
用于复刻音色的音频文件URL,要求公网可访问。
如何录音请参见录音操作指南。
voice_prompt
string
-
重要仅在声音设计时必须使用该参数
声音描述。最大长度 500 字符。
只支持中文和英文。
preview_text
string
-
重要仅在声音设计时必须使用该参数
预览音频对应的文本。最大长度 200 字符。
支持中文(zh)、英文(en)。
prefix
string
-
为音色指定一个便于识别的名称(仅允许数字和英文字母,不超过10个字符)。建议选用与角色、场景相关的标识。
该关键字会在设计的音色名中出现,例如关键字为“announcer”,最终音色名为:
声音复刻:cosyvoice-v3.5-plus-announcer-8aae0c0397fa408ca60c29cf******
声音设计:cosyvoice-v3.5-plus-vd-announcer-8aae0c0397fa408ca60c29cf******
language_hints
array[string]
["zh"]
指定用于提取目标音色特征的样本音频语种,仅适用于 cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash 和 cosyvoice-v3-plus 模型。
注意:此参数为数组,但当前版本仅处理第一个元素,因此建议只传入一个值。
功能说明:
声音复刻
该参数用于辅助模型识别样本音频(原始参考音频)的语种,从而更准确地提取音色特征,提升复刻效果。若设置的语言提示与实际音频语言不符(例如为中文音频设置
en),系统将忽略此提示,并依据音频内容自动检测语言。取值范围(因模型而异):
cosyvoice-v3-plus:
zh:中文(默认值)
en:英文
fr:法语
de:德语
ja:日语
ko:韩语
ru:俄语
cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash:
zh:中文(默认值)
en:英文
fr:法语
de:德语
ja:日语
ko:韩语
ru:俄语
pt:葡萄牙语
th:泰语
id:印尼语
vi:越南语
对于中文方言(例如东北话、粤语等),建议仍将
language_hints设置为zh,方言风格应在后续语音合成调用中通过文本内容或instruct等参数进行控制。声音设计
指定声音设计生成音色的语言倾向。该参数影响生成音色的语言特征和发音倾向,建议根据实际使用场景选择对应语言代码。
若使用该参数,设置的语种要和
preview_text的语种一致。取值范围:
zh:中文(默认值)
en:英文
max_prompt_audio_length
float
10.0
否
重要仅在声音复刻场景下可以使用该参数
音频预处理后用于声音复刻的参考音频最大时长,单位为秒。仅适用于 cosyvoice-v3.5-plus、cosyvoice-v3.5-flash和cosyvoice-v3-flash 模型。
sample_rate
int
24000
重要仅在声音设计场景下可以使用该参数
声音设计生成的预览音频采样率(单位:Hz)。
取值范围:
16000
24000
48000
response_format
string
wav
重要仅在声音设计场景下可以使用该参数
声音设计生成的预览音频格式。
取值范围:
pcm
wav
mp3
响应参数
需关注的参数如下:
参数
类型
说明
voice_id
string
音色ID,可直接用于语音合成接口的
voice参数。data
string
声音设计生成的预览音频数据,以 Base64 编码字符串形式返回。
sample_rate
int
声音设计生成的预览音频采样率(单位:Hz),与音色创建时的采样率一致,未指定则默认为 24000 Hz。
response_format
string
声音设计生成的预览音频格式,与音色创建时的音频格式一致,未指定则默认为wav。
target_model
string
驱动音色的语音合成模型(参见支持的模型)。
必须与后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败。
request_id
string
Request ID。
count
integer
本次请求实际“创建音色”次数。
创建音色时,count恒为1。
示例代码
重要注意区分如下参数:
model:声音复刻/设计模型,固定为voice-enrollmenttarget_model:驱动音色的语音合成模型,须和后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败
声音复刻
若未将API Key配置到环境变量,需将示例中的
$DASHSCOPE_API_KEY替换为实际的API Key。# ======= 重要提示 ======= # 以下为新加坡地域url,若使用北京地域的模型,需将url替换为:https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization # 新加坡地域和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key # === 执行时请删除该注释 === curl -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \ -H "Authorization: Bearer $DASHSCOPE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "voice-enrollment", "input": { "action": "create_voice", "target_model": "cosyvoice-v3.5-plus", "prefix": "myvoice", "url": "https://yourAudioFileUrl" } }'声音设计
若未将API Key配置到环境变量,需将示例中的
$DASHSCOPE_API_KEY替换为实际的API Key。# ======= 重要提示 ======= # 以下为新加坡地域url,若使用北京地域的模型,需将url替换为:https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization # 新加坡地域和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key # === 执行时请删除该注释 === curl -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \ -H "Authorization: Bearer $DASHSCOPE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "voice-enrollment", "input": { "action": "create_voice", "target_model": "cosyvoice-v3.5-plus", "voice_prompt": "沉稳的中年男性播音员,音色低沉浑厚,富有磁性,语速平稳,吐字清晰,适合用于新闻播报或纪录片解说。", "preview_text": "各位听众朋友,大家好,欢迎收听晚间新闻。", "prefix": "announcer" }, "parameters": { "sample_rate": 24000, "response_format": "wav" } }'
Python SDK
接口说明
def create_voice(self, target_model: str, prefix: str, url: str, language_hints: List[str] = None) -> str:
'''
创建一个新的定制音色。
param: target_model 驱动音色的语音合成模型,必须与后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败。
param: prefix 为音色指定一个便于识别的名称(仅允许数字、大小写字母和下划线,不超过10个字符)。建议选用与角色、场景相关的标识。该关键字会在复刻的音色名中出现,生成的音色名格式为:模型名-前缀-唯一标识,如cosyvoice-v3-plus-myvoice-xxxxxxxx。
param: url 用于复刻音色的音频文件URL,要求公网可访问。
param: language_hints 指定用于提取目标音色特征的样本音频语种,仅适用于 cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash 和 cosyvoice-v3-plus 模型。
该参数用于辅助模型识别样本音频(原始参考音频)的语种,从而更准确地提取音色特征,提升复刻效果。
若设置的语言提示与实际音频语言不符(例如为中文音频设置 en),系统将忽略此提示,并依据音频内容自动检测语言。
取值范围(因模型而异):
cosyvoice-v3-plus:zh(默认值)、en、fr、de、ja、ko、ru。
cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash:zh(默认值)、en、fr、de、ja、ko、ru、pt、th、id、vi。
此参数为数组,但当前版本仅处理第一个元素,建议只传入一个值。
max_prompt_audio_length 音频预处理后用于声音复刻的参考音频最大时长,单位为秒。仅适用于 cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash 模型。
return: voice_id 音色ID,可直接用于语音合成接口的voice参数。
'''target_model:驱动音色的语音合成模型,须和后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败language_hints:指定用于提取目标音色特征的样本音频语种,仅适用于cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash和cosyvoice-v3-plus模型功能说明:
声音复刻
该参数用于辅助模型识别样本音频(原始参考音频)的语种,从而更准确地提取音色特征,提升复刻效果。若设置的语言提示与实际音频语言不符(例如为中文音频设置
en),系统将忽略此提示,并依据音频内容自动检测语言。取值范围(因模型而异):
cosyvoice-v3-plus:
zh:中文(默认值)
en:英文
fr:法语
de:德语
ja:日语
ko:韩语
ru:俄语
cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash:
zh:中文(默认值)
en:英文
fr:法语
de:德语
ja:日语
ko:韩语
ru:俄语
pt:葡萄牙语
th:泰语
id:印尼语
vi:越南语
对于中文方言(例如东北话、粤语等),建议仍将
language_hints设置为zh,方言风格应在后续语音合成调用中通过文本内容或instruct等参数进行控制。声音设计
指定声音设计生成音色的语言倾向。该参数影响生成音色的语言特征和发音倾向,建议根据实际使用场景选择对应语言代码。
若使用该参数,设置的语种要和
preview_text的语种一致。取值范围:
zh:中文(默认值)
en:英文
请求示例
from dashscope.audio.tts_v2 import VoiceEnrollmentService
service = VoiceEnrollmentService()
# 避免频繁调用。每次调用都会创建新音色,达到配额上限后将无法创建。
voice_id = service.create_voice(
target_model='cosyvoice-v3.5-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 驱动音色的语音合成模型,必须与后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败。
* @param prefix 为音色指定一个便于识别的名称(仅允许数字、大小写字母和下划线,不超过10个字符)。建议选用与角色、场景相关的标识。该关键字会在复刻的音色名中出现,生成的音色名格式为:模型名-前缀-唯一标识,如cosyvoice-v3-plus-myvoice-xxxxxxxx。
* @param url 用于复刻音色的音频文件URL,要求公网可访问。
* @param customParam 自定义参数。可在此处指定languageHints和maxPromptAudioLength。
* languageHints:指定用于提取目标音色特征的样本音频语种,仅适用于 cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash 和 cosyvoice-v3-plus 模型。
* 该参数用于辅助模型识别样本音频(原始参考音频)的语种,从而更准确地提取音色特征,提升复刻效果。
* 若设置的语言提示与实际音频语言不符(例如为中文音频设置 en),系统将忽略此提示,并依据音频内容自动检测语言。
* 取值范围(因模型而异):
* cosyvoice-v3-plus:zh(默认值)、en、fr、de、ja、ko、ru。
* cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash:zh(默认值)、en、fr、de、ja、ko、ru、pt、th、id、vi。
* 当前版本仅处理第一个元素,建议只传入一个值。
* maxPromptAudioLength:音频预处理后用于声音复刻的参考音频最大时长,单位为秒。仅适用于 cosyvoice-v3-flash 模型。
* @return Voice 新创建的音色,通过Voice的getVoiceId方法能够获取音色ID,可直接用于语音合成接口的voice参数。
* @throws NoApiKeyException 如果apikey为空。
* @throws InputRequiredException 如果必须参数为空。
*/
public Voice createVoice(String targetModel, String prefix, String url, VoiceEnrollmentParam customParam) throws NoApiKeyException, InputRequiredExceptiontargetModel:驱动音色的语音合成模型,须和后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败languageHints:指定用于提取目标音色特征的样本音频语种,仅适用于cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash和cosyvoice-v3-plus模型功能说明:
声音复刻
该参数用于辅助模型识别样本音频(原始参考音频)的语种,从而更准确地提取音色特征,提升复刻效果。若设置的语言提示与实际音频语言不符(例如为中文音频设置
en),系统将忽略此提示,并依据音频内容自动检测语言。取值范围(因模型而异):
cosyvoice-v3-plus:
zh:中文(默认值)
en:英文
fr:法语
de:德语
ja:日语
ko:韩语
ru:俄语
cosyvoice-v3.5-plus、cosyvoice-v3.5-flash、cosyvoice-v3-flash:
zh:中文(默认值)
en:英文
fr:法语
de:德语
ja:日语
ko:韩语
ru:俄语
pt:葡萄牙语
th:泰语
id:印尼语
vi:越南语
对于中文方言(例如东北话、粤语等),建议仍将
language_hints设置为zh,方言风格应在后续语音合成调用中通过文本内容或instruct等参数进行控制。声音设计
指定声音设计生成音色的语言倾向。该参数影响生成音色的语言特征和发音倾向,建议根据实际使用场景选择对应语言代码。
若使用该参数,设置的语种要和
preview_text的语种一致。取值范围:
zh:中文(默认值)
en:英文
请求示例
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.5-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和请求头与创建音色接口相同
消息体
包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略。
重要model:声音复刻/设计模型,固定为voice-enrollment,请勿修改。{ "model": "voice-enrollment", "input": { "action": "list_voice", "prefix": "announcer" "page_size": 10, "page_index": 0 } }请求参数
参数
类型
默认值
是否必须
说明
model
string
-
声音复刻/设计模型,固定为
voice-enrollment。action
string
-
操作类型,固定为
list_voice。prefix
string
-
和创建音色时使用的prefix相同。仅允许数字和英文字母,不超过10个字符。
page_index
integer
0
页码索引,需大于或等于0。
page_size
integer
10
每页包含数据条数。取值范围:[0, 1000]。
响应参数
需关注的参数如下:
参数
类型
说明
voice_id
string
音色ID,可直接用于语音合成接口的
voice参数。target_model
string
驱动音色的语音合成模型(参见支持的模型)。
必须与后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败。
gmt_create
string
创建音色的时间。
gmt_modified
string
修改音色的时间。
voice_prompt
string
声音描述。
preview_text
string
试听文本。
request_id
string
Request ID。
status
string
音色状态:
DEPLOYING: 审核中
OK:审核通过,可调用
UNDEPLOYED:审核不通过,不可调用
示例代码
重要model:声音复刻/设计模型,固定为voice-enrollment,请勿修改。若未将API Key配置到环境变量,需将示例中的
$DASHSCOPE_API_KEY替换为实际的API Key。# ======= 重要提示 ======= # 以下为新加坡地域url,若使用北京地域的模型,需将url替换为:https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization # 新加坡地域和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key # === 执行时请删除该注释 === curl -X POST https://dashscope.aliyuncs-intl.com/api/v1/services/audio/tts/customization \ -H "Authorization: Bearer $DASHSCOPE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "voice-enrollment", "input": { "action": "list_voice", "prefix": "announcer", "page_size": 10, "page_index": 0 } }'
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,可直接用于语音合成接口的 |
target_model | string | 驱动音色的语音合成模型(参见支持的模型)。 必须与后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败。 |
gmt_create | string | 创建音色的时间。 |
gmt_modified | string | 修改音色的时间。 |
voice_prompt | string | 声音描述。 |
preview_text | string | 试听文本。 |
request_id | string | Request ID。 |
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,可直接用于语音合成接口的 |
target_model | string | 驱动音色的语音合成模型(参见支持的模型)。 必须与后续调用语音合成接口时使用的语音合成模型一致,否则合成会失败。 |
gmt_create | string | 创建音色的时间。 |
gmt_modified | string | 修改音色的时间。 |
voice_prompt | string | 声音描述。 |
preview_text | string | 试听文本。 |
request_id | string | Request ID。 |
status | string | 音色状态:
|
查询特定音色
通过音色名称获取特定音色的详细信息。
RESTful API
URL和请求头与创建音色接口相同
消息体
包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略。
重要model:声音复刻/设计模型,固定为voice-enrollment,请勿修改。{ "model": "voice-enrollment", "input": { "action": "query_voice", "voice_id": "yourVoiceID" } }请求参数
参数
类型
默认值
是否必须
说明
model
string
-
声音复刻/设计模型,固定为
voice-enrollment。action
string
-
操作类型,固定为
query_voice。voice_id
string
-
待查询的音色ID。
响应参数
参数说明请参见查询音色列表接口。
示例代码
重要model:声音复刻/设计模型,固定为voice-enrollment,请勿修改。若未将API Key配置到环境变量,需将示例中的
$DASHSCOPE_API_KEY替换为实际的API Key。# ======= 重要提示 ======= # 以下为新加坡地域url,若使用北京地域的模型,需将url替换为:https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization # 新加坡地域和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key # === 执行时请删除该注释 === curl -X POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization \ -H "Authorization: Bearer $DASHSCOPE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "voice-enrollment", "input": { "action": "query_voice", "voice_id": "yourVoiceID" } }'
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.5-plus",
"gmt_modified": "2024-09-13 11:29:41",
"status": "OK"
}响应参数
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.5-plus",
"gmt_modified": "2024-09-13 11:29:41",
"status": "OK"
}响应参数
更新音色(仅限声音复刻)
使用新的音频文件更新一个已存在的音色。
声音设计不支持该功能。
RESTful API
URL和请求头与创建音色接口相同
消息体
包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
重要model:声音复刻/设计模型,固定为voice-enrollment,请勿修改。{ "model": "voice-enrollment", "input": { "action": "update_voice", "voice_id": "yourVoiceId", "url": "https://yourAudioFileUrl" } }请求参数
参数
类型
默认值
是否必须
说明
model
string
-
声音复刻/设计模型,固定为
voice-enrollment。action
string
-
操作类型,固定为
update_voice。voice_id
string
-
待更新的音色。
url
string
-
用于更新音色的音频文件URL。该URL要求公网可访问。
响应参数
示例代码
重要model:声音复刻/设计模型,固定为voice-enrollment,请勿修改。若未将API Key配置到环境变量,需将示例中的
$DASHSCOPE_API_KEY替换为实际的API Key。# ======= 重要提示 ======= # 以下为新加坡地域url,若使用北京地域的模型,需将url替换为:https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization # 新加坡地域和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key # === 执行时请删除该注释 === curl -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \ -H "Authorization: Bearer $DASHSCOPE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "voice-enrollment", "input": { "action": "update_voice", "voice_id": "yourVoiceId", "url": "https://yourAudioFileUrl" } }'
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和请求头与创建音色接口相同
消息体
包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
重要model:声音复刻/设计模型,固定为voice-enrollment,请勿修改。{ "model": "voice-enrollment", "input": { "action": "delete_voice", "voice_id": "yourVoiceID" } }请求参数
参数
类型
默认值
是否必须
说明
model
string
-
声音复刻/设计模型,固定为
voice-enrollment。action
string
-
操作类型,固定为
delete_voice。voice_id
string
-
待删除的音色。
响应参数
示例代码
重要model:声音复刻/设计模型,固定为voice-enrollment,请勿修改。若未将API Key配置到环境变量,需将示例中的
$DASHSCOPE_API_KEY替换为实际的API Key。# ======= 重要提示 ======= # 以下为新加坡地域url,若使用北京地域的模型,需将url替换为:https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization # 新加坡地域和北京地域的API Key不同。获取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key # === 执行时请删除该注释 === curl -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/audio/tts/customization \ -H "Authorization: Bearer $DASHSCOPE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "voice-enrollment", "input": { "action": "delete_voice", "voice_id": "yourVoiceID" } }'
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());
}
}音色配额与自动清理规则
计费说明
声音复刻/设计:创建、查询、更新、删除音色免费
使用声音复刻/设计生成的专属音色进行语音合成:按量(文本字符数)计费,参见实时语音合成-CosyVoice
版权与合法性
您需对所提供声音的所有权及合法使用权负责,请注意阅读服务协议。
错误码
如遇报错问题,请参见错误信息进行排查。
常见问题
功能特性
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公式包裹,建议预处理过滤特殊符号
验证音色复刻参数
尝试重新复刻
使用质量更高的源音频重新进行复刻,并测试合成效果。
对比系统音色
使用系统预置音色测试相同文本,确认是否为复刻音色特定问题。
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:为什么使用复刻音色合成很短的文本(例如单个词语)时,前面会出现较长的静音或音频整体时长异常?
声音复刻模型会学习样本音频中的停顿与节奏,如果原始录音中包含较长的起始静音或停顿,合成结果也可能保留类似模式。对于单字或极短文本,这种静音比例会被放大,看起来像“音频很长但几乎都是静音”。建议在录制样本音频时避免长时间静音,合成时尽量使用完整句子或较长文本;如必须对单个词语进行合成,可在前后补充少量上下文或使用同音替换词以规避极端情况。