Skip to content
malekverse
All work

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

  1. LectureLLMScene writer
  2. Scene writerdrop unsourced numbersNumber gate
  3. Number gatematch to sourceRe-anchoring
  4. Re-anchoringapprove per sceneHuman review
  5. 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.

malekverse

© 2026 Malek Maghraoui. Built with Next.js, three.js and GSAP.

Every color on this site is a star temperature, from 3,200 K to 30,000 K. There are no green stars.