语音合成Sambert Java API

更新时间:2025-03-13 02:42:22

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

前提条件

调用模式

核心类(SpeechSynthesizer)提供了同步调用和流式调用的接口。请根据业务场景选择合适的调用模式。

同步调用

提交单个语音合成任务,无需调用回调方法,进行语音合成(无流式输出中间结果),最终一次性获取完整结果。

image
  1. 配置请求参数

    设置模型、待合成文本等参数:

    SpeechSynthesisParam param = SpeechSynthesisParam.builder()
                    .model("sambert-zhichu-v1")
                    .text("今天天气怎么样")
                    .sampleRate(48000)
                    .format(SpeechSynthesisAudioFormat.WAV)
                    .build();
  2. 实例化核心类(SpeechSynthesizer)

    SpeechSynthesizer synthesizer = new SpeechSynthesizer();
  3. 同步调用。

    调用核心类(SpeechSynthesizer)call方法,该方法阻塞当前线程直到所有结果返回,返回的数据类型为ByteBuffer类型。

    // 提交同步合成任务,获取完整的音频数据
    ByteBuffer audio = synthesizer.call(param);
  4. 处理音频数据。

    处理音频数据,例如保存到本地。

点击查看完整示例

以下示例展示了如何使用同步接口调用发音人模型知厨(sambert-zhichu-v1),将文案“今天天气怎么样”合成采样率为48kHz,音频格式为wav的音频,并保存到名为output.wav的文件中。

import com.alibaba.dashscope.audio.tts.SpeechSynthesizer;
import com.alibaba.dashscope.audio.tts.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.tts.SpeechSynthesisAudioFormat;

import java.io.*;
import java.nio.ByteBuffer;

public class Main {
    public static void syncAudioDataToFile() {
        SpeechSynthesizer synthesizer = new SpeechSynthesizer();
        SpeechSynthesisParam param = SpeechSynthesisParam.builder()
                // 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将apiKey替换为自己的API Key
                // .apiKey("yourApikey")
                .model("sambert-zhichu-v1")
                .text("今天天气怎么样")
                .sampleRate(48000)
                .format(SpeechSynthesisAudioFormat.WAV)
                .build();

        File file = new File("output.wav");
        // 提交同步合成任务,获取完整的音频数据
        ByteBuffer audio = synthesizer.call(param);
        try (FileOutputStream fos = new FileOutputStream(file)) {
            fos.write(audio.array());
            System.out.println("synthesis done!");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

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

流式调用

提交单个语音合成任务,通过回调的方式流式输出中间结果,合成结果通过ResultCallback中的回调方法流式进行获取。

image
  1. 配置请求参数

    设置模型、待合成文本等参数:

    SpeechSynthesisParam param = SpeechSynthesisParam.builder()
                    .model("sambert-zhichu-v1")
                    .text("今天天气怎么样")
                    .sampleRate(48000)
                    .format(SpeechSynthesisAudioFormat.WAV)
                    .build();
  2. 实例化回调接口(ResultCallback)

  3. 实例化核心类(SpeechSynthesizer)

    SpeechSynthesizer synthesizer = new SpeechSynthesizer();
  4. 开启任务,流式接收合成结果。

    调用核心类(SpeechSynthesizer)call方法开启任务。语音合成的结果通过回调接口(ResultCallback)的回调方法(如onEventonComplete)实时返回并处理。

    synthesizer.call(param, callback);
  5. 文本提交完成后结束任务。

    调用核心类(SpeechSynthesizer)streamingComplete方法结束任务,请勿遗漏该步骤,否则服务端可能不会返回缓存的剩余音频数据。

    语音合成成功完成回调后(ResultCallbackonComplete方法被调用之后)还可以一次性获取完整的音频和时间戳结果(调用核心类(SpeechSynthesizer)getAudioDatagetTimestamps方法)。

    synthesizer.streamingComplete();

点击查看完整示例

以下示例展示了如何使用流式接口调用发音人模型知厨(sambert-zhichu-v1)将文案“今天天气怎么样”合成采样率为48kHz,默认音频格式(wav)的流式音频,并获取对应时间戳。

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

import java.util.concurrent.CountDownLatch;

public class Main {
    public static void main(String[] args) {
        CountDownLatch latch = new CountDownLatch(1);
        SpeechSynthesizer synthesizer = new SpeechSynthesizer();
        SpeechSynthesisParam param = SpeechSynthesisParam.builder()
                // 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将apiKey替换为自己的API Key
                // .apiKey("yourApikey")
                .model("sambert-zhichu-v1")
                .text("今天天气怎么样")
                .sampleRate(48000)
                .enableWordTimestamp(true)
                .enablePhonemeTimestamp(true)
                .build();

        class ReactCallback extends ResultCallback<SpeechSynthesisResult> {
            @Override
            public void onEvent(SpeechSynthesisResult result) {
                if (result.getAudioFrame() != null) {
                    // do something with the audio frame
                    System.out.println("audio result length: " + result.getAudioFrame().array().length);
                }
                if (result.getTimestamp() != null) {
                    // do something with the timestamp
                    System.out.println("timestamp: " + result.getTimestamp());
                }
            }

            @Override
            public void onComplete() {
                // do something when the synthesis is done
                System.out.println("onComplete!");
                latch.countDown();
            }

            @Override
            public void onError(Exception e) {
                // do something when an error occurs
                System.out.println("onError:" + e);
                latch.countDown();
            }
        }

        synthesizer.call(param, new ReactCallback());
        try {
            latch.await();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.exit(0);
    }
}

通过Flowable调用

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

点击查看完整示例

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

您也可以在Flowable的所有流式数据返回完成后,通过核心类(SpeechSynthesizer)getAudioDatagetTimestamps方法分别获取完整的合成结果和完整的时间戳。

import com.alibaba.dashscope.audio.tts.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.tts.SpeechSynthesisResult;
import com.alibaba.dashscope.audio.tts.SpeechSynthesizer;
import io.reactivex.Flowable;

public class Main {
    public static void main(String[] args) {
        SpeechSynthesizer synthesizer = new SpeechSynthesizer();
        SpeechSynthesisParam param = SpeechSynthesisParam.builder()
                // 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将apiKey替换为自己的API Key
                // .apiKey("yourApikey")
                .model("sambert-zhichu-v1")
                .text("今天天气怎么样")
                .sampleRate(48000)
                .enableWordTimestamp(true)
                .build();

        Flowable<SpeechSynthesisResult> flowable = synthesizer.streamCall(param);
        flowable.blockingForEach(
                msg -> {
                    if (msg.getAudioFrame() != null) {
                        // do something with the audio frame
                        System.out.println("getAudioFrame");
                    }
                    if (msg.getTimestamp() != null) {
                        // do something with the timestamp
                        System.out.println("getTimestamp");
                    }
                }
        );
        System.exit(0);
    }
}

高并发调用

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

请求参数

请求参数通过SpeechSynthesisParam的链式方法进行配置。

点击查看示例

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
                .model("sambert-zhichu-v1")
                .text("今天天气怎么样")
                .sampleRate(48000)
                .enableWordTimestamp(true)
                .build();

参数

类型

默认值

是否必须

说明

参数

类型

默认值

是否必须

说明

model

String

-

指定用于语音合成的音色模型名,完整列表请参见模型列表

text

String

-

指定待合成文本,要求采用UTF-8编码且不能为空。

最高字符限制:1万字符。

字符计算规则:1个汉字、1个英文字母、1个标点或1个句子中间空格均算作1个字符。

支持SSML格式。SSML标记语言的使用请参见SSML标记语言介绍

format

enum

SpeechSynthesisAudioFormat.WAV

指定合成音频的编码格式,支持下列格式:

  • SpeechSynthesisAudioFormat.PCM

  • SpeechSynthesisAudioFormat.WAV

  • SpeechSynthesisAudioFormat.MP3

SpeechSynthesisAudioFormat通过“import com.alibaba.dashscope.audio.tts.SpeechSynthesisAudioFormat;”的方式引入。

sampleRate

int

16000

指定合成音频的采样率(单位:Hz),建议使用模型默认采样率(参见模型列表),如果不匹配,服务会进行必要的升降采样处理。

volume

int

50

指定合成音频的音量,取值范围是0~100。

rate

float

1.0

指定合成音频的语速,取值范围:0.5~2。

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

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

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

pitch

float

1.0

指定合成音频的语调,取值范围:0.5~2。

enableWordTimestamp

boolean

false

是否开启字级别时间戳。默认不开启。

enablePhonemeTimestamp

boolean

false

是否在开启字级别时间戳(enableWordTimestamptrue)的基础上,进一步显示音素级别时间戳。默认不开启。

apiKey

String

-

用户API Key。如已将API Key配置到环境变量,则无须在代码中设置。

响应结果

同步调用模式:响应结果为二进制音频数据。

流式调用模式:响应结果为音频数据和时间戳信息(SpeechSynthesisResult)

音频数据和时间戳信息(SpeechSynthesisResult

SpeechSynthesisResult封装了语音合成结果,常用的接口为getAudioFramegetTimestamp

接口/方法

参数

返回值

描述

接口/方法

参数

返回值

描述

public ByteBuffer getAudioFrame()

二进制音频数据

返回一个流式合成片段的增量二进制音频数据,可能为空。

public Sentence getTimestamp()

句子级别时间戳信息(Sentence)List集合

批量获取句子级别时间戳信息,可能为空。

句子级别时间戳信息(Sentence

Sentence封装了句子级别时间戳信息。

接口/方法

参数

返回值

描述

接口/方法

参数

返回值

描述

public int getBeginTime()

句子开始时间,单位为ms

返回句子开始时间。

public int getEndTime()

句子结束时间,单位为ms

返回句子结束时间。

public List<Word> getWords()

字级别时间戳信息(Word)List集合

批量获取字级别时间戳信息,可能为空。

字级别时间戳信息(Word

Word封装了字级别时间戳信息。

接口/方法

参数

返回值

描述

接口/方法

参数

返回值

描述

public int getBeginTime()

词开始时间,单位为ms

返回词开始时间。

public int getEndTime()

词结束时间,单位为ms

返回词结束时间。

public String getText()

文本信息

返回文本信息。

public List<Phoneme> getPhonemes()

音素级别时间戳信息(Phoneme)List集合

批量获取音素级别时间戳信息,可能为空。

音素级别时间戳信息(Phoneme

Phoneme封装了音素级别时间戳信息。

接口/方法

参数

返回值

描述

接口/方法

参数

返回值

描述

public int getBeginTime()

音素开始时间,单位为ms

返回音素开始时间。

public int getEndTime()

音素结束时间,单位为ms

返回音素结束时间。

public String getText()

文本信息

返回文本信息。

public String getTone()

音调

返回音调。

  • 英文中,0、1、2分别代表轻音、重音和次重音。

  • 拼音中,1、2、3、4、5分别代表一声、二声、三声、四声和轻声。

关键接口

回调接口(ResultCallback

实现异步监听需继承ResultCallback抽象类,具备以下特征:

  1. 类型化处理:通过泛型SpeechSynthesisResult处理结构化数据。

  2. 事件驱动:专注处理有效业务数据,需实现以下方法:

点击查看示例

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)

当服务端返回合成数据时会被回调。

public void onComplete()

当所有合成数据全部返回后被回调。

public void onError(Exception e)

e:异常信息

当调用过程出现异常以及服务返回错误后被回调。

核心类(SpeechSynthesizer

SpeechSynthesizer可以通过“import com.alibaba.dashscope.audio.tts.SpeechSynthesizer;”方式引入。它的关键接口如下:

接口/方法

参数

返回值

描述

接口/方法

参数

返回值

描述

public ByteBuffer call(SpeechSynthesisParam param)

param:语音合成参数配置类SpeechSynthesisParam实例,封装了模型、待合成文本等参数

二进制音频

发送待合成文本并获取语音合成结果。该方法阻塞当前线程直到所有结果返回。

public void call(SpeechSynthesisParam param, ResultCallback<SpeechSynthesisResult> callback)
  • param:语音合成相关参数

  • callback:回调类,ResultCallback实例

异步开启语音合成任务。

任务开启后,服务端会通过回调的方式调用ResultCallback实例的方法,将关键流程信息和数据返回给客户端。

public ByteBuffer getAudioData()

二进制音频

获取完整的二进制音频数据。

流式调用时,完成回调后(ResultCallbackonComplete方法被调用之后)可以使用该方法一次性获取完整的音频。

public List<Sentence> getTimestamps()

句子级别时间戳信息(Sentence)List集合

获取完整的句子级别时间戳信息(Sentence)

流式调用时,完成回调后(ResultCallbackonComplete方法被调用之后)可以使用该方法一次性获取完整的时间戳。

public String getLastRequestId()

当前任务的request ID

获取当前任务的request ID,在调用call开始新任务之后可以使用。

public long getFirstPackageDelay()

当前任务首包延迟

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

错误码

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

更多示例

更多示例,请参见GitHub

常见问题

请参见GitHub QA

模型列表

说明

默认采样率代表当前模型的最佳采样率,缺省条件下默认按照该采样率输出,同时支持降采样或升采样。如知妙音色,默认采样率16 kHz,使用时可以降采样到8 kHz,但升采样到48 kHz时不会有额外效果提升。

音色

音频试听

model参数

时间戳支持

适用场景

特色

语言

默认采样率(Hz)

音色

音频试听

model参数

时间戳支持

适用场景

特色

语言

默认采样率(Hz)

知楠

sambert-zhinan-v1

通用场景

广告男声

中文+英文

48k

知琪

sambert-zhiqi-v1

通用场景

温柔女声

中文+英文

48k

知厨

sambert-zhichu-v1

新闻播报

舌尖男声

中文+英文

48k

知德

sambert-zhide-v1

新闻播报

新闻男声

中文+英文

48k

知佳

sambert-zhijia-v1

新闻播报

标准女声

中文+英文

48k

知茹

sambert-zhiru-v1

新闻播报

新闻女声

中文+英文

48k

知倩

sambert-zhiqian-v1

配音解说、新闻播报

资讯女声

中文+英文

48k

知祥

sambert-zhixiang-v1

配音解说

磁性男声

中文+英文

48k

知薇

sambert-zhiwei-v1

阅读产品简介

萝莉女声

中文+英文

48k

知浩

sambert-zhihao-v1

通用场景

咨询男声

中文+英文

16k

知婧

sambert-zhijing-v1

通用场景

严厉女声

中文+英文

16k

知茗

sambert-zhiming-v1

通用场景

诙谐男声

中文+英文

16k

知墨

sambert-zhimo-v1

通用场景

情感男声

中文+英文

16k

知娜

sambert-zhina-v1

通用场景

浙普女声

中文+英文

16k

知树

sambert-zhishu-v1

通用场景

资讯男声

中文+英文

16k

知莎

sambert-zhistella-v1

通用场景

知性女声

中文+英文

16k

知婷

sambert-zhiting-v1

通用场景

电台女声

中文+英文

16k

知笑

sambert-zhixiao-v1

通用场景

资讯女声

中文+英文

16k

知雅

sambert-zhiya-v1

通用场景

严厉女声

中文+英文

16k

知晔

sambert-zhiye-v1

通用场景

青年男声

中文+英文

16k

知颖

sambert-zhiying-v1

通用场景

软萌童声

中文+英文

16k

知媛

sambert-zhiyuan-v1

通用场景

知心姐姐

中文+英文

16k

知悦

sambert-zhiyue-v1

客服

温柔女声

中文+英文

16k

知柜

sambert-zhigui-v1

阅读产品简介

直播女声

中文+英文

16k

知硕

sambert-zhishuo-v1

数字人

自然男声

中文+英文

16k

知妙(多情感)

sambert-zhimiao-emo-v1

阅读产品简介、数字人、直播

多种情感女声

中文+英文

16k

知猫

sambert-zhimao-v1

阅读产品简介、配音解说、数字人、直播

直播女声

中文+英文

16k

知伦

sambert-zhilun-v1

配音解说

悬疑解说

中文+英文

16k

知飞

sambert-zhifei-v1

配音解说

激昂解说

中文+英文

16k

知达

sambert-zhida-v1

新闻播报

标准男声

中文+英文

16k

Camila

sambert-camila-v1

通用场景

西班牙语女声

西班牙语

16k

Perla

sambert-perla-v1

通用场景

意大利语女声

意大利语

16k

Indah

sambert-indah-v1

通用场景

印尼语女声

印尼语

16k

Clara

sambert-clara-v1

通用场景

法语女声

法语

16k

Hanna

sambert-hanna-v1

通用场景

德语女声

德语

16k

Beth

sambert-beth-v1

通用场景

咨询女声

美式英文

16k

Betty

sambert-betty-v1

通用场景

客服女声

美式英文

16k

Cally

sambert-cally-v1

通用场景

自然女声

美式英文

16k

Cindy

sambert-cindy-v1

通用场景

对话女声

美式英文

16k

Eva

sambert-eva-v1

通用场景

陪伴女声

美式英文

16k

Donna

sambert-donna-v1

通用场景

教育女声

美式英文

16k

Brian

sambert-brian-v1

通用场景

客服男声

美式英文

16k

Waan

sambert-waan-v1

通用场景

泰语女声

泰语

16k

  • 本页导读 (1)
  • 前提条件
  • 调用模式
  • 同步调用
  • 流式调用
  • 通过Flowable调用
  • 高并发调用
  • 请求参数
  • 响应结果
  • 音频数据和时间戳信息(SpeechSynthesisResult)
  • 句子级别时间戳信息(Sentence)
  • 字级别时间戳信息(Word)
  • 音素级别时间戳信息(Phoneme)
  • 关键接口
  • 回调接口(ResultCallback)
  • 核心类(SpeechSynthesizer)
  • 错误码
  • 更多示例
  • 常见问题
  • 模型列表