AI pipeline2026
Edah Studio
Turns a written lecture into a narrated Arabic and English video, without letting the model invent facts.
- Role
- Solo engineer, pilot for an education platform
- Year
- 2026
- Stack
- Python, FastAPI, React 19, three.js, edge-tts, Playwright, FFmpeg
- Links
- Private pilot
5
layers between the model and the screen
The problem
Teachers have written lectures, and students want video. Generating the video is the easy part. Making sure it doesn't add a date, a statistic or a whole scene that was never in the lecture is the hard part.
What I built
- A 3D lip-synced presenter, with 10 Arabic voices (2 of them Libyan) and 8 English voices.
- 19 types of animated visuals, synced to the narration, with bilingual subtitles.
- Frame-accurate MP4 export: every animation is a pure function of time, so the preview and the export match frame by frame.
- Per-scene human review: approve, comment or re-voice before export. Plus a question bank generated from the same source.
How it earns trust
Numbers must exist in the source
A quality gate deletes chart and statistic values that don't appear in the original lecture. Plausible isn't good enough.
Scenes are re-anchored by content
Each scene is matched back to its source paragraph by what it says. The model's own paragraph numbers are never trusted.
Self-correction, then a verbatim fallback
A scene that fails the checks is regenerated. If it still fails, the source text is used verbatim, and a coverage check flags any paragraph that was skipped.
Tested with the worst model available
A small local model (Llama 3.2 3B) invented whole scenes. Every one was removed or reverted, ending with zero flagged scenes.
By the numbers
- layers of faithfulness checks
- 5layers of faithfulness checks
- animated visual types
- 19animated visual types
- neural voices, AR and EN
- 18neural voices, AR and EN
- flagged scenes after the adversarial run
- 0flagged scenes after the adversarial run
How it fits together
- LectureLLMScene writer
- Scene writerdrop unsourced numbersNumber gate
- Number gatematch to sourceRe-anchoring
- Re-anchoringapprove per sceneHuman review
- Human reviewframe-accurateMP4 export
What I'd do next
Turn the adversarial run into a standing benchmark, so every prompt or model change is scored before it ships.