Validating video clips
There are two validation paths for recorded clips, and which one you get depends on one project flag.
Default: the review streamβ
Out of the box a sign-collection project validates like any other: a reviewer opens the review stream, plays the clip, and accepts, rejects, or fixes. Rejections can be disputed by the signer. Nothing automated runs, and the Listen tab does not appear.
With the QC pipeline on: clip QC + Listenβ
The speech track's machinery is media-agnostic where it can be. If the
project's QC pipeline (audio_qc_enabled) is on, a submitted clip rides
the same dispatcher as a recorded audio clip.
Machine checks that existβ
Waveform DSP does not apply to a muxed video container, so the dispatcher runs lightweight, dependency-free container checks instead:
| Check | Passes when | On failure |
|---|---|---|
video_present | The file exists in storage and is non-empty | Soft fail β flagged |
video_mimetype | The stored file's type is video/* | Warning |
video_duration | Container duration could be read (MP4/MOV only; WebM returns nothing) | Informational β the value is stored on the annotation as duration_seconds |
Results are written exactly like audio QC results β a QC prediction plus a
summary on the task (meta.qc with flags), and a review-queue item
when a flag is raised and the project's action-on-fail is route-to-review
or require-rerecord (Audio QC).
What does not exist yet: resolution / frame-rate thresholds, black-frame or freeze detection, face or hands-in-frame checks, and a minimum duration. The code leaves an explicit hook for frame-decoder-based checks; a missing decoder must skip, never reject.
Listen with a video playerβ
When the QC flag is on, the Listen loop
serves recorded video clips alongside audio: an annotation is eligible as
soon as it carries a <VideoRecord> URL. The page swaps the audio player
for a video player and keeps everything else β Space to replay, the speed
toggle, Y / N / S / R shortcuts, structured reports, never-your-own and
never-twice rotation, hard-flagged clips skipped, N-vote resolution,
escalation of rejections and reports to the review queue, and ledger
credit to the signer at validation (and to every voter).
Two things to know:
- The criteria sheet is the project's audio profile β worded for speech (every word audible, matches the prompt, one main speakerβ¦). There is no sign-specific profile; brief validators on what "Yes" means for signing (prompt signed fully, signer framed, hands visible) through the project's labeling instructions.
- Who may vote, and the vote thresholds, come from the same Corpus purpose & validation settings as speech (reviewers / crowd / hybrid). The Listen tab is shown when the mode is crowd or hybrid, and to managers whenever the QC flag is on.
The speaker-profile and one-prompt rules follow the flagβ
With the QC flag on, a video project also gets the speech project's gates: the speaker-profile step is required before a submission or draft is accepted (server-enforced, every field optional), and a signer cannot record the same prompt twice. Switch the flag on only if you want those.
Switching it on for a video-only projectβ
audio_qc_enabled auto-enables whenever the labeling config contains a
recording control β <AudioRecord> or <VideoRecord> β and the
Audio QC settings tab appears for both. A video-only project therefore
gets the same controls as a speech project: pipeline on/off, validation
mode (reviewers, crowd, hybrid), vote thresholds and action-on-fail
(customising the config).
Once the validation mode is crowd or hybrid, new submissions are
QC-checked and the Listen tab appears.
The project API sets the same fields if you prefer scripting it:
curl -X PATCH "{{platformURL}}/api/projects/<id>" \
-H "Authorization: Bearer YOUR_PAT" \
-H "Content-Type: application/json" \
-d '{"audio_qc_enabled": true,
"audio_qc_config": {"validation": {"mode": "crowd"}}}'
Consent is checked either wayβ
Per-project consent is enforced at submit for every project type, before any QC or validation runs (Consent).