简介与SDK代码示例

更新时间:
复制 MD 格式

CosyVoice 声音复刻服务使用大模型提取音频中的声音特征,无需训练即可生成定制音色。本文介绍声音复刻的使用条件,提供复刻和查询音色的 Python、Java SDK 示例,并说明如何使用复刻音色进行语音合成。

重要

声音复刻服务已于 2025 年 4 月 14 日升级至 CosyVoice 2.0。在此之后复刻的音色默认使用 CosyVoice 2.0,相比 1.0 具有更好的复刻效果。

在此之前使用 CosyVoice 1.0 复刻的音色可以正常使用,也可以使用原始音频重新复刻,以获得更好的复刻效果。

应用场景

  • 陪伴场景:利用复刻的家人声音提供个性化陪伴,用于智能助手和车载导航语音,以及家庭娱乐项目,如为家人朗读绘本、控制家用电器或提供教育辅导。

  • 教育场景:使用复刻老师的声音,加强师生互动,丰富教学视频和课件的内容,打造更亲切、更生动的学习体验。

  • 音视频产业:通过复刻主播的声音,方便后期补录、配音等应用场景,提高音视频的制作效率。

  • 智能客服:借助复刻的客户经理声音,提供语音服务,包括但不限于客户回访和市场营销电话,以赋予服务更加个性化、人性化的特点。

产品优势

  • 短音频复刻:仅需 10~20 秒的录音即可完成声音复刻。

  • 声音还原:使用阿里千问语音实验室自研的 CosyVoice 生成式神经网络语音大模型,结合零样本学习技术,还原真人声音的语调、韵律和情感表达。

  • 即时合成:秒级还原音色,提供实时的声音复刻服务。

重要说明

  • 音色数量与有效期:每个 UID 最多可复刻 1000 个音色,v1 和 v2 共用此额度。超过 1 年未使用的音色将下线处理。目前暂不支持删除已复刻的音色。

  • 版权与合法性:需对所提供声音的所有权及合法使用权负责。开通智能语音交互的流式文本语音合成服务前,请阅读服务协议。

  • 复刻音色的使用:复刻音色(VoiceName)与 CosyVoice 预置音色(例如 longxiaoxia)的使用方法相同。调用方式请参见CosyVoice 语音合成接口说明。

    重要

    CosyVoice 复刻音色只能用于 CosyVoice 语音合成。用于其他语音合成服务会导致合成失败。

  • 调用方式:声音复刻服务当前仅支持通过 API 调用。

计费说明

声音复刻免费。复刻成功后,使用文字转语音服务会产生“语音合成 CosyVoice 大模型”的接口使用费用,当前价格为 2 元/万字符。详情请参见计费方式。

前提条件

  • 了解相关条款并开通智能语音交互-流式文本语音合成服务商用版。开通地址,请参见智能语音交互。

  • 已准备公网可访问的音频 URL。推荐将音频上传至 OSS,具体操作请参见简单上传。音频要求如下:

    • 声道数:单/双声道

    • 采样位数:16 bit

    • 采样率:大于 16000 Hz

    • 格式:WAV、MP3、M4A

    • 文件大小:10M 以内

    • 音频时长:10~20 秒,不建议超过 60 秒。朗读时保持连贯,至少包含一段超过 5 秒的连续语音。

使用示例

以下示例使用 Python 和 Java SDK 调用声音复刻 API。运行前,配置环境变量 ALIYUN_AK_ID 和 ALIYUN_AK_SECRET,分别保存 AccessKey ID 和 AccessKey Secret;将示例中的音频 URL 替换为已准备的公网可访问地址。

Python

步骤一:安装阿里云 SDK

安装阿里云 Python SDK。

pip install aliyun-python-sdk-core

步骤二:复刻声音并查询音色

声音复刻接口调用的代码示例如下:

import os
import json
import time

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest

# 从环境变量读取 AccessKey ID 和 AccessKey Secret。
client = AcsClient(os.environ.get('ALIYUN_AK_ID'), os.environ.get('ALIYUN_AK_SECRET'))
domain = 'nls-slp.cn-shanghai.aliyuncs.com'
version = '2019-08-19'

def build_request(api_name, method):
    request = CommonRequest()
    request.set_domain(domain)
    request.set_version(version)
    request.set_action_name(api_name)
    request.set_method(method)
    request.set_protocol_type('https')
    return request

def cosy_clone(voice_prefix, url):
    clone_request = build_request('CosyVoiceClone', 'POST')
    clone_request.add_body_params('Url', url)
    clone_request.add_body_params('VoicePrefix', voice_prefix)
    # 设定等待超时时间为15s
    clone_request.set_read_timeout(15)
    begin = int(round(time.time() * 1000))
    clone_response = client.do_action_with_exception(clone_request)
    end = int(round(time.time() * 1000))
    print(json.loads(clone_response))
    print('cost: {}'.format(end - begin))

def cosy_list(voice_prefix, page_index=1, page_size=10):
    list_request = build_request('ListCosyVoice', 'POST')
    list_request.add_body_params('VoicePrefix', voice_prefix)
    list_request.add_body_params('PageIndex', page_index)
    list_request.add_body_params('PageSize', page_size)
    list_response = client.do_action_with_exception(list_request)
    print(json.loads(list_response))

if __name__ == '__main__':
    # 1. 调用CosyVoiceClone接口复刻声音
    audio_url = 'https://your-url'
    prefix = 'tongyi'  # 要求英文字母或数字
    cosy_clone(prefix, audio_url)
    # 调用成功后接口会同步返回VoiceName, 格式为 cosyvoice-${voice_prefix}-${7位随机字符}

    # 2. 调用 ListCosyVoice 接口查询指定前缀下的音色状态。
    cosy_list(prefix)

更多关于CosyVoice声音复刻API信息,请参见CosyVoice声音复刻API。

步骤三:使用复刻音色

调用 CosyVoice 语音合成时,将 voice 字段设置为复刻得到的 VoiceName。具体调用方法请参见CosyVoice 语音合成接口说明。

Java

步骤一:安装阿里云 SDK

在 Maven 项目中添加以下依赖。示例使用 aliyun-java-sdk-core 4.6.4。

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.6.4</version>
</dependency>

步骤二:复刻声音并查询音色

声音复刻接口调用的代码示例如下:

package org.example;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;

public class CosyVoiceDemo {
    //域名
    private static final String DOMAIN = "nls-slp.cn-shanghai.aliyuncs.com";
    // API版本
    private static final String API_VERSION = "2019-08-19";

    private static final IAcsClient client;

    static {
        // 创建DefaultAcsClient实例并初始化
        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-shanghai",
                // 从环境变量读取 AccessKey ID 和 AccessKey Secret。
                System.getenv("ALIYUN_AK_ID"),
                System.getenv("ALIYUN_AK_SECRET"));
        client = new DefaultAcsClient(profile);
    }

    public static void main(String[] args) throws InterruptedException {
        String voicePrefix = "tongyi";
        String url = "your-file-url";
        cosyClone(voicePrefix, url);
        cosyList(voicePrefix);
    }

    private static void cosyList(String voicePrefix) {
        CommonRequest request = buildRequest("ListCosyVoice");
        request.putBodyParameter("VoicePrefix", voicePrefix);
        String response = sendRequest(request);
        System.out.println(response);
    }

    private static void cosyClone(String voicePrefix, String url) {
        CommonRequest cloneRequest = buildRequest("CosyVoiceClone");
        cloneRequest.putBodyParameter("VoicePrefix", voicePrefix);
        cloneRequest.putBodyParameter("Url", url);
        // 设定等待超时时间为15s
        cloneRequest.setSysReadTimeout(15000);
        long startTime = System.currentTimeMillis();
        String response = sendRequest(cloneRequest);
        long endTime = System.currentTimeMillis();
        System.out.println(response);
        System.out.println("cost: "+ (endTime - startTime) + " 毫秒");
    }

    private static CommonRequest buildRequest(String popApiName) {
        CommonRequest request = new CommonRequest();
        request.setMethod(MethodType.POST);
        request.setDomain(DOMAIN);
        request.setVersion(API_VERSION);
        request.setAction(popApiName);
        request.setProtocol(ProtocolType.HTTPS);
        return request;
    }

    private static String sendRequest(CommonRequest request) {
        try {
            CommonResponse response = client.getCommonResponse(request);
            return response.getData();
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return null;
    }
}

更多关于CosyVoice声音复刻API信息,请参见CosyVoice声音复刻API。

步骤三:使用复刻音色

调用 CosyVoice 语音合成时,将 voice 字段设置为复刻得到的 VoiceName。具体调用方法请参见CosyVoice 语音合成接口说明。

服务状态码

状态码

状态消息

原因和处理方法

40001000

QUOTA_ERROR

检查是否开通服务。

40001001

VOICE_LIMIT_ERROR

音色克隆数量超限,目前默认 1000 个。

40001002

VOICE_PREFIX_ERROR

音色名前缀不满足规则:

  • 不为空

  • 不超过 10 个字符

  • 仅包含数字和字母

40002000

AUDIO_URL_ERROR

音频 URL 地址无效。

40002001

AUDIO_DOWNLOAD_FAIL

下载音频失败。

40002002

FILE_SIZE_EXCEED

音频文件超过 10 MB。

40002003

AUDIO_SAMPLE_RATE_ERROR

音频采样率小于 16 kHz。

40002004

AUDIO_FORMAT_ERROR

音频格式错误,解码失败,目前支持wav,mp3,m4a,aac。

40003000

SILENT_AUDIO_ERROR

音频内无足够的有效语音。

40003001

AUDIO_SNR_ERROR

音频信噪比太低。

50000000

SERVER_ERROR

服务错误,一般可通过重试解决。

使用 CosyVoice 声音复刻时出现该错误,通常是因为录音质量不合格。请按照录音操作指南重新录制并复刻声音。录音应尽量无杂音,避免频繁且不必要的停顿,并确保至少有 5 秒以上的连续声音。

-

ACCESS_DENIED : Permission denied!

没有权限。

使用未授予 AliyunNLSFullAccess 权限的 RAM 用户调用声音复刻时,会出现此错误。授权方法请参见管理 RAM 用户的权限。

相关文档