Translate into other languages

One script in, validated audio out in every target language — translation, voices, and export in a single run.

One script, many languages: a Translator node turns each line into your target languages, and the Generator voices each one. One run delivers per-language audio — the pattern behind dubbing, localized courses, and multi-region ads.

1. Set the target languages

Edit the workflow’s Translator node (read → modify → write back):

1definition = client.workflows.get(workflow_id=wf).data.model_dump()["definition"]
2for node in definition["graph"]["nodes"]:
3 if node["type"] == "processing_translator":
4 node["config"] = {"target_languages": ["ko-kr", "ja-jp", "es-es"]}
5client.workflows.patch_workflow(wf, definition=definition)

Up to 30 targets per Translator (BCP-47 codes). No Translator in your workflow yet? Add one between Script and Generator on the canvas, or clone a template that has one.

2. Give each language a voice

Every target language needs an entry in the Generator’s voice_map. Two ways:

1for node in definition["graph"]["nodes"]:
2 if node["type"] == "processing_generator":
3 node["config"]["voice_map"].update({
4 "ko-kr": [], # auto-route picks the best model
5 "ja-jp": [{"voice_id": "...", "provider": "...", "model": "..."}], # your pick
6 "es-es": [],
7 })
  • Empty listauto-route picks the best model for that language from Onepin’s benchmarks.
  • Explicit assignment — you pick the voice and model; see Browse voices.

A target language with no voice_map entry fails at run start with a clear error — coverage is checked before anything is billed.

3. Run and collect

Run as usual — the export ZIP has one folder per language:

sink_preview_1/
├── en-us/…_line_000.mp3
├── ko-kr/…_line_000.mp3
├── ja-jp/…_line_000.mp3
└── manifest.csv ← maps every file to its line and language

Validators score every language’s lines the same way — a Korean line that fails the accuracy bar is retried just like an English one.