非实时语音合成(Qwen-TTS)API 的请求参数与返回字段说明。
请求体 |
DashScope Python SDK中的 Copy Copy Copy
DashScope Python SDK中的 Copy Copy Copy |
modelstring(必选)模型名称,详情请参见支持的模型。 | |
inputobject(必选)输入参数。
属性 text string (必选)要合成的文本,支持多语种混合输入。最大输入长度为 600 字符。voice string (必选)使用的音色,参见支持的系统音色。language_type string (可选)合成音频的语种。默认为 Auto。
|
返回对象(流式与非流式输出格式一致) | Copy |
status_code integerHTTP状态码。遵循 RFC 9110标准定义。例如:• 200:请求成功,正常返回结果• 400:客户端请求参数错误• 401:未授权访问• 404:资源未找到• 500:服务器内部错误。 | |
request_id string本次请求的唯一标识,可用于问题排查。 | |
code string请求失败时展示错误码(参见错误码)。 | |
message string请求失败时展示错误信息(参见错误码)。 | |
outputobject模型的输出。
属性 text string始终为null,无需关注该参数。choicesstring始终为null,无需关注该参数。finish_reasonstring生成状态标识:
object模型输出的音频信息。
属性 url string完整音频文件的 URL,有效期 24 小时。流式输出说明:流式模式下,API 返回多个 chunk。中间 chunk 的 audio.data 包含 Base64 编码的音频片段,audio.url 为空;最后一个 chunk 的 audio.data 为空字符串,audio.url 包含完整音频文件的 OSS 地址。开发者可在最后一个 chunk 中通过 url 字段下载完整音频。非流式模式下,该字段直接返回完整音频文件 URL。 stringBase64 编码的音频数据。非流式输出和流式输出的中间 chunk 中返回 Base64 编码的音频片段;流式输出的最后一个 chunk 中该字段为空字符串,音频通过同级的 url 字段获取。id string音频的唯一标识。expires_at integerURL 过期时间的 UNIX 时间戳。 | |
usage object本次请求的字符消耗信息。
属性 output_tokens integer输出音频的 Token 消耗量。对于千问3-TTS-Flash模型,该字段固定为0。input_tokens integer输入文本的 Token 消耗量。对于千问3-TTS-Flash模型,该字段固定为0。characters integer输入文本的字符数。仅千问3-TTS-Flash模型返回该字段。 | |
request_id string本次请求的 ID。 |
音频下载与播放
运行示例前,请先获取并配置 API Key,并安装 DashScope SDK。Python 播放示例还依赖 PyAudio 和 NumPy;PyAudio 的安装方式见代码注释,NumPy 可通过pip install numpy 安装。
下载音频(Java)
需要导入 Gson 依赖,Maven 或 Gradle 添加方式如下:- Maven
- Gradle
在
pom.xml中添加:Copy
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.13.1</version>
</dependency>
在
build.gradle中添加:Copy
// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation("com.google.code.gson:gson:2.13.1")
Copy
import com.alibaba.dashscope.aigc.multimodalconversation.AudioParameters;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
public class Main {
private static final String MODEL = "qwen3-tts-flash";
public static void call() throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
MultiModalConversationParam param = MultiModalConversationParam.builder()
// 新加坡和北京地域的API Key不同。获取API Key:https://help.aliyun.com/zh/model-studio/get-api-key
// 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:.apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model(MODEL)
.text("Today is a wonderful day to build something people love!")
.voice(AudioParameters.Voice.CHERRY)
.parameter("language_type", "English") // 建议与文本语种一致,以获得正确的发音和自然的语调。
.build();
MultiModalConversationResult result = conv.call(param);
String audioUrl = result.getOutput().getAudio().getUrl();
System.out.print(audioUrl);
// 下载音频文件到本地
try (InputStream in = new URL(audioUrl).openStream();
FileOutputStream out = new FileOutputStream("downloaded_audio.wav")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
System.out.println("\n音频文件已下载到本地:downloaded_audio.wav");
} catch (Exception e) {
System.out.println("\n下载音频文件时出错:" + e.getMessage());
}
}
public static void main(String[] args) {
try {
// 以下为华北2(北京)地域的配置。
Constants.baseHttpApiUrl = "https://dashscope.aliyuncs.com/api/v1";
call();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}
流式播放
- Python
- Java
Copy
# coding=utf-8
#
# Installation instructions for pyaudio:
# APPLE Mac OS X
# brew install portaudio
# pip install pyaudio
# Debian/Ubuntu
# sudo apt-get install python-pyaudio python3-pyaudio
# or
# pip install pyaudio
# CentOS
# sudo yum install -y portaudio portaudio-devel && pip install pyaudio
# Microsoft Windows
# python -m pip install pyaudio
import os
import dashscope
import pyaudio
import time
import base64
import numpy as np
# 以下为华北2(北京)地域的配置。
dashscope.base_http_api_url = 'https://dashscope.aliyuncs.com/api/v1'
p = pyaudio.PyAudio()
# 创建音频流
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=24000,
output=True)
text = "你好啊,我是千问"
response = dashscope.MultiModalConversation.call(
# 新加坡和北京地域的API Key不同。获取API Key:https://help.aliyun.com/zh/model-studio/get-api-key
# 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:api_key = "sk-xxx"
api_key=os.getenv("DASHSCOPE_API_KEY"),
model="qwen3-tts-flash",
text=text,
voice="Cherry",
language_type="Chinese", # 建议与文本语种一致,以获得正确的发音和自然的语调。
stream=True
)
for chunk in response:
if chunk.output is not None:
audio = chunk.output.audio
if audio.data is not None:
wav_bytes = base64.b64decode(audio.data)
audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
# 直接播放音频数据
stream.write(audio_np.tobytes())
if chunk.output.finish_reason == "stop":
print(f"finish at: {chunk.output.audio.expires_at}")
time.sleep(0.8)
# 清理资源
stream.stop_stream()
stream.close()
p.terminate()
需要导入 Gson 依赖,Maven 或 Gradle 添加方式如下:
- Maven
- Gradle
在
pom.xml中添加:Copy
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.13.1</version>
</dependency>
在
build.gradle中添加:Copy
// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation("com.google.code.gson:gson:2.13.1")
Copy
import com.alibaba.dashscope.aigc.multimodalconversation.AudioParameters;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import io.reactivex.Flowable;
import javax.sound.sampled.*;
import java.util.Base64;
public class Main {
private static final String MODEL = "qwen3-tts-flash";
public static void streamCall() throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
MultiModalConversationParam param = MultiModalConversationParam.builder()
// 新加坡和北京地域的API Key不同。获取API Key:https://help.aliyun.com/zh/model-studio/get-api-key
// 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:.apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model(MODEL)
.text("Today is a wonderful day to build something people love!")
.voice(AudioParameters.Voice.CHERRY)
.parameter("language_type", "English") // 建议与文本语种一致,以获得正确的发音和自然的语调。
.build();
Flowable<MultiModalConversationResult> result = conv.streamCall(param);
result.blockingForEach(r -> {
try {
// 1. 获取Base64编码的音频数据
String base64Data = r.getOutput().getAudio().getData();
byte[] audioBytes = Base64.getDecoder().decode(base64Data);
// 2. 配置音频格式(根据API返回的音频格式调整)
AudioFormat format = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
24000, // 采样率(需与API返回格式一致)
16, // 采样位数
1, // 声道数
2, // 帧大小(字节数)
24000, // 帧率(需与采样率一致)
false // 大端序
);
// 3. 实时播放音频数据
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try (SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info)) {
if (line != null) {
line.open(format);
line.start();
line.write(audioBytes, 0, audioBytes.length);
line.drain();
}
}
} catch (LineUnavailableException e) {
e.printStackTrace();
}
});
}
public static void main(String[] args) {
// 以下为华北2(北京)地域的配置。
Constants.baseHttpApiUrl = "https://dashscope.aliyuncs.com/api/v1";
try {
streamCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}