API接口详情

CosyVoice声音复刻服务依托先进的大模型技术进行特征提取,无需训练过程就可以完成声音的复刻。仅需提供10~20秒的音频,即可迅速生成高度相似且听感自然的定制声音。本文将详细介绍CosyVoice声音复刻服务的使用方法和操作流程,帮助您快速实现声音复刻。

说明
  • 声音复刻已全面升级,推荐使用cosyvoice-v3cosyvoice-v3-plus 版本,以获得最佳效果。

    cosyvoice-v3cosyvoice-v3-plus模型开放邀测(所有人可见,申请使用),申请通过后发放免费额度。

  • 关键原则:声音复刻时使用的模型(target_model/targetModel)必须与后续进行语音合成时使用的模型(model)保持一致。

  • 旧版模型的复刻服务会继续支持,此前复刻的音色可以正常使用。

  • 您也可以使用原始音频调用cosyvoice-v3cosyvoice-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)提供调用。SDKAPI的封装,推荐使用以简化开发。

示例代码:使用复刻的音色进行语音合成

本文档提供音色管理接口的功能说明,支持音色的创建、查询、更新与删除操作。若需在语音合成中调用已复刻的音色,请按以下步骤操作(请确保声音复刻与语音合成使用同一账号):

声音复刻与语音合成服务均提供 Java 和 Python SDK 支持。对于其他编程语言(如 Go、C#、PHP、Node.js等),声音复刻需调用 RESTful API,语音合成功能则需使用 WebSocket API。
  1. 调用声音复刻API并获取音色ID

    调用创建音色查询所有音色接口,获取音色ID(根据编程语言选择合适的接口。对于JavaPython以外的其他编程语言,如 Go、C#、PHP、Node.js 等,请使用RESTful接口)。

  2. 使用复刻的音色进行语音合成

    请根据您所使用的编程语言选择对应语音合成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

https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization

请求方法

POST

请求头

Authorization: Bearer {api-key} // 需替换为您自己的API Key
Content-Type: application/json

消息体

包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:

{
    "model": "voice-enrollment",
    "input": {
        "action": "create_voice",
        "target_model": "cosyvoice-v2",
        "prefix": "testpfx",
        "url": "https://yourAudioFileUrl"
    }
}

请求参数

点击查看请求示例

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": "create_voice",
        "target_model": "cosyvoice-v2",
        "prefix": "testpfx",
        "url": "https://yourAudioFileUrl"
    }
}'

参数

类型

默认值

是否必须

说明

model

string

-

固定为voice-enrollment

action

string

-

固定为create_voice

target_model

string

-

声音复刻所使用的模型,请使用cosyvoice-v2。

prefix

string

-

音色自定义前缀,仅允许数字和小写字母,小于十个字符。

url

string

-

用于复刻音色的音频文件URL。该URL要求公网可访问。

如何录制音频请参见录音操作指南

响应参数

点击查看响应示例

{
    "output": {
        "voice_id": "yourVoiceId"
    },
    "usage": {
        "count": 1
    },
    "request_id": "yourRequestId"
}

参数

类型

说明

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

状态。

  • DEPLOYING: 审核中

  • OK:审核通过,可调用

  • UNDEPLOYED:审核不通过,不可调用

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

状态。

  • DEPLOYING: 审核中

  • OK:审核通过,可调用

  • UNDEPLOYED:审核不通过,不可调用

RESTful API

基本信息

URL

https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization

请求方法

POST

请求头

Authorization: Bearer {api-key} // 需替换为您自己的API Key
Content-Type: application/json

消息体

包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:

{
    "model": "voice-enrollment",
    "input": {
        "action": "list_voice",
        "prefix": "testpfx",
        "page_index": 0,
        "page_size": 10
    }
}

请求参数

点击查看请求示例

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": "list_voice",
        "prefix": "testpfx",
        "page_index": 0,
        "page_size": 10
    }
}'

参数

类型

默认值

是否必须

说明

model

string

-

固定为voice-enrollment

action

string

-

固定为list_voice

prefix

string

null

音色自定义前缀,仅允许数字和小写字母,小于十个字符。

page_index

integer

0

页码索引,从0开始计数。

page_size

integer

10

每页包含数据条数。

响应参数

点击查看响应示例

{
    "output": {
        "voice_list": [
            {
                "gmt_create": "2024-12-11 13:38:02",
                "voice_id": "yourVoiceId",
                "gmt_modified": "2024-12-11 13:38:02",
                "status": "OK"
            }
        ]
    },
    "usage": {
        "count": 1
    },
    "request_id": "yourRequestId"
}

参数

类型

说明

voice_id

string

音色ID。该ID可用于CosyVoice语音合成,作为音色使用。

gmt_create

string

创建音色的时间。

gmt_modified

string

修改音色的时间。

status

string

状态。

  • DEPLOYING: 审核中

  • OK:审核通过,可调用

  • UNDEPLOYED:审核不通过,不可调用

查询指定音色

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

状态。

  • DEPLOYING: 审核中

  • OK:审核通过,可调用

  • UNDEPLOYED:审核不通过,不可调用

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

状态。

  • DEPLOYING: 审核中

  • OK:审核通过,可调用

  • UNDEPLOYED:审核不通过,不可调用

RESTful API

基本信息

URL

https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization

请求方法

POST

请求头

Authorization: Bearer {api-key} // 需替换为您自己的API Key
Content-Type: application/json

消息体

包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:

{
    "model": "voice-enrollment",
    "input": {
        "action": "query_voice",
        "voice_id": "yourVoiceId"
    }
}

请求参数

点击查看请求示例

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"
    }
}'

参数

类型

默认值

是否必须

说明

model

string

-

固定为voice-enrollment

action

string

-

固定为query_voice

voice_id

string

-

待查询的音色ID。

响应参数

点击查看响应示例

{
    "output": {
        "gmt_create": "2024-12-11 13:38:02",
        "resource_link": "https://yourAudioFileUrl",
        "target_model": "cosyvoice-v2",
        "gmt_modified": "2024-12-11 13:38:02",
        "status": "OK"
    },
    "usage": {
        "count": 1
    },
    "request_id": "2450f969-d9ea-9483-bafc-************"
}

参数

类型

说明

resource_link

string

被复刻的音频的URL。

target_model

string

声音复刻所使用的模型。

gmt_create

string

创建音色的时间。

gmt_modified

string

修改音色的时间。

status

string

状态。

  • DEPLOYING: 审核中

  • OK:审核通过,可调用

  • UNDEPLOYED:审核不通过,不可调用

更新音色

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

https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization

请求方法

POST

请求头

Authorization: Bearer {api-key} // 需替换为您自己的API Key
Content-Type: application/json

消息体

包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:

{
    "model": "voice-enrollment",
    "input": {
        "action": "update_voice",
        "voice_id": "yourVoiceId",
        "url": "https://yourAudioFileUrl"
    }
}

请求参数

点击查看请求示例

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": "update_voice",
        "voice_id": "yourVoiceId",
        "url": "https://yourAudioFileUrl"
    }
}'

参数

类型

默认值

是否必须

说明

model

string

-

固定为voice-enrollment

action

string

-

固定为update_voice

voice_id

string

-

待更新的音色ID。

url

string

-

用于更新音色的音频文件URL。该URL要求公网可访问。

如何录制音频请参见录音操作指南

点击查看响应示例

{
    "output": {},
    "usage": {
        "count": 1
    },
    "request_id": "yourRequestId"
}

删除音色

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

https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization

请求方法

POST

请求头

Authorization: Bearer {api-key} // 需替换为您自己的API Key
Content-Type: application/json

消息体

包含所有请求参数的消息体如下,对于可选字段,在实际业务中可根据需求省略:

{
    "model": "voice-enrollment",
    "input": {
        "action": "delete_voice",
        "voice_id": "yourVoiceId"
    }
}

请求参数

点击查看请求示例

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": "delete_voice",
        "voice_id": "yourVoiceId"
    }
}'

参数

类型

默认值

是否必须

说明

model

string

-

固定为voice-enrollment

action

string

-

固定为delete_voice

voice_id

string

-

待删除的音色ID。

点击查看响应示例

{
    "output": {},
    "usage": {
        "count": 1
    },
    "request_id": "yourRequestId"
}

语音合成

将音色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中调用发生错误将通过NoApiKeyExceptionInputRequiredException异常抛出。

错误码

如遇报错问题,请参见错误信息进行排查。

若问题仍未解决,请加入开发者群反馈遇到的问题,以便进一步排查问题。

常见问题

功能特性

Q:如何对自定义音色的语速、音量等进行调节?

对于自定义音色的使用,和默认音色的使用方式是一样的:调用CosyVoice语音合成接口,传入对应的请求参数即可对语速(speechRatespeech_rate参数)、音量(volume参数)等进行调节。完整操作流程请参见示例代码:使用复刻的音色进行语音合成

Q:如何将音频文件以公网可访问的URL形式提供?

通常遵循以下几个步骤(这里为您提供一种思路,具体情况因不同存储产品而异,推荐将音频上传至阿里云OSS):

1、选择存储和托管方式

如以下这几种:

  • 对象存储服务(推荐):

    • 使用云服务商的对象存储服务(如阿里云OSS),将音频文件上传到存储桶中,并设置为公开访问。

    • 优点:高可用性、支持 CDN 加速、易于管理。

  • Web 服务器:

    • 将音频文件放置在支持 HTTP/HTTPS 访问的 Web 服务器上(如 Nginx、Apache)。

    • 优点:适合小型项目或本地测试。

  • 内容分发网络(CDN):

    • 将音频文件托管在 CDN 上,通过 CDN 提供的 URL 访问。

    • 优点:加速文件传输,适合高并发场景。

2、上传音频文件

根据选择的存储/托管方式,将音频上传,如:

  • 对象存储服务:

    • 登录云服务商的控制台,创建存储桶。

    • 上传音频文件,并设置文件权限为“公共读”或生成临时访问链接。

  • Web 服务器:

    • 将音频文件放置在服务器指定目录下(如 /var/www/html/audio/)。

    • 确保文件可以通过 HTTP/HTTPS 访问。

3、生成公网可访问的URL

例如:

  • 对象存储服务:

    • 文件上传后,系统会自动生成一个公网访问 URL(通常格式为 https://<bucket-name>.<region>.aliyuncs.com/<file-name>)。

    • 如果需要更友好的域名,可以绑定自定义域名并开启 HTTPS。

  • Web 服务器:

    • 文件的访问 URL 通常是服务器地址加上文件路径(如 https://your-domain.com/audio/file.mp3)。

  • CDN:

    • 配置 CDN 加速后,使用 CDN 提供的 URL(如 https://cdn.your-domain.com/audio/file.mp3)。

4、验证URL的可用性

公网环境下,确保生成的 URL 可以正常访问,例如:

  • 在浏览器中打开 URL,检查是否能播放音频文件。

  • 使用工具(如 curl 或 Postman)验证 URL 是否返回正确的 HTTP 响应(状态码 200)。

故障排查

如遇代码报错问题,请根据错误码中的信息进行排查。

Q:使用Java/Python SDK时找不到VoiceEnrollmentService类?

安装最新版SDK

Q:声音复刻效果不佳(例如多出一些别的发音、发音不清晰等)是什么原因?

请按照录音操作指南,重新录音进行复刻。

权限与认证

Q:使用子业务空间的API Key是否可以进行声音复刻?

需要为API Key对应的子业务空间进行模型授权后方才支持,详情请参见子业务空间的模型调用