通过DashScope Java SDK进行Qwen-Audio-TTS语音合成。
接口地址
SDK 的接口地址需在初始化前设置为下方地址。
wss://maas.qianwenaiapi.com/api-ws/v1/inference
SpeechSynthesizer
包路径:com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer
构造方法
param:语音合成参数,通过SpeechSynthesisParam .builder()构建callback:回调函数,用于流式调用。非流式调用时传入null
call() - 非流式/单向流式合成
方法签名:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
text | String | 是 | 待合成的文本,长度不得超过20000字符。 |
ByteBuffer 或 null。非流式调用时返回完整音频数据;单向流式调用时音频通过回调返回,此方法返回null。
streamingCall() - 双向流式合成
方法签名:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
text | String | 是 | 待合成的文本,长度不得超过20000字符。可多次调用追加文本。 |
streamingComplete() - 结束双向流式调用
方法签名:
streamingCancel() - 取消双向流式调用
方法签名:
SpeechSynthesizer 实例。
版本要求:使用该功能需要 Java SDK 版本不低于 2.22.26。
callAsFlowable() - 单向流式合成(响应式)
方法签名:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
text | String | 是 | 待合成的文本。 |
Flowable< SpeechSynthesisResult > 响应式流。
streamingCallAsFlowable() - 双向流式合成(响应式)
方法签名:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
textStream | Flowable<String> | 是 | 文本的响应式流。 |
Flowable< SpeechSynthesisResult > 响应式流。
getDuplexApi().close() - 关闭WebSocket连接
方法签名:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
code | int | 是 | 关闭码。 |
reason | String | 是 | 关闭原因。 |
boolean,是否成功关闭。
getLastRequestId() - 获取请求ID
方法签名:
String,请求ID。
getFirstPackageDelay() - 获取首包延迟
方法签名:
long,首包延迟(ms),从发送第一包到收到首包结果。
SpeechSynthesisParam
包路径:com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam
示例:
Builder 方法
| 方法 | 参数类型 | 必填 | 说明 |
|---|---|---|---|
model(String) | String | 是 | 模型名称。 |
voice(String) | String | 是 | 语音合成所使用的音色。
|
format(SpeechSynthesisAudioFormat) | enum | 否 | 音频编码格式及采样率。 默认值:SpeechSynthesisAudioFormat.MP3_22050HZ_MONO_256KBPS。 SpeechSynthesisAudioFormat包路径:com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisAudioFormat。 |
volume(int) | int | 否 | 音量。 默认值:50。 取值范围:[0, 100]。 |
speechRate(float) | float | 否 | 语速。 默认值:1.0。 取值范围:[0.5, 2.0]。 |
pitchRate(float) | float | 否 | 音调。 默认值:1.0。 取值范围:[0.5, 2.0]。 |
enableWordTimestamp(boolean) | boolean | 否 | 是否开启字级别时间戳。 默认值:false。 仅在流式输出模式下可用。支持复刻音色;支持的系统音色请参见Qwen-Audio-TTS音色列表。 |
seed(int) | int | 否 | 生成时使用的随机数种子,使合成的效果产生变化。在模型版本、文本、音色及其他参数均相同的前提下,使用相同的seed可复现相同的合成结果。 默认值0。 取值范围:[0, 65535]。 SDK版本低于2.21.7时,seed需要通过扩展参数进行设置。 |
languageHints(List<String>) | List<String> | 否 | 提示: - 此参数为数组,但当前版本仅处理第一个元素,因此建议只传入一个值。
|
instruction(String) | String | 否 | 设置指令,用于控制方言、情感或角色等合成效果。 使用说明请参见指令控制。 |
hotFix(ParamHotFix) | ParamHotFix | 否 | 文本热修复配置,用于自定义指定词语的发音或对待合成文本进行替换。 参数介绍:
|
parameter(String key, Object value) | String, Object | 否 | 设置扩展参数。 |
parameters(Map<String, Object>) | Map | 否 | 设置扩展参数。 |
扩展参数
通过 parameter() 或 parameters() 设置。
示例:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
bit_rate | integer | 否 | 音频码率(kbps)。音频格式为mp3或opus时,支持通过bit_rate参数调整码率。 默认值:32。 取值范围:[6, 510]。 |
enable_aigc_tag | boolean | 否 | 是否在生成的音频中添加AIGC隐性标识。设置为true时,会将隐性标识嵌入到支持格式(wav/mp3/opus)的音频中。 默认值:false。 |
aigc_propagator | String | 否 | 设置AIGC隐性标识中的 ContentPropagator 字段,用于标识内容的传播者。仅在 enable_aigc_tag 为 true 时生效。 默认值:千问AI平台账号。 |
aigc_propagate_id | String | 否 | 设置AIGC隐性标识中的 PropagateID 字段,用于唯一标识一次具体的传播行为。仅在 enable_aigc_tag 为 true 时生效。 默认值:本次语音合成请求Request ID。 |
ResultCallback
包路径:com.alibaba.dashscope.common.ResultCallback
onEvent() - 接收音频数据
方法签名:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
result | SpeechSynthesisResult | 是 | 接收到合成事件时触发,包含音频帧、时间戳信息和输出信息(事件类型、原始文本等)。 |
onComplete() - 合成完成
方法签名:
onError() - 错误处理
方法签名:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
e | Exception | 是 | 发生错误时触发,包含异常信息。 |
SpeechSynthesisResult
包路径:com.alibaba.dashscope.audio.tts.SpeechSynthesisResult
getAudioFrame() - 获取音频数据帧
方法签名:
ByteBuffer,音频数据帧。
getTimestamp() - 获取时间戳信息
方法签名:
Sentence,时间戳信息。
getOutput() - 获取输出信息
方法签名:
com.google.gson.JsonObject,合成事件的输出信息,包含事件类型和文本内容。需要SDK版本 >= 2.22.0。
句子级别时间戳信息(Sentence)
Sentence封装了句子级别时间戳信息。
getBeginTime() - 获取句子开始时间
方法签名:
getEndTime() - 获取句子结束时间
方法签名:
getWords() - 获取字级别时间戳
方法签名:
List集合,批量获取字级别时间戳信息,可能为空。
字级别时间戳信息(Word)
Word封装了字级别时间戳信息。
getBeginTime() - 获取词开始时间
方法签名:
getEndTime() - 获取词结束时间
方法签名:
getText() - 获取文本信息
方法签名:
String,文本信息。
getPhonemes() - 获取音素级别时间戳
方法签名:
List集合,批量获取音素级别时间戳信息,可能为空。
音素级别时间戳信息(Phoneme)
Phoneme封装了音素级别时间戳信息。
getBeginTime() - 获取音素开始时间
方法签名:
getEndTime() - 获取音素结束时间
方法签名:
getText() - 获取文本信息
方法签名:
String,文本信息。
getTone() - 获取音调
方法签名:
- 英文中,0、1、2分别代表轻音、重音和次重音。
- 拼音中,1、2、3、4、5分别代表一声、二声、三声、四声和轻声。
输出信息(output)
getOutput()返回JsonObject,封装了合成事件的输出信息。在onEvent回调或Flowable流中获取。包含以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
type | String | 事件类型。取值:sentence-begin(句子开始,返回待合成的文本内容)、sentence-synthesis(标识音频数据块,表示当前正在合成音频)、sentence-end(句子结束,返回文本内容和字级别时间戳)。 |
original_text | String | 当前句子的原始文本内容。在sentence-begin和sentence-end事件中返回。 |
sentence | JsonObject | 句子信息,包含句子编号(index)和字级别时间戳(words)。在sentence-end事件中包含完整的字级别时间戳信息。 |
示例代码
SDK提供了语音合成的关键接口,支持以下几种调用方式:
- 非流式调用:阻塞式,一次性发送完整文本,直接返回完整音频。适合短文本语音合成场景。
- 单向流式调用:非阻塞式,一次性发送完整文本,通过回调函数接收音频数据(可能分片)。适用于对实时性要求高的短文本语音合成场景。
- 双向流式调用:非阻塞式,可分多次发送文本片段,通过回调函数实时接收增量合成的音频流。适合实时性要求高的长文本语音合成场景。
通过Flowable调用
Flowable是RxJava中表示响应式数据流的类型,支持背压。关于Flowable的使用,请参见Flowable API详情。
使用Flowable前需确保已集成RxJava库,并了解响应式编程基础概念。
单次发送文本长度不得超过 20000 字符,且累计发送文本总长度不得超过 20 万字符。
- 单向流式调用
- 双向流式调用
以下示例展示了通过Flowable对象的
blockingForEach接口,阻塞式地获取每次流式返回的SpeechSynthesisResult类型数据。