{ "pack_id": "audio-and-narration-qa", "title": "Audio and narration QA", "version": "0.1.0", "summary": "A collection of nouns and verbs for deterministic audio, mix and narration quality checks: ITU-R BS.1770-4 gated loudness and 4x oversampled true peak, sidechain pause-pumping detection, edit-point click impulse detection, speaking WPM pacing, WebVTT caption-pause alignment, and ASR Character Error Rate gating.", "dependencies": [ "video-qa", "findings-to-fixes" ], "boundaries": [ "Every measurement binds to the exact SHA-256 of the audio or video file inspected.", "Automated loudness, click, ducking and CER checks catch technical defects; a human listener judges vocal warmth, prosody and musicality.", "Standard-library code executes locally without network calls or remote model APIs.", "Importing the pack writes nothing, enqueues nothing and installs no code." ], "nouns": [ { "slug": "pack", "category": "noun.skill_pack", "role": "pack", "title": "A collection of nouns and verbs for deterministic audio, mix and narration quality checks", "value": { "lets_workers": "Measure ITU-R BS.1770-4 integrated loudness, loudness range and 4x oversampled inter-sample true peak, detect sidechain pause-pumping in short speech gaps and generate hold-bridged duck envelopes, flag edit-point splice clicks via second-difference impulse concentration, check speaking WPM pacing and WebVTT caption-pause sync, and gate synthesized or recorded speech against its script with normalized Levenshtein CER.", "flow": [ { "verb": { "$verb": "audio-and-narration-qa.measure-loudness-and-peaks" }, "when": "Measure BS.1770-4 integrated LUFS, LRA, sample peak and 4x true peak." }, { "verb": { "$verb": "audio-and-narration-qa.audit-ducking-and-clicks" }, "when": "Check music stems and mixes for sidechain pause-pumping and edit-point splice clicks." }, { "verb": { "$verb": "audio-and-narration-qa.check-pacing-and-caption-sync" }, "when": "Verify speaking WPM, 10 s sliding pacing windows, and WebVTT caption onset/offset alignment." }, { "verb": { "$verb": "audio-and-narration-qa.gate-narration-asr-cer" }, "when": "Compare ASR transcript against the reference script using normalized CER." }, { "verb": { "$verb": "audio-and-narration-qa.compile-narration-qa-report" }, "when": "Bind all audio and narration metrics into a single QA report." } ], "guardrails": [ { "$pin": "guardrail.exact-audio-digest" }, { "$pin": "guardrail.hold-across-short-pauses" }, { "$pin": "guardrail.metrics-not-creative-approval" } ], "tool": { "$pin": "tool.audio-narration-qa" }, "worked_example": "Synthetic 10-second narrated cut recomputed by test_audio_qa.py: catches two short inter-phrase pauses where sidechain release pumps the music bed by more than 6 dB and a caption end bleeding 0.70 s into a pause, while ASR CER passes at 0.0." }, "relations": [ [ "requires_noun", "guardrail.exact-audio-digest" ], [ "requires_noun", "guardrail.hold-across-short-pauses" ], [ "requires_noun", "guardrail.metrics-not-creative-approval" ], [ "requires_noun", "spec.audio-narration-gates" ], [ "requires_noun", "rules.hold-ducking-envelope" ], [ "requires_noun", "tool.audio-narration-qa" ], [ "requires_noun", "template.narration-qa-report" ] ] }, { "slug": "guardrail.exact-audio-digest", "category": "noun.skill_pack", "role": "guardrail", "title": "Guardrail: bind every loudness, click and CER check to the exact media SHA-256", "category_reason": "Prevents stale stem or pre-master measurements from certifying a re-exported mix.", "value": { "rule": "Every audio QA measurement names the SHA-256 of the exact PCM or MP4 stream read. Re-encoding or re-limiting invalidates prior peak and LUFS rows.", "how_it_is_checked": "read_wav_pcm and template.narration-qa-report require a 64-hex media_sha256." } }, { "slug": "guardrail.hold-across-short-pauses", "category": "noun.skill_pack", "role": "guardrail", "title": "Guardrail: bridge pauses shorter than 1.2 s so music ducking never pumps between clauses", "category_reason": "Prevents distracting background swells inside comma and sentence pauses.", "value": { "rule": "Music under narration holds a steady duck depth across pauses shorter than 1.2 s instead of releasing on every word boundary via a fast sidechain compressor.", "how_it_is_checked": "detect_pause_pumping flags pauses of 0.3 to 1.0 s whose 100 ms music level rises 3.0 dB or more above the preceding 0.6 s baseline." } }, { "slug": "guardrail.metrics-not-creative-approval", "category": "noun.skill_pack", "role": "guardrail", "title": "Guardrail: passing loudness and CER gates does not replace human listening", "category_reason": "Keeps automated audio gates within honest technical boundaries.", "value": { "rule": "Passing BS.1770 loudness, click and ASR CER checks confirms technical hygiene only; a person still listens for vocal tone, emphasis and musical phrasing.", "how_it_is_checked": "Reports output technical verdicts and findings-to-fixes candidates without approving publication." } }, { "slug": "spec.audio-narration-gates", "category": "noun.benchmark_suite", "role": "spec", "title": "Specification: BS.1770 loudness, pause-pumping, click, WPM pacing, caption sync and ASR CER thresholds", "category_reason": "Defines deterministic pass, warn and fail thresholds across all six audio and narration QA checks.", "value": { "loudness": { "standard": "ITU-R BS.1770-4", "sample_rate_hz": 48000, "target_lufs": -16.0, "tolerance_lu": 1.0, "max_true_peak_dbtp": -1.0, "max_lra_lu": 8.0 }, "pause_pumping": { "pause_window_s": [ 0.3, 1.0 ], "rise_threshold_db": 3.0, "severe_rise_db": 6.0, "min_pumping_pauses": 2 }, "edit_point_clicks": { "second_diff_impulse_ratio_min": 12.0, "energy_concentration_1ms_over_5ms_min": 0.5, "min_peak_dbfs": -50.0, "edit_boundary_tolerance_s": 0.035 }, "pacing_and_captions": { "target_wpm": [ 140.0, 165.0 ], "flag_wpm": [ 110.0, 180.0 ], "sliding_window_s": 10.0, "max_caption_start_err_s": 0.25, "max_caption_end_err_s": 0.5, "min_voice_coverage": 0.95 }, "asr_cer": { "pass_max_cer": 0.02, "minor_max_cer": 0.05 } } }, { "slug": "rules.hold-ducking-envelope", "category": "noun.reflex_procedure", "role": "rules", "title": "Deterministic hold-bridged music ducking envelope generator", "category_reason": "Zero-call piecewise-linear gain curve procedure computed from phrase timestamps.", "value": { "hold_bridge_s": 1.2, "pre_pad_s": 0.15, "attack_ramp_s": 0.15, "post_pad_s": 0.15, "release_ramp_s": 0.4, "default_depth_db": 11.0, "model_calls": 0 } }, { "slug": "tool.audio-narration-qa", "category": "noun.code_node", "role": "tool_card", "title": "Tool card: standard-library audio and narration QA analyzer", "category_reason": "Tested Python standard-library package pinned by path, file count and digest.", "value": { "name": "audio and narration QA", "code": { "$code": "audio-and-narration-qa" }, "runtime": "Python 3.10 or later, standard library only.", "commands": [ "python -m audio_narration_qa loudness --wav FILE [--target-lufs -16.0]", "python -m audio_narration_qa dynamics --mix-wav FILE [--music-wav FILE] --phrases-json FILE", "python -m audio_narration_qa pacing --vtt FILE --phrases-json FILE --duration-s S", "python -m audio_narration_qa cer --reference SCRIPT.txt --hypothesis ASR.txt" ], "does": [ "Computes BS.1770-4 K-weighted gated LUFS, 3 s LRA, sample peak and 4x windowed-sinc true peak.", "Detects sidechain pause-pumping in 0.3 to 1.0 s pauses, builds 1.2 s hold-bridged duck envelopes, and detects edit-point clicks.", "Measures speaking and articulation WPM, 10 s pacing windows, WebVTT caption-pause sync and normalized Levenshtein ASR CER." ], "does_not": [ "Call remote APIs, run speech synthesis, modify source media or approve mixes without human listening." ], "code_license": "MIT" }, "relations": [ [ "verifies", "spec.audio-narration-gates" ] ] }, { "slug": "template.narration-qa-report", "category": "noun.scene_recipe", "role": "template", "title": "Template: digest-pinned audio and narration QA report", "value": { "describes": "a consolidated audio and narration QA report covering BS.1770 loudness, true peak, pause-pumping, edit clicks, speaking WPM, caption coverage and ASR CER", "schema": { "type": "object", "additionalProperties": false, "required": [ "media_sha256", "integrated_lufs", "true_peak_dbtp", "pumping_pauses", "max_pause_rise_db", "edit_clicks", "speaking_wpm", "voice_coverage", "asr_cer", "asr_verdict", "overall_verdict" ], "properties": { "media_sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, "integrated_lufs": { "type": "number", "minimum": -70, "maximum": 0 }, "true_peak_dbtp": { "type": "number", "minimum": -70, "maximum": 6 }, "pumping_pauses": { "type": "integer", "minimum": 0 }, "max_pause_rise_db": { "type": "number", "minimum": -30, "maximum": 40 }, "edit_clicks": { "type": "integer", "minimum": 0 }, "speaking_wpm": { "type": "number", "minimum": 0, "maximum": 500 }, "voice_coverage": { "type": "number", "minimum": 0, "maximum": 1 }, "asr_cer": { "type": "number", "minimum": 0, "maximum": 2 }, "asr_verdict": { "type": "string", "enum": [ "pass", "warn", "fail" ] }, "overall_verdict": { "type": "string", "enum": [ "pass", "warn", "fail" ] } } }, "example": { "media_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "integrated_lufs": -16.1, "true_peak_dbtp": -1.4, "pumping_pauses": 2, "max_pause_rise_db": 7.4, "edit_clicks": 0, "speaking_wpm": 140.3, "voice_coverage": 0.8858, "asr_cer": 0.0, "asr_verdict": "pass", "overall_verdict": "fail" } } }, { "slug": "example.narration-cut", "category": "noun.eval_run", "role": "example", "synthetic": true, "title": "Worked example input: synthetic 10-second narration phrases, WebVTT cues, music power trace and ASR transcript", "category_reason": "Synthetic fixture recomputed by test_audio_qa.py.", "value": { "duration_s": 10.0, "speech_phrases_s": [ [ 0.52, 2.6 ], [ 3.15, 5.85 ], [ 6.4, 9.5 ] ], "webvtt": "WEBVTT\n\nc1\n00:00:00.500 --> 00:00:03.300\nDeterministic audio checks inspect loudness and ducking.\n\nc2\n00:00:03.700 --> 00:00:06.400\nShort pauses hold the bed steady without pumping.\n\nc3\n00:00:06.900 --> 00:00:09.600\nTranscript comparison catches dropped narration words.\n", "music_kp_10ms": [ 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.00055, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.00048, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 ], "reference_script": "Deterministic audio checks inspect loudness and ducking. Short pauses hold the bed steady without pumping. Transcript comparison catches dropped narration words.", "asr_transcript": "deterministic audio checks inspect loudness and ducking short pauses hold the bed steady without pumping transcript comparison catches dropped narration words" }, "relations": [ [ "requires_noun", "spec.audio-narration-gates" ] ] }, { "slug": "example.qa-report", "category": "noun.eval_run", "role": "example", "synthetic": true, "title": "Worked example output: recomputed audio and narration QA report", "category_reason": "Conforming report instance verified against audio_narration_qa functions in CI.", "value": { "conforms_to": { "$pin": "template.narration-qa-report" }, "instance": { "media_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "integrated_lufs": -16.1, "true_peak_dbtp": -1.4, "pumping_pauses": 2, "max_pause_rise_db": 7.4, "edit_clicks": 0, "speaking_wpm": 140.3, "voice_coverage": 0.8858, "asr_cer": 0.0, "asr_verdict": "pass", "overall_verdict": "fail" } }, "relations": [ [ "derives_from", "example.narration-cut" ], [ "verifies", "template.narration-qa-report" ] ] } ], "verbs": [ { "slug": "measure-loudness-and-peaks", "kind": "verb.verify_gate", "title": "Measure BS.1770-4 loudness, LRA and 4x true peak", "claimant": "agent", "model_use": "none", "summary": "Filter 48 kHz PCM audio with the ITU-R BS.1770-4 K-weighting cascade, compute gated integrated LUFS, 3-second loudness range, sample peak and 4x oversampled true peak, and check them against delivery targets.", "outcome": "Loudness, LRA and true-peak measurements with any target or ceiling findings.", "ready_outcome": "loudness_measured", "pinned": [ "spec.audio-narration-gates", "tool.audio-narration-qa", "guardrail.exact-audio-digest" ], "slots": [ { "name": "audio_asset", "category": "noun.scene_recipe", "description": "Pin of the local WAV PCM asset and delivery target." } ], "network": [ "local_only", "Reads local WAV bytes only." ], "produces": [ { "name": "loudness_metrics", "template": "template.narration-qa-report" } ], "steps": [ "Run python -m audio_narration_qa loudness on the local PCM file.", "Record SHA-256, integrated LUFS, LRA, sample peak and 4x true peak alongside any threshold violations." ], "acceptance": [ { "id": "digest-bound", "check": "sha256 matches the exact PCM file read.", "method": "deterministic" }, { "id": "bs1770-gated", "check": "evaluate_loudness reproduces integrated_lufs and true_peak_dbtp.", "method": "deterministic" } ] }, { "slug": "audit-ducking-and-clicks", "kind": "verb.verify_gate", "title": "Detect sidechain pause-pumping and edit-point splice clicks", "claimant": "agent", "model_use": "none", "summary": "Measure 100 ms music loudness across 0.3 to 1.0 s pauses to catch sidechain release pumping, compute a 1.2 s hold-bridged duck envelope, and scan second-difference energy concentration for edit-point clicks.", "outcome": "Pause-pumping events, recommended duck envelope points and edit-point click timestamps.", "ready_outcome": "dynamics_audited", "pinned": [ "spec.audio-narration-gates", "rules.hold-ducking-envelope", "tool.audio-narration-qa", "guardrail.hold-across-short-pauses" ], "slots": [ { "name": "audio_stems", "category": "noun.scene_recipe", "description": "Pin of the local mix and music stems plus speech phrase spans." } ], "network": [ "local_only", "Reads local stems and phrase timestamps without network access." ], "produces": [ { "name": "dynamics_metrics", "template": "template.narration-qa-report" } ], "steps": [ "Run detect_pause_pumping on the music K-weighted power trace and phrase spans.", "Generate a hold-bridged duck envelope with build_hold_duck_envelope when pumping is found.", "Run detect_edit_point_clicks on the mono waveform outside voiced spans." ], "acceptance": [ { "id": "pumping-checked", "check": "Every pause in [0.3, 1.0) s is evaluated against the 3.0 dB rise limit.", "method": "deterministic" }, { "id": "clicks-checked", "check": "Second-difference impulses >= 12x local median RMS with >= 0.5 concentration are reported.", "method": "deterministic" } ] }, { "slug": "check-pacing-and-caption-sync", "kind": "verb.verify_gate", "title": "Check speaking WPM pacing and WebVTT caption-pause alignment", "claimant": "agent", "model_use": "none", "summary": "Parse WebVTT cues, compute overall speaking WPM, articulation WPM and 10-second sliding-window pacing, verify 95 percent voiced-frame caption coverage, and flag cue starts or ends drifting into pauses.", "outcome": "Speaking rate metrics, cue sync errors and voiced-frame coverage.", "ready_outcome": "pacing_and_captions_checked", "pinned": [ "spec.audio-narration-gates", "tool.audio-narration-qa" ], "slots": [ { "name": "captions_and_phrases", "category": "noun.scene_recipe", "description": "Pin of the WebVTT sidecar and measured speech phrase spans." } ], "network": [ "local_only", "Parses local WebVTT text and phrase JSON." ], "produces": [ { "name": "pacing_metrics", "template": "template.narration-qa-report" } ], "steps": [ "Parse cues with parse_webvtt and align them against speech_phrases with evaluate_wpm_and_caption_alignment.", "Flag cues outside [110, 180] WPM, start drift above 0.25 s, end bleed above 0.50 s, or voice coverage below 0.95." ], "acceptance": [ { "id": "wpm-and-sync-recomputed", "check": "evaluate_wpm_and_caption_alignment reproduces speaking_wpm, voice_coverage and findings.", "method": "deterministic" } ] }, { "slug": "gate-narration-asr-cer", "kind": "verb.verify_gate", "title": "Gate narration accuracy against the script via ASR Character Error Rate", "claimant": "agent", "model_use": "none", "summary": "Normalize reference script and ASR transcript text to alphanumeric tokens and compute exact Levenshtein Character Error Rate, passing at or below 2 percent and failing above 5 percent.", "outcome": "Normalized character counts, edit distance, CER and gate verdict.", "ready_outcome": "asr_cer_gated", "pinned": [ "spec.audio-narration-gates", "tool.audio-narration-qa" ], "slots": [ { "name": "script_and_transcript", "category": "noun.eval_run", "description": "Pin of the reference narration script and ASR transcript." } ], "produces": [ { "name": "cer_gate_result", "template": "template.narration-qa-report" } ], "steps": [ "Normalize punctuation and casing on both strings and compute exact character Levenshtein distance.", "Emit pass for CER <= 0.02, warn for CER <= 0.05, and fail for CER > 0.05." ], "acceptance": [ { "id": "cer-exact", "check": "evaluate_asr_cer_gate reproduces edit_distance, cer and verdict.", "method": "deterministic" } ] }, { "slug": "compile-narration-qa-report", "kind": "verb.verify_gate", "title": "Compile the consolidated audio and narration QA report", "claimant": "agent", "model_use": "none", "summary": "Combine BS.1770 loudness, pause-pumping, edit click, WPM pacing, caption coverage and ASR CER rows for one media digest into a conforming narration QA report.", "outcome": "A conforming narration QA report bound to media_sha256.", "ready_outcome": "narration_qa_report_compiled", "pinned": [ "template.narration-qa-report", "guardrail.exact-audio-digest", "guardrail.metrics-not-creative-approval" ], "slots": [ { "name": "loudness_metrics", "category": "noun.eval_run", "description": "Pin of loudness metrics." }, { "name": "dynamics_metrics", "category": "noun.eval_run", "description": "Pin of pause-pumping and click metrics." }, { "name": "pacing_metrics", "category": "noun.eval_run", "description": "Pin of WPM and caption alignment metrics." }, { "name": "cer_gate_result", "category": "noun.eval_run", "description": "Pin of ASR CER gate result." } ], "produces": [ { "name": "qa_report", "template": "template.narration-qa-report" } ], "steps": [ "Verify every input row names the same media_sha256.", "Set overall_verdict to fail when any major or blocker finding or CER fail occurs, warn when minor findings occur, and pass otherwise." ], "acceptance": [ { "id": "matches-report-schema", "check": "Output passes schema_errors against template.narration-qa-report.", "method": "deterministic" } ], "follows": [ "audio-and-narration-qa.measure-loudness-and-peaks", "audio-and-narration-qa.audit-ducking-and-clicks", "audio-and-narration-qa.check-pacing-and-caption-sync", "audio-and-narration-qa.gate-narration-asr-cer" ] } ] }