CosyVoice声音复刻服务依托先进的大模型技术进行特征提取,无需训练过程就可以完成声音的复刻。仅需提供10~20秒的音频,即可迅速生成高度相似且听感自然的定制声音。本文将详细介绍CosyVoice声音复刻服务的使用方法和操作流程,帮助您快速实现声音复刻。
声音复刻已全面升级,推荐使用cosyvoice-v3和cosyvoice-v3-plus 版本,以获得最佳效果。
cosyvoice-v3和cosyvoice-v3-plus模型开放邀测(所有人可见,申请使用),申请通过后发放免费额度。
关键原则:声音复刻时使用的模型(
target_model
/targetModel
)必须与后续进行语音合成时使用的模型(model
)保持一致。旧版模型的复刻服务会继续支持,此前复刻的音色可以正常使用。
您也可以使用原始音频调用cosyvoice-v3或cosyvoice-v3-plus作为
target_model
/targetModel
重新复刻,以获得更好的效果。当前版本暂不支持方言和跨语种复刻功能。
应用场景
陪伴场景:通过复刻家人的声音提供个性化陪伴。可用于智能助手和车载导航语音,以及家庭娱乐项目,例如,为家人朗读绘本、控制家用电器或提供教育辅导。
教育场景:复刻老师的声音,加强师生互动,丰富教学视频和课件的内容,打造更亲切、更生动的学习体验。
音视频产业:复刻主播的声音,以便于后期的补录和配音等,从而提高音视频的制作效率。
智能客服:通过复刻客户经理的声音,提供语音服务,包括但不限于客户回访和市场营销电话,以增强服务的个性化和人性化特征。
产品优势
低样本音频要求:仅需短短10~20秒的录音便能完成声音复刻,显著降低了录制成本,提升了效率。
高度拟真:利用阿里通义语音实验室自研的CosyVoice生成式神经网络语音大模型算法,结合前沿的零样本学习技术,能够在语调、韵律以及情感表达上高度还原真人声音,很难与真实录音相辨。
即时合成:秒级还原真实音色,提供高效、实时的声音复刻服务。
支持的模型
在资源与预算允许的情况下,优先选择 cosyvoice-v3-plus 获取最佳合成效果,对成本敏感时可选 cosyvoice-v3 平衡质量与价格,其余版本仅建议在兼容或低要求场景使用。
cosyvoice-v3-plus
cosyvoice-v3
cosyvoice-v2
cosyvoice-v1
支持的语言
中、英
计费说明
声音复刻服务免费提供,但使用复刻的音色进行语音合成时将收取费用,计费详情请参见语音合成(CosyVoice)。
前提条件
在开始之前,请确保您已完成以下准备工作:
开通服务并获取API Key。推荐您配置API Key到环境变量以降低API Key的泄漏风险。
安装最新版SDK,旧版本可能缺少
VoiceEnrollmentService
等必要的类。准备公网可访问的音频URL:复刻服务需要通过URL拉取音频文件。您需要将音频文件上传至公网可访问的位置。推荐使用对象存储OSS,并确保URL可公开访问。
注意事项
使用CosyVoice声音复刻服务时,务必遵守以下规范:
音频文件格式要求:
声道数:单/双声道
采样率:大于等于 16000 Hz
格式:WAV(16bit)、MP3、M4A
文件大小:10MB 以内
音频时长:10~20秒,不建议超过60秒。在朗读时请保持连贯,至少包含一段5秒以上的连续、清晰、无背景噪音的语音。
音色数量与生命周期:每个阿里云主账号最多可复刻1000个音色(所有模型共享此限额)。您可以删除不再使用的音色以释放额度。请注意:超过1年未被使用的音色将被系统自动下线并删除,数据不可恢复。
版权与合法性:您需对所提供声音的所有权及合法使用权负责,请注意阅读服务协议。
服务调用方式:服务通过RESTful API和官方SDK(Java/Python)提供调用。SDK是API的封装,推荐使用以简化开发。
示例代码:使用复刻的音色进行语音合成
本文档提供音色管理接口的功能说明,支持音色的创建、查询、更新与删除操作。若需在语音合成中调用已复刻的音色,请按以下步骤操作(请确保声音复刻与语音合成使用同一账号):
声音复刻与语音合成服务均提供 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
参数传递至语音合成接口(调用接口时,可通过请求参数对音量、语速等进行调节)
以下示例代码展示如何复刻声音,并使用cosyvoice-v2模型调用复刻的声音,将文本“今天天气怎么样?”转换为语音。
示例代码仅提供 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);
}
}
API详情
使用不同 API 时,请确保使用同一账号进行操作。
创建音色
每个阿里云主账号最多可同时保留1000个复刻音色,超出额度后将无法创建新音色。
创建音色所用音频文件需满足音频文件格式要求,否则将无法创建音色。
创建音色后,可以调用查询指定音色接口并传入创建的音色ID,检查该音色状态是否为OK
。只有状态为OK
的音色才可正常使用。
Python SDK
通过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-v2。
param: prefix 音色自定义前缀,仅允许数字和小写字母,小于十个字符。
param: url 用于复刻音色的音频文件URL。该URL要求公网可访问。
return: voice_id
'''
请求示例
import os
import dashscope
from dashscope.audio.tts_v2 import VoiceEnrollmentService
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("request id为:", service.get_last_request_id())
print(f"voice id为:{voice_id}")
Java SDK
通过VoiceEnrollmentService
类的createVoice
方法复刻音色。VoiceEnrollmentService
类的引入方式:import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
。
createVoice
返回的Voice
类的getVoiceId
方法可以获取音色ID。该ID可用于CosyVoice语音合成,作为音色使用。
接口说明
/**
* 创建音色
*
* @param targetModel 声音复刻所使用的模型,请使用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
请求示例
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 static java.lang.System.exit;
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 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("request id为:" + service.getLastRequestId());
System.out.println("voice id为:" + myVoice.getVoiceId());
exit(0);
}
}
RESTful API
基本信息
URL |
|
请求方法 | POST |
请求头 |
|
消息体 | 包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
|
请求参数
参数 | 类型 | 默认值 | 是否必须 | 说明 |
model | string | - | 是 | 固定为 |
action | string | - | 是 | 固定为 |
target_model | string | - | 是 | 声音复刻所使用的模型,请使用cosyvoice-v2。 |
prefix | string | - | 是 | 音色自定义前缀,仅允许数字和小写字母,小于十个字符。 |
url | string | - | 是 | 用于复刻音色的音频文件URL。该URL要求公网可访问。 如何录制音频请参见录音操作指南。 |
响应参数
参数 | 类型 | 说明 |
voice_id | string | 音色ID。该ID可用于CosyVoice语音合成,作为音色使用。 |
查询所有音色
Python SDK
通过VoiceEnrollmentService
类的list_voices
方法查询所有音色。VoiceEnrollmentService
类的引入方式:from dashscope.audio.tts_v2 import VoiceEnrollmentService
。
音色状态有三种:
DEPLOYING: 审核中
OK:审核通过,可调用
UNDEPLOYED:审核不通过,不可调用
接口说明
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,创建时间,修改时间,状态。
'''
请求示例
import os
import dashscope
from dashscope.audio.tts_v2 import VoiceEnrollmentService
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY') # 如果您没有配置环境变量,请在此处用您的API-KEY进行替换
prefix = 'prefix' # 请按实际情况进行替换
# 创建语音注册服务实例
service = VoiceEnrollmentService()
voices = service.list_voices(prefix=prefix, page_index=0, page_size=10)
print("request id为:", service.get_last_request_id())
print(f"查询到的音色为:{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。该ID可用于CosyVoice语音合成,作为音色使用。 |
gmt_create | string | 创建音色的时间。 |
gmt_modified | string | 修改音色的时间。 |
status | string | 状态。
|
Java SDK
通过VoiceEnrollmentService
类的listVoice
方法查询所有音色。VoiceEnrollmentService
类的引入方式:import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
。
音色状态有三种:
DEPLOYING: 审核中
OK:审核通过,可调用
UNDEPLOYED:审核不通过,不可调用
接口说明
/**
* 查询已创建的所有音色 默认的页索引为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
请求示例
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 static java.lang.System.exit;
public class Main {
public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // 如果您没有配置环境变量,请在此处用您的API-KEY进行替换
private static String prefix = "prefix"; // 请按实际情况进行替换
public static void main(String[] args)
throws NoApiKeyException, InputRequiredException {
VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey);
// 查询音色
Voice[] voices = service.listVoice(prefix, 0, 10);
System.out.println("request id为:" + service.getLastRequestId());
// 将voices打印成json
Gson gson = new Gson();
System.out.println("查询到的音色为:" + gson.toJson(voices));
exit(0);
}
}
响应示例
[
{
"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 | 状态。
|
RESTful API
基本信息
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 | 状态。
|
查询指定音色
Python SDK
通过VoiceEnrollmentService
类的query_voices
方法查询指定音色。VoiceEnrollmentService
类的引入方式:from dashscope.audio.tts_v2 import VoiceEnrollmentService
。
接口说明
def query_voice(self, voice_id: str) -> List[str]:
'''
查询已创建的所有音色
param: voice_id 需要查询的音色
return: bytes 注册音色使用的音频
'''
请求示例
import os
import dashscope
from dashscope.audio.tts_v2 import VoiceEnrollmentService
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY') # 如果您没有配置环境变量,请在此处用您的API-KEY进行替换
voice_id = 'cosyvoice-v2-prefix-xxx' # 请按实际情况进行替换
# 创建语音注册服务实例
service = VoiceEnrollmentService()
voice = service.query_voice(voice_id=voice_id)
print("request id为:", service.get_last_request_id())
print(f"查询到的音色为:{voice}")
响应示例
{
"gmt_create": "2024-09-13 11:29:41",
"resource_link": "https://yourAudioFileUrl",
"target_model": "cosyvoice-v2",
"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 | 状态。
|
Java SDK
通过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
请求示例
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 static java.lang.System.exit;
public class Main {
public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // 如果您没有配置环境变量,请在此处用您的API-KEY进行替换
private static String voiceId = "cosyvoice-v2-prefix-xxx"; // 请按实际情况进行替换
public static void main(String[] args)
throws NoApiKeyException, InputRequiredException {
VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey);
// 查询音色
Voice voice = service.queryVoice(voiceId);
System.out.println("request id为:" + service.getLastRequestId());
// 将voices打印成json
Gson gson = new Gson();
System.out.println("查询到的音色为:" + gson.toJson(voice));
exit(0);
}
}
响应示例
{
"gmt_create": "2024-09-13 11:29:41",
"resource_link": "https://yourAudioFileUrl",
"target_model": "cosyvoice-v2",
"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 | 状态。
|
RESTful API
基本信息
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 | 状态。
|
更新音色
Python SDK
通过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
'''
请求示例
import os
import dashscope
from dashscope.audio.tts_v2 import VoiceEnrollmentService
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY') # 如果您没有配置环境变量,请在此处用您的API-KEY进行替换
url = "https://your-audio-file-url" # 请按实际情况进行替换
voice_id = 'cosyvoice-v2-prefix-xxx' # 请按实际情况进行替换
# 创建语音注册服务实例
service = VoiceEnrollmentService()
service.update_voice(voice_id=voice_id, url=url)
print("request id为:", service.get_last_request_id())
Java SDK
通过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
请求示例
import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import static java.lang.System.exit;
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-v2-prefix-xxx"; // 请按实际情况进行替换
public static void main(String[] args)
throws NoApiKeyException, InputRequiredException {
VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey);
// 更新音色
service.updateVoice(voiceId, fileUrl);
System.out.println("request id为:" + service.getLastRequestId());
exit(0);
}
}
RESTful API
基本信息
URL |
|
请求方法 | POST |
请求头 |
|
消息体 | 包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
|
请求参数
参数 | 类型 | 默认值 | 是否必须 | 说明 |
model | string | - | 是 | 固定为 |
action | string | - | 是 | 固定为 |
voice_id | string | - | 是 | 待更新的音色ID。 |
url | string | - | 是 | 用于更新音色的音频文件URL。该URL要求公网可访问。 如何录制音频请参见录音操作指南。 |
删除音色
Python SDK
通过VoiceEnrollmentService
类的delete_voice
方法删除音色。VoiceEnrollmentService
类的引入方式:from dashscope.audio.tts_v2 import VoiceEnrollmentService
。
接口说明
def delete_voice(self, voice_id: str) -> None:
'''
删除音色
param: voice_id 需要删除的音色
'''
请求示例
import os
import dashscope
from dashscope.audio.tts_v2 import VoiceEnrollmentService
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY') # 如果您没有配置环境变量,请在此处用您的API-KEY进行替换
voice_id = 'cosyvoice-v2-prefix-xxx' # 请按实际情况进行替换
# 创建语音注册服务实例
service = VoiceEnrollmentService()
service.delete_voice(voice_id=voice_id)
print("request id为:", service.get_last_request_id())
Java SDK
通过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
请求示例
import com.alibaba.dashscope.audio.ttsv2.enrollment.VoiceEnrollmentService;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import static java.lang.System.exit;
public class Main {
public static String apiKey = System.getenv("DASHSCOPE_API_KEY"); // 如果您没有配置环境变量,请在此处用您的API-KEY进行替换
private static String voiceId = "cosyvoice-v2-prefix-xxx"; // 请按实际情况进行替换
public static void main(String[] args)
throws NoApiKeyException, InputRequiredException {
VoiceEnrollmentService service = new VoiceEnrollmentService(apiKey);
// 删除音色
service.deleteVoice(voiceId);
System.out.println("request id为:" + service.getLastRequestId());
exit(0);
}
}
RESTful API
基本信息
URL |
|
请求方法 | POST |
请求头 |
|
消息体 | 包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:
|
请求参数
参数 | 类型 | 默认值 | 是否必须 | 说明 |
model | string | - | 是 | 固定为 |
action | string | - | 是 | 固定为 |
voice_id | string | - | 是 | 待删除的音色ID。 |
语音合成
将音色ID作为voice
参数传递至合成接口,请根据使用的编程语言选择合适的接口:
Java:Java SDK
Python:Python SDK
其他编程语言(如Go、C#、PHP、Node.js等):WebSocket API
语音合成服务选择 WebSocket 而非 RESTful,根本在于其依赖全双工通信能力——WebSocket 允许服务端与客户端主动双向传输数据(如实时推送合成进度),而基于 HTTP 的 RESTful 仅支持客户端发起的单向请求-响应模式,无法满足实时交互需求。
示例代码:使用复刻的音色进行语音合成
异常处理
Python SDK
在Python SDK中调用发生错误将通过异常VoiceEnrollmentException
抛出。异常包括:状态码、异常代码、异常描述。
class VoiceEnrollmentException(Exception):
def __init__(self, status_code: int, code: str, error_message: str)
Java SDK
在Java SDK中调用发生错误将通过NoApiKeyException
和InputRequiredException
异常抛出。
错误码
如遇报错问题,请参见错误信息进行排查。
若问题仍未解决,请加入开发者群反馈遇到的问题,以便进一步排查问题。
常见问题
功能特性
Q:如何对自定义音色的语速、音量等进行调节?
对于自定义音色的使用,和默认音色的使用方式是一样的:调用CosyVoice语音合成接口,传入对应的请求参数即可对语速(speechRate
或speech_rate
参数)、音量(volume
参数)等进行调节。完整操作流程请参见示例代码:使用复刻的音色进行语音合成。
Q:如何将音频文件以公网可访问的URL形式提供?
通常遵循以下几个步骤(这里为您提供一种思路,具体情况因不同存储产品而异,推荐将音频上传至阿里云OSS):
故障排查
如遇代码报错问题,请根据错误码中的信息进行排查。
Q:使用Java/Python SDK时找不到VoiceEnrollmentService
类?
请安装最新版SDK。
Q:声音复刻效果不佳(例如多出一些别的发音、发音不清晰等)是什么原因?
请按照录音操作指南,重新录音进行复刻。
权限与认证
Q:使用子业务空间的API Key是否可以进行声音复刻?
需要为API Key对应的子业务空间进行模型授权后方才支持,详情请参见子业务空间的模型调用。