本文介绍语音合成CosyVoice Java SDK的参数和接口细节。
用户指南:关于模型介绍和选型建议请参见实时语音合成-CosyVoice/Sambert。
前提条件
已开通服务并获取API Key。请配置API Key到环境变量,而非硬编码在代码中,防范因代码泄露导致的安全风险。
说明当您需要为第三方应用或用户提供临时访问权限,或者希望严格控制敏感数据访问、删除等高风险操作时,建议使用临时鉴权Token。
与长期有效的 API Key 相比,临时鉴权 Token 具备时效性短(60秒)、安全性高的特点,适用于临时调用场景,能有效降低API Key泄露的风险。
使用方式:在代码中,将原本用于鉴权的 API Key 替换为获取到的临时鉴权 Token 即可。
模型与价格
模型名称 | 单价 | 免费额度 |
cosyvoice-v3-plus | 2元/万字符 | 2025年11月15日0点前开通阿里云百炼:2000字符 2025年11月15日0点后开通阿里云百炼:1万字符 有效期:阿里云百炼开通后90天内 |
cosyvoice-v3-flash | 1元/万字符 | |
cosyvoice-v2 | 2元/万字符 | |
cosyvoice-v1 |
语音合成文本限制与格式规范
文本长度限制
字符计算规则
汉字(包括简/繁体汉字、日文汉字和韩文汉字)按2个字符计算,其他所有字符(如标点符号、字母、数字、日韩文假名/谚文等)均按 1个字符计算
计算文本长度时,不包含SSML 标签内容
示例:
"你好"→ 2(你)+2(好)=4字符"中A文123"→ 2(中)+1(A)+2(文)+1(1)+1(2)+1(3)=8字符"中文。"→ 2(中)+2(文)+1(。)=5字符"中 文。"→ 2(中)+1(空格)+2(文)+1(。)=6字符"<speak>你好</speak>"→ 2(你)+2(好)=4字符
编码格式
需采用UTF-8编码。
数学表达式支持说明
当前数学表达式解析功能仅适用于cosyvoice-v2、cosyvoice-v3-flash和cosyvoice-v3-plus模型,支持识别中小学常见的数学表达式,包括但不限于基础运算、代数、几何等内容。
详情请参见LaTeX 公式转语音。
SSML标记语言支持说明
当前SSML(Speech Synthesis Markup Language,语音合成标记语言)功能仅cosyvoice-v2模型的部分音色可用,使用时需满足以下条件:
使用DashScope SDK 2.20.3 或更高版本
仅支持同步调用和异步调用(即SpeechSynthesizer类的
call方法),不支持流式调用(即SpeechSynthesizer类的streamingCall方法)和Flowable调用。使用方法与普通语音合成一致:将包含SSML的文本传入SpeechSynthesizer类的
call方法即可
快速开始
SpeechSynthesizer类提供了语音合成的关键接口,支持以下几种调用方式:
同步调用:阻塞式,一次性发送完整文本,直接返回完整音频。适合短文本语音合成场景。
异步调用:非阻塞式,一次性发送完整文本,通过回调函数接收音频数据(可能分片)。适用于对实时性要求高的短文本语音合成场景。
流式调用:非阻塞式,可分多次发送文本片段,通过回调函数实时接收增量合成的音频流。适合实时性要求高的长文本语音合成场景。
同步调用
同步提交语音合成任务,直接获取完整结果。
实例化SpeechSynthesizer类绑定请求参数,调用call方法进行合成并获取二进制音频数据。
发送的文本长度不得超过2000字符(详情请参见SpeechSynthesizer类的call方法)。
每次调用call方法前,需要重新初始化SpeechSynthesizer实例。
异步调用
异步提交语音合成任务,通过注册ResultCallback回调,逐帧接收实时语音分段数据。
实例化SpeechSynthesizer类绑定请求参数和回调接口(ResultCallback),调用call方法进行合成并通过回调接口(ResultCallback)的onEvent方法实时获取合成结果。
发送的文本长度不得超过2000字符(详情请参见SpeechSynthesizer类的call方法)。
每次调用call方法前,需要重新初始化SpeechSynthesizer实例。
流式调用
分多次提交文本,通过注册ResultCallback回调,逐帧接收实时语音分段数据。
流式输入时可多次调用
streamingCall按顺序提交文本片段。服务端接收文本片段后自动进行分句:完整语句立即合成
不完整语句缓存至完整后合成
调用
streamingComplete时,服务端会强制合成所有已接收但未处理的文本片段(包括未完成的句子)。发送文本片段的间隔不得超过23秒,否则触发“request timeout after 23 seconds”异常。
若无待发送文本,需及时调用
streamingComplete结束任务。服务端强制设定23秒超时机制,客户端无法修改该配置。
实例化SpeechSynthesizer类
流式传输
多次调用SpeechSynthesizer类的
streamingCall方法分片提交待合成文本,将待合成文本分段发送至服务端。在发送文本的过程中,服务端会通过回调接口(ResultCallback)的
onEvent方法,将合成结果实时返回给客户端。每次调用
streamingCall方法发送的文本片段(即text)长度不得超过2000字符,累计发送的文本总长度不得超过20万字符。结束处理
调用SpeechSynthesizer类的
streamingComplete方法结束语音合成。该方法会阻塞当前线程,直到回调接口(ResultCallback)的
onComplete或者onError回调触发后才会释放线程阻塞。请务必确保调用该方法,否则可能会导致结尾部分的文本无法成功转换为语音。
通过Flowable调用
Flowable是一个用于工作流和业务流程管理的开源框架,它基于Apache 2.0许可证发布。关于Flowable的使用,请参见Flowable API详情。
使用Flowable前需确保已集成RxJava库,并了解响应式编程基础概念。
非流式调用
以下示例展示了通过Flowable对象的blockingForEach接口,阻塞式地获取每次流式返回的SpeechSynthesisResult类型数据。
您也可以在Flowable的所有流式数据返回完成后,通过SpeechSynthesizer类的getAudioData来获取完整的合成结果。
流式调用
以下示例展示了通过Flowable对象作为输入参数,输入文本流。并通过Flowable对象作为返回值,利用的blockingForEach接口,阻塞式地获取每次流式返回的SpeechSynthesisResult类型数据。
您也可以在Flowable的所有流式数据返回完成后,通过SpeechSynthesizer类的getAudioData来获取完整的合成结果。
高并发调用
在DashScope Java SDK中,采用了OkHttp3的连接池技术,以减少重复建立连接的开销。详情请参见高并发场景。
请求参数
通过SpeechSynthesisParam的链式方法配置模型、音色等参数。配置完成的参数对象传入SpeechSynthesizer类的构造函数中使用。
参数 | 类型 | 默认值 | 是否必须 | 说明 |
model | String | - | 是 | 指定模型。 不同版本的模型编码方式一致,但使用时须确保模型( |
voice | String | - | 是 | 指定语音合成所使用的音色。 支持默认音色和专属音色:
⚠️ 使用声音复刻系列模型合成语音时,仅能使用该模型复刻生成的专属音色,不能使用默认音色。 ⚠️ 使用专属音色合成语音时,语音合成模型( |
format | enum | mp3 | 否 | 指定音频编码格式及采样率。 若未指定 说明 默认采样率代表当前音色的最佳采样率,缺省条件下默认按照该采样率输出,同时支持降采样或升采样。 可指定的音频编码格式及采样率如下:
|
volume | int | 50 | 否 | 指定音量,取值范围:0~100。 |
speechRate | float | 1.0 | 否 | 指定语速,取值范围:0.5~2。
|
pitchRate | float | 1.0 | 否 | 指定语调,取值范围:0.5~2。 |
bit_rate | int | 32 | 否 | 指定音频的码率,取值范围:6~510kbps。 码率越大,音质越好,音频文件体积越大。 仅在音频格式(
说明
通过parameter设置通过parameters设置 |
enableWordTimestamp | boolean | false | 否 | 是否开启字级别时间戳,默认关闭。 仅cosyvoice-v2支持该功能。 时间戳结果仅能通过回调接口获取 |
seed | int | 0 | 否 | 生成时使用的随机数种子,使合成的效果产生变化。默认值0。取值范围:0~65535。 cosyvoice-v1不支持该功能。 |
languageHints | List | - | 否 | 提供语言提示,仅cosyvoice-v3-flash、cosyvoice-v3-plus支持该功能。 在语音合成中有如下作用:
若设置的语言提示与文本内容明显不符(如为中文文本设置 注意:此参数为数组,但当前版本仅处理第一个元素,因此建议只传入一个值。 |
instruction | String | - | 否 | 设置提示词。仅cosyvoice-v3-flash、cosyvoice-v3-plus支持该功能。 在语音合成中有如下作用:
|
apiKey | String | - | 否 | 指定用户API Key。 |
关键接口
SpeechSynthesizer类
SpeechSynthesizer通过“import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;”方式引入,提供语音合成的关键接口。
接口/方法 | 参数 | 返回值 | 描述 |
|
|
| 构造函数。
|
|
|
| 将整段文本(无论是纯文本还是包含SSML的文本)转换为语音。 在创建
重要 每次调用 |
|
| 无 | 流式发送待合成文本(不支持包含SSML的文本)。 您可以多次调用该接口,将待合成文本分多次发送给服务端。合成结果通过回调接口(ResultCallback)的 详细调用流程和参考示例请参见流式调用。 |
| 无 | 无 | 结束流式语音合成。 该方法阻塞调用线程直至发生以下条件之一:
详细的调用流程和参考示例请参见流式调用。 重要 流式调用时,请确保调用该方法,以免导致合成语音缺失。 |
|
| 合成结果,封装在 | 非流式文本(不支持包含SSML的文本)输入实时转换为流式语音输出,合成结果在flowable中流式返回。 详细的调用流程和参考示例请参见通过Flowable调用。 |
| code: WebSocket关闭码(Close Code) reason:关闭原因 这两个参数可参考The WebSocket Protocol文档进行配置 | true | 在任务结束后,无论是否出现异常都需要关闭WebSocket连接,避免造成连接泄漏。关于如何复用连接提升效率请参考高并发场景。 |
|
| 合成结果,封装在 | 流式文本(不支持包含SSML的文本)输入实时转换为流式语音输出,合成结果在flowable中流式返回。 详细的调用流程和参考示例请参见通过Flowable调用。 |
| 无 | 上一个任务的Request ID | 获取上一个任务的Request ID,在调用 |
| 无 | 当前任务首包延迟 | 获取当前任务的首包延迟(一般在500ms左右),任务结束后使用。 首包延迟是开始发送文本和接收第一个音频包之间的时间,单位为毫秒。 首次发送文本时需建立 WebSocket 连接,因此首包延迟会包含连接建立的耗时;若在高并发场景下复用连接,则不包含连接耗时。 |
回调接口(ResultCallback)
在异步调用或流式调用时,通过回调接口ResultCallback获取合成结果。通过“import com.alibaba.dashscope.common.ResultCallback;”方式引入。
接口/方法 | 参数 | 返回值 | 描述 |
|
| 无 | 当服务端推送语音合成数据时被异步回调。 调用SpeechSynthesisResult的 调用SpeechSynthesisResult的 |
| 无 | 无 | 当所有合成数据全部返回(语音合成完成)后被异步回调。 |
|
| 无 | 发生异常时该接口被异步回调。 建议在 |
响应结果
服务器返回二进制音频数据:
同步调用:对SpeechSynthesizer类的
call方法返回的二进制音频数据进行处理。异步调用或流式调用:对回调接口(ResultCallback)的
onEvent方法的参数(SpeechSynthesisResult类型)进行处理。SpeechSynthesisResult的关键接口如下:接口/方法
参数
返回值
描述
public ByteBuffer getAudioFrame()无
二进制音频数据
返回当前流式合成片段的二进制音频数据,可能为空(当无新数据到达时)。
您可以将二进制音频数据合成为一个完整的音频文件后使用播放器播放,也可以通过支持流式播放的播放器实时播放。
重要流式语音合成中,对于mp3/opus等压缩格式,音频分段传输需使用流式播放器,不可逐帧播放,避免解码失败。
支持流式播放的播放器:ffmpeg、pyaudio (Python)、AudioFormat (Java)、MediaSource (Javascript)等。
将音频数据合成完整的音频文件时,应以追加模式写入同一文件。
流式语音合成的wav/mp3 格式音频仅首帧包含头信息,后续帧为纯音频数据。
public String getRequestId()无
任务的Request ID
获取任务的Request ID。当调用
getAudioFrame获取到二进制音频数据时,getRequestId方法的返回值为null。public SpeechSynthesisUsage getUsage()无
SpeechSynthesisUsage:截止当前,本次请求中计费的有效字符数返回
SpeechSynthesisUsage或null。通过
SpeechSynthesisUsage的getCharacters方法,可获取截止当前,本次请求中计费的有效字符数,请以最后一次收到的SpeechSynthesisUsage为准。public Sentence getTimestamp()无
Sentence:截止当前,本次请求中计费的句子需要开启
enableWordTimestamp字级别时间戳返回
Sentence或null。Sentence的方法:getIndex:可获取句子编号,从0开始。getWords:可获取组成句子的字符数组List<Word>,请以最后一次收到的Sentence为准。
Word方法:getText:获取字的文本。getBeginIndex:获取字在句子中的开始位置索引,从 0 开始。getEndIndex:获取字在句子中的结束位置索引,从 1 开始。getBeginTime:获取字对应音频的开始时间戳,单位为毫秒。getEndTime:获取字对应音频的结束时间戳,单位为毫秒。
错误码
如遇报错问题,请参见错误信息进行排查。
更多示例
更多示例,请参见GitHub。
常见问题
功能特性/计量计费/限流
Q:当遇到发音不准的情况时,有什么解决方案可以尝试?
通过SSML可以对语音合成效果进行个性化定制。
Q:语音合成是按文本字符数计费的,要如何查看或获取每次合成的文本长度?
其他调用方式:通过响应结果SpeechSynthesisResult的
getUsage方法获取。请以收到的最后一个响应结果为准。
故障排查
如遇代码报错问题,请根据错误码中的信息进行排查。
Q:如何获取Request ID?
通过以下两种方式可以获取:
在回调接口(ResultCallback)的
onEvent方法中调用SpeechSynthesisResult的getRequestId方法。getRequestId方法返回值可能为null,详情请参见SpeechSynthesisResult中关于getRequestId方法的描述。调用SpeechSynthesizer的
getLastRequestId方法。
Q:使用SSML功能失败是什么原因?
请按以下步骤排查:
确保当前音色支持SSML功能(声音复刻音色不支持SSML)
确保
model参数值为cosyvoice-v2确保使用正确的接口:只有SpeechSynthesizer类的
call方法支持SSML确保待合成文本为纯文本格式且符合格式要求,详情请参见SSML标记语言介绍
Q:为什么音频无法播放?
请根据以下场景逐一排查:
音频保存为完整文件(如xx.mp3)的情况
音频格式一致性:确保请求参数中设置的音频格式与文件后缀一致。例如,如果请求参数设置的音频格式为wav,但文件后缀为mp3,可能会导致播放失败。
播放器兼容性:确认使用的播放器是否支持该音频文件的格式和采样率。例如,某些播放器可能不支持高采样率或特定编码的音频文件。
流式播放音频的情况
将音频流保存为完整文件,尝试使用播放器播放。如果文件无法播放,请参考场景 1 的排查方法。
如果文件可以正常播放,则问题可能出在流式播放的实现上。请确认使用的播放器是否支持流式播放。
常见的支持流式播放的工具和库包括:ffmpeg、pyaudio (Python)、AudioFormat (Java)、MediaSource (Javascript)等。
Q:为什么音频播放卡顿?
请根据以下场景逐一排查:
检查文本发送速度: 确保发送文本的间隔合理,避免前一句音频播放完毕后,下一句文本未能及时发送。
检查回调函数性能:
检查回调函数中是否存在过多业务逻辑,导致阻塞。
回调函数运行在 WebSocket 线程中,若被阻塞,可能会影响 WebSocket 接收网络数据包,进而导致音频接收卡顿。
建议将音频数据写入一个独立的音频缓冲区(audio buffer),然后在其他线程中读取并处理,避免阻塞 WebSocket 线程。
检查网络稳定性: 确保网络连接稳定,避免因网络波动导致音频传输中断或延迟。
Q:语音合成慢(合成时间长)是什么原因?
请按以下步骤排查:
检查输入间隔
如果是流式语音合成,请确认文字发送间隔是否过长(如上段发出后延迟数秒才发送下段),过久间隔会导致合成总时长增加。
分析性能指标
首包延迟:正常500ms左右。
RTF(RTF = 合成总耗时/音频时长):正常小于1.0。
Q:合成的语音发音错误如何处理?
若当前使用的模型为cosyvoice-v1,推荐使用cosyvoice-v2,v2效果更好且支持SSML。
若当前使用的模型为cosyvoice-v2,请使用SSML的<phoneme>标签指定正确的发音。
Q:为什么没有返回语音?为什么结尾部分的文本没能成功转换成语音?(合成语音缺失)
请检查是否遗漏了调用SpeechSynthesizer类的streamingComplete方法。在语音合成过程中,服务端会在缓存足够文本后才开始合成。如果未调用streamingComplete方法,可能会导致缓存中的结尾部分文本未能被合成为语音。
权限与认证
Q:我希望我的 API Key 仅用于 CosyVoice 语音合成服务,而不被百炼其他模型使用(权限隔离),我该如何做?
可以通过新建业务空间并只授权特定模型来限制API Key的使用范围。详情请参见业务空间管理。
Q:使用子业务空间的API Key是否可以调用CosyVoice模型?
对于默认业务空间,cosyvoice-v1和cosyvoice-v2均可调用。
对于子业务空间:需要为API Key对应的子业务空间进行模型授权,详情请参见子业务空间的模型调用。
更多问题
请参见GitHub QA。