# Soundstage

A studio for Indian D2C brands and agencies: speak a brief as a voice note in Hindi, Hinglish or English, and get an on-brand 9:16 reel, written, voiced, rendered and scored by an AI reviewer before you see it

**Status:** in-progress · **Timeline:** November 2026 · **Role:** Creator · **Team:** Solo

**Technologies:** Next.js 16, React 19, TypeScript, Supabase, PostgreSQL, Claude, Gemini, Gnani Prisma and Timbre, HyperFrames, Python, ffmpeg, Tailwind CSS

[Live](https://soundstage-site.vercel.app)

---

# Soundstage: your film crew, in a voice note

## Overview

Soundstage turns a spoken brief into a finished brand reel. A marketer records a voice note the way they would on WhatsApp, in Hindi, Hinglish or English, rambling included. Soundstage writes a script from the brand's own catalogue, voices it, renders a 9:16 reel for Instagram Reels and YouTube Shorts, and has a separate AI reviewer score it before anyone sees it.

I built it solo for Gnani AI's Great Indian AI Internship Challenge. Gnani's models do the speech: Prisma v3.0 hears the brief, and Timbre v2.5 voices every line.

The video above is one real run, filmed unedited and sped up only while the AI works. The brands in it, Brewhouse and PulseFit, are demo brands, and the voice notes use synthetic voices.

<video controls playsInline preload="metadata" poster="/project/soundstage.webp" src="/project/soundstage-film.mp4" style={{ width: '100%', borderRadius: '0.5rem' }}></video>

*The 52-second launch film.*

## Why I built this

A brand ad usually takes an agency about three weeks: a brief, a script, casting, a shoot and an edit. Small D2C brands make many reels a month and cannot afford that loop for each one. What they do have is a founder or a marketer who can describe the reel in thirty seconds.

The hard part is not generating a video. It is making one a brand can post: the right product, the right price, nothing invented, and a cut that holds attention. So Soundstage is built around a reviewer that is strict by default.

## What it does

| Step     | What happens                                                                                                                                                                   |
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Brief    | Speak or type the brief. Gnani Prisma transcribes it code-mixed: English stays Latin, Hindi stays Devanagari.                                                                  |
| Script   | A Director agent writes a short script from the brand's catalogue and photos. It may only claim what the catalogue says.                                                       |
| Approve  | In story mode you approve a still for every shot, or change the plan in plain words. One typed note, "cafe mein karo" ("do it in a café"), moved the whole plan in 12 seconds. |
| Render   | The reel is built as HTML and animation timelines, then rendered frame by frame to MP4, with word-timed captions and Gnani Timbre voices.                                      |
| Review   | A separate reviewer watches the render: 10 weighted criteria and 9 hard gates (no invented claims, no blank frames, no overlapping text, the right language), 85/100 to pass.  |
| Fix      | Below 85, the reviewer writes fixes with timestamps, and the Director renders again.                                                                                           |
| Look     | Pick a look from the style library: Kinetic, Diary, Risograph, Chalkboard, Keynote or Swiss. The same story changes paper, type, photo treatment, labels and cuts.            |

## Results

- A 14-second Hinglish voice note became a reel scored **91.8/100** in **3 minutes 36 seconds** of real run time.
- A rambling 35-second Hindi note scored **67.5** on its first round, was sent back with timestamped fixes, and scored **93.8** on the second.
- A gym-brand reel went from **83.8** to **96** after the reviewer's fixes.
- Across 59 measured runs, the median run took **6.1 minutes**, and the Director's model cost was a median of **$0.46** per reel.

## How it works

```mermaid
flowchart LR
    Voice["Voice note"] --> STT["Gnani Prisma: transcript"]
    STT --> Director["Director agent: script and plan"]
    Catalogue["Brand catalogue and photos"] --> Director
    Director --> TTS["Gnani Timbre: voices"]
    TTS --> Render["Render HTML frames to MP4"]
    Render --> Review{"Reviewer: 85 to pass?"}
    Review -->|"below 85: timed fixes"| Director
    Review -->|"pass"| Ready["Ready to post"]
```

The Studio runs on Vercel. Supabase holds the data and the files: agencies, brands, assets, reels, run steps and a job queue, with row-level security so each agency sees only its own work. The engine runs as a worker on a small VPS. It takes jobs from the queue, rebuilds the brand from Supabase, runs the Director, and uploads the finished reel and every step of the run, which the Studio shows live.

## Engineering decisions

### The judge is not the author

The Director and the reviewer are different models with different instructions. The reviewer starts from what the reel actually does, must name a time and a flaw for every point it takes away, and fails the reel outright on a hard gate, whatever the score. Its fixes go back to the Director as data, not as a suggestion.

### Claims come from the catalogue, checked in code

Prices, offers and specs may only come from the brief, the brand's catalogue or its profile. The tools that write the script and build the reel refuse a number they cannot trace, so an invented price never reaches the render.

### Video as code

Each reel is a web page with animation timelines keyed to the spoken words, rendered frame by frame to MP4. That makes every frame repeatable, testable and cheap to change, and it lets a look from the style library restyle every scene through one CSS layer.

### Most of a run is waiting

A run spends about 84% of its time waiting on models: the Director, the reviewer and the voices. Only the build and the render use the CPU. So one 4-core worker runs several reels at once, and a lock lets only one of them render at a time.

### Postgres is the queue

Jobs are rows. A worker claims one with `FOR UPDATE SKIP LOCKED`, renews a lease every 15 seconds, and a worker that dies loses its lease, so the job goes back to the queue. Leases belong to one attempt, so a worker that lost its job can never finish someone else's.

### Agencies stay apart

Every table and file path is guarded by row-level security. Users write through database functions that check membership, limits and inputs. The worker holds the only service key, and it refuses any file path outside the brand it is working on.

## Testing

The engine has 551 automated tests, including the reviewer's rubric, the reel builder's refusal rules, the worker's path checks and the CPU lock. The database has SQL checks for the queue, access between agencies and file keys, each run in a transaction that is rolled back.

## Access

The [landing page](https://soundstage-site.vercel.app) is public, and the Studio is invite-only while it is in testing. The source code is private.