API REFERENCE · DECISIONS
Audio decisions
What to translate at all. The model finds the main voice and keeps the rest as it was; which sounds stay in the original is yours to settle.
01.What the model decides in audio
The model hears everything in the source: the laughter, the crowd, a shout, a speaker no one can make out. It finds the main voice and keeps the rest as it was.
The decision is which voices are translated and what stays in the source language. Each one lands in the decision record with type: "audio".
02.The kinds
TRANSLATE
Whether a voice is translated at all: the main voice, a line off mic, a background speaker no one can make out. The main voice is translated; the background speaker is left as it was.
KEEP_ORIGINAL
A chant, a yell or a phrase that stays in the source language. The stadium chant at 41.2 to 44.0 s stays in Korean, so does the yell across the kitchen and the catchphrase the fans know.
PRESERVE
A sound kept exactly as it was. The laughter and the crowd come through untouched in every language.
03.In the record
/v1/dubs/{dub_id}/decisions?type=audio&lang=enThe decisions resource (in the works) filters to audio with type=audio. The chant, as the record holds it:
{
"dub_id": "dub_31xk9m",
"lang": "en",
"decisions": [
{
"id": "dec_7h2k0b",
"type": "audio",
"kind": "keep_original",
"segment": null,
"start": 41.20,
"end": 44.05,
"speaker": null,
"source": "crowd chant",
"options": [
{ "id": "opt_1", "text": "keep in Korean", "reasoning": "A stadium chant; the crowd is the scene, not a speaker." },
{ "id": "opt_2", "text": "translate", "reasoning": "The words carry the next line's joke." }
],
"chosen": "opt_1",
"chosen_by": "model",
"status": "open",
"memory": null
}
],
"has_more": false
}| FIELD | AUDIO DECISIONS |
|---|---|
segment | Always null; a sound has no transcript segment. |
speaker | null for a crowd or a sound; a spk_ id for one voice. |
options[] | id, text, reasoning; no intent or emotion. |
source | The sound, named: a crowd chant, a yell, laughter. |
04.Override
/v1/dubs/{dub_id}/decisions/{decision_id}The override (in the works) takes exactly one of keep_original: true or choose. Add remember: "creator" to carry the choice to the next episode.
curl -X PATCH https://api.thefamiliarlab.com/v1/dubs/dub_31xk9m/decisions/dec_7h2k0b \
-H "Authorization: Bearer $FAMILIAR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "keep_original": true, "remember": "creator" }'curl -X PATCH https://api.thefamiliarlab.com/v1/dubs/dub_31xk9m/decisions/dec_7h2k0b \
-H "Authorization: Bearer $FAMILIAR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "choose": "opt_2" }'{
"id": "dec_7h2k0b",
"type": "audio",
"kind": "keep_original",
"chosen": "opt_2",
"chosen_by": "you",
"status": "settled",
"memory": null
}PATCH works at in_review and at complete, then POST /render again. During rendering it returns 409 decision_locked; an unknown option returns 422 option_not_found.
05.Settings
Two request fields on POST /v1/dubs (in the works) set the defaults. Nested fields are written dotted in multipart.
| FIELD | VALUES | DESCRIPTION |
|---|---|---|
decisions.audio.translate | main_voice (default) · all_speech · ask | The main voice only; every intelligible speaker; or every close call comes back open. |
decisions.audio.keep_original | auto (default) · ask | The model decides what stays in the source language, or asks. |
ask requires review=manual; on an auto dub it returns 422 decision_setting_requires_review. The dub waits at in_review until every open decision is settled or you render.
06.On the review screen
The review screen (in the works) shows each audio decision as the sound's span on the episode timeline, with the options and the reasoning. One tap keeps it in the original; another remembers the choice for this creator.
07.Access
The API is enterprise-only: private access under a Studio contract, with volume pricing, raised limits, ProRes masters on request, and a named point of contact. Book a call and your key is issued with the contract.