主题
浏览器文本转语音
Convbased.textToSpeech() 将文本合成为音频,按需上传参考音频并等待结果。
在 AI 客户端中生成语音,请使用 MCP 连接指引。
前置条件
无参考音频合成
使用 general 模式,无需准备音频文件。每次调用都会创建收费任务,收费规则见模式与价格。
ts
import { Convbased } from "@convbased/sdk";
const result = await Convbased.textToSpeech({
auth,
mode: "general",
text: "请生成一段清晰、自然的旁白。",
});
console.log(result.url);成功后从 result.url 取得临时音频地址;结果字段见结果。
模式与价格
| 模式 | 用途与参考音频要求 | 计费单位 |
|---|---|---|
general | 不用参考音频直接合成,或用一段参考音频克隆音色;克隆时需提供参考音频对应的文字 | 字符 |
expressive | 可控制情感、采样和分段;最多一段主参考音频,可另传一段情感参考音频 | 字符 |
advanced | 支持上下文参考音频、场景描述和输出格式设置;最多三段参考音频,按传入顺序使用 | 秒 |
查询模式与价格
使用 TtsClient 读取模式要求和当前价格:
ts
import { TtsClient } from "@convbased/sdk";
const tts = new TtsClient({ auth });
const [modes, pricing] = await Promise.all([
tts.getModes(),
tts.getPricing(),
]);modes 中的 billingUnit、cloneRequiresTranscript、maxReferences 和 supportsContext 分别表示计费单位、克隆时是否需要参考音频对应的文字、参考音频数量上限和是否支持上下文参考音频。列表中的模式不保证当前一定可用。
pricing 包含:
| 字段 | 含义 |
|---|---|
pricePerToken | 每个输入字符的价格 |
advancedPricePerSecond | advanced 每秒输出音频的价格 |
advancedMaxSeconds | advanced 提交时按此秒数冻结余额 |
minCharge | 单次最低收费 |
提交任务时先冻结一部分余额,任务完成后按实际用量扣费。advanced 按 advancedMaxSeconds 冻结,扣费后退回未使用的部分;任务失败或成功取消时,冻结的余额全部退回。实际扣费见结果中的 amountCharged。
单段参考音频合成
以下示例使用 expressive 控制情感。referenceFile 是用户选择的音频 File,audio 是页面中的 <audio> 元素:
ts
const result = await Convbased.textToSpeech({
auth,
mode: "expressive",
voice: referenceFile,
text: "你好,这是一段合成语音。",
params: {
temperature: 0.8,
use_emo_text: true,
emo_text: "平静、自然",
},
onProgress: (status, queuePosition) => {
console.log(status, queuePosition);
},
});
if (result.url) audio.src = result.url;voice 接受 File、Blob 或已上传音频的 { key }。使用 general 克隆时,还需通过 promptText 提供参考音频对应的文字,并使用该模式的 params 字段。
多段参考音频与字幕
advanced 可传入多段参考音频并按传入顺序使用,还可以要求返回字幕。speakerReference 和 contextReference 是事先准备好的音频 File 或 { key }:
ts
const result = await Convbased.textToSpeech({
auth,
mode: "advanced",
voices: [speakerReference, contextReference],
text: "雨停以后,街道慢慢安静下来。",
params: {
scene_description: "克制的纪录片旁白,近讲,语速稍慢",
format: "wav",
sample_rate: 48000,
speech_rate: 0.95,
enable_subtitle: true,
},
});voice 和 voices 不能同时传入。voices 中的顺序会原样传给服务端;emotionVoice 只用于 expressive。
参数与状态
按所选 mode 设置 params:general 使用 GeneralTtsParams,expressive 使用 ExpressiveTtsParams,advanced 使用 AdvancedTtsParams。
onProgress(status, queuePosition) 回调会收到任务状态和排队位置:
| 状态 | 含义 |
|---|---|
queued | 排队中,queuePosition 从 1 开始 |
warming、processing | 正在准备或生成音频,继续等待 |
done | 任务完成,函数返回合成结果 |
failed、cancelled | 任务失败或已取消,函数抛出错误 |
timeoutMs 默认 300000 毫秒。超时只表示 SDK 不再等待,任务仍可能在服务端继续执行;超时或网络中断后,先在账户使用记录中确认任务是否已完成,不要自动重新提交合成。
通过 signal 中止时,SDK 停止等待并尝试取消任务。只有尚未开始执行的任务可以取消。任务失败、取消、超时或中止时函数抛出错误。
结果
| 字段 | 含义 |
|---|---|
key、url | 音频文件的存储标识和临时访问地址;没有生成临时地址时 url 为 null |
mode | 实际使用的模式,可能为 null |
billingQuantity、billingUnit | 实际计费数量及其单位 CHAR 或 SECOND |
audioDurationSec | 合成音频时长,单位为秒 |
amountCharged、balanceAfter | 本次扣费金额与扣费后余额 |
subtitle | 服务返回的字幕时间轴数据;未启用字幕或没有字幕时为 null |
tokenCount 表示输入字符数;查看计费结果时请使用 billingQuantity 和 billingUnit。
参考音频限制
参考音频支持 mp3、wav、ogg、flac、m4a 和 aac,单文件最大 100 MB;advanced 每段参考音频不能超过 10 MB。参考音频必须属于签发 SDK 令牌的账户,数量和对应文字须符合所选模式的要求。
优先传入保留真实文件名的 File。直接传入 Blob 时,SDK 使用默认文件名 audio.wav,这不会改变音频编码;音频实际不是 WAV 格式时,应创建带正确文件名的 File。