Skip to main content

音频生成接口


一、同步生成接口

接口信息

  • 接口路径: /v1/text-to-speech
  • 请求方式: POST
  • 认证方式: Header 中的 X-API-Key
  • 响应方式: 同步返回,响应体为音频二进制数据

请求头

参数名类型必填说明
X-API-Keystring应用密钥

注意: X-API-Key 用于验证账户信息,进入 控制台 → 项目空间,选择对应项目,左侧导航进入「API Key 管理」即可创建/查看。

请求参数

参数名类型必填说明
voice_idstring音色 ID,例如:jingchengbochuanzhiningnianan;请选择当前项目可用的音色
generate_textstring需要转换的文本内容;长度按平台统一加权规则计算(中文汉字计 2,其他字符计 1),当前公开环境上限为 500 加权字符;支持在文本中使用 [laughs] 等模型标签
languagestring系统音色可省略;个人音色不传时默认中文 zh,英文请传 en
text_normalizationboolean默认 falsetrue 开启数字、日期等文本归一化,false 保持原文(仅标准 Luna 模型)
model_idstring默认 luna-tts
emotion_classstring默认 default;当前标准 Luna 模型不处理此参数
speednumber语速倍率,范围 0.6–1.2;不传或为 0 时默认 1.0,超出范围返回参数错误
audio_formatstring不传、空值或 wav 返回 WAV;pcm / pcm_s16le 返回原始 PCM S16LE

文本归一化与标签

以下用法适用于本页的同步和流式接口。

  • TNtext_normalization 默认 false。传 true 时,对数字、日期等文本做归一化处理,使其更适合朗读;请传 JSON 布尔值,不要传字符串 "true" / "false"
  • 标签:直接将下表中的标签写入 generate_text,保留英文拼写和半角方括号;不需要单独的 tags 参数,也不通过 emotion_class 传递。TN 与标签可以同时使用。
标签含义
[laughs]笑声
[chuckles]轻笑
[gasps]倒吸气
[sighs]叹气
[inhales]吸气
[breath]呼吸声
[exhale]呼气
[coughs]咳嗽
[clears throat]清嗓子
[sniffles]吸鼻子
[snorts]鼻哼声
[hisses]嘶声
[tsks]啧声
[groans]低吟声

例如,使用标签并开启 TN:

{
"voice_id": "qinyao",
"model_id": "luna-tts",
"generate_text": "[laughs] 今天是2026年9月8日,温度36度。",
"text_normalization": true
}

响应说明

请求成功时,接口直接返回音频二进制数据。Content-Type 是客户端判断实际格式的唯一依据;不要仅根据请求参数或文件扩展名推断格式。

模型audio_format实际输出Content-Type
luna-tts不传、空值或 wavWAVaudio/wav
luna-ttspcm / pcm_s16le原始 PCM S16LEaudio/pcm

WAV / PCM 音频均为 24000 Hz、单声道、16-bit;原始 PCM 为 Signed Little-Endian,不含 WAV 文件头。

响应头如下:

响应头说明
Content-Type实际输出的 MIME 类型;客户端必须以此为准
X-Audio-Sample-Rate音频采样率(当前为 24000
X-Audio-Channels音频声道数(当前为 1
X-Audio-Bit-Depth音频位深(当前为 16

请求失败时,接口返回对应 HTTP 错误状态码,响应体为 JSON 格式的错误信息。

请求示例

# 使用 Luna-TTS
curl -X POST "https://api.vuilabs.cn/v1/text-to-speech" \
-H "X-API-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"voice_id": "qinyao",
"generate_text": "你好,欢迎使用 Luna-TTS。",
"model_id": "luna-tts"
}' \
--output audio.wav
# 默认返回 WAV 格式
curl -X POST "https://api.vuilabs.cn/v1/text-to-speech" \
-H "X-API-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"voice_id": "jingcheng",
"generate_text": "你好,欢迎使用TTS服务。",
"model_id": "luna-tts",
"emotion_class": "default",
"speed": 1.0
}' \
--output audio.wav

调用示例

Python

import requests

response = requests.post(
"https://api.vuilabs.cn/v1/text-to-speech",
headers={"X-API-Key": "your-secret-key-here"},
json={
"voice_id": "jingcheng",
"generate_text": "你好,欢迎使用TTS服务。",
"model_id": "luna-tts",
"emotion_class": "default",
"speed": 1.0,
}
)

if response.status_code == 200:
with open("audio.wav", "wb") as f:
f.write(response.content)
else:
print(response.json()) # 错误信息

Node.js

const fs = require("fs");
const https = require("https");

const body = JSON.stringify({
voice_id: "jingcheng",
generate_text: "你好,欢迎使用TTS服务。",
model_id: "luna-tts",
emotion_class: "default",
speed: 1.0,
});

const req = https.request(
{
hostname: "api.vuilabs.cn",
path: "/v1/text-to-speech",
method: "POST",
headers: {
"X-API-Key": "your-secret-key-here",
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(body),
},
},
(res) => {
if (res.statusCode === 200) {
const file = fs.createWriteStream("audio.wav");
res.pipe(file);
} else {
let data = "";
res.on("data", (chunk) => (data += chunk));
res.on("end", () => console.error("Error:", data));
}
}
);

req.write(body);
req.end();

二、流式生成接口

接口信息

  • 接口路径: /v1/text-to-speech/stream
  • 请求方式: POST
  • 认证方式: Header 中的 X-API-Key
  • 响应方式: HTTP Chunked Transfer 流式返回音频,默认 WAV,可指定 PCM;实际格式以响应 Content-Type 为准。

当前模型完成合成后,由网关流式传输音频,不保证首字节延迟低于同步接口。

请求头

参数名类型必填说明
X-API-Keystring应用密钥

请求参数

参数名类型必填说明
voice_idstring音色 ID,例如:jingchengbochuanzhiningnianan;请选择当前项目可用的音色
generate_textstring需要转换的文本内容;长度按平台统一加权规则计算(中文汉字计 2,其他字符计 1),当前公开环境上限为 500 加权字符;支持在文本中使用 [laughs] 等模型标签
languagestring系统音色可省略;个人音色不传时默认中文 zh,英文请传 en
text_normalizationboolean默认 falsetrue 开启数字、日期等文本归一化,false 保持原文(仅标准 Luna 模型)
model_idstring默认 luna-tts
emotion_classstring默认 default;当前标准 Luna 模型不处理此参数
speednumber语速倍率,范围 0.6–1.2;不传或为 0 时默认 1.0,其他非零值超出范围返回参数错误
audio_formatstring不传、空值或 wav 返回 WAV;pcm / pcm_s16le 返回原始 PCM S16LE

TN 与标签用法见文本归一化与标签

响应说明

请求成功后,接口以 HTTP Chunked Transfer 方式持续返回音频数据块,直到传输完成。收到 HTTP 200 后,请持续读取至连接结束,并确认接收到的音频非空。

模型audio_format实际输出Content-Type
luna-tts不传、空值或 wavWAV 字节流audio/wav
luna-ttspcm / pcm_s16le原始 PCM S16LE 字节流audio/pcm

默认返回 WAV;需要原始 PCM S16LE 时请传 audio_format: "pcm"。两种格式均为 24000 Hz、单声道、16-bit,请按响应格式保存和播放。

响应头说明
Content-Type实际输出的 MIME 类型;客户端必须以此为准
X-Audio-Sample-Rate音频采样率(当前为 24000
X-Audio-Channels音频声道数(当前为 1
X-Audio-Bit-Depth音频位深(当前为 16
X-Accel-Bufferingno,音频数据实时返回,不缓冲

注意:参数错误或认证失败时,接口返回 JSON 错误信息。音频传输开始后,若发生错误,连接会中断,已接收的音频可能不完整;请处理读取错误并检查音频完整性。

请求示例

# 使用 Luna-TTS 流式生成:返回 WAV 字节流
curl -X POST "https://api.vuilabs.cn/v1/text-to-speech/stream" \
-H "X-API-Key: your-secret-key-here" \
-H "Content-Type: application/json" \
-d '{
"voice_id": "qinyao",
"generate_text": "你好,这是 Luna-TTS 流式生成。",
"model_id": "luna-tts",
"audio_format": "wav"
}' \
--output audio.wav

调用示例

Python(流式写入 WAV 文件)

import requests

response = requests.post(
"https://api.vuilabs.cn/v1/text-to-speech/stream",
headers={"X-API-Key": "your-secret-key-here"},
json={
"voice_id": "jingcheng",
"generate_text": "你好,欢迎使用TTS服务。",
"model_id": "luna-tts",
"emotion_class": "default",
"speed": 1.0,
"audio_format": "wav"
},
stream=True
)

if response.status_code == 200:
with open("audio.wav", "wb") as f:
for chunk in response.iter_content(chunk_size=4096):
f.write(chunk)
else:
print(response.json())

Node.js(流式写入 WAV 文件)

const fs = require("fs");
const https = require("https");

const body = JSON.stringify({
voice_id: "jingcheng",
generate_text: "你好,欢迎使用TTS服务。",
model_id: "luna-tts",
emotion_class: "default",
speed: 1.0,
audio_format: "wav",
});

const req = https.request(
{
hostname: "api.vuilabs.cn",
path: "/v1/text-to-speech/stream",
method: "POST",
headers: {
"X-API-Key": "your-secret-key-here",
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(body),
},
},
(res) => {
if (res.statusCode === 200) {
const file = fs.createWriteStream("audio.wav");
res.pipe(file);
} else {
let data = "";
res.on("data", (chunk) => (data += chunk));
res.on("end", () => console.error("Error:", data));
}
}
);

req.write(body);
req.end();

三、错误响应

请求失败时,响应体为 JSON 格式:

{
"error_code": 20003,
"error_message": "余额不足",
"succeed": false,
"data": null
}

错误码说明

HTTP 状态码说明
400参数错误(如 generate_text 缺失或超过字符上限、voice_id 缺失、model_id 不受支持或非零 speed 不在 0.6–1.2 范围等)
401API Key 无效或未授权
429请求频率超限
402余额不足
500服务异常

四、计费说明

具体计费规则、价格和免费额度请参见 产品计费