CosyVoice声音复刻服务依托先进的大模型技术进行特征提取,无需训练过程就可以完成声音的复刻。仅需提供10~20秒的音频,即可迅速生成高度相似且听感自然的定制声音。本文将详细介绍CosyVoice声音复刻服务的使用方法和操作流程,帮助您快速实现声音复刻。
声音复刻服务已于2025年4月24日支持 cosyvoice-v2 版本,相比于 cosyvoice-v1 具有更好的复刻效果。
v1 版模型的复刻服务会继续支持,此前使用 cosyvoice-v1 复刻的音色可以正常使用。
您也可以使用原始音频调用 cosyvoice-v2 作为target_model
/targetModel
重新复刻,以获得更好的复刻效果。
应用场景
陪伴场景:通过复刻家人的声音提供个性化陪伴。可用于智能助手和车载导航语音,以及家庭娱乐项目,例如,为家人朗读绘本、控制家用电器或提供教育辅导。
教育场景:复刻老师的声音,加强师生互动,丰富教学视频和课件的内容,打造更亲切、更生动的学习体验。
音视频产业:复刻主播的声音,以便于后期的补录和配音等,从而提高音视频的制作效率。
智能客服:通过复刻客户经理的声音,提供语音服务,包括但不限于客户回访和市场营销电话,以增强服务的个性化和人性化特征。
产品优势
低样本音频要求:仅需短短10~20秒的录音便能完成声音复刻,显著降低了录制成本,提升了效率。
高度拟真:利用阿里通义语音实验室自研的CosyVoice生成式神经网络语音大模型算法,结合前沿的零样本学习技术,能够在语调、韵律以及情感表达上高度还原真人声音,很难与真实录音相辨。
即时合成:秒级还原真实音色,提供高效、实时的声音复刻服务。
支持的模型
声音复刻服务支持 cosyvoice-v1 和 cosyvoice-v2 模型。
支持的语言
中文和英文。
注意事项
使用CosyVoice声音复刻服务请注意以下事项:
音频文件格式要求:
声道数:单/双声道
采样率:大于等于 16000 Hz
格式:WAV(16bit)、MP3、M4A
文件大小:10MB 以内
音频时长:10~20秒,不建议超过60秒。在朗读时请保持连贯,至少包含一段超过5秒的连续语音。
声音复刻数量限制:每个阿里云主账号最多可复刻1000个音色(cosyvoice-v1 和 cosyvoice-v2共享该限额),复刻完成的音色支持删除,删除后将不再占用复刻额度。若您的需求超过此限额,请提前与我们的售前团队联系沟通或加入开发者群。超过1年未使用的声音将下线处理。
版权与合法性:您需对所提供声音的所有权及合法使用权负责,请注意阅读服务协议。
复刻后音色的使用:使用声音复刻服务生成的音色(
voice_id
/voiceId
)与音色列表中官方默认提供的音色(例如:longxiaoxia)的使用方法相同。服务调用方式:声音复刻服务当前仅支持API方式调用。
计费说明
声音复刻服务免费提供,但使用复刻的音色进行语音合成时将收取费用,计费详情请参见CosyVoice。
前提条件
已开通服务并获取API Key。推荐您配置API Key到环境变量以降低API Key的泄漏风险。
已准备公网可访问的音频URL,推荐将音频上传至OSS。
API详情
使用不同 API 时,请确保使用同一账号进行操作。
创建音色
每个阿里云主账号最多可同时保留1000个复刻音色,超出额度后将无法创建新音色(参见声音复刻数量限制)。
创建音色所用音频文件需满足音频文件格式要求,否则将无法创建音色。
通过VoiceEnrollmentService
类的create_voice
方法复刻音色。VoiceEnrollmentService
类的引入方式:from dashscope.audio.tts_v2 import VoiceEnrollmentService
。
create_voice
方法返回音色ID。该ID可用于CosyVoice语音合成,作为音色使用。
def create_voice(self, target_model: str, prefix: str, url: str) -> str:
'''
创建音色
param: target_model 声音复刻所使用的模型,支持cosyvoice-v1和cosyvoice-v2。
param: prefix 音色自定义前缀,仅允许数字和小写字母,小于十个字符。
param: url 用于复刻音色的音频文件URL。该URL要求公网可访问。
return: voice_id
'''
通过VoiceEnrollmentService
类的createVoice
方法复刻音色。VoiceEnrollmentService
类的引入方式:import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
。
createVoice
返回的Voice
类的getVoiceId
方法可以获取音色ID。该ID可用于CosyVoice语音合成,作为音色使用。
/**
* 创建音色
*
* @param targetModel 声音复刻所使用的模型,支持cosyvoice-v1和cosyvoice-v2。
* @param prefix 音色自定义前缀,仅允许数字和小写字母,小于十个字符。
* @param url 用于复刻音色的音频文件URL。该URL要求公网可访问。
* @return Voice 音色对象
* @throws NoApiKeyException 如果apikey为空
* @throws InputRequiredException 如果必须参数为空
*/
public Voice createVoice(String targetModel, String prefix, String url) throws NoApiKeyException, InputRequiredException
基本信息
URL |
|
请求方法 | POST |
请求头 |
|
消息体 | 包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
|
请求参数
参数 | 类型 | 默认值 | 是否必须 | 说明 |
model | string | - | 是 | 固定为 |
action | string | - | 是 | 固定为 |
target_model | string | - | 是 | 声音复刻所使用的模型,支持cosyvoice-v1和cosyvoice-v2。 |
prefix | string | - | 是 | 音色自定义前缀,仅允许数字和小写字母,小于十个字符。 |
url | string | - | 是 | 用于复刻音色的音频文件URL。该URL要求公网可访问。 如何录制音频请参见录音操作指南。 |
响应参数
参数 | 类型 | 说明 |
voice_id | string | 音色ID。该ID可用于CosyVoice语音合成,作为音色使用。 |
查询所有音色
通过VoiceEnrollmentService
类的list_voices
方法查询所有音色。VoiceEnrollmentService
类的引入方式:from dashscope.audio.tts_v2 import VoiceEnrollmentService
。
音色状态有两种:
UNDEPLOYED:不可调用
OK:可调用
def list_voices(self, prefix=None, page_index: int = 0, page_size: int = 10) -> List[dict]:
'''
查询已创建的所有音色
param: prefix 音色前缀,设置为None则返回所有音色
param: page_index 查询的页索引
param: page_size 查询页大小
return: List[dict] 音色列表,包含每个音色的id,创建时间,修改时间,状态。
'''
响应示例:
[
{
"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。该ID可用于CosyVoice语音合成,作为音色使用。 |
gmt_create | string | 创建音色的时间。 |
gmt_modified | string | 修改音色的时间。 |
status | string | 状态。
|
通过VoiceEnrollmentService
类的listVoice
方法查询所有音色。VoiceEnrollmentService
类的引入方式:import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
。
音色状态有两种:
UNDEPLOYED:不可调用
OK:可调用
/**
* 查询已创建的所有音色 默认的页索引为0,默认的页大小为10
*
* @param prefix 音色自定义前缀,仅允许数字和小写字母,小于十个字符。可以为null。
* @return Voice[] 音色对象数组
* @throws NoApiKeyException 如果apikey为空
* @throws InputRequiredException 如果必须参数为空
*/
public Voice[] listVoice(String prefix) throws NoApiKeyException, InputRequiredException
/**
* 查询已创建的所有音色
*
* @param prefix 音色自定义前缀,仅允许数字和小写字母,小于十个字符。
* @param pageIndex 查询的页索引
* @param pageSize 查询的页大小
* @return Voice[] 音色对象数组
* @throws NoApiKeyException 如果apikey为空
* @throws InputRequiredException 如果必须参数为空
*/
public Voice[] listVoice(String prefix, int pageIndex, int pageSize) throws NoApiKeyException, InputRequiredException
响应示例:
[
{
"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。该ID可用于CosyVoice语音合成,作为音色使用。 |
gmt_create | string | 创建音色的时间。 |
gmt_modified | string | 修改音色的时间。 |
status | string | 状态。
|
基本信息
URL |
|
请求方法 | POST |
请求头 |
|
消息体 | 包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
|
请求参数
参数 | 类型 | 默认值 | 是否必须 | 说明 |
model | string | - | 是 | 固定为 |
action | string | - | 是 | 固定为 |
prefix | string | null | 否 | 音色自定义前缀,仅允许数字和小写字母,小于十个字符。 |
page_index | integer | 0 | 否 | 页码索引,从0开始计数。 |
page_size | integer | 10 | 否 | 每页包含数据条数。 |
响应参数
参数 | 类型 | 说明 |
voice_id | string | 音色ID。该ID可用于CosyVoice语音合成,作为音色使用。 |
gmt_create | string | 创建音色的时间。 |
gmt_modified | string | 修改音色的时间。 |
status | string | 状态。
|
查询指定音色
通过VoiceEnrollmentService
类的query_voices
方法查询指定音色。VoiceEnrollmentService
类的引入方式:from dashscope.audio.tts_v2 import VoiceEnrollmentService
。
def query_voices(self, voice_id: str) -> List[str]:
'''
查询已创建的所有音色
param: voice_id 需要查询的音色
return: bytes 注册音色使用的音频
'''
响应示例:
{
"gmt_create": "2024-09-13 11:29:41",
"resource_link": "https://yourAudioFileUrl",
"target_model": "cosyvoice-v1",
"gmt_modified": "2024-09-13 11:29:41",
"status": "OK"
}
响应参数:
参数 | 类型 | 说明 |
resource_link | string | 被复刻的音频的URL。 |
target_model | string | 声音复刻所使用的模型。 |
gmt_create | string | 创建音色的时间。 |
gmt_modified | string | 修改音色的时间。 |
status | string | 状态。
|
通过VoiceEnrollmentService
类的queryVoice
方法查询指定音色。VoiceEnrollmentService
类的引入方式:import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
。
/**
* 查询指定音色
*
* @param voiceId 需要查询的音色
* @return Voice 音色对象,包含状态信息和用于声音复刻的音频文件url
* @throws NoApiKeyException 如果apikey为空
* @throws InputRequiredException 如果必须参数为空
*/
public Voice queryVoice(String voiceId) throws NoApiKeyException, InputRequiredException
响应示例:
{
"gmt_create": "2024-09-13 11:29:41",
"resource_link": "https://yourAudioFileUrl",
"target_model": "cosyvoice-v1",
"gmt_modified": "2024-09-13 11:29:41",
"status": "OK"
}
响应参数:
参数 | 类型 | 说明 |
resource_link | string | 被复刻的音频的URL。 |
target_model | string | 声音复刻所使用的模型。 |
gmt_create | string | 创建音色的时间。 |
gmt_modified | string | 修改音色的时间。 |
status | string | 状态。
|
基本信息
URL |
|
请求方法 | POST |
请求头 |
|
消息体 | 包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
|
请求参数
参数 | 类型 | 默认值 | 是否必须 | 说明 |
model | string | - | 是 | 固定为 |
action | string | - | 是 | 固定为 |
voice_id | string | - | 是 | 待查询的音色ID。 |
响应参数
参数 | 类型 | 说明 |
resource_link | string | 被复刻的音频的URL。 |
target_model | string | 声音复刻所使用的模型。 |
gmt_create | string | 创建音色的时间。 |
gmt_modified | string | 修改音色的时间。 |
status | string | 状态。
|
更新音色
通过VoiceEnrollmentService
类的update_voice
方法更新音色。VoiceEnrollmentService
类的引入方式:from dashscope.audio.tts_v2 import VoiceEnrollmentService
。
def update_voice(self, voice_id: str, url: str) -> None:
'''
更新音色
param: voice_id 音色id
param: url 用于声音复刻的音频文件url
'''
通过VoiceEnrollmentService
类的updateVoice
方法更新音色。VoiceEnrollmentService
类的引入方式:import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
。
/**
* 更新音色
*
* @param voiceId 需要更新的音色
* @param url 用于声音复刻的音频文件url
* @throws NoApiKeyException 如果apikey为空
* @throws InputRequiredException 如果必须参数为空
*/
public void updateVoice(String voiceId, String url)
throws NoApiKeyException, InputRequiredException
基本信息
URL |
|
请求方法 | POST |
请求头 |
|
消息体 | 包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
|
请求参数
参数 | 类型 | 默认值 | 是否必须 | 说明 |
model | string | - | 是 | 固定为 |
action | string | - | 是 | 固定为 |
voice_id | string | - | 是 | 待更新的音色ID。 |
url | string | - | 是 | 用于更新音色的音频文件URL。该URL要求公网可访问。 如何录制音频请参见录音操作指南。 |
删除音色
通过VoiceEnrollmentService
类的delete_voice
方法删除音色。VoiceEnrollmentService
类的引入方式:from dashscope.audio.tts_v2 import VoiceEnrollmentService
。
def delete_voice(self, voice_id: str) -> None:
'''
删除音色
param: voice_id 需要删除的音色
'''
通过VoiceEnrollmentService
类的deleteVoice
方法删除音色。VoiceEnrollmentService
类的引入方式:import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
。
/**
* 删除音色
*
* @param voiceId 需要删除的音色
* @throws NoApiKeyException 如果apikey为空
* @throws InputRequiredException 如果必须参数为空
*/
public void deleteVoice(String voiceId) throws NoApiKeyException, InputRequiredException
基本信息
URL |
|
请求方法 | POST |
请求头 |
|
消息体 | 包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
|
请求参数
参数 | 类型 | 默认值 | 是否必须 | 说明 |
model | string | - | 是 | 固定为 |
action | string | - | 是 | 固定为 |
voice_id | string | - | 是 | 待删除的音色ID。 |
使用复刻的音色进行语音合成
本文档提供音色管理接口的功能说明,支持音色的创建、查询、更新与删除操作。若需在语音合成中调用已复刻的音色,请按以下步骤操作(请确保声音复刻与语音合成使用同一账号):
声音复刻与语音合成服务均提供 Java 和 Python SDK 支持。对于其他编程语言(如 Go、C#、PHP、Node.js等),声音复刻需调用 RESTful API,语音合成功能则需使用 WebSocket API。
调用声音复刻API并获取音色ID
调用创建音色或查询所有音色接口,获取音色ID(根据编程语言选择合适的接口。对于Java和Python以外的其他编程语言,如 Go、C#、PHP、Node.js 等,请使用RESTful接口)。
使用复刻的音色进行语音合成
请根据您所使用的编程语言选择对应语音合成API,将第1步中获取的音色ID作为
voice
参数传递至合成接口(调用接口时,可通过请求参数对音量、语速等进行调节),参见:Java:Java API
Python:Python API
其他编程语言(如Go、C#、PHP、Node.js等):WebSocket API
以下示例代码展示如何复刻声音,并使用cosyvoice-v2模型调用复刻的声音,将文本“今天天气怎么样?”转换为语音。
声音复刻的接口并发调用限制为 10 RPS。
声音复刻时,无论您是仅使用 v1、仅使用 v2,还是同时调用两者,系统对所有请求的总并发限制均为 10 RPS。这意味着:
如果您仅调用 v1,则其最大并发请求为 10 RPS。
如果您同时调用 v1 和 v2,两者的请求总和不能超过 10 RPS(例如,v1 使用 7 RPS,则 v2 最多只能使用 3 RPS)。
语音合成的接口并发调用限制为3RPS。
语音合成时,无论单独使用还是同时使用,v1和v2的并发调用限制都为3RPS。两者相互独立,互不干扰。
示例代码仅提供 Java 和 Python 的基础示例,实际业务场景中的相关代码需您根据具体需求自行开发。
请保持复刻时的 target_model
/targetModel
和调用语音合成时的 model
字段一致。
import os
import dashscope
from dashscope.audio.tts_v2 import VoiceEnrollmentService, SpeechSynthesizer
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY') # 如果您没有配置环境变量,请在此处用您的API-KEY进行替换
url = "https://your-audio-file-url" # 请按实际情况进行替换
prefix = 'prefix'
target_model = "cosyvoice-v2"
# 创建语音注册服务实例
service = VoiceEnrollmentService()
# 调用create_voice方法复刻声音,并生成voice_id
# 避免频繁调用 create_voice 方法。每次调用都会创建新音色,每个阿里云主账号最多可复刻 1000 个音色,超额时请删除不用的音色或申请扩容。
voice_id = service.create_voice(target_model=target_model, prefix=prefix, url=url)
print("requestId: ", service.get_last_request_id())
print(f"your voice id is {voice_id}")
# 使用复刻的声音进行语音合成
synthesizer = SpeechSynthesizer(model=target_model, voice=voice_id)
audio = synthesizer.call("今天天气怎么样?")
print("requestId: ", synthesizer.get_last_request_id())
# 将合成的音频文件保存到本地文件
with open("output.mp3", "wb") as f:
f.write(audio)
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
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 java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import static java.lang.System.exit;
public class VoiceEnrollmentSampleCodes {
public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // 如果您没有配置环境变量,请在此处用您的API-KEY进行替换
private static String fileUrl = "https://your-audio-file-url"; // 请按实际情况进行替换
private static String prefix = "prefix";
private static String targetModel = "cosyvoice-v2";
public static void main(String[] args)
throws NoApiKeyException, InputRequiredException {
// 复刻声音
VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey);
Voice myVoice = service.createVoice(targetModel, prefix, fileUrl);
System.out.println("RequestId: " + service.getLastRequestId());
System.out.println("your voice id is " + myVoice.getVoiceId());
// 使用复刻的声音来合成文本为语音
SpeechSynthesisParam param = SpeechSynthesisParam.builder()
.apiKey(apiKey)
.model(targetModel)
.voice(myVoice.getVoiceId())
.build();
SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
ByteBuffer audio = synthesizer.call("今天天气怎么样?");
// 保存合成的语音到文件
System.out.println("TTS RequestId: " + synthesizer.getLastRequestId());
File file = new File("output.mp3");
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write(audio.array());
} catch (IOException e) {
throw new RuntimeException(e);
}
exit(0);
}
}
错误码
在Python SDK中调用发生错误将通过异常VoiceEnrollmentException
抛出。异常包括:状态码、异常代码、异常描述。
class VoiceEnrollmentException(Exception):
def __init__(self, status_code: int, code: str, error_message: str)
在Java SDK中调用发生错误将通过NoApiKeyException
和InputRequiredException
异常抛出。
声音复刻中可能遇到的错误码如下:
HTTP返回码 | 错误代码 Code | 错误信息 Message (具体信息内容可能跟随场景有所变化) | 含义说明 |
HTTP返回码 | 错误代码 Code | 错误信息 Message (具体信息内容可能跟随场景有所变化) | 含义说明 |
415 | BadRequest.UnsupportedFileFormat | File format unsupported. | 文件格式不支持。 |
416 | BadRequest.ResourceNotExist | The Required resource not exist. | 更新、查询或删除接口调用时资源不存在。 |
430 | Audio.DecoderError | Decoder audio file failed. | 音频文件解码失败。 |
430 | Audio.FileSizeExceed | File too large | 文件大小超限,用于声音复刻的音频文件需10M以内。 |
430 | Audio.AudioRateError | File sample rate unsupported | 文件采样率不支持,要求16KHz 及以上。 |
430 | Audio.AudioSilentError | Silent file unsupported | 文件为静音或非静音长度过短,声音复刻要求10秒以上有效音频。 |
500 | InternalError | audio preprocess server error | 音频文件不规范,比如声音本身有问题,有杂音或者声音忽高忽低。 |
更多通用错误码的详细信息,请参见错误信息。
常见问题
Q:如何对自定义音色的语速、音量等进行调节?
A:对于自定义音色的使用,和默认音色的使用方式是一样的:调用CosyVoice语音合成接口,传入对应的请求参数即可对语速(speechRate
或speech_rate
参数)、音量(volume
参数)等进行调节。完整操作流程请参见使用复刻的音色进行语音合成。
Q:如何将音频文件以公网可访问的URL形式提供?
A:通常遵循以下几个步骤(这里为您提供一种思路,具体情况因不同存储产品而异,推荐将音频上传至阿里云OSS):
- 本页导读 (1)
- 应用场景
- 产品优势
- 支持的模型
- 支持的语言
- 注意事项
- 计费说明
- 前提条件
- API详情
- 创建音色
- 查询所有音色
- 查询指定音色
- 更新音色
- 删除音色
- 使用复刻的音色进行语音合成
- 错误码
- 常见问题
- Q:如何对自定义音色的语速、音量等进行调节?
- Q:如何将音频文件以公网可访问的URL形式提供?