madoo.dubbing-manifest/v2
Madoo natural speech dubbing manifest — Delivery evidence with immutable plan, measured candidates and complete attempt history.
| Reference | madoo.dubbing-manifest/v2 |
| Schema id | urn:madoo:schema:dubbing-manifest:v2 |
| Version | 2.0.0 |
| Served at | GET /api/v1/json-schemas/madoo.dubbing-manifest/v2 · MCP get_json_schema |
Where it appears
Section titled “Where it appears”- Produced by:
utility/dubbing_manifest→manifest_v2
Fields
Section titled “Fields”| Field | Type | Required | Rules | Description |
|---|---|---|---|---|
schema |
"madoo.dubbing-manifest/v2" |
yes | ||
sourceLanguage |
string | yes | min length 2; max length 35 | |
targetLanguage |
string | yes | min length 2; max length 35 | |
master |
object | yes | no other fields | |
master.kind |
one of "video", "audio", "json" |
yes | ||
master.storageRef |
string | yes | min length 1; max length 2048 | |
master.mediaType |
string | yes | min length 1; max length 256 | |
master.durationMilliseconds |
integer or null | yes | ≥ 0; ≤ 21600000 | |
master.sha256 |
string or null | yes | pattern “^[a-f0-9]{64}$” | |
sourceCaptions |
object | yes | no other fields | |
sourceCaptions.schema |
"madoo.caption-track/v1" |
yes | ||
sourceCaptions.trackId |
string | yes | min length 1; max length 256 | |
sourceCaptions.language |
string or null | yes | min length 2; max length 35 | |
targetCaptions |
object | yes | no other fields | |
targetCaptions.schema |
"madoo.caption-track/v1" |
yes | ||
targetCaptions.trackId |
string | yes | min length 1; max length 256 | |
targetCaptions.language |
string or null | yes | min length 2; max length 35 | |
textToSpeechModel |
object | yes | no other fields | |
textToSpeechModel.provider |
string | yes | min length 1; max length 128 | |
textToSpeechModel.modelId |
string | yes | min length 1; max length 256 | |
textToSpeechModel.version |
string or null | yes | max length 128 | |
textToSpeechModel.profileVersion |
string | yes | min length 1; max length 64 | |
stemSeparationModel |
object or null | yes | ||
backgroundMode |
one of "separated", "provided", "none" |
yes | ||
speakerVoices |
array of objects | yes | min items 1; max items 32 | |
speakerVoices[].speaker |
string or null | yes | max length 256 | |
speakerVoices[].voice |
string | yes | min length 1; max length 512 | |
speakerVoices[].source |
one of "preset", "reference", "workflow" |
yes | ||
timelineAudio |
object | yes | no other fields | |
timelineAudio.kind |
one of "video", "audio", "json" |
yes | ||
timelineAudio.storageRef |
string | yes | min length 1; max length 2048 | |
timelineAudio.mediaType |
string | yes | min length 1; max length 256 | |
timelineAudio.durationMilliseconds |
integer or null | yes | ≥ 0; ≤ 21600000 | |
timelineAudio.sha256 |
string or null | yes | pattern “^[a-f0-9]{64}$” | |
finalAudio |
object | yes | no other fields | |
finalAudio.kind |
one of "video", "audio", "json" |
yes | ||
finalAudio.storageRef |
string | yes | min length 1; max length 2048 | |
finalAudio.mediaType |
string | yes | min length 1; max length 256 | |
finalAudio.durationMilliseconds |
integer or null | yes | ≥ 0; ≤ 21600000 | |
finalAudio.sha256 |
string or null | yes | pattern “^[a-f0-9]{64}$” | |
finalVideo |
object or null | yes | ||
cues |
array of objects | yes | max items 10000 | |
cues[].cueId |
string | yes | min length 1; max length 128 | |
cues[].iterationIndex |
integer | yes | ≥ 0; ≤ 9999 | |
cues[].sourceText |
string | yes | min length 1; max length 4000 | |
cues[].targetText |
string | yes | min length 1; max length 4000 | |
cues[].startMilliseconds |
integer | yes | ≥ 0; ≤ 21600000 | |
cues[].endMilliseconds |
integer | yes | ≥ 1; ≤ 21600000 | |
cues[].speaker |
string or null | yes | max length 256 | |
cues[].voice |
string | yes | min length 1; max length 512 | |
cues[].modelId |
string | yes | min length 1; max length 256 | |
cues[].generatedDurationMilliseconds |
integer | yes | ≥ 1; ≤ 21600000 | |
cues[].fittedDurationMilliseconds |
integer | yes | ≥ 1; ≤ 21600000 | |
cues[].fitAction |
string | yes | min length 1; max length 128 | |
cues[].status |
one of "completed", "warning", "failed", "skipped" |
yes | ||
cues[].warnings |
array of objects | yes | max items 256 | |
cues[].warnings[].code |
string | yes | min length 1; max length 128 | |
cues[].warnings[].message |
string | yes | min length 1; max length 1000 | |
cues[].warnings[].path |
string or null | yes | max length 500 | |
quality |
object | yes | no other fields | |
quality.passed |
boolean | yes | ||
quality.checkIds |
array of string | yes | max items 64 | |
quality.failedCheckIds |
array of string | yes | max items 64 | |
provenance |
object | yes | no other fields | |
provenance.builder |
"madoo.dubbing-manifest" |
yes | ||
provenance.version |
string | yes | min length 1; max length 64 | |
provenance.timelineTechnique |
object | yes | no other fields | |
provenance.timelineTechnique.name |
string | yes | min length 1; max length 128 | |
provenance.timelineTechnique.version |
string | yes | min length 1; max length 64 | |
provenance.timelineTechnique.engine |
string | yes | min length 1; max length 64 | |
provenance.timelineTechnique.engineVersion |
string | yes | min length 1; max length 128 | |
provenance.qualityTechnique |
object | yes | no other fields | |
provenance.qualityTechnique.name |
string | yes | min length 1; max length 128 | |
provenance.qualityTechnique.version |
string | yes | min length 1; max length 64 | |
warnings |
array of objects | yes | max items 256 | |
warnings[].code |
string | yes | min length 1; max length 128 | |
warnings[].message |
string | yes | min length 1; max length 1000 | |
warnings[].path |
string or null | yes | max length 500 | |
speechTiming |
object | yes | no other fields | |
speechTiming.schema |
"madoo.speech-timing-state/v1" |
yes | ||
speechTiming.plan |
object | yes | no other fields | |
speechTiming.plan.schema |
"madoo.speech-timing-plan/v1" |
yes | ||
speechTiming.plan.planId |
string | yes | pattern “^[a-f0-9]{64}$” | |
speechTiming.plan.organizationID |
integer | yes | ≥ 1; ≤ 9007199254740991 | |
speechTiming.plan.workspaceID |
integer | yes | ≥ 1; ≤ 9007199254740991 | |
speechTiming.plan.durationMilliseconds |
integer | yes | ≥ 50; ≤ 21600000 | |
speechTiming.plan.sourceCaptions |
object | yes | no other fields | |
speechTiming.plan.sourceCaptions.schema |
"madoo.caption-track/v1" |
yes | ||
speechTiming.plan.sourceCaptions.track_id |
string | yes | min length 1; max length 512 | |
speechTiming.plan.sourceCaptions.language |
string | yes | min length 1; max length 64 | |
speechTiming.plan.sourceCaptions.source_language |
string or null | yes | max length 64 | |
speechTiming.plan.sourceCaptions.granularity |
string | yes | min length 1; max length 64 | |
speechTiming.plan.sourceCaptions.cues |
array of objects | yes | min items 1; max items 10000 | |
speechTiming.plan.sourceCaptions.generation |
object | yes | no other fields | |
speechTiming.plan.sourceCaptions.warnings |
array of objects | yes | min items 0; max items 10000 | |
speechTiming.plan.targetCaptions |
object | yes | no other fields | |
speechTiming.plan.targetCaptions.schema |
"madoo.caption-track/v1" |
yes | ||
speechTiming.plan.targetCaptions.track_id |
string | yes | min length 1; max length 512 | |
speechTiming.plan.targetCaptions.language |
string | yes | min length 1; max length 64 | |
speechTiming.plan.targetCaptions.source_language |
string or null | yes | max length 64 | |
speechTiming.plan.targetCaptions.granularity |
string | yes | min length 1; max length 64 | |
speechTiming.plan.targetCaptions.cues |
array of objects | yes | min items 1; max items 10000 | |
speechTiming.plan.targetCaptions.generation |
object | yes | no other fields | |
speechTiming.plan.targetCaptions.warnings |
array of objects | yes | min items 0; max items 10000 | |
speechTiming.plan.policy |
object | yes | no other fields | |
speechTiming.plan.policy.maximumRounds |
integer | yes | ≥ 1; ≤ 3 | |
speechTiming.plan.policy.minimumSpeakingRate |
number | yes | ≥ 0.95; ≤ 1 | |
speechTiming.plan.policy.maximumSpeakingRate |
number | yes | ≥ 1; ≤ 1.05 | |
speechTiming.plan.policy.maximumFitRate |
number | yes | ≥ 1; ≤ 2 | |
speechTiming.plan.policy.maximumCombinedRate |
number | yes | ≥ 1; ≤ 2 | |
speechTiming.plan.policy.toleranceMilliseconds |
integer | yes | ≥ 1; ≤ 250 | |
speechTiming.plan.cues |
array of objects | yes | min items 1; max items 10000 | |
speechTiming.plan.cues[].cueId |
string | yes | min length 1; max length 128 | |
speechTiming.plan.cues[].originalIndex |
integer | yes | ≥ 0; ≤ 9999 | |
speechTiming.plan.cues[].sourceText |
string | yes | min length 1; max length 20000 | |
speechTiming.plan.cues[].initialTranslation |
string | yes | min length 1; max length 20000 | |
speechTiming.plan.cues[].speaker |
string or null | yes | max length 512 | |
speechTiming.plan.cues[].startMilliseconds |
integer | yes | ≥ 0; ≤ 21600000 | |
speechTiming.plan.cues[].endMilliseconds |
integer | yes | ≥ 50; ≤ 21600000 | |
speechTiming.plan.cues[].contextBefore |
string or null | yes | max length 20000 | |
speechTiming.plan.cues[].contextAfter |
string or null | yes | max length 20000 | |
speechTiming.plan.elasticity |
object | no other fields | ||
speechTiming.plan.elasticity.maximumEndExtensionMilliseconds |
integer | yes | ≥ 1; ≤ 250 | |
speechTiming.plan.elasticity.evidence |
object | yes | no other fields | |
speechTiming.plan.elasticity.windows |
array of objects | yes | max items 10000 | |
speechTiming.plan.availableWindows |
object | no other fields | ||
speechTiming.plan.availableWindows.maximumEndExtensionMilliseconds |
integer | yes | ≥ 1; ≤ 2000 | |
speechTiming.plan.availableWindows.safetyGapMilliseconds |
integer | yes | ≥ 20; ≤ 500 | |
speechTiming.plan.availableWindows.windows |
array of objects | yes | max items 10000 | |
speechTiming.completedRounds |
integer | yes | ≥ 0; ≤ 3 | |
speechTiming.history |
array of objects | yes | min items 0; max items 30000 | |
speechTiming.history[].schema |
"madoo.speech-timing-assessment/v1" |
yes | ||
speechTiming.history[].candidate |
object | yes | no other fields | |
speechTiming.history[].candidate.planId |
string | yes | pattern “^[a-f0-9]{64}$” | |
speechTiming.history[].candidate.cueId |
string | yes | min length 1; max length 128 | |
speechTiming.history[].candidate.round |
integer | yes | ≥ 1; ≤ 3 | |
speechTiming.history[].candidate.text |
string | yes | min length 1; max length 20000 | |
speechTiming.history[].candidate.audioStorageRef |
string | yes | max length 4096; pattern “^storage://[^?#\s]+$” | |
speechTiming.history[].candidate.audioSha256 |
string | yes | pattern “^[a-f0-9]{64}$” | |
speechTiming.history[].candidate.durationMilliseconds |
integer | yes | ≥ 1; ≤ 21600000 | |
speechTiming.history[].candidate.speakingRate |
number | yes | ≤ 10; > 0 | |
speechTiming.history[].candidate.modelId |
string | yes | min length 1; max length 256 | |
speechTiming.history[].candidate.profileVersion |
string | yes | min length 1; max length 256 | |
speechTiming.history[].candidate.voice |
string | yes | min length 1; max length 512 | |
speechTiming.history[].candidate.hasAudibleSignal |
boolean | yes | ||
speechTiming.history[].candidate.headSilenceMilliseconds |
integer | ≥ 0; ≤ 21600000 | ||
speechTiming.history[].candidate.tailSilenceMilliseconds |
integer | ≥ 0; ≤ 21600000 | ||
speechTiming.history[].candidate.trimStartMilliseconds |
integer | ≥ 0; ≤ 1000 | ||
speechTiming.history[].candidate.trimEndMilliseconds |
integer | ≥ 0; ≤ 1000 | ||
speechTiming.history[].candidate.expectedMilliCredits |
integer | yes | ≥ 0; ≤ 9007199254740991 |
28 more fields are in the complete schema below.
Example
Section titled “Example”{ "schema": "madoo.dubbing-manifest/v2", "sourceLanguage": "en", "targetLanguage": "it", "master": { "kind": "video", "storageRef": "storage://org/ws/master.mp4", "mediaType": "video/mp4", "durationMilliseconds": 1000, "sha256": null }, "sourceCaptions": { "schema": "madoo.caption-track/v1", "trackId": "source", "language": "en" }, "targetCaptions": { "schema": "madoo.caption-track/v1", "trackId": "target", "language": "it" }, "textToSpeechModel": { "provider": "fal", "modelId": "turbo", "version": null, "profileVersion": "1" }, "stemSeparationModel": null, "backgroundMode": "provided", "speakerVoices": [ { "speaker": "speaker", "voice": "Rachel", "source": "preset" } ], "timelineAudio": { "kind": "audio", "storageRef": "storage://org/ws/timeline.wav", "mediaType": "audio/wav", "durationMilliseconds": 1000, "sha256": null }, "finalAudio": { "kind": "audio", "storageRef": "storage://org/ws/final.wav", "mediaType": "audio/wav", "durationMilliseconds": 1000, "sha256": null }, "finalVideo": { "kind": "video", "storageRef": "storage://org/ws/final.mp4", "mediaType": "video/mp4", "durationMilliseconds": 1000, "sha256": null }, "cues": [ { "cueId": "cue-1", "iterationIndex": 0, "sourceText": "Hello", "targetText": "Ciao", "startMilliseconds": 0, "endMilliseconds": 1000, "speaker": "speaker", "voice": "Rachel", "modelId": "turbo", "generatedDurationMilliseconds": 800, "fittedDurationMilliseconds": 1000, "fitAction": "pad", "status": "completed", "warnings": [] } ], "quality": { "passed": true, "checkIds": [ "dubbing-timeline-integrity" ], "failedCheckIds": [] }, "provenance": { "builder": "madoo.dubbing-manifest", "version": "2.0.0", "timelineTechnique": { "name": "madoo.audio-timeline", "version": "1.0.0", "engine": "ffmpeg", "engineVersion": "8.0.1" }, "qualityTechnique": { "name": "madoo.dubbing-delivery-quality", "version": "1.0.0" } }, "warnings": [], "speechTiming": { "schema": "madoo.speech-timing-state/v1", "plan": { "schema": "madoo.speech-timing-plan/v1", "planId": "df9f0828ea2c188dc4f90ef01e1c53ff04956e4f6f7199e1368bf01d54c18f7f", "organizationID": 1, "workspaceID": 2, "durationMilliseconds": 1000, "sourceCaptions": { "schema": "madoo.caption-track/v1", "track_id": "source", "language": "en", "source_language": null, "granularity": "segment", "cues": [ { "id": "cue-1", "start": 0, "end": 1, "text": "Hello", "speaker": "speaker", "speaker_scope": "track", "kind": "speech", "source_segment_ids": [] } ], "generation": { "normalizer": "fixture", "version": "1", "segment_count": 1, "overlap_reconciled": false }, "warnings": [] }, "targetCaptions": { "schema": "madoo.caption-track/v1", "track_id": "target", "language": "it", "source_language": null, "granularity": "segment", "cues": [ { "id": "cue-1", "start": 0, "end": 1, "text": "Ciao", "speaker": "speaker", "speaker_scope": "track", "kind": "speech", "source_segment_ids": [] } ], "generation": { "normalizer": "fixture", "version": "1", "segment_count": 1, "overlap_reconciled": false }, "warnings": [] }, "policy": { "maximumRounds": 3, "minimumSpeakingRate": 0.95, "maximumSpeakingRate": 1.05, "maximumFitRate": 1.1, "maximumCombinedRate": 1.15, "toleranceMilliseconds": 80 }, "cues": [ { "cueId": "cue-1", "originalIndex": 0, "sourceText": "Hello", "initialTranslation": "Ciao", "speaker": "speaker", "startMilliseconds": 0, "endMilliseconds": 1000, "contextBefore": null, "contextAfter": null } ] }, "completedRounds": 1, "history": [ { "schema": "madoo.speech-timing-assessment/v1", "candidate": { "planId": "df9f0828ea2c188dc4f90ef01e1c53ff04956e4f6f7199e1368bf01d54c18f7f", "cueId": "cue-1", "round": 1, "text": "Ciao", "audioStorageRef": "storage://org/ws/audio.wav", "audioSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "durationMilliseconds": 800, "speakingRate": 1, "modelId": "turbo", "profileVersion": "1", "voice": "Rachel", "expectedMilliCredits": 100, "hasAudibleSignal": true }, "accepted": true, "requiredFitRate": 1, "paddingMilliseconds": 200, "reason": "SPEECH_TIMING_ACCEPTED" } ] }, "speechTimingFits": [ { "cueId": "cue-1", "fittedAudioStorageRef": "storage://org/ws/fit.wav", "report": { "schema": "madoo.audio-processing-report/v1", "operation": "fit_duration", "profile": "natural_speech", "effectiveParameters": { "strategy": "natural_speech", "minimumRate": 1, "maximumRate": 1.1, "preservePitch": true, "preserveFormants": true, "onOutOfRange": "fail", "padPosition": "end", "outputFormat": "wav" }, "inputSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "before": null, "after": null, "actions": [ "Speech retained at natural rate; remaining slot filled with silence." ], "operationMetrics": { "originalDurationMilliseconds": 800, "targetDurationMilliseconds": 1000, "actualDurationMilliseconds": 1000, "requestedRate": 1, "appliedRate": 1, "paddingMilliseconds": 200, "paddingIsEstimated": false, "trimmedMilliseconds": 0, "outputSha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" }, "technique": { "name": "madoo.ffmpeg-none-duration-fit", "version": "1.0.0", "engine": "ffmpeg", "engineVersion": "8.0.1" }, "warnings": [] } } ]}The complete schema
Section titled “The complete schema”madoo.dubbing-manifest/v2 (JSON Schema)
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "urn:madoo:schema:dubbing-manifest:v2", "title": "Madoo natural speech dubbing manifest", "description": "Auditable delivery manifest for a timeline-aware localized dubbing workflow.", "type": "object", "required": [ "schema", "sourceLanguage", "targetLanguage", "master", "sourceCaptions", "targetCaptions", "textToSpeechModel", "stemSeparationModel", "backgroundMode", "speakerVoices", "timelineAudio", "finalAudio", "finalVideo", "cues", "quality", "provenance", "warnings", "speechTiming", "speechTimingFits" ], "properties": { "schema": { "const": "madoo.dubbing-manifest/v2" }, "sourceLanguage": { "type": "string", "minLength": 2, "maxLength": 35 }, "targetLanguage": { "type": "string", "minLength": 2, "maxLength": 35 }, "master": { "$ref": "#/$defs/asset" }, "sourceCaptions": { "$ref": "#/$defs/captions" }, "targetCaptions": { "$ref": "#/$defs/captions" }, "textToSpeechModel": { "$ref": "#/$defs/model" }, "stemSeparationModel": { "oneOf": [ { "$ref": "#/$defs/model" }, { "type": "null" } ] }, "backgroundMode": { "type": "string", "enum": [ "separated", "provided", "none" ] }, "speakerVoices": { "type": "array", "minItems": 1, "maxItems": 32, "items": { "$ref": "#/$defs/speakerVoice" } }, "timelineAudio": { "$ref": "#/$defs/asset" }, "finalAudio": { "$ref": "#/$defs/asset" }, "finalVideo": { "oneOf": [ { "$ref": "#/$defs/asset" }, { "type": "null" } ] }, "cues": { "type": "array", "maxItems": 10000, "items": { "$ref": "#/$defs/cue" } }, "quality": { "$ref": "#/$defs/quality" }, "provenance": { "$ref": "#/$defs/provenance" }, "warnings": { "$ref": "#/$defs/warnings" }, "speechTiming": { "$ref": "#/$defs/timing_state" }, "speechTimingFits": { "type": "array", "minItems": 1, "maxItems": 10000, "items": { "type": "object", "additionalProperties": false, "required": [ "cueId", "fittedAudioStorageRef", "report" ], "properties": { "cueId": { "type": "string", "minLength": 1 }, "fittedAudioStorageRef": { "type": "string", "pattern": "^storage://[^?#]+$" }, "report": { "title": "Madoo Audio Processing Report v1", "description": "Versioned, explainable before/after envelope for an Audio Finishing transformation.", "type": "object", "required": [ "schema", "operation", "profile", "effectiveParameters", "inputSha256", "before", "after", "actions", "operationMetrics", "technique", "warnings" ], "properties": { "schema": { "const": "madoo.audio-processing-report/v1" }, "operation": { "type": "string", "enum": [ "loudness_normalize", "fit_duration", "duck", "speech_enhance" ] }, "profile": { "type": "string", "minLength": 1, "maxLength": 64 }, "effectiveParameters": { "type": "object", "maxProperties": 64 }, "inputSha256": { "type": [ "string", "null" ], "pattern": "^[a-f0-9]{64}$" }, "before": { "$ref": "#/$defs/fit_qualityReportOrNull" }, "after": { "$ref": "#/$defs/fit_qualityReportOrNull" }, "actions": { "type": "array", "maxItems": 64, "items": { "type": "string", "minLength": 1, "maxLength": 256 } }, "operationMetrics": { "type": "object", "maxProperties": 64 }, "technique": { "type": "object", "required": [ "name", "version", "engine", "engineVersion" ], "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 128 }, "version": { "type": "string", "minLength": 1, "maxLength": 64 }, "engine": { "type": "string", "minLength": 1, "maxLength": 64 }, "engineVersion": { "type": "string", "minLength": 1, "maxLength": 128 } }, "additionalProperties": false }, "warnings": { "type": "array", "maxItems": 128, "items": { "type": "object", "required": [ "code", "message" ], "properties": { "code": { "type": "string", "minLength": 1, "maxLength": 128 }, "message": { "type": "string", "minLength": 1, "maxLength": 1000 }, "path": { "type": [ "string", "null" ], "maxLength": 500 } }, "additionalProperties": false } } }, "additionalProperties": false } } } } }, "$defs": { "asset": { "type": "object", "required": [ "kind", "storageRef", "mediaType", "durationMilliseconds", "sha256" ], "properties": { "kind": { "type": "string", "enum": [ "video", "audio", "json" ] }, "storageRef": { "type": "string", "minLength": 1, "maxLength": 2048 }, "mediaType": { "type": "string", "minLength": 1, "maxLength": 256 }, "durationMilliseconds": { "type": [ "integer", "null" ], "minimum": 0, "maximum": 21600000 }, "sha256": { "type": [ "string", "null" ], "pattern": "^[a-f0-9]{64}$" } }, "additionalProperties": false }, "captions": { "type": "object", "required": [ "schema", "trackId", "language" ], "properties": { "schema": { "const": "madoo.caption-track/v1" }, "trackId": { "type": "string", "minLength": 1, "maxLength": 256 }, "language": { "type": [ "string", "null" ], "minLength": 2, "maxLength": 35 } }, "additionalProperties": false }, "model": { "type": "object", "required": [ "provider", "modelId", "version", "profileVersion" ], "properties": { "provider": { "type": "string", "minLength": 1, "maxLength": 128 }, "modelId": { "type": "string", "minLength": 1, "maxLength": 256 }, "version": { "type": [ "string", "null" ], "maxLength": 128 }, "profileVersion": { "type": "string", "minLength": 1, "maxLength": 64 } }, "additionalProperties": false }, "speakerVoice": { "type": "object", "required": [ "speaker", "voice", "source" ], "properties": { "speaker": { "type": [ "string", "null" ], "maxLength": 256 }, "voice": { "type": "string", "minLength": 1, "maxLength": 512 }, "source": { "type": "string", "enum": [ "preset", "reference", "workflow" ] } }, "additionalProperties": false }, "cue": { "type": "object", "required": [ "cueId", "iterationIndex", "sourceText", "targetText", "startMilliseconds", "endMilliseconds", "speaker", "voice", "modelId", "generatedDurationMilliseconds", "fittedDurationMilliseconds", "fitAction", "status", "warnings" ], "properties": { "cueId": { "type": "string", "minLength": 1, "maxLength": 128 }, "iterationIndex": { "type": "integer", "minimum": 0, "maximum": 9999 }, "sourceText": { "type": "string", "minLength": 1, "maxLength": 4000 }, "targetText": { "type": "string", "minLength": 1, "maxLength": 4000 }, "startMilliseconds": { "type": "integer", "minimum": 0, "maximum": 21600000 }, "endMilliseconds": { "type": "integer", "minimum": 1, "maximum": 21600000 }, "speaker": { "type": [ "string", "null" ], "maxLength": 256 }, "voice": { "type": "string", "minLength": 1, "maxLength": 512 }, "modelId": { "type": "string", "minLength": 1, "maxLength": 256 }, "generatedDurationMilliseconds": { "type": "integer", "minimum": 1, "maximum": 21600000 }, "fittedDurationMilliseconds": { "type": "integer", "minimum": 1, "maximum": 21600000 }, "fitAction": { "type": "string", "minLength": 1, "maxLength": 128 }, "status": { "type": "string", "enum": [ "completed", "warning", "failed", "skipped" ] }, "warnings": { "$ref": "#/$defs/warnings" } }, "additionalProperties": false }, "quality": { "type": "object", "required": [ "passed", "checkIds", "failedCheckIds" ], "properties": { "passed": { "type": "boolean" }, "checkIds": { "type": "array", "maxItems": 64, "uniqueItems": true, "items": { "type": "string", "minLength": 1, "maxLength": 128 } }, "failedCheckIds": { "type": "array", "maxItems": 64, "uniqueItems": true, "items": { "type": "string", "minLength": 1, "maxLength": 128 } } }, "additionalProperties": false }, "provenance": { "type": "object", "required": [ "builder", "version", "timelineTechnique", "qualityTechnique" ], "properties": { "builder": { "const": "madoo.dubbing-manifest" }, "version": { "type": "string", "minLength": 1, "maxLength": 64 }, "timelineTechnique": { "type": "object", "required": [ "name", "version", "engine", "engineVersion" ], "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 128 }, "version": { "type": "string", "minLength": 1, "maxLength": 64 }, "engine": { "type": "string", "minLength": 1, "maxLength": 64 }, "engineVersion": { "type": "string", "minLength": 1, "maxLength": 128 } }, "additionalProperties": false }, "qualityTechnique": { "type": "object", "required": [ "name", "version" ], "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 128 }, "version": { "type": "string", "minLength": 1, "maxLength": 64 } }, "additionalProperties": false } }, "additionalProperties": false }, "warning": { "type": "object", "required": [ "code", "message", "path" ], "properties": { "code": { "type": "string", "minLength": 1, "maxLength": 128 }, "message": { "type": "string", "minLength": 1, "maxLength": 1000 }, "path": { "type": [ "string", "null" ], "maxLength": 500 } }, "additionalProperties": false }, "warnings": { "type": "array", "maxItems": 256, "items": { "$ref": "#/$defs/warning" } }, "timing_warning": { "type": "object", "additionalProperties": false, "required": [ "code", "message" ], "properties": { "code": { "type": "string", "minLength": 1, "maxLength": 128 }, "message": { "type": "string", "minLength": 1, "maxLength": 20000 } } }, "timing_captionCue": { "type": "object", "additionalProperties": false, "required": [ "id", "start", "end", "text", "speaker", "speaker_scope", "kind", "source_segment_ids" ], "properties": { "id": { "type": "string", "minLength": 1, "maxLength": 128 }, "start": { "type": "number", "minimum": 0, "maximum": 21600 }, "end": { "type": "number", "minimum": 0, "maximum": 21600 }, "text": { "type": "string", "minLength": 1, "maxLength": 20000 }, "speaker": { "type": [ "string", "null" ], "maxLength": 512 }, "speaker_scope": { "type": [ "string", "null" ], "maxLength": 512 }, "kind": { "const": "speech" }, "source_segment_ids": { "type": "array", "items": { "type": "string", "minLength": 1, "maxLength": 256 }, "maxItems": 10000, "minItems": 0 } } }, "timing_captionTrack": { "type": "object", "additionalProperties": false, "required": [ "schema", "track_id", "language", "source_language", "granularity", "cues", "generation", "warnings" ], "properties": { "schema": { "const": "madoo.caption-track/v1" }, "track_id": { "type": "string", "minLength": 1, "maxLength": 512 }, "language": { "type": "string", "minLength": 1, "maxLength": 64 }, "source_language": { "type": [ "string", "null" ], "maxLength": 64 }, "granularity": { "type": "string", "minLength": 1, "maxLength": 64 }, "cues": { "type": "array", "items": { "$ref": "#/$defs/timing_captionCue" }, "maxItems": 10000, "minItems": 1 }, "generation": { "type": "object", "additionalProperties": false, "required": [ "normalizer", "version", "segment_count", "overlap_reconciled" ], "properties": { "normalizer": { "type": "string", "minLength": 1, "maxLength": 256 }, "version": { "type": "string", "minLength": 1, "maxLength": 128 }, "segment_count": { "type": "integer", "minimum": 0, "maximum": 10000 }, "overlap_reconciled": { "type": "boolean" } } }, "warnings": { "type": "array", "items": { "$ref": "#/$defs/timing_warning" }, "maxItems": 10000, "minItems": 0 } } }, "timing_policy": { "type": "object", "additionalProperties": false, "required": [ "maximumRounds", "minimumSpeakingRate", "maximumSpeakingRate", "maximumFitRate", "maximumCombinedRate", "toleranceMilliseconds" ], "properties": { "maximumRounds": { "type": "integer", "minimum": 1, "maximum": 3 }, "minimumSpeakingRate": { "type": "number", "minimum": 0.95, "maximum": 1 }, "maximumSpeakingRate": { "type": "number", "minimum": 1, "maximum": 1.05 }, "maximumFitRate": { "type": "number", "minimum": 1, "maximum": 2 }, "maximumCombinedRate": { "type": "number", "minimum": 1, "maximum": 2 }, "toleranceMilliseconds": { "type": "integer", "minimum": 1, "maximum": 250 } } }, "timing_cue": { "type": "object", "additionalProperties": false, "required": [ "cueId", "originalIndex", "sourceText", "initialTranslation", "speaker", "startMilliseconds", "endMilliseconds", "contextBefore", "contextAfter" ], "properties": { "cueId": { "type": "string", "minLength": 1, "maxLength": 128 }, "originalIndex": { "type": "integer", "minimum": 0, "maximum": 9999 }, "sourceText": { "type": "string", "minLength": 1, "maxLength": 20000 }, "initialTranslation": { "type": "string", "minLength": 1, "maxLength": 20000 }, "speaker": { "type": [ "string", "null" ], "maxLength": 512 }, "startMilliseconds": { "type": "integer", "minimum": 0, "maximum": 21600000 }, "endMilliseconds": { "type": "integer", "minimum": 50, "maximum": 21600000 }, "contextBefore": { "type": [ "string", "null" ], "maxLength": 20000 }, "contextAfter": { "type": [ "string", "null" ], "maxLength": 20000 } } }, "timing_plan": { "type": "object", "additionalProperties": false, "required": [ "schema", "planId", "organizationID", "workspaceID", "durationMilliseconds", "sourceCaptions", "targetCaptions", "policy", "cues" ], "properties": { "schema": { "const": "madoo.speech-timing-plan/v1" }, "planId": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "organizationID": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 }, "workspaceID": { "type": "integer", "minimum": 1, "maximum": 9007199254740991 }, "durationMilliseconds": { "type": "integer", "minimum": 50, "maximum": 21600000 }, "sourceCaptions": { "$ref": "#/$defs/timing_captionTrack" }, "targetCaptions": { "$ref": "#/$defs/timing_captionTrack" }, "policy": { "$ref": "#/$defs/timing_policy" }, "cues": { "type": "array", "items": { "$ref": "#/$defs/timing_cue" }, "maxItems": 10000, "minItems": 1 }, "elasticity": { "$ref": "#/$defs/timing_elasticity" }, "availableWindows": { "$ref": "#/$defs/timing_availableWindows" } } }, "timing_candidate": { "type": "object", "additionalProperties": false, "required": [ "planId", "cueId", "round", "text", "audioStorageRef", "audioSha256", "durationMilliseconds", "speakingRate", "modelId", "profileVersion", "voice", "expectedMilliCredits", "hasAudibleSignal" ], "properties": { "planId": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "cueId": { "type": "string", "minLength": 1, "maxLength": 128 }, "round": { "type": "integer", "minimum": 1, "maximum": 3 }, "text": { "type": "string", "minLength": 1, "maxLength": 20000 }, "audioStorageRef": { "type": "string", "pattern": "^storage://[^?#\\s]+$", "maxLength": 4096 }, "audioSha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "durationMilliseconds": { "type": "integer", "minimum": 1, "maximum": 21600000 }, "speakingRate": { "type": "number", "exclusiveMinimum": 0, "maximum": 10 }, "modelId": { "type": "string", "minLength": 1, "maxLength": 256 }, "profileVersion": { "type": "string", "minLength": 1, "maxLength": 256 }, "voice": { "type": "string", "minLength": 1, "maxLength": 512 }, "hasAudibleSignal": { "type": "boolean" }, "headSilenceMilliseconds": { "type": "integer", "minimum": 0, "maximum": 21600000 }, "tailSilenceMilliseconds": { "type": "integer", "minimum": 0, "maximum": 21600000 }, "trimStartMilliseconds": { "type": "integer", "minimum": 0, "maximum": 1000 }, "trimEndMilliseconds": { "type": "integer", "minimum": 0, "maximum": 1000 }, "expectedMilliCredits": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 } } }, "timing_assessment": { "type": "object", "additionalProperties": false, "required": [ "schema", "candidate", "accepted", "requiredFitRate", "paddingMilliseconds", "reason" ], "properties": { "schema": { "const": "madoo.speech-timing-assessment/v1" }, "candidate": { "$ref": "#/$defs/timing_candidate" }, "accepted": { "type": "boolean" }, "requiredFitRate": { "type": "number", "minimum": 1, "maximum": 432000 }, "paddingMilliseconds": { "type": "integer", "minimum": 0, "maximum": 21600000 }, "reason": { "enum": [ "SPEECH_TIMING_ACCEPTED", "SPEECH_TIMING_REQUIRES_ADAPTATION", "SPEECH_TIMING_NO_AUDIBLE_SIGNAL", "SPEECH_TIMING_REFLOWED", "SPEECH_TIMING_DEGRADED_REFLOW" ] }, "targetDurationMilliseconds": { "type": "integer", "minimum": 0, "maximum": 21600000 } } }, "timing_state": { "type": "object", "additionalProperties": false, "required": [ "schema", "plan", "completedRounds", "history" ], "properties": { "schema": { "const": "madoo.speech-timing-state/v1" }, "plan": { "$ref": "#/$defs/timing_plan" }, "completedRounds": { "type": "integer", "minimum": 0, "maximum": 3 }, "history": { "type": "array", "items": { "$ref": "#/$defs/timing_assessment" }, "maxItems": 30000, "minItems": 0 }, "deliveryPolicy": { "description": "Stamped by the finalizing reconcile: the policy its delivery was selected with. Absent before finalization.", "enum": [ "strict", "best_effort" ] } } }, "timing_silenceInterval": { "type": "object", "additionalProperties": false, "required": [ "startMilliseconds", "endMilliseconds" ], "properties": { "startMilliseconds": { "type": "integer", "minimum": 0, "maximum": 21600000 }, "endMilliseconds": { "type": "integer", "minimum": 1, "maximum": 21600000 } } }, "timing_deliveryWindow": { "type": "object", "additionalProperties": false, "required": [ "cueId", "startMilliseconds", "endMilliseconds" ], "properties": { "cueId": { "type": "string", "minLength": 1, "maxLength": 128 }, "startMilliseconds": { "type": "integer", "minimum": 0, "maximum": 21600000 }, "endMilliseconds": { "type": "integer", "minimum": 1, "maximum": 21600000 } } }, "timing_availableWindows": { "type": "object", "additionalProperties": false, "required": [ "maximumEndExtensionMilliseconds", "safetyGapMilliseconds", "windows" ], "properties": { "maximumEndExtensionMilliseconds": { "type": "integer", "minimum": 1, "maximum": 2000 }, "safetyGapMilliseconds": { "type": "integer", "minimum": 20, "maximum": 500 }, "windows": { "type": "array", "maxItems": 10000, "items": { "$ref": "#/$defs/timing_deliveryWindow" } } } }, "timing_elasticity": { "type": "object", "additionalProperties": false, "required": [ "maximumEndExtensionMilliseconds", "evidence", "windows" ], "properties": { "maximumEndExtensionMilliseconds": { "type": "integer", "minimum": 1, "maximum": 250 }, "evidence": { "type": "object", "additionalProperties": false, "required": [ "referenceAudioStorageRef", "referenceAudioSha256", "durationMilliseconds", "silence" ], "properties": { "referenceAudioStorageRef": { "type": "string", "pattern": "^storage://[^?#\\s]+$", "maxLength": 4096 }, "referenceAudioSha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "durationMilliseconds": { "type": "integer", "minimum": 50, "maximum": 21600000 }, "silence": { "type": "array", "maxItems": 1026, "items": { "$ref": "#/$defs/timing_silenceInterval" } } } }, "windows": { "type": "array", "maxItems": 10000, "items": { "$ref": "#/$defs/timing_deliveryWindow" } } } }, "fit_qualityReportOrNull": { "anyOf": [ { "type": "object", "required": [ "schema" ], "properties": { "schema": { "const": "madoo.audio-quality-report/v1" } } }, { "type": "null" } ] } }, "additionalProperties": false}