视频配音 TTS API:每个场景生成一个音频文件
YiduoChan 通过 OpenAI 兼容的 /v1/audio/speech 接口提供 MiniMax speech-2.8-hd 与 speech-2.8-turbo,按输入字符计费。本页介绍如何按目标时长写稿、每个场景生成一个音频文件、挑选剪辑时能直接用的格式,以及一分钟成品旁白实际要花多少钱。
试听配音示例
以下为英文示例:一段主播风格的脚本,分别由两个模型经本站中转生成,未做任何后期处理。
音色:English_CalmWoman。
生成之前,先按时长写稿
视频配音出问题的地方很好预测。有人写好脚本,整段生成,才发现音频长 7:40,而剪好的片子只有 6:00,于是只好对音频做时间拉伸,或者剪掉画面来凑。两种补救都不如一开始就按长度写稿,而且两种都可以避免。MiniMax 语音模型按输入字符计费,所以花钱之前唯一能测量的那个数字——脚本的字符数——同时也能预测时长和价格。
估算脚本长度,有三个规划用的经验值就够了(均按英文文本估算)。请把它们当作估算:实际语速会随语言、标点和所选音色而变化。
- 每分钟成品语音约 900 个字符。
- 每小时约 54,000 个字符。
- 每个英文单词约 6 个字符,算上词后的空格。
把它们结合起来,就得到一个可以在文本编辑器里、而不是在非线性剪辑软件(NLE)里把控的目标。一分钟的视频大约需要 900 个字符,约 150 个单词;五分钟的视频约 4,500 个字符(750 个单词);十分钟的视频约 9,000 个字符(1,500 个单词)。如果给十分钟时段交上来的稿子有 11,400 个字符,就超出了 2,400 个字符——大约 2.7 分钟——解决办法是删文字,而不是剪音频。
给每个场景分配字符预算
在任何人动笔之前先做除法。一支六分钟的讲解视频约 5,400 个字符,分到十二个场景,平均每个场景 450 个字符,这是写手或对话模型都能照着达成的具体要求。把预算放在驱动生成的同一个 JSON 文件里,让检查成为机械步骤,而不是编辑判断。如果想让模型起草脚本而不是手写,MiniMax-M2.7 用的是同一个 Key 和同一个 Base URL,你可以把每个场景的字符预算写进提示里交给它。
每个场景一个音频文件
每个场景各生成一个文件。人们很容易想把整份脚本放进一个请求,拿回一条完整的长音轨,但这种形态不适合视频工作。视频剪辑总会改:产品名要更正,价格有变动,法务要求改写某一条款。每个场景一个文件时,你只需重新生成那个场景,把新文件在时间线上覆盖旧文件,后面的一切都保持原位。如果是单条音轨,你就得重新生成整段旁白,再把每个剪辑点重新对齐。
从成本看也是同一个结论。一句 40 个单词的台词约 240 个字符,在 speech-2.8-hd 上按刊例价约 $0.02。重新生成十分钟视频里的一句约两美分,重新生成整段约 $0.90。按场景分文件还让重试便宜、审阅方便——审阅者可以直接标出 07-pricing.wav,而不是报一个时间码。
给文件起可排序、稳定的名字:补零的场景序号、一个简短标识(slug)和格式扩展名。重新生成时、换语言时都保持文件名不变,这样剪辑工程里的文件引用永远不用改。
时间线用 wav 或 pcm,交付用 mp3
/v1/audio/speech 接口的 response_format 支持 mp3、wav、flac 和 pcm;省略该字段时返回 mp3。对剪辑时间线来说,这个默认值是错误的选择。凡是要剪切、要在配乐下压低音量(ducking)、要做响度标准化或要重新导出的素材,都生成 wav;mp3 只留给最终交付时的编码。每一次中间的有损编码,都会造成一次无法挽回的音质损失;而且把语音对齐到帧边界时,mp3 编码器加的填充很碍事。
如果你想要不带任何容器的原始采样,就用 pcm——适合拼接场景,或者交给会自己写文件头的处理链。代价是原始 PCM 不带任何元数据,导入程序必须被告知它读到的是什么。这时采样率透传就派上用场了。
透传 audio_setting.sample_rate
MiniMax 专有参数放在请求的 metadata 对象里传递。对视频工作有用的是 audio_setting.sample_rate:它支持的取值这里没有公布,所以批量生成之前,先用你项目的采样率测试一下。序列是 48 kHz,就请求 48 kHz。如果想调整语气,比如在产品主视觉镜头和合规免责声明之间做出区别,同一个对象里还可以带 voice_setting.emotion。请把这些当作透传字段——接口本身仍然是 OpenAI 兼容的,所以任何能调用 audio.speech.create 的客户端都能用,详见 OpenAI SDK 指南。
从 JSON 脚本逐场景生成音频文件
下面的脚本读取一个由场景组成的 JSON 数组,把每个场景生成为单独的文件,并在过程中打印字符数和估算时长,这样稿子超长在开始剪辑之前就一目了然。
# render_scenes.py - one audio file per scene
import json, os, pathlib, requests
ENDPOINT = "https://yiduochan.com/v1/audio/speech"
KEY = os.environ["YIDUOCHAN_API_KEY"]
OUT = pathlib.Path("render")
OUT.mkdir(exist_ok=True)
# script.json:
# [{"id": "01-hook", "voice": "English_expressive_narrator",
# "text": "Most teams ship the wrong length first."}, ...]
scenes = json.loads(pathlib.Path("script.json").read_text())
def render(scene, model="speech-2.8-hd", fmt="wav", sample_rate=48000):
body = {
"model": model,
"input": scene["text"],
"voice": scene["voice"],
"response_format": fmt,
"metadata": {"audio_setting": {"sample_rate": sample_rate}},
}
r = requests.post(
ENDPOINT,
headers={"Authorization": f"Bearer {KEY}",
"Content-Type": "application/json"},
json=body,
timeout=300,
)
r.raise_for_status()
path = OUT / f"{scene['id']}.{fmt}"
path.write_bytes(r.content)
n = len(scene["text"])
print(f"{path} {n} chars ~{n / 900:.2f} min")
return n
total = sum(render(s) for s in scenes)
print(f"total {total} chars ~{total / 900:.1f} min")
print(f"list cost ${total * 0.0001:.2f} (speech-2.8-hd)")
文案改动后要重新生成一句,直接调用接口、覆盖一个文件即可,剪辑里的其他部分都不会动。
curl -s https://yiduochan.com/v1/audio/speech \
-H "Authorization: Bearer $YIDUOCHAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "speech-2.8-turbo",
"input": "Scene four. Measure the script once, then render.",
"voice": "female-shaonv",
"response_format": "pcm",
"metadata": {"audio_setting": {"sample_rate": 48000}}
}' \
--output render/04-measure.pcm
一分钟成品旁白要多少钱
语音按输入字符计费,所以成本只取决于脚本长度——与生成耗时、音色、输出格式都无关。可用的模型有两个:speech-2.8-hd 和 speech-2.8-turbo。
| 模型 | 每百万字符刊例价 | 按当前 5% 分组折扣 | 每 1,000 字符刊例价 |
|---|---|---|---|
speech-2.8-hd | $100 | $95 | $0.10 |
speech-2.8-turbo | $60 | $57 | $0.06 |
套用每分钟 900 字符的估算,就得到每条视频的总价。表中的脚本长度是估算值,金额也请当作同等精度的估算。
| 成品时长 | 脚本(估算字符数) | 约合单词数 | hd,刊例价 | hd,−5% | turbo,刊例价 | turbo,−5% |
|---|---|---|---|---|---|---|
| 1 分钟 | 900 | 150 | $0.09 | $0.09 | $0.05 | $0.05 |
| 5 分钟 | 4,500 | 750 | $0.45 | $0.43 | $0.27 | $0.26 |
| 10 分钟 | 9,000 | 1,500 | $0.90 | $0.86 | $0.54 | $0.51 |
| 60 分钟 | 54,000 | 9,000 | $5.40 | $5.13 | $3.24 | $3.08 |
目前所有账号都在倍率为 0.95 的分组里,实际计费比刊例价低 5%。这是当前的分组折扣,不是永久承诺;一分钟的用量下,5% 还不到一美分,所以第一行里刊例价与折后价两列四舍五入后相同。一小时那一行就能明显看出差距:speech-2.8-hd 上是 $5.40 对 $5.13。刊例价即 MiniMax 官方公布的按量付费价,本站与之一致。完整明细见 speech-2.8 价格页,费用计算器可以直接输入字符数计算。
实际的结论是:旁白不是视频里花钱多的部分。一个每周更新十分钟讲解视频的频道,在 speech-2.8-hd 上每期按刊例价约 $0.90,按当前 5% 分组折扣约 $0.855。在两个模型之间取舍时,看的是它们在你的素材上的播报效果和延迟,而不是价差——挑一个有代表性的场景,用两个模型各生成一遍,听一听。
本地化只是重新生成,不用重新集成
因为场景按 ID 而不是按时间码定位,本地化版本就是同一条流水线,只是换了译文和 voice 值。保持 JSON 结构和场景 ID 不变,把 text 换成译好的台词,把 voice 换成合适的音色 ID——English_expressive_narrator、male-qn-qingse 和 female-shaonv 都可以直接指定——再把输出写到按语言划分的目录里,例如 render/de/07-pricing.wav。
预算也照此计算:一条十分钟视频做五个语言版本共 45,000 个字符,在 speech-2.8-hd 上按刊例价是 $4.50(按当前折扣 $4.28),在 speech-2.8-turbo 上是 $2.70(折后 $2.57)。译文场景的长度通常会与原文不同,所以翻译后要重新核对每个场景的字符预算,不要假设原来的时长还能对上。
限制与不提供的功能
有些边界最好在围绕它们做设计之前就先了解。
- 音色克隆需要单独一步。想用主播本人的声音,先用参考录音在
/v1/minimax/voice_clone克隆音色,再固定使用它返回的音色 ID;否则请从官方音色 ID 中选择。 - 流式音频没有文档说明。把每个请求都当作生成一个完整文件。不要按分块或事件流的响应形态来开发语音功能;要分块,就分你的脚本。
- 没有公布单次请求的字符上限。文档里没有写这个上限,所以不要依赖某个数值。按场景拆分能让每个请求都保持在宽裕的小尺寸,也天然形成了重试的单位。
- 失败的请求从不计费,所以给场景生成套一个重试循环,失败时不会多花一分钱。
本平台的 MiniMax-H3 视频生成暂时不可用,所以这条流水线只覆盖制作中的音频部分。按同样的分文件方法处理长篇语音内容,见配套文章有声书 TTS;参数细节见 speech-2.8 模型页。
开始使用
在 /register 创建 Key 并充值。计费方式为预付美元额度、按量付费、无订阅:最低充值 $5,预设档位有 $5 / $10 / $20 / $50 / $100 / $200 / $500,也可以自定义金额,额度有效期 12 个月。新账号注册即送 $0.10 试用额度,约合一分钟的 hd 音频;更多的测试生成请预留几美元——按这个价格,几美元就能生成大量测试旁白。所有模型的当前价格见定价页。Base URL 是 https://yiduochan.com/v1,鉴权使用标准的 Authorization: Bearer 请求头,携带 <your API key>。有问题请发邮件至 support@yiduochan.com。
常见问题
五分钟的视频,脚本应该写多长?
约 4,500 个字符,依据是语音每分钟约 900 个字符的规划估算。在定下整份脚本之前,先生成一个有代表性的场景实测一下。
十分钟的配音要多少钱?
约 9,000 个字符,按刊例价在 speech-2.8-hd 上是 $0.90,在 speech-2.8-turbo 上是 $0.54。按当前 5% 的分组折扣,分别为 $0.86 和 $0.51。
剪辑时间线应该用哪种 response_format?
要剪切或处理的素材用 wav;想要不带容器的原始采样就用 pcm;也可以选 flac。mp3 是省略该字段时的默认值,留到最终交付编码时再用。
可以克隆主播的音色吗?
可以。/v1/minimax/voice_clone 接收一段样本,返回一个可以固定用作主播的音色。也可以从官方音色 ID 中选择,例如 English_expressive_narrator、male-qn-qingse 和 female-shaonv。
语音接口支持流式输出吗?
流式音频没有文档说明,所以请把每个请求都当作返回一个完整文件。长脚本请拆成按场景的请求,不要按流式响应来开发。
怎样制作同一条视频的其他语言版本?
把翻译后的脚本换一个音色 ID,通过同一条按场景生成的流水线重新生成,场景 ID 和文件名保持不变。之后要重新核对每个场景的字符预算,因为译文的长度很少与原文一致。