language: 'zh'每一个故事,都值得被听见。
voice: voiceIdsame ready voiceMULTILINGUAL VOICE CLONING API
Prepare an authorized recording once. Reuse its voice ID to turn your text into speech—without recording every line again.
Record · upload · invite the speaker
voice_idReuse for new textWorkflow illustration. This does not translate your text.
LISTEN TO THE RESULT
These recordings were generated through the live API using the published Rowan preset. Compare them with its original reference before trying your own authorized voice.
Published preset · same prepared voice
Every small step opens a new door. Listen, learn, and tell your own story.
const examples = [
{ language: 'en', text: 'Every small step opens a new door. Listen, learn, and tell your own story.' },
{ language: 'zh', text: '每一个小小的进步,都会打开一扇新的门。认真聆听,不断学习,讲述属于你自己的故事。' },
{ language: 'ja', text: '小さな一歩が、新しい扉を開きます。耳を傾け、学び、自分だけの物語を語りましょう。' },
];
for (const example of examples) {
const { audio } = await client.generate({
voice: 'rowan',
...example,
output_format: 'mp3',
});
await writeFile(example.language + '.mp3', audio);
}Generation excerpt; install the client and configure your server-side key first. Each language has its own input text. The API does not translate it.
Client installation and complete quickstart →Recorded 14 September 2026 · clone-v1 · MP3 · speed 1. These are saved demonstration outputs, not new generations on playback. One preset and three short texts are not a quality benchmark or a guarantee for other recordings. Pronunciation, accent and similarity vary; assess your target-language content before publishing.
01 / A BETTER REFERENCE
One clean, representative voice is the starting point. These are preparation checks, not a promise of a perfect voice match.
REFERENCE CHECKLIST
3–30seconds
Current worker duration guidance. Follow upload validation if your file is rejected.
Common containers; the API validates supported audio MIME types and file contents.
Use consistent volume and a style representative of the voice you want.
Remove overlapping speakers, long silences and obvious clipping. Do not cover noise with music.
reference_text is optional and accepts up to 600 Unicode code points; do not supply a different script.
Use your own voice or keep explicit speaker permission for cloning and the planned application.
02 / VOICE ≠ LANGUAGE
Examples of request inputs, not recordings or a translation demo. You supply the translated script when you need another language.
language: 'zh'每一个故事,都值得被听见。
voice: voiceIdsame ready voicelanguage: 'ja'すべての物語には、届けたい声があります。
voice: voiceIdsame ready voicelanguage: 'es'Cada historia merece ser escuchada.
voice: voiceIdsame ready voiceListen to names, numbers, rhythm and speaker similarity in each language. Accent and pronunciation can vary. Short or mixed-language input may need an explicit language or separate requests; selecting a language does not translate the text.
03 / FROM JOB TO FILE
Voice preparation and speech generation are different operations. Switching a ready ID skips preparation, not inference.
processing → readySave the ready voice ID in its workspace and region.
queued → runningKeep the job ID and Idempotency-Key. Up to 500 characters per queued task.
succeeded → downloadDownload MP3/WAV before result_expires_at. A retained download is not another generation.
Pre-generated product guidance, short lessons, localization snippets and scripted dialogue assembled by your app.
Realtime calls, streaming, native multi-speaker orchestration or emotion control. Longer content needs splitting and audio assembly.
FROM RECORDING TO API
Use your own voice, upload a permitted file or send a recording invitation from the console. Keep the recording clear and the transcript accurate.
Registration prepares the reference for synthesis. Store the returned voice ID; switching between prepared voices does not require another registration.
Reuse the voice ID with text and its language. The SDK handles routing and queued-job waiting, then returns the generated audio.
import { VoiceAPI } from '@castreader/voice-api';
import { writeFile } from 'node:fs/promises';
const client = new VoiceAPI();
// Use the ID of your ready, authorized clone.
const voiceId = 'YOUR_VOICE_ID';
const { audio } = await client.generate({
voice: voiceId,
text: '每一个故事,都值得被听见。',
language: 'zh',
output_format: 'mp3',
});
// Same voice ID. Different input text.
const english = await client.generate({
voice: voiceId,
text: 'Every story deserves to be heard.',
language: 'en',
output_format: 'mp3',
});
await writeFile('chinese.mp3', audio);
await writeFile('english.mp3', english.audio);Install the SDK and set CASTREADER_API_KEY first. Each successful generation is metered separately.
Install the Node.js or Python client →
Registration fields and complete quickstart →PAY FOR GENERATION, NOT A SUBSCRIPTION
One usage price for supported synthesis languages. Available trial characters are used first; waiting and downloading a retained result do not add another generation charge.
FOR AI-ASSISTED DEVELOPMENT
Keep the voice, workspace and region together. Change the text and its language for each generation. Inspect real samples before deciding if similarity meets your needs.
const job = await client.createJob({
model: 'clone-v1', voice_id: readyVoiceId,
text: '欢迎回来。', language: 'zh',
output_format: 'mp3'
}, { idempotencyKey: savedKey });Use one speaker in a quiet setting, speaking naturally. Avoid music, overlapping speakers, echo, clipping and long silent sections. A representative speaking style is more useful than an exaggerated performance.
The current worker’s duration guidance is 3–30 seconds. Use a clean excerpt and follow the console’s validation result. If you provide a transcript, it must match the recording; the optional reference_text field accepts up to 600 Unicode code points.
Upload formats and fields →Registration validates and processes the reference and prepares the voice for inference. Only a ready voice can be used for generation. Reusing that voice ID avoids repeating the registration step.
Generation is still a separate task with a queue. This deployment allows 1 concurrent generation per workspace; switching IDs does not eliminate queueing or model inference. There is no promised preparation or generation latency.
Understand queued jobs →The current workspace limit is two active private voices and 5 registrations per UTC day. Built-in defaults do not use these private voice slots. Processing and deleting voices still count until their status changes.
Deleting a voice does not restore the day’s registration allowance. When you receive voice_registration_limit, check GET /v1/models and the console instead of retrying the upload in a loop.
Voice limits and status values →Private clones are scoped to the workspace and require a currently authorized API key and voice permission. They are not published in the public gallery. Voice recordings are not automatically copied between processing regions.
Deleting a voice immediately blocks new generation and access to its retained downloads; artifact cleanup then happens asynchronously. Reference data remains until deletion completes. Audio, consent and billing records have different retention rules.
Storage, consent and deletion →MP3 supports speed from 0.5 to 2; WAV uses speed 1. Categories do not set emotion. The public API does not expose pronunciation dictionaries, phoneme/SSML controls, timed pause tags or emotion instructions.
Proofread input and write ambiguous numbers, abbreviations or dates in the intended spoken form. Try a short, clearly punctuated sentence in the correct language. These are practical workarounds, not pronunciation guarantees; each new successful generation is metered.
Supported request controls →No: workspace privacy describes access control, not zero retention. Voice references and prepared artifacts remain until deletion; audio and recoverable job input expire within the published retention window. Usage and consent records are kept separately.
This public offering does not publish an enterprise zero-retention or no-training contractual guarantee. If you require those commitments or specific residency/compliance terms, obtain written confirmation before sending sensitive recordings. Do not infer a certification or training policy from “private”.
Actual retention and access rules →No automatic translation is performed. Pass target-language text and a matching language code. The source recording, interface locale and synthesis language are separate choices.
Cross-language synthesis aims to preserve speaker characteristics, but accent, pronunciation and similarity can vary with the recording and language. Test names, numbers and representative sentences; no identity match or native-level pronunciation is guaranteed.
Supported languages and limits →You can build a pre-generated workflow: divide a script into passages of at most 500 characters, choose a ready voice for each passage, generate sequentially and assemble the audio in your application.
This is application-side orchestration, not a native multi-speaker endpoint. Current delivery is MP3/WAV files; live conversations, streaming output, emotion controls and guaranteed seamless long-form joins are not included.
Workflow capabilities →Save the job ID and the original Idempotency-Key before waiting. A queued job survives closing the browser. Query that job or retry the identical input with the same key instead of submitting a new generation immediately.
Read the terminal status and error before changing the recording or text. Rejected or failed work is not charged; any active reservation is released after execution is confirmed stopped. An expired result returns 410 and is not regenerated under the old key.
Error codes and safe retries →You receive MP3 or WAV audio with request and usage information. Results are private and retained for up to 24 hours in this deployment; follow result_expires_at and download into your own authorized storage before it expires.
Downloading the same retained result does not create another generation charge. Optional v3 timings are currently for English, may contain word groups and may be unavailable; they are not guaranteed multilingual subtitles.
Audio results and timestamp support →