Skip to main content

MiniMax 语音合成

通过 /v1/audio/speech 接口将文本转换为自然语音。接口支持两种输出方式:
  • 非流式:生成完成后返回音频文件 URL,适合配音、有声内容等场景。
  • 流式:通过 SSE 持续返回音频分片,适合语音助手、实时播报等低延迟场景。

可用模型

模型
speech-2.6-hd
speech-2.6-turbo
speech-02-hd
speech-02-turbo
speech-02
speech-2.5-hd-preview
speech-2.5-turbo-preview
speech-01-hd

非流式语音合成

只需提供模型、文本和音色。生成完成后,从响应的 url 下载或播放音频。
curl --request POST \
  --url https://model-api.skyengine.com.cn/v1/audio/speech \
  --header 'Authorization: Bearer <API-KEY>' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "speech-2.6-hd",
    "input": "欢迎使用 ModelHub 语音合成服务。",
    "voice": "male-qn-qingse",
    "speed": 1.0,
    "response_format": "mp3"
  }'
import requests

API_KEY = "<API-KEY>"
BASE_URL = "https://model-api.skyengine.com.cn/v1"

response = requests.post(
    f"{BASE_URL}/audio/speech",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json={
        "model": "speech-2.6-hd",
        "input": "欢迎使用 ModelHub 语音合成服务。",
        "voice": "male-qn-qingse",
        "speed": 1.0,
        "response_format": "mp3",
    },
    timeout=120,
)
response.raise_for_status()

result = response.json()
print("音频地址:", result["url"])
print("音频时长(毫秒):", result.get("duration_ms"))
const response = await fetch("https://model-api.skyengine.com.cn/v1/audio/speech", {
  method: "POST",
  headers: {
    "Authorization": "Bearer <API-KEY>",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    model: "speech-2.6-hd",
    input: "欢迎使用 ModelHub 语音合成服务。",
    voice: "male-qn-qingse",
    speed: 1.0,
    response_format: "mp3"
  })
});

if (!response.ok) throw new Error(await response.text());

const result = await response.json();
console.log("音频地址:", result.url);
console.log("音频时长(毫秒):", result.duration_ms);
响应示例:
{
  "request_id": "9f72f...",
  "url": "https://.../tts_xxx.mp3",
  "duration_ms": 3204,
  "token": 23
}
响应字段说明
request_id本次语音合成请求 ID。
url生成音频的访问地址。请及时转存,不要依赖其永久有效。
subtitle_url开启字幕后返回的字幕文件地址。
duration_ms音频时长,单位为毫秒。
token本次请求计费使用的字符数。

流式语音合成

设置 stream: true 后,接口返回 text/event-stream。每条 SSE 消息中的 audio 是 Base64 编码的 MP3 分片。
curl --no-buffer --request POST \
  --url https://model-api.skyengine.com.cn/v1/audio/speech \
  --header 'Authorization: Bearer <API-KEY>' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "speech-2.6-turbo",
    "input": "这是一段流式语音合成示例。",
    "voice": "female-shaonv",
    "response_format": "mp3",
    "stream": true
  }'
import base64
import json
import requests

response = requests.post(
    "https://model-api.skyengine.com.cn/v1/audio/speech",
    headers={"Authorization": "Bearer <API-KEY>"},
    json={
        "model": "speech-2.6-turbo",
        "input": "这是一段流式语音合成示例。",
        "voice": "female-shaonv",
        "response_format": "mp3",
        "stream": True,
    },
    stream=True,
    timeout=120,
)
response.raise_for_status()

with open("speech.mp3", "wb") as audio_file:
    for line in response.iter_lines(decode_unicode=True):
        if not line or not line.startswith("data:"):
            continue
        event = json.loads(line.removeprefix("data:").strip())
        if event.get("error"):
            raise RuntimeError(event["error"]["message"])
        if event.get("audio"):
            audio_file.write(base64.b64decode(event["audio"]))

print("音频已保存为 speech.mp3")
import { createWriteStream } from "node:fs";

const response = await fetch("https://model-api.skyengine.com.cn/v1/audio/speech", {
  method: "POST",
  headers: {
    "Authorization": "Bearer <API-KEY>",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    model: "speech-2.6-turbo",
    input: "这是一段流式语音合成示例。",
    voice: "female-shaonv",
    response_format: "mp3",
    stream: true
  })
});

if (!response.ok) throw new Error(await response.text());

const output = createWriteStream("speech.mp3");
const decoder = new TextDecoder();
let buffer = "";

for await (const chunk of response.body) {
  buffer += decoder.decode(chunk, { stream: true });
  const events = buffer.split("\n\n");
  buffer = events.pop() ?? "";

  for (const eventText of events) {
    const dataLine = eventText.split("\n").find(line => line.startsWith("data:"));
    if (!dataLine) continue;
    const event = JSON.parse(dataLine.slice(5).trim());
    if (event.error) throw new Error(event.error.message);
    if (event.audio) output.write(Buffer.from(event.audio, "base64"));
  }
}

output.end();
console.log("音频已保存为 speech.mp3");
SSE 数据示例:
data: {"audio":"<base64-audio-chunk>"}

data: {"audio":"<base64-audio-chunk>"}

data: {"token":15}
流式模式建议使用 mp3。音频分片必须按接收顺序解码并写入同一个文件。

请求参数

通用参数

参数类型必填默认值说明
modelstring-要使用的 TTS 模型。
inputstring-需要合成的文本。
voicestring-音色 ID。
speednumber1.0语速,范围 0.52.0。数值越大语速越快。
response_formatstringmp3音频格式,常用值为 mp3wavflac。流式模式推荐 mp3
streambooleanfalse是否通过 SSE 流式返回音频。
model_extraobject-MiniMax 高级参数。

常用音色

音色 ID音色说明
male-qn-qingse青涩青年男声
male-qn-jingying精英青年男声
male-qn-badao霸道青年男声
female-shaonv少女音色
female-yujie御姐音色
female-chengshu成熟女性音色
presenter_male男性主持人
presenter_female女性主持人
audiobook_male_1男性有声书音色
audiobook_female_1女性有声书音色
也可以将已创建的 MiniMax 复刻音色 ID 传给 voice。更多系统音色请参考 MiniMax 官方语音合成文档

高级参数

高级参数统一放在 model_extra 中:
{
  "model_extra": {
    "vol": 1.2,
    "pitch": 2,
    "audio_sample_rate": 32000,
    "bitrate": 128000,
    "language_boost": "Chinese"
  }
}
参数类型说明
volnumber音量,范围 (0, 10],默认 1.0
pitchinteger音调,范围 -1212,默认 0
audio_sample_rateinteger音频采样率,例如 16000240003200044100
bitrateintegerMP3 比特率,例如 128000
language_booststring指定语言增强,如 ChineseEnglishChinese,Yueauto
tonestring[]自定义发音词典,例如 ["行长/(hang2)(zhang3)"]
timber_weightsobject[]混合多个音色,每项包含 voice_idweight。最多建议使用 4 个音色。
subtitle_enableboolean是否生成字幕文件。
subtitle_typestring字幕粒度:sentenceword

生成字幕

字幕文件请使用非流式模式:
{
  "model": "speech-2.6-hd",
  "input": "这段语音会同时生成词级字幕。",
  "voice": "presenter_female",
  "response_format": "mp3",
  "model_extra": {
    "subtitle_enable": true,
    "subtitle_type": "word"
  }
}
成功后通过响应中的 subtitle_url 获取字幕文件。

指定发音

遇到多音字、专有名词或英文缩写时,可以使用 tone 指定发音:
{
  "model": "speech-2.6-hd",
  "input": "银行行长参加会议。",
  "voice": "male-qn-jingying",
  "model_extra": {
    "tone": ["行长/(hang2)(zhang3)"]
  }
}

混合音色

使用 timber_weights 混合多个系统音色:
{
  "model": "speech-2.6-hd",
  "input": "这是一段混合音色示例。",
  "voice": "female-shaonv",
  "model_extra": {
    "timber_weights": [
      {"voice_id": "male-qn-qingse", "weight": 50},
      {"voice_id": "female-shaonv", "weight": 50}
    ]
  }
}
设置 timber_weights 后,最终声音主要由混合音色配置决定。