语音合成 · 介绍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):音色更自然,支持方言、多语种、自然语言指令与情感标签,按实际用量计费,详见「千问模型」标签页。
接口地址
| 用途 | 方法 | 路径 |
|---|---|---|
| 合成语音 | 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
请求参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
| text | string | 二选一 | — | 要合成的文本(支持长文本,服务端自动分段合成再拼接);上限约 256KB。与 segments 二选一 |
| segments | array | 二选一 | — | 分句分别设定语速 / 音高 / 音量,见下「分句控制」。与 text 互斥,最多 200 段 |
| voice | string | — | zh-CN-XiaoxiaoNeural | 音色,取值见 GET /v1/tts/voices 返回的 shortName;填了就必须是支持的音色之一 |
| format | string | — | mp3 | 输出格式:mp3(默认)/ mp3-high(高音质)/ webm(网页直接播放,单次限 2000 字),见下「输出格式」 |
| rate | string | — | +0% | 语速:x-slow / slow / medium / fast / x-fast / default,或百分比 +40% / -20%,或倍率 1.0 |
| pitch | string | — | +0Hz | 音高:x-low ~ x-high / default,或带符号偏移 +2st / -5Hz / +10%,或绝对值 150Hz |
| volume | string | — | +0% | 音量:silent / x-soft / soft / medium / loud / x-loud / default,或 +20% / +6dB / 0~100 |
| subtitle | bool | — | false | 同时返回一份与音频严格对齐的 SRT 字幕,见下「字幕」。不额外收费 |
| model | string | — | edge | 不填(或 edge)即本表描述的默认通道;填千问模型 id 即切换,参数见「千问模型」标签页。区分大小写 |
输出格式
| format | 文件 | 适用 |
|---|---|---|
| mp3 | 24kHz 48kbps 单声道 mp3 | 通用,体积最小;长文本请用这个 |
| mp3-high | 24kHz 96kbps 单声道 mp3 | 音质更好,体积约 2 倍 |
| webm | 24kHz Opus (WebM) | 网页直接播放;单次请求限 2000 字以内 |
分句控制(segments)
用 segments 代替 text,就能让每一句用不同的语速 / 音高 / 音量——比如开场白正常语速、重点句放慢加大声、结尾快速收尾。最多 200 段。
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
| text | string | 必填 | — | 该段要合成的文本 |
| rate | string | — | — | 该段语速;省略则继承顶层 rate |
| pitch | string | — | — | 该段音高;省略则继承顶层 pitch |
| volume | string | — | — | 该段音量;省略则继承顶层 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。
请求示例
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 积分每百万 token | mp3 (default) / wav | longanhuan_v3.1 | instruction, sampleRate |
| qwen-audio-3.0-tts-flash | 100 积分 / 万字符 | mp3 (default) / wav | longanhuan_v3.6 | instruction, sampleRate |
| qwen-audio-3.0-tts-plus | 140 积分 / 万字符 | mp3 (default) / wav | longanlingxin | instruction, sampleRate |
| qwen3-tts-flash | 80 积分 / 万字符 | wav | Cherry | language |
请求参数
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
| voice | string | — | — | 音色,每个模型只能用自己那组(见下,或 GET /v1/tts/voices?model=<模型id>);不填用该模型默认音色。填了别的千问模型的音色直接返回 400(voice xxx belongs to …) |
| instruction | string | — | — | 用自然语言控制表达,如「请用东北话表达」「用温柔的语气,语速稍慢」(qwen-audio-3.x) |
| sampleRate | int | — | — | 采样率,如 16000 / 24000 / 48000(qwen-audio-3.x) |
| language | string | — | — | 语种提示(qwen3-tts-flash):Auto / Chinese / English / Japanese / Korean / French / German / Spanish / Italian / Portuguese / Russian |
音色(voice)
多语种与方言(上海/广东/东北/重庆/陕西/云南/宁波/甘肃话;日/韩/法/德/葡/意/越/印尼语):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(男·直播带货)
longanhuan_v3.6(默认)、longanfengyue、longanyuanfei、longanlingxi、longanxiaoxin、longjielidou_v3.6、longpaopao_v3.6、longhuohuo_v3.6、longchuanshu_v3.6、loongmary、loongeva_v3.6、loongjohn
longanlingxin(默认)、longanlufeng
3.0 两个模型另有 500 余个基础音色,命名为 qwen-audio-3.0-tts-{plus|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)原样填写。
情感 / 拟声标签(仅 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":[...] } } }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 } } }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"
}'响应字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| url | string | 合成语音链接(平台 CDN 直链,单声道 24kHz) |
| duration | number | 合成音频时长(秒) |
| cost | number | 本次消耗积分 |
| format | string | 实际输出格式 |
| subtitleUrl | string | SRT 字幕链接。只有请求带了 subtitle: true 才会出现,不会返回空串 |
| model | string | 千问模型才返回:本次使用的模型 id |
| usage | object | 千问模型才返回:本次计费依据 { characters, input_tokens, output_tokens, total_tokens };qwen-audio-3.1 按 token,其余按 characters(不等于字数) |
💰 价格见定价页 →
常见错误
| 错误码 | msg | 含义 |
|---|---|---|
| 401 | unauthorized | 缺少有效凭证 |
| 400 | invalid JSON | 请求体不是合法 JSON |
| 400 | text required | 未提供文本(text 和 segments 都为空) |
| 400 | text and segments are mutually exclusive; send one | 两个字段只能给一个 |
| 400 | segments contain no text | segments 里每段的 text 都是空白 |
| 400 | too many segments (max 200) | 段落数超上限 200 |
| 400 | unsupported voice | 音色不在支持列表 |
| 400 | unsupported format "xxx"; want one of mp3, mp3-high, webm | format 取值错误 |
| 400 | invalid rate/pitch/volume "xxx" (segments[N]); want … | 语速 / 音高 / 音量写法不对,消息里会直接给出正确写法和出错的段号 |
| 400 | format "webm" cannot be concatenated, so it is limited to 2000 characters … | webm 超长,见「输出格式」 |
| 400 | edge tts rejected the request: … | 语音服务判定请求内容不合法(正常不应出现,遇到请反馈) |
| 400 | unsupported model | model 不是 edge 或千问模型 id(区分大小写) |
| 400 | instruction/sampleRate/language require a paid model | 默认通道传了千问模型专属参数 |
| 400 | pitch must be a string like "+5Hz" for the default model | 默认通道的 pitch 传成了数字 |
| 400 | segments/rate/volume/subtitle are not supported by … | 千问模型传了默认通道专属参数 |
| 400 | xxx is not supported by … | 该千问模型不接受这个参数(见模型表「额外参数」) |
| 400 | unsupported format for … (…) | format 不在该千问模型支持范围内 |
| 400 | voice … belongs to …, not … | 音色属于另一个千问模型(如给 3.1 填了 3.0 的音色),可用音色见 GET /v1/tts/voices?model= |
| 400 | InvalidParameter: … | 千问模型参数不合法(如音色该模型不支持) |
| 429 | rate limited, retry later | 千问模型请求过于频繁,稍后重试(未扣费) |
| 503 | model unavailable | 千问模型当前未开放 |
| 413 | text too long | 请求体超出 256KB 上限 |
| 402 | insufficient balance | 余额不足(不扣费、不返回链接) |
| 502 | tts synthesis failed | 合成服务暂时不可用,可直接重试(未扣费) |
| 500 | upload failed | 结果上传失败,请重试(未扣费) |