语音合成CosyVoice Java API

更新时间:2025-04-24 02:41:19

本文介绍语音合成CosyVoice Java API的使用。

前提条件

快速开始

SpeechSynthesizer提供了语音合成的关键接口,支持以下几种调用方式:

  • 同步调用:提交文本后,服务端立即处理并返回完整的语音合成结果。整个过程是阻塞式的,客户端需要等待服务端完成处理后才能继续下一步操作。适合短文本语音合成场景。

  • 异步调用:将文本一次发送至服务端并实时接收语音合成结果,不允许将文本分段发送。适用于对实时性要求高的短文本语音合成场景。

  • 流式调用:将文本逐步发送到服务端并实时接收语音合成结果,允许将长文本分段发送,服务端在接收到部分文本后便立即开始处理。适合实时性要求高的长文本语音合成场景。

同步调用

同步提交语音合成任务,直接获取完整结果。

image

实例化SpeechSynthesizer绑定请求参数,调用call方法进行合成并获取二进制音频数据。

发送的文本长度不得超过2000字符(详情请参见SpeechSynthesizercall方法)。

点击查看完整示例

import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;

public class Main {
    // 模型
    private static String model = "cosyvoice-v2";
    // 音色
    private static String voice = "longxiaochun_v2";

    public static void streamAudioDataToSpeaker() {
        // 请求参数
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将your-api-key替换为自己的API Key
                        // .apiKey("your-api-key")
                        .model(model) // 模型
                        .voice(voice) // 音色
                        .build();

        // 同步模式:禁用回调(第二个参数为null)
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
        // 阻塞直至音频返回 
        ByteBuffer audio = synthesizer.call("今天天气怎么样?");
        // 将音频数据保存到本地文件“output.mp3”中
        File file = new File("output.mp3");
        System.out.println(
                "[Metric] requestId: "
                        + synthesizer.getLastRequestId()
                        + ", first package delay ms: "
                        + 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) {
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

异步调用

异步提交语音合成任务,通过注册ResultCallback回调,逐帧接收实时语音分段数据。

image

实例化SpeechSynthesizer绑定请求参数回调接口(ResultCallback),调用call方法进行合成并通过回调接口(ResultCallback)onEvent方法实时获取合成结果。

发送的文本长度不得超过2000字符(详情请参见SpeechSynthesizercall方法)。

点击查看完整示例

以下示例,展示如何使用同步接口调用语音大模型CosyVoice的音色“龙小淳(longxiaochun)”,将文案“今天天气怎么样”合成采样率为22050Hz,音频格式为MP3的音频。

import com.alibaba.dashscope.audio.tts.SpeechSynthesisResult;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.common.ResultCallback;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.CountDownLatch;

class TimeUtils {
    private static final DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    public static String getTimestamp() {
        return LocalDateTime.now().format(formatter);
    }
}

public class Main {
    // 模型
    private static String model = "cosyvoice-v2";
    // 音色
    private static String voice = "longxiaochun_v2";

    public static void streamAudioDataToSpeaker() {
        CountDownLatch latch = new CountDownLatch(1);

        // 实现回调接口ResultCallback
        ResultCallback<SpeechSynthesisResult> callback = new ResultCallback<SpeechSynthesisResult>() {
            @Override
            public void onEvent(SpeechSynthesisResult result) {
                // System.out.println("收到消息: " + result);
                if (result.getAudioFrame() != null) {
                    // 此处实现保存音频数据到本地的逻辑
                    System.out.println(TimeUtils.getTimestamp() + " 收到音频");
                }
            }

            @Override
            public void onComplete() {
                System.out.println(TimeUtils.getTimestamp() + " 收到Complete,语音合成结束");
                latch.countDown();
            }

            @Override
            public void onError(Exception e) {
                System.out.println("收到错误: " + e.toString());
                latch.countDown();
            }
        };

        // 请求参数
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将your-api-key替换为自己的API Key
                        // .apiKey("your-api-key")
                        .model(model) // 模型
                        .voice(voice) // 音色
                        .build();
        // 第二个参数“callback”传入回调即启用异步模式
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, callback);
        // 非阻塞调用,立即返回null(实际结果通过回调接口异步传递),在回调接口的onEvent方法中实时获取二进制音频
        synthesizer.call("今天天气怎么样?");
        // 等待合成完成
        try {
            latch.await();
            // 等待播放线程全部播放完
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(
                "[Metric] requestId: "
                        + synthesizer.getLastRequestId()
                        + ", first package delay ms: "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) {
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

流式调用

分多次提交文本,通过注册ResultCallback回调,逐帧接收实时语音分段数据。

说明
  • 流式输入时可多次调用streamingCall按顺序提交文本片段。服务端接收文本片段后自动进行分句:

    • 完整语句立即合成

    • 不完整语句缓存至完整后合成

    调用 streamingComplete 时,服务端会强制合成所有已接收但未处理的文本片段(包括未完成的句子)。

  • 发送文本片段的间隔不得超过23秒,否则触发“request timeout after 23 seconds”异常。

    若无待发送文本,需及时调用 streamingComplete结束任务。

    服务端强制设定23秒超时机制,客户端无法修改该配置。
image
  1. 实例化SpeechSynthesizer

    实例化SpeechSynthesizer绑定请求参数回调接口(ResultCallback)

  2. 流式传输

    多次调用SpeechSynthesizerstreamingCall方法分片提交待合成文本,将待合成文本分段发送至服务端。

    在发送文本的过程中,服务端会通过回调接口(ResultCallback)onEvent方法,将合成结果实时返回给客户端。

    每次调用streamingCall方法发送的文本片段(即text)长度不得超过2000字符,累计发送的文本总长度不得超过20万字符。

  3. 结束处理

    调用SpeechSynthesizerstreamingComplete方法结束语音合成。

    该方法会阻塞当前线程,直到回调接口(ResultCallback)onComplete或者onError回调触发后才会释放线程阻塞。

点击查看完整示例

import com.alibaba.dashscope.audio.tts.SpeechSynthesisResult;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisAudioFormat;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.common.ResultCallback;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.CountDownLatch;

class TimeUtils {
    private static final DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    public static String getTimestamp() {
        return LocalDateTime.now().format(formatter);
    }
}


public class Main {
    private static String[] textArray = {"流式文本语音合成SDK,",
            "可以将输入的文本", "合成为语音二进制数据,", "相比于非流式语音合成,",
            "流式合成的优势在于实时性", "更强。用户在输入文本的同时",
            "可以听到接近同步的语音输出,", "极大地提升了交互体验,",
            "减少了用户等待时间。", "适用于调用大规模", "语言模型(LLM),以",
            "流式输入文本的方式", "进行语音合成的场景。"};
    private static String model = "cosyvoice-v2"; // 模型
    private static String voice = "longxiaochun_v2"; // 音色

    public static void streamAudioDataToSpeaker() {
        CountDownLatch latch = new CountDownLatch(1);

        // 配置回调函数
        ResultCallback<SpeechSynthesisResult> callback = new ResultCallback<SpeechSynthesisResult>() {
            @Override
            public void onEvent(SpeechSynthesisResult result) {
                // System.out.println("收到消息: " + result);
                if (result.getAudioFrame() != null) {
                    // 此处实现处理音频数据的逻辑
                    System.out.println(TimeUtils.getTimestamp() + " 收到音频");
                }
            }

            @Override
            public void onComplete() {
                System.out.println(TimeUtils.getTimestamp() + " 收到Complete,语音合成结束");
                latch.countDown();
            }

            @Override
            public void onError(Exception e) {
                System.out.println("收到错误: " + e.toString());
                latch.countDown();
            }
        };

        // 请求参数
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将your-api-key替换为自己的API Key
                        // .apiKey("your-api-key")
                        .model(model)
                        .voice(voice)
                        .format(SpeechSynthesisAudioFormat
                                .PCM_22050HZ_MONO_16BIT) // 流式合成使用PCM或者MP3
                        .build();
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, callback);
        // 带Callback的call方法将不会阻塞当前线程
        for (String text : textArray) {
            // 发送文本片段,在回调接口的onEvent方法中实时获取二进制音频
            synthesizer.streamingCall(text);
        }
        // 结束流式语音合成
        synthesizer.streamingComplete();
        System.out.println(
                "[Metric] requestId: "
                        + synthesizer.getLastRequestId()
                        + ", first package delay ms: "
                        + synthesizer.getFirstPackageDelay());
        // 等待合成完成
        try {
            latch.await();
            // 等待播放线程全部播放完
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

通过Flowable调用

Flowable是一个用于工作流和业务流程管理的开源框架,它基于Apache 2.0许可证发布。关于Flowable的使用,请参见Flowable API详情

使用Flowable前需确保已集成RxJava库,并了解响应式编程基础概念。

非流式调用
流式调用

以下示例展示了通过Flowable对象的blockingForEach接口,阻塞式地获取每次流式返回的SpeechSynthesisResult类型数据。

您也可以在Flowable的所有流式数据返回完成后,通过SpeechSynthesizergetAudioData来获取完整的合成结果。

点击查看完整示例

import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.exception.NoApiKeyException;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class TimeUtils {
    private static final DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    public static String getTimestamp() {
        return LocalDateTime.now().format(formatter);
    }
}

public class Main {
    private static String model = "cosyvoice-v2"; // 模型
    private static String voice = "longxiaochun_v2"; // 音色

    public static void streamAudioDataToSpeaker() throws NoApiKeyException {
        // 请求参数
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将your-api-key替换为自己的API Key
                        // .apiKey("your-api-key")
                        .model(model) // 模型
                        .voice(voice) // 音色
                        .build();
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
        synthesizer.callAsFlowable("今天天气怎么样?").blockingForEach(result -> {
            // System.out.println("收到消息: " + result);
            if (result.getAudioFrame() != null) {
                // 此处实现处理音频数据的逻辑
                System.out.println(TimeUtils.getTimestamp() + " 收到音频");
            }
        });
        System.out.println(
                "[Metric] requestId: "
                        + synthesizer.getLastRequestId()
                        + ", first package delay ms: "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) throws NoApiKeyException {
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

以下示例展示了通过Flowable对象作为输入参数,输入文本流。并通过Flowable对象作为返回值,利用的blockingForEach接口,阻塞式地获取每次流式返回的SpeechSynthesisResult类型数据。

您也可以在Flowable的所有流式数据返回完成后,通过SpeechSynthesizergetAudioData来获取完整的合成结果。

点击查看完整示例

import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.exception.NoApiKeyException;
import io.reactivex.BackpressureStrategy;
import io.reactivex.Flowable;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class TimeUtils {
    private static final DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    public static String getTimestamp() {
        return LocalDateTime.now().format(formatter);
    }
}

public class Main {
    private static String[] textArray = {"流式文本语音合成SDK,",
            "可以将输入的文本", "合成为语音二进制数据,", "相比于非流式语音合成,",
            "流式合成的优势在于实时性", "更强。用户在输入文本的同时",
            "可以听到接近同步的语音输出,", "极大地提升了交互体验,",
            "减少了用户等待时间。", "适用于调用大规模", "语言模型(LLM),以",
            "流式输入文本的方式", "进行语音合成的场景。"};
    private static String model = "cosyvoice-v2";
    private static String voice = "longxiaochun_v2";

    public static void streamAudioDataToSpeaker() throws NoApiKeyException {
        // 模拟流式输入
        Flowable<String> textSource = Flowable.create(emitter -> {
            new Thread(() -> {
                for (int i = 0; i < textArray.length; i++) {
                    emitter.onNext(textArray[i]);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                emitter.onComplete();
            }).start();
        }, BackpressureStrategy.BUFFER);

        // 请求参数
        SpeechSynthesisParam param =
                SpeechSynthesisParam.builder()
                        // 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将apiKey替换为自己的API Key
                        // .apiKey("yourApikey")
                        .model(model) // 模型
                        .voice(voice) // 音色
                        .build();
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
        synthesizer.streamingCallAsFlowable(textSource).blockingForEach(result -> {
            if (result.getAudioFrame() != null) {
                // 此处实现播放音频的逻辑
                System.out.println(
                        TimeUtils.getTimestamp() +
                                " audio result length: " + result.getAudioFrame().capacity());
            }
        });
        System.out.println(
                "[Metric] requestId: "
                        + synthesizer.getLastRequestId()
                        + ", first package delay ms: "
                        + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) throws NoApiKeyException {
        streamAudioDataToSpeaker();
        System.exit(0);
    }
}

高并发调用

DashScope Java SDK中,采用了OkHttp3的连接池技术,以减少重复建立连接的开销。详情请参见高并发场景

请求参数

通过SpeechSynthesisParam的链式方法配置模型、音色等参数。配置完成的参数对象传入SpeechSynthesizer的构造函数中使用。

点击查看示例

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
    .model("cosyvoice-v2") // 模型
    .voice("longxiaochun_v2") // 音色
    .format(SpeechSynthesisAudioFormat.WAV_8000HZ_MONO_16BIT) // 音频编码格式、采样率
    .volume(50) // 音量,取值范围:[0, 100]
    .speechRate(1.0) // 语速,取值范围:[0.5, 2]
    .pitchRate(1.0) // 语调,取值范围:[0.5, 2]
    .build();

参数

类型

默认值

是否必须

说明

参数

类型

默认值

是否必须

说明

model

String

-

指定模型,支持cosyvoice-v1cosyvoice-v2

voice

String

-

指定语音合成所使用的音色。

支持如下两种音色:

  • 默认音色(参见音色列表)。

  • 通过声音复刻功能定制的专属音色。使用声音复刻音色时(请确保声音复刻与语音合成使用同一账号),需将voice参数设置为复刻音色的ID,完整操作流程请参见使用复刻的音色进行语音合成cosyvoice-v1cosyvoice-v2模型均支持声音复刻功能。

format

enum

因音色而异

指定音频编码格式及采样率。

若未指定format,系统将根据voice参数自动选择该音色的推荐格式(如龙小淳默认使用MP3_22050HZ_MONO_256KBPS),详情请参见音色列表

可指定的音频编码格式及采样率如下:

  • SpeechSynthesisAudioFormat.WAV_8000HZ_MONO_16BIT,代表音频格式为wav,采样率为8kHz

  • SpeechSynthesisAudioFormat.WAV_16000HZ_MONO_16BIT,代表音频格式为wav,采样率为16kHz

  • SpeechSynthesisAudioFormat.WAV_22050HZ_MONO_16BIT,代表音频格式为wav,采样率为22.05kHz

  • SpeechSynthesisAudioFormat.WAV_24000HZ_MONO_16BIT,代表音频格式为wav,采样率为24kHz

  • SpeechSynthesisAudioFormat.WAV_44100HZ_MONO_16BIT,代表音频格式为wav,采样率为44.1kHz

  • SpeechSynthesisAudioFormat.WAV_48000HZ_MONO_16BIT,代表音频格式为wav,采样率为48kHz

  • SpeechSynthesisAudioFormat.MP3_8000HZ_MONO_128KBPS,代表音频格式为mp3,采样率为8kHz

  • SpeechSynthesisAudioFormat.MP3_16000HZ_MONO_128KBPS,代表音频格式为mp3,采样率为16kHz

  • SpeechSynthesisAudioFormat.MP3_22050HZ_MONO_256KBPS,代表音频格式为mp3,采样率为22.05kHz

  • SpeechSynthesisAudioFormat.MP3_24000HZ_MONO_256KBPS,代表音频格式为mp3,采样率为24kHz

  • SpeechSynthesisAudioFormat.MP3_44100HZ_MONO_256KBPS,代表音频格式为mp3,采样率为44.1kHz

  • SpeechSynthesisAudioFormat.MP3_48000HZ_MONO_256KBPS,代表音频格式为mp3,采样率为48kHz

  • SpeechSynthesisAudioFormat.PCM_8000HZ_MONO_16BIT,代表音频格式为pcm,采样率为8kHz

  • SpeechSynthesisAudioFormat.PCM_16000HZ_MONO_16BIT,代表音频格式为pcm,采样率为16kHz

  • SpeechSynthesisAudioFormat.PCM_22050HZ_MONO_16BIT,代表音频格式为pcm,采样率为22.05kHz

  • SpeechSynthesisAudioFormat.PCM_24000HZ_MONO_16BIT,代表音频格式为pcm,采样率为24kHz

  • SpeechSynthesisAudioFormat.PCM_44100HZ_MONO_16BIT,代表音频格式为pcm,采样率为44.1kHz

  • SpeechSynthesisAudioFormat.PCM_48000HZ_MONO_16BIT,代表音频格式为pcm,采样率为48kHz

volume

int

50

指定音量,取值范围:0~100。

speechRate

float

1.0

指定语速,取值范围:0.5~2。

  • 0.5:表示默认语速的0.5倍速。

  • 1:表示默认语速。默认语速是指模型默认输出的合成语速,语速会因音色不同而略有不同。约每秒钟4个字。

  • 2:表示默认语速的2倍速。

pitchRate

float

1.0

指定语调,取值范围:0.5~2。

apiKey

String

-

指定用户API Key。

关键接口

SpeechSynthesizer

SpeechSynthesizer通过“import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;”方式引入,提供语音合成的关键接口。

接口/方法

参数

返回值

描述

接口/方法

参数

返回值

描述

public SpeechSynthesizer(SpeechSynthesisParam param, ResultCallback<SpeechSynthesisResult> callback)

SpeechSynthesizer实例

构造函数。

当您使用异步调用流式调用模式时,请将callback参数设置为回调接口(ResultCallback)

当您使用同步调用通过Flowable调用模式时,请将callback参数设为null。

public ByteBuffer call(String text)

text:待合成文本(UTF-8)

ByteBuffernull

将整段文本转换为语音。

在创建SpeechSynthesizer实例时,存在以下两种情况:

  • 没有指定ResultCallbackcall方法会阻塞当前线程直到语音合成完成。使用方法请参见同步调用

  • 指定了ResultCallbackcall方法会立刻返回null。合成结果通过回调接口(ResultCallback)onEvent方法获取。使用方法请参见异步调用

注意:

调用call方法发送的文本(即text)长度不得超过2000字符。

字符计算规则:
1个汉字算作2个字符。
1个英文字母、1个标点或1个句子中间的空格均算作1个字符。
public void streamingCall(String text)

text:待合成文本(UTF-8)

流式发送待合成文本。

您可以多次调用该接口,将待合成文本分多次发送给服务端。合成结果通过回调接口(ResultCallback)onEvent方法获取。

详细调用流程和参考示例请参见流式调用

注意:

  • 必须在所有streamingCall调用完成后执行streamingComplete结束任务。

  • 每次调用streamingCall方法发送的文本片段(即text)长度不得超过2000字符,累计发送的文本总长度不得超过20万字符。

    字符计算规则:
    1个汉字算作2个字符。
    1个英文字母、1个标点或1个句子中间的空格均算作1个字符。
public void streamingComplete() throws RuntimeException

结束流式语音合成。

该方法阻塞调用线程直至发生以下条件之一:

  • 服务端完成最终音频合成(成功)

  • 流式会话异常中断(失败)

  • 达到10分钟超时阈值(自动解除阻塞)

详细的调用流程和参考示例请参见流式调用

public Flowable<SpeechSynthesisResult> callAsFlowable(String text)

text:待合成文本,须为utf-8格式

合成结果,封装在 Flowable<SpeechSynthesisResult>

非流式文本输入实时转换为流式语音输出,合成结果在flowable中流式返回。

详细的调用流程和参考示例请参见通过Flowable调用

public Flowable<SpeechSynthesisResult> streamingCallAsFlowable(Flowable<String> textStream)

textStream:封装了待合成文本的Flowable实例

合成结果,封装在 Flowable<SpeechSynthesisResult>

流式文本输入实时转换为流式语音输出,合成结果在flowable中流式返回。

详细的调用流程和参考示例请参见通过Flowable调用

public String getLastRequestId()

当前上一个任务的request id

获取上一个任务的request id,在调用callstreamingCallcallAsFlowablestreamingCallAsFlowable开始新任务之后可以使用。

public long getFirstPackageDelay()

当前任务首包延迟

获取当前任务的首包延迟,任务结束后使用。

首包延迟是开始发送文本和接收第一个音频包之间的时间,单位为毫秒。

回调接口(ResultCallback

异步调用流式调用时,通过回调接口ResultCallback获取合成结果。

点击查看示例

ResultCallback<SpeechSynthesisResult> callback = new ResultCallback<SpeechSynthesisResult>() {
    @Override
    public void onEvent(SpeechSynthesisResult result) {
        System.out.println("RequestId为:" + result.getRequestId());
        // 实时处理音频分片(如播放/写入缓冲)
    }

    @Override
    public void onComplete() {
        System.out.println("任务完成");
        // 处理合成结束逻辑(如释放播放器)
    }

    @Override
    public void onError(Exception e) {
        System.out.println("任务失败:" + e.getMessage());
        // 处理异常(网络错误/服务端错误码)
    }
};

接口/方法

参数

返回值

描述

接口/方法

参数

返回值

描述

public void onEvent(SpeechSynthesisResult result)

result:SpeechSynthesisResult实例

当服务端推送语音合成数据时被异步回调。

调用SpeechSynthesisResultgetAudioFrame方法能够获得二进制音频数据。

public void onComplete()

当语音合成完成后被异步回调。

public void onError(Exception e)

e:异常信息

发生异常时该接口被异步回调。

建议在onError方法中实现完整的异常日志记录和资源清理逻辑。

响应结果

服务器返回二进制音频数据:

  • 同步调用:对SpeechSynthesizercall方法返回的二进制音频数据进行处理。

  • 异步调用流式调用:对回调接口(ResultCallback)onEvent方法的参数(SpeechSynthesisResult类型)进行处理。

    SpeechSynthesisResult的关键接口如下:

    接口/方法

    参数

    返回值

    描述

    接口/方法

    参数

    返回值

    描述

    public ByteBuffer getAudioFrame()

    二进制音频数据

    返回当前流式合成片段的二进制音频数据,可能为空(当无新数据到达时)。

    您可以将二进制音频数据合成为一个完整的音频文件后使用播放器播放,也可以通过支持流式播放的播放器实时播放。

    重要
    • 在流式语音合成中,完整的音频文件会被分多次返回。播放流式音频时,需要使用支持流式播放的音频播放器,而不是将每一帧作为独立的音频进行播放,否则可能导致解码失败。

      支持流式播放的播放器:ffmpeg、pyaudio (Python)、AudioFormat (Java)、MediaSource (Javascript)等。
    • 将音频数据合成为一个完整的音频文件时,请以追加模式将数据写入同一个文件。

    • 在使用wavmp3格式进行流式语音合成时,文件头信息仅包含在第一帧中,后续帧为纯音频数据。

错误码

在使用API过程中,如果调用失败并返回错误信息,请参见错误信息进行解决。

更多示例

更多示例,请参见GitHub

常见问题

请参见GitHub QA

升级CosyVoice2.0说明

部分音色支持升级使用CosyVoice2.0模型,升级方法:

  1. model字段替换为"cosyvoice-v2"

  2. voice字段使用CosyVoice2.0音色

升级后调用方法和计费不变,默认QPS3。支持升级的音色包括:

升级前voice参数

升级后voice参数

longcheng

longcheng_v2

longhua

longhua_v2

longshu

longshu_v2

loongbella

loongbella_v2

longwan

longwan_v2

longxiaochun

longxiaochun_v2

longxiaoxia

longxiaoxia_v2

更多的音色会陆续上线,敬请期待。

重要

目前cosyvoice-v2服务只支持使用主账号调用。

音色列表

当前默认支持的音色如下表所示。若您需要更加个性化的音色,可通过声音复刻功能免费定制专属音色,详情请参见使用复刻的音色进行语音合成

说明
  • 默认采样率代表当前音色的最佳采样率,缺省条件下默认按照该采样率输出,同时支持降采样或升采样。

    如龙小淳音色,默认采样率22.05 kHz,使用时可以降采样到8 kHz,但升采样到48 kHz时不会有额外效果提升。

  • 如果当前音色在“语言”列中未明确标注支持的口音,则表明该音色不区分具体口音。

音色

音频试听(右键保存音频)

model参数

voice参数

适用场景

语言

默认采样率(Hz)

默认音频格式

音色

音频试听(右键保存音频)

model参数

voice参数

适用场景

语言

默认采样率(Hz)

默认音频格式

龙婉

cosyvoice-v1

longwan

语音助手、

导航播报、

聊天数字人

中文普通话

22050

mp3

龙橙

cosyvoice-v1

longcheng

语音助手、

导航播报、

聊天数字人

中文普通话

22050

mp3

龙华

cosyvoice-v1

longhua

语音助手、

导航播报、

聊天数字人

中文普通话

22050

mp3

龙小淳

cosyvoice-v1

longxiaochun

语音助手、

导航播报、

聊天数字人

中文普通话+英文

22050

mp3

龙小夏

cosyvoice-v1

longxiaoxia

语音助手、聊天数字人

中文普通话

22050

mp3

龙小诚

cosyvoice-v1

longxiaocheng

语音助手、导航播报、聊天数字人

中文普通话+英文

22050

mp3

龙小白

cosyvoice-v1

longxiaobai

聊天数字人、有声书、语音助手

中文普通话

22050

mp3

龙老铁

cosyvoice-v1

longlaotie

新闻播报、有声书、语音助手、直播带货、导航播报

中文东北口音

22050

mp3

龙书

cosyvoice-v1

longshu

有声书、语音助手、导航播报、新闻播报、智能客服

中文普通话

22050

mp3

龙硕

cosyvoice-v1

longshuo

语音助手、导航播报、新闻播报、客服催收

中文普通话

22050

mp3

龙婧

cosyvoice-v1

longjing

语音助手、导航播报、新闻播报、客服催收

中文普通话

22050

mp3

龙妙

cosyvoice-v1

longmiao

客服催收、导航播报、有声书、语音助手

中文普通话

22050

mp3

龙悦

cosyvoice-v1

longyue

语音助手、诗词朗诵、有声书朗读、导航播报、新闻播报、客服催收

中文普通话

22050

mp3

龙媛

cosyvoice-v1

longyuan

有声书、语音助手、聊天数字人

中文普通话

22050

mp3

龙飞

cosyvoice-v1

longfei

会议播报、新闻播报、有声书

中文普通话

22050

mp3

龙杰力豆

cosyvoice-v1

longjielidou

新闻播报、有声书、聊天助手

中文普通话+英文

22050

mp3

龙彤

cosyvoice-v1

longtong

有声书、导航播报、聊天数字人

中文普通话

22050

mp3

龙祥

cosyvoice-v1

longxiang

新闻播报、有声书、导航播报

中文普通话

22050

mp3

Stella

cosyvoice-v1

loongstella

语音助手、直播带货、导航播报、客服催收、有声书

中文普通话+英文

22050

mp3

Bella

cosyvoice-v1

loongbella

语音助手、客服催收、新闻播报、导航播报

中文普通话

22050

mp3

  • 本页导读 (1)
  • 前提条件
  • 快速开始
  • 同步调用
  • 异步调用
  • 流式调用
  • 通过Flowable调用
  • 高并发调用
  • 请求参数
  • 关键接口
  • SpeechSynthesizer类
  • 回调接口(ResultCallback)
  • 响应结果
  • 错误码
  • 更多示例
  • 常见问题
  • 升级CosyVoice2.0说明
  • 音色列表
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等