Hello! Welcome to our city.
2.2s · 27 字符用 VOICE API 构建
20 条学习卡片,四种语言,生成可用的音频。
把一份小型内容列表变成可下载的 MP3。这个 Node.js 项目逐个提交排队任务、保存进度,并输出应用可直接读取的音频清单。
Node.js 22+ · 已开通 API 工作区 · 服务端密钥 · 按正常生成用量计费
每条卡片使用同一个预设
cards.json5 句表达 × 4 种语言queued → succeeded逐个排队 + 进度保存20 × .mp3 + manifest.json实际保存的音频,不是占位文件
2026 年 9 月 14 日的内部示例运行,未使用免费字符。这不是客户案例、性能 SLA 或语言质量基准。
实际 API 输出
先听结果。
先听同一句表达在四种语言中的结果,使用的是同一个已准备好的声音。源文件分别提供各语言文本,API 不负责翻译。
你好!欢迎来到我们的城市。
2.9s · 13 字符こんにちは。私たちの町へようこそ。
3.6s · 17 字符¡Hola! Bienvenido a nuestra ciudad.
2.7s · 35 字符请结合目标用户评估发音和相似度。这些样音通过生成与文件技术检查,不代表每种语言都完成了母语人工验收。
运行完整项目。
1. 先看输入和用量
下载并解压项目。默认预估命令只在本地读取 20 条输入,不调用 API。
npm install
node generate.mjs --planSDK 包从官方站点安装,尚未上架 npm。运行前先查看 cards.json 和字符费用预估。
2. 使用自己的工作区生成
在服务端环境或密钥管理工具中设置 CASTREADER_API_KEY,再运行脚本。不要把密钥放进网页前端或公开仓库。
node generate.mjs --run
# output/ contains MP3 files, manifest.json
# and private recovery state.json每次请求做什么
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.mp3 | 0.000216 |
| 中文 你好!欢迎来到我们的城市。 | welcome-zh.mp3 | 0.000104 |
| 日本語 こんにちは。私たちの町へようこそ。 | welcome-ja.mp3 | 0.000136 |
| Español ¡Hola! Bienvenido a nuestra ciudad. | welcome-es.mp3 | 0.000280 |
| English Excuse me, where is the train station? | station-en.mp3 | 0.000304 |
| 中文 请问,火车站在哪里? | station-zh.mp3 | 0.000080 |
| 日本語 すみません、駅はどこですか。 | station-ja.mp3 | 0.000112 |
| Español Disculpe, ¿dónde está la estación de tren? | station-es.mp3 | 0.000336 |
| English Could I have a glass of water, please? | water-en.mp3 | 0.000304 |
| 中文 请给我一杯水,谢谢。 | water-zh.mp3 | 0.000080 |
| 日本語 お水を一杯いただけますか。 | water-ja.mp3 | 0.000104 |
| Español ¿Me da un vaso de agua, por favor? | water-es.mp3 | 0.000272 |
| English Thank you for your help. | thanks-en.mp3 | 0.000192 |
| 中文 谢谢你的帮助。 | thanks-zh.mp3 | 0.000056 |
| 日本語 手伝ってくれてありがとうございます。 | thanks-ja.mp3 | 0.000144 |
| Español Gracias por su ayuda. | thanks-es.mp3 | 0.000168 |
| English See you tomorrow. Have a good evening! | tomorrow-en.mp3 | 0.000304 |
| 中文 明天见,祝你今晚愉快! | tomorrow-zh.mp3 | 0.000088 |
| 日本語 また明日。よい夜をお過ごしください。 | tomorrow-ja.mp3 | 0.000144 |
| Español Hasta mañana. ¡Que tenga una buena noche! | tomorrow-es.mp3 | 0.000328 |
换成自己的卡片,复用这套流程。
编辑输入 JSON,保留唯一、安全的文件标识,并填写每条文本的语言。通过 VOICE_ID 使用你有权使用的已准备音色。先跑少量内容,检查音频后再扩大。
示例接受最多 200 条输入,每条不超过 500 个标准化字符;仍受当前服务限制和可用语言约束。不包含自动翻译、实时对话或音频混合。