CQTAI
语音合成 · 语音

语音合成 · 介绍NEW

语音合成(TTS)API:输入文本,返回一段合成语音的链接(平台 CDN 直链,单声道 24kHz),可选同时返回一份与音频精确对齐的 SRT 字幕。 同步接口——一次请求即拿到结果,无需轮询,也没有 taskId。32 个精选中英音色(全量目录 322 个可选),可调语速 / 音高 / 音量,支持按句分别设定语速的分句控制;长文本自动分段合成再拼接。三种输出格式:mp3 / mp3-high / webm。 同一接口加 model 字段即可切换到千问模型(qwen-audio-3.1-tts-flash / qwen-audio-3.0-tts-flash / qwen-audio-3.0-tts-plus / qwen3-tts-flash):音色更自然,支持方言、多语种、自然语言指令与情感标签,按实际用量计费,详见「千问模型」标签页。

⚡ 同步调用:一次请求直接返回结果,无 taskId、无需轮询

接口地址

用途方法路径
合成语音POST/v1/tts
音色列表(精选)GET/v1/tts/voices
音色列表(全量 322 个)GET/v1/tts/voices?all=1
千问模型音色列表GET/v1/tts/voices?model=<千问模型id>

认证

Authorization: Bearer <API_KEY>
Content-Type: application/json

请求参数

参数类型必填默认说明
textstring二选一—要合成的文本(支持长文本,服务端自动分段合成再拼接);上限约 256KB。与 segments 二选一
segmentsarray二选一—分句分别设定语速 / 音高 / 音量,见下「分句控制」。与 text 互斥,最多 200 段
voicestring—zh-CN-XiaoxiaoNeural音色,取值见 GET /v1/tts/voices 返回的 shortName;填了就必须是支持的音色之一
formatstring—mp3输出格式:mp3(默认)/ mp3-high(高音质)/ webm(网页直接播放,单次限 2000 字),见下「输出格式」
ratestring—+0%语速:x-slow / slow / medium / fast / x-fast / default,或百分比 +40% / -20%,或倍率 1.0
pitchstring—+0Hz音高:x-low ~ x-high / default,或带符号偏移 +2st / -5Hz / +10%,或绝对值 150Hz
volumestring—+0%音量:silent / x-soft / soft / medium / loud / x-loud / default,或 +20% / +6dB / 0~100
subtitlebool—false同时返回一份与音频严格对齐的 SRT 字幕,见下「字幕」。不额外收费
modelstring—edge不填(或 edge)即本表描述的默认通道;填千问模型 id 即切换,参数见「千问模型」标签页。区分大小写
pitch 用半音 / 赫兹 / 百分比偏移时必须带正负号:+2st 可以,2st 会被拒。
语速 / 音高 / 音量填了不认识的值会立即返回 400 并告诉你正确的写法,不会白跑一次合成(不消耗积分)。

输出格式

format文件适用
mp324kHz 48kbps 单声道 mp3通用,体积最小;长文本请用这个
mp3-high24kHz 96kbps 单声道 mp3音质更好,体积约 2 倍
webm24kHz Opus (WebM)网页直接播放;单次请求限 2000 字以内
webm 的长度限制是格式本身决定的:超长文本需要分多次合成再拼接,而 WebM 拼接后播放器只会播第一段。与其给你一个「只有前半段却按全长计费」的文件,超长时直接报 400——请改用 mp3,或自行把文本拆成多次请求。

分句控制(segments)

用 segments 代替 text,就能让每一句用不同的语速 / 音高 / 音量——比如开场白正常语速、重点句放慢加大声、结尾快速收尾。最多 200 段。

参数类型必填默认说明
textstring必填—该段要合成的文本
ratestring——该段语速;省略则继承顶层 rate
pitchstring——该段音高;省略则继承顶层 pitch
volumestring——该段音量;省略则继承顶层 volume
  • 每段省略的字段继承顶层同名值,所以只写你要改的那几个即可。
  • 全部段落用同一个音色(voice 只能在顶层给)。一次请求内做不到多音色对话,多角色请分多次请求。
  • 段落之间没有额外停顿标签——语音服务不支持插入静音;需要停顿请在文本里用标点,或拆成多次请求后自行拼接。
curl -X POST https://api.cqtai.com/v1/tts \
  -H 'Authorization: Bearer <API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "voice": "zh-CN-YunxiNeural",
    "segments": [
      { "text": "先说一句正常语速的开场白。" },
      { "text": "这一句要慢下来,重点强调。", "rate": "-25%", "volume": "loud" },
      { "text": "最后快速收尾。", "rate": "+35%", "pitch": "+2st" }
    ]
  }'

字幕(SRT)

请求里加 "subtitle": true,响应会多出一个 subtitleUrl。时间轴是精确的,不是识别出来的——字幕直接取自语音引擎在合成时报告的逐词位置,每个字 / 词落在音频的第几毫秒由合成器自己给出,不存在语音识别的错字和对不齐。

curl -X POST https://api.cqtai.com/v1/tts \
  -H 'Authorization: Bearer <API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "text": "第一句话。第二句话稍微长一点,用来演示断句。",
    "voice": "zh-CN-XiaoxiaoNeural",
    "subtitle": true
  }'
# -> { "code":200, "data":{
#      "url":"https://cdn.novapi.ai/tts/....mp3",
#      "subtitleUrl":"https://cdn.novapi.ai/tts/....srt",
#      "duration":6.20, "cost":1, "format":"mp3" } }
  • 不额外收费,也不额外耗时(合成时顺手拿到的数据)。
  • 文本和你传进来的完全一致(不会被识别改写)。
  • 与 rate / segments 调速后的音频依然对齐(调速会改变时间轴,字幕跟着变)。
  • subtitle 与三种 format 都可搭配(字幕文件本身与音频格式无关)。
  • 用途:网页播放器的 <track kind="subtitles">、剪辑软件导入,或直接把 subtitleUrl 传给视频字幕烧录接口(FFmpeg burn_subtitle)。

排版规则(固定,暂不开放配置):单行;一行最多约 20 个中文字 / 40 个英文字符;单条最长 7 秒、最短 0.7 秒;句末标点、超过 0.6 秒的停顿处断句。文件为 UTF-8 无 BOM、LF 换行的标准 SubRip。

subtitleUrl 只有请求带了 subtitle: true 才会出现,不会返回空串。
极少数情况下语音服务不返回逐词时间戳,此时整个请求按失败处理(502,不扣费,可重试),不会给你一个「有音频但没字幕」的成功响应。

请求示例

合成语音
curl -X POST https://api.cqtai.com/v1/tts \
  -H 'Authorization: Bearer <API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "text": "你好,欢迎使用语音合成服务。",
    "voice": "zh-CN-XiaoxiaoNeural"
  }'
# -> { "code":200, "data":{ "url":"https://cdn.novapi.ai/tts/....mp3", "duration":3.62, "cost":1, "format":"mp3" } }
带语速 / 音高
curl -X POST https://api.cqtai.com/v1/tts \
  -H 'Authorization: Bearer <API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "text": "This is a faster, higher-pitched sample.",
    "voice": "en-US-AriaNeural",
    "rate": "+15%",
    "pitch": "+3Hz"
  }'

响应示例

{
  "code": 200,
  "msg": "success",
  "data": {
    "url": "https://cdn.novapi.ai/tts/1756272000000_ab12cd.mp3",
    "duration": 3.62,
    "cost": 1,
    "format": "mp3"
  }
}

支持的音色

加载中…
音色(voice 取值)名称性别语言地区
  • 音色列表实时取自 GET /v1/tts/voices(文档页默认展示精选,可切到「全量目录」看全部 322 个 / 142 种语言地区);voice 填其中任意 shortName 即可。
  • 中英混排的文本建议直接用 AvaMultilingual / AndrewMultilingual,一个音色就能念,不必按语言切换。
  • ?all=1 里的 voices 偶尔可能为空(服务刚启动、目录还没加载完),此时 loadedAt 为空字符串,请回退用 presets 展示,不要当成「没有音色」。
  • 一切以接口实时返回为准。
获取音色列表
curl -X GET https://api.cqtai.com/v1/tts/voices \
  -H 'Authorization: Bearer <API_KEY>'
# -> { "code":200, "data":[ { "id":"edge:zh-CN-XiaoxiaoNeural",
#       "shortName":"zh-CN-XiaoxiaoNeural", "name":"晓晓(温柔女声)",
#       "nameEn":"Xiaoxiao (warm female)", "gender":"female",
#       "language":"zh", "locale":"zh-CN" }, ... ] }

# 全量音色(322 个 / 142 种语言地区)
curl -X GET 'https://api.cqtai.com/v1/tts/voices?all=1' \
  -H 'Authorization: Bearer <API_KEY>'
# -> { "code":200, "data":{ "presets":[...], "voices":[...], "formats":[...], "loadedAt":"..." } }

能力边界

默认通道提供音色 + 语速 + 音高 + 音量四个维度的控制,不支持以下能力,请不要按其他 TTS 产品的参数来对接:

不支持说明
情感风格 / 语气(cheerful、sad、angry…)默认通道不支持;需要请用千问模型 qwen-audio-3.x(情感标签 + instruction)
角色扮演(role)同上
插入静音 / 停顿标签请改用标点,或拆多次请求自行拼接
一次请求内多音色对话一次请求只能用一个音色;多角色请分多次请求
SSML 直接透传请求体只接受上表字段,不接受自定义 SSML
数字 / 日期读法指定、多音字注音不支持 say-as / phoneme

模型一览

同一个接口 POST /v1/tts,请求里加 model 即切换到千问模型:音色更自然,支持方言、多语种与情感控制。不填 model(或填 edge)仍走「默认通道」(见该标签页),行为不变。model 区分大小写,须与下表逐字一致。

model计费(按实际用量)format默认音色额外参数
qwen-audio-3.1-tts-flash输入 150 / 输出 1200 积分每百万 tokenmp3 (default) / wavlonganhuan_v3.1instruction, sampleRate
qwen-audio-3.0-tts-flash100 积分 / 万字符mp3 (default) / wavlonganhuan_v3.6instruction, sampleRate
qwen-audio-3.0-tts-plus140 积分 / 万字符mp3 (default) / wavlonganlingxininstruction, sampleRate
qwen3-tts-flash80 积分 / 万字符wavCherrylanguage
所有千问模型都接受 model / text(必填)/ voice / format;每个模型只接受上表列出的额外参数,传了别的直接 400(xxx is not supported by <model>),不会被静默忽略。

请求参数

参数类型必填默认说明
voicestring——音色,每个模型只能用自己那组(见下,或 GET /v1/tts/voices?model=<模型id>);不填用该模型默认音色。填了别的千问模型的音色直接返回 400(voice xxx belongs to …)
instructionstring——用自然语言控制表达,如「请用东北话表达」「用温柔的语气,语速稍慢」(qwen-audio-3.x)
sampleRateint——采样率,如 16000 / 24000 / 48000(qwen-audio-3.x)
languagestring——语种提示(qwen3-tts-flash):Auto / Chinese / English / Japanese / Korean / French / German / Spanish / Italian / Portuguese / Russian
千问模型都不支持 segments / rate / volume / subtitle / pitch(传了直接 400)。反过来,默认通道不支持 instruction / sampleRate / language。
千问模型按实际用量计费,计费依据即响应里的 usage;参数错误(400)与限流(429)不扣费。

音色(voice)

qwen-audio-3.1-tts-flash

多语种与方言(上海/广东/东北/重庆/陕西/云南/宁波/甘肃话;日/韩/法/德/葡/意/越/印尼语):longanhuan_v3.1(女·默认)、longanlingxin_v3.1(女)、longanfengyue_v3.1(女)、xunanchuan_v3.1(男)

精品中文(仅普通话):yuxiaoyun_v3.1、qiaoxiaojiao_v3.1、xiaxiaochen_v3.1、anmingyuan_v3.1(男)、wenhuaiqing_v3.1、anxiaolan_v3.1、xieshurou_v3.1、baiqinglan_v3.1、xuyuyuan_v3.1、anruorou_v3.1、wenhuaizhi_v3.1、xiaoxingzhi_v3.1、guyunshu_v3.1、huozhuoshi_v3.1(男)、yeqinghe_v3.1、yunhuanhuan_v3.1、xuxiaoqiao_v3.1、baianran_v3.1、xuyanchu_v3.1、yezhiqing_v3.1、andi_v3.1(男·ABC口音)、anyuqing_v3.1

精品英文(仅英文):Emily_v3.1(英式)、Luna_v3.1(英式)、Eric_v3.1(英式)、Luca_v3.1(英式)、Abby_v3.1(美式)、Annie_v3.1(美式)、Ava_v3.1(美式)、Beth_v3.1(美式)、Betty_v3.1(美式)、Cally_v3.1(美式)、Cindy_v3.1(美式)、Donna_v3.1(美式)、Andy_v3.1(美式)、Brian_v3.1(美式)、David_v3.1(美式)

其他:longanyuanfei_v3.1、longjielidou_v3.1(男童)、longanlingxi_v3.1、longhuohuo_v3.1(少年)、longyingtao_v3.1、longanya_v3.1、longwan_v3.1、longxing_v3.1、longhua_v3.1、longhan_v3.1(男)、longanzhi_v3.1(男)、longzhe_v3.1(男)、longanyang_v3.1(男)、libai_v3.1(诗词朗诵)、longling_v3.1、longniuniu_v3.1、longshanshan_v3.1、longpaopao_v3.1、loongstella_v3.1、longyuan_v3.1、longmiao_v3.1、longsanshu_v3.1(男)、longanli_v3.1、longanwen_v3.1、longanlang_v3.1(男)、longxiaoxia_v3.1、longanchong_v3.1(男·直播带货)

qwen-audio-3.0-tts-flash

longanhuan_v3.6(默认)、longanfengyue、longanyuanfei、longanlingxi、longanxiaoxin、longjielidou_v3.6、longpaopao_v3.6、longhuohuo_v3.6、longchuanshu_v3.6、loongmary、loongeva_v3.6、loongjohn

qwen-audio-3.0-tts-plus

longanlingxin(默认)、longanlufeng

3.0 两个模型另有 500 余个基础音色,命名为 qwen-audio-3.0-tts-{plus|flash}-{后缀},用法同上(需与模型对应)。

qwen3-tts-flash(不区分大小写,多语种通用)

Cherry(默认)、Serena、Ethan、Chelsie、Momo、Vivian、Moon、Maia、Kai、Nofish、Bella、Jennifer、Ryan、Katerina、Aiden、Eldric Sage、Mia、Mochi、Bellona、Vincent、Bunny、Neil、Elias、Arthur、Nini、Ebona、Seren、Pip、Stella、Bodega、Sonrisa、Alek、Dolce、Sohee、Ono Anna、Lenn、Emilien、Andre、Radio Gol、Jada(上海话)、Dylan(北京话)、Li(南京话)、Marcus(陕西话)、Roy(闽南语)、Peter(天津话)、Sunny(四川话)、Eric(四川话)、Rocky(粤语)、Kiki(粤语)

以上 49 个均已实测可用。带空格的音色名(如 Eldric Sage)原样填写。

文本语言必须在所选音色支持范围内,否则可能发音异常。填了其他模型的音色(如给 3.1 填了 3.0 的音色)会直接返回 400。本表实时取自 GET /v1/tts/voices?model=<模型名>(公开接口,无需 Key),也可自行调用;不带 model 返回的是默认通道的音色。

情感 / 拟声标签(仅 qwen-audio-3.x,写在 text 里)

  • 控制类(作用于其后文本,直到下一个控制标签):[sad][amazed][angry][excited][sarcastic][curious][bored][tired][scornful][shouting][deep and loud shouting][trembling][like dracula][asmr][panicked][mischievously][empathetic][whispers][reluctantly][crying][serious][very slowly][very fast]
  • 拟声类(在当前位置插入一段效果):[gasp][sighing][clears throat][giggles][laughing][cough][snorts]
查询某个千问模型的音色
curl -X GET 'https://api.cqtai.com/v1/tts/voices?model=qwen-audio-3.1-tts-flash'
# -> { "code":200, "data":{ "model":"qwen-audio-3.1-tts-flash",
#       "defaultVoice":"longanhuan_v3.1", "formats":[...], "params":[...],
#       "voices":{ "groups":[ { "group":"…", "groupEn":"…",
#         "voices":[ { "voice":"longanhuan_v3.1", "note":"女·默认", "noteEn":"female · default" }, ... ] } ],
#       "notes":[...], "notesEn":[...] } } }
qwen-audio-3.1:方言指令 + 情感标签
curl -X POST https://api.cqtai.com/v1/tts \
  -H 'Authorization: Bearer <API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "qwen-audio-3.1-tts-flash",
    "voice": "xunanchuan_v3.1",
    "text": "[excited]今天的天气真不错![laughing]我们一起出去玩吧!",
    "instruction": "请用东北话表达"
  }'
# -> { "code":200, "data":{ "url":"https://cdn.novapi.ai/tts/....mp3", "duration":5.18,
#      "cost":0.0798, "format":"mp3", "model":"qwen-audio-3.1-tts-flash",
#      "usage":{ "characters":53, "input_tokens":20, "output_tokens":64, "total_tokens":84 } } }
qwen3-tts-flash:方言音色,输出 wav
curl -X POST https://api.cqtai.com/v1/tts \
  -H 'Authorization: Bearer <API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "qwen3-tts-flash",
    "voice": "Dylan",
    "text": "今儿个天儿真不错。",
    "language": "Chinese"
  }'

响应字段说明

字段类型说明
urlstring合成语音链接(平台 CDN 直链,单声道 24kHz)
durationnumber合成音频时长(秒)
costnumber本次消耗积分
formatstring实际输出格式
subtitleUrlstringSRT 字幕链接。只有请求带了 subtitle: true 才会出现,不会返回空串
modelstring千问模型才返回:本次使用的模型 id
usageobject千问模型才返回:本次计费依据 { characters, input_tokens, output_tokens, total_tokens };qwen-audio-3.1 按 token,其余按 characters(不等于字数)

💰 价格见定价页 →

常见错误

错误码msg含义
401unauthorized缺少有效凭证
400invalid JSON请求体不是合法 JSON
400text required未提供文本(text 和 segments 都为空)
400text and segments are mutually exclusive; send one两个字段只能给一个
400segments contain no textsegments 里每段的 text 都是空白
400too many segments (max 200)段落数超上限 200
400unsupported voice音色不在支持列表
400unsupported format "xxx"; want one of mp3, mp3-high, webmformat 取值错误
400invalid rate/pitch/volume "xxx" (segments[N]); want …语速 / 音高 / 音量写法不对,消息里会直接给出正确写法和出错的段号
400format "webm" cannot be concatenated, so it is limited to 2000 characters …webm 超长,见「输出格式」
400edge tts rejected the request: …语音服务判定请求内容不合法(正常不应出现,遇到请反馈)
400unsupported modelmodel 不是 edge 或千问模型 id(区分大小写)
400instruction/sampleRate/language require a paid model默认通道传了千问模型专属参数
400pitch must be a string like "+5Hz" for the default model默认通道的 pitch 传成了数字
400segments/rate/volume/subtitle are not supported by …千问模型传了默认通道专属参数
400xxx is not supported by …该千问模型不接受这个参数(见模型表「额外参数」)
400unsupported format for … (…)format 不在该千问模型支持范围内
400voice … belongs to …, not …音色属于另一个千问模型(如给 3.1 填了 3.0 的音色),可用音色见 GET /v1/tts/voices?model=
400InvalidParameter: …千问模型参数不合法(如音色该模型不支持)
429rate limited, retry later千问模型请求过于频繁,稍后重试(未扣费)
503model unavailable千问模型当前未开放
413text too long请求体超出 256KB 上限
402insufficient balance余额不足(不扣费、不返回链接)
502tts synthesis failed合成服务暂时不可用,可直接重试(未扣费)
500upload failed结果上传失败,请重试(未扣费)
客户端读超时建议 ≥ 180s:接口是同步的,正常几秒返回;但服务侧对并发合成有闸门,高峰期请求可能先排队再合成。排队等待超出上限时同样返回 502 tts synthesis failed(未扣费,可直接重试)。