用 VOICE API 构建

20 条学习卡片,四种语言,生成可用的音频。

把一份小型内容列表变成可下载的 MP3。这个 Node.js 项目逐个提交排队任务、保存进度,并输出应用可直接读取的音频清单。

Node.js 22+ · 已开通 API 工作区 · 服务端密钥 · 按正常生成用量计费

Rowan

每条卡片使用同一个预设

  1. cards.json5 句表达 × 4 种语言
  2. queued → succeeded逐个排队 + 进度保存
  3. 20 × .mp3 + manifest.json实际保存的音频,不是占位文件
469计量字符
$0.003752实际生成费用

2026 年 9 月 14 日的内部示例运行,未使用免费字符。这不是客户案例、性能 SLA 或语言质量基准。

实际 API 输出

先听结果。

先听同一句表达在四种语言中的结果,使用的是同一个已准备好的声音。源文件分别提供各语言文本,API 不负责翻译。

English

Hello! Welcome to our city.

2.2s · 27 字符
中文

你好!欢迎来到我们的城市。

2.9s · 13 字符
日本語

こんにちは。私たちの町へようこそ。

3.6s · 17 字符
Español

¡Hola! Bienvenido a nuestra ciudad.

2.7s · 35 字符

请结合目标用户评估发音和相似度。这些样音通过生成与文件技术检查,不代表每种语言都完成了母语人工验收。

运行完整项目。

1. 先看输入和用量

下载并解压项目。默认预估命令只在本地读取 20 条输入,不调用 API。

Terminal
npm install
node generate.mjs --plan

SDK 包从官方站点安装,尚未上架 npm。运行前先查看 cards.json 和字符费用预估。

2. 使用自己的工作区生成

在服务端环境或密钥管理工具中设置 CASTREADER_API_KEY,再运行脚本。不要把密钥放进网页前端或公开仓库。

Terminal
node generate.mjs --run

# output/ contains MP3 files, manifest.json
# and private recovery state.json

还没有 API 工作区?申请开通

每次请求做什么

Node.js · 请求片段,下载项目包含完整恢复逻辑
const job = await client.createJob({
  model: 'clone-v1',
  voice_id: readyVoiceId,
  text: card.text,
  language: card.language,
  output_format: 'mp3',
}, { idempotencyKey: savedKey });

// Save job.id, then poll until succeeded.
const { audio, chargedUSD } = await client.getJobAudio(job.id);
await writeFile(card.id + '.mp3', audio);

这是应用层循环,不是原生批量接口。请求逐个运行,以适配当前工作区一次一个操作的并发限制;每条请求都可能等待可用资源。

中断了?继续原任务。

情况脚本如何处理
MP3 已保存且校验一致直接使用本地文件,不发起 API 请求。
提交时网络结果不确定用保存的幂等键和原输入重试。
任务仍在运行或下载失败查询保存的任务 ID,下载同一结果。
任务失败、取消或过期停止并提示检查,不自动新建收费任务。
文本或音色变化拒绝覆盖旧运行;新目录代表明确的新生成。

请私下保存 output/state.json,使用相同目录和原输入重跑。强制终止可能留下锁文件,确认旧进程已结束后再移除该目录的 .running 锁。服务端结果不超过 24 小时即过期,请及时下载。

每条文本,都与音频一一对应。

本次使用 469 个字符生成 20 个文件,单价为每百万字符 8 美元,API 返回的总费用为 $0.003752。你的可用免费额度可能改变实际支付费用。

查看每条输入、文件与费用
输入/语言音频文件USD
English

Hello! Welcome to our city.

welcome-en.mp30.000216
中文

你好!欢迎来到我们的城市。

welcome-zh.mp30.000104
日本語

こんにちは。私たちの町へようこそ。

welcome-ja.mp30.000136
Español

¡Hola! Bienvenido a nuestra ciudad.

welcome-es.mp30.000280
English

Excuse me, where is the train station?

station-en.mp30.000304
中文

请问,火车站在哪里?

station-zh.mp30.000080
日本語

すみません、駅はどこですか。

station-ja.mp30.000112
Español

Disculpe, ¿dónde está la estación de tren?

station-es.mp30.000336
English

Could I have a glass of water, please?

water-en.mp30.000304
中文

请给我一杯水,谢谢。

water-zh.mp30.000080
日本語

お水を一杯いただけますか。

water-ja.mp30.000104
Español

¿Me da un vaso de agua, por favor?

water-es.mp30.000272
English

Thank you for your help.

thanks-en.mp30.000192
中文

谢谢你的帮助。

thanks-zh.mp30.000056
日本語

手伝ってくれてありがとうございます。

thanks-ja.mp30.000144
Español

Gracias por su ayuda.

thanks-es.mp30.000168
English

See you tomorrow. Have a good evening!

tomorrow-en.mp30.000304
中文

明天见,祝你今晚愉快!

tomorrow-zh.mp30.000088
日本語

また明日。よい夜をお過ごしください。

tomorrow-ja.mp30.000144
Español

Hasta mañana. ¡Que tenga una buena noche!

tomorrow-es.mp30.000328

换成自己的卡片,复用这套流程。

编辑输入 JSON,保留唯一、安全的文件标识,并填写每条文本的语言。通过 VOICE_ID 使用你有权使用的已准备音色。先跑少量内容,检查音频后再扩大。

示例接受最多 200 条输入,每条不超过 500 个标准化字符;仍受当前服务限制和可用语言约束。不包含自动翻译、实时对话或音频混合。