1. Check the language and voices
capability=meaning_first lists the languages with the meaning-first engine, and capabilities.meaning_first_only marks those that
have nothing else.
meaning_first_compatible.
2. Estimate with the model
The estimate says what you would get.details.dubbing_model is the model that would run, details.text_adaptation says how the
auto-dub would voice the text (null when nothing will be dubbed), and a notice dubbing_model_overridden warns when the model is not
the one you named, or not v2 when you named none.
3. Create the project
params.dubbing_model (null when you named none). Copies from
createProjectCopies inherit the model of their source.
The project_processing job ends when translation ends. The auto-dub then runs as a dub job of its own, named in
result.auto_dub.dub_job_id: wait for it before you read which engine voiced the project.
4. Read it back
A dub job also reports
result.engine, result.text_adaptation and result.notices.
When the model differs
These are the allowed fallbacks, indubbing_model_override_reason:
The effective model is
v2 only when the project runs meaning-first, its voices can use it and it is not a free dubbing variant. A
voice can still change the engine after creation: on a v2 project, giving a speaker a voice with meaning_first_compatible: false
sends the next voiceover to the legacy engine, while dubbing_model stays v2. updateSpeakerVoice
warns with meaning_first_disabled, and the dub’s result reads engine: legacy with the notice voice_fallback.
Text adaptation
text_adaptation tells you how a dub treats the translation. It decides whether the words you read are the words you hear.
The whole program
dubbing_model.py