Skip to content
vp.Ven Petrov
WorkWritingAboutAt a glance
← Projects & notes
Between UsProject story · 4 min read

Between Us: why I kept the first take and widened the shot

I compared dialogue takes, asked for wider shots and more physical acting, then changed the workflow when its studio limited the scenes I wanted to make.

Ven PetrovLocal film workflow

Between Us is my local workflow for making short dialogue films, from a story idea through voices, shots and editing. I wanted a repeatable process, but I also wanted to keep control of the performance: who the characters are, how they speak, what their bodies do and which take we keep.

I used ElevenLabs for dialogue, MiniMax H3 through Replicate for video and HyperFrames for assembly, working with AI coding agents on the pipeline. The film below is a wider edit with the original pilot cast. It keeps the approved dialogue and runs for 75.5 seconds.

Your browser cannot play this video. Open the saved film.
Read the dialogue generation script ↗
The wider edit with the original cast, 75.5 seconds. This is a saved working version; the full acting and mouth-timing review remains open. The linked script is the generation input, not a verified transcript.

Start with a conversation that has room to develop

The first script was short. I asked for a longer exchange so it could carry more emotion and information, with wording that fitted the situation being played.

For this pilot I selected Sarah and Roger as the voices. I also made clear that these were temporary choices: future episodes needed different casts and the option to enter a voice ID manually.

After hearing the first dialogue take, I liked the direction but asked whether we could increase the emotional charge. Before trying again, I asked to save that take in case the next one was worse.

When I heard the revision, I preferred the louder delivery because it brought out Clara's frustration. I asked for future arguments to follow a louder, faster direction so the verbal conflict felt more realistic. That was my listening judgement, not a score produced by a timing check.

The take I kept, and the one I preferred

Original dialogue

Saved before trying a more emotionally charged version.

Your browser cannot play this audio.Original generation script ↗

Revised dialogue

The louder delivery I preferred for Clara’s frustration.

Your browser cannot play this audio.Revised generation script ↗
The same fictional dialogue, with revised delivery direction. Each link opens the matching fictional dialogue script. These are model inputs, not independently checked transcripts.

Keeping both takes matters here. A new generation isn't automatically an improvement, and replacing the earlier file would remove the comparison that informed the choice.

The audio worked better than some of the pictures

Reviewing the video raised different questions. Clara's expressions and lip sync looked good to me. Adrian looked less expressive, his shot was blurrier and his mouth timing was weaker. I pointed to how close the camera was and how little of the surrounding scene it showed.

I asked for more movement: hands, posture and visible gestures that could carry the conflict. I also wanted to explore more realistic characters rather than being limited to the example cast.

Looking through the existing edit exposed a concrete framing problem. All six Adrian shots had been enlarged by about 1.56 times. The source already contained a gesture that the delivered crop hid. A wider edit could show it without buying a new performance.

Your browser cannot play this video. Open the comparison.
Left: the wider edit. Right: the original crop. The saved comparison shows more of the hand, bag and kitchen without purchasing another performance. Playback is a 20.875-second excerpt; the poster is a still from the review.

The comparison keeps the original cast and dialogue, so the framing change can be inspected separately. At the shown moment, the wider frame includes the hand, bag and more of the kitchen. It makes the difference visible; a still frame alone cannot tell us whether every spoken word matches the mouth.

A separate recast version was also saved. Its ending uses one extra second of existing footage, making that version 76.5 seconds. The version with the original timing remains available too. Those are different edits, rather than one file repeatedly replaced.

Why I asked for a studio, then stopped using it

I initially asked for a private browser interface because a collaborator couldn't install Codex or run HyperFrames on their machine. I wanted them to be able to brainstorm and contribute without breaking the project files.

Once the studio existed, it restricted the work in ways I hadn't wanted. The fixed interface assumed two characters, while I wanted to create different situations and casts. What I really wanted was faster production with ordered, editable instructions and control over the LLMs.

I chose to direct the work in Codex and asked to remove the studio because it added complexity. The workflow now uses stage instructions and saved checkpoints. I can inspect what a stage used and return to it without treating the entire production as one long chat.

Keep the choices safe while changing the work

The engineering supports those comparisons. The selected dialogue is a locked audio master; shot timing refers to that recording, and generated video audio is muted in the assembly. Reviews belong to the exact audio, source clip and edit they covered. Changing an input makes the affected review stale.

Paid generation has another awkward case: a provider can accept a request while the response gets lost before the local database saves its job ID. An audit found that recovery window. The revised code saves responses in a disk journal, recovers an existing job where possible and holds an unknown outcome for investigation rather than buying the shot again. Offline crash tests check that a lost response doesn't trigger a second purchase.

The films, takes, edit history and local workflow are saved. The production code has been tested and replayed from preserved media. The remaining creative work is a complete normal-speed review of acting and mouth timing. New live provider trials and running the workflow on another machine also need their own checks.

Project sources & checks
Creative direction

Original user feedback asks for longer, situation-specific dialogue, preservation of the earlier take, louder delivery, wider framing, gestures and flexible casts and voices.

Media on this page

Preserved original dialogue takes, the 75.5-second wider edit with the original pilot cast, a 20.875-second original/wider comparison and a frame comparison. These are existing production artifacts.

Other saved edition

The separate recast edition is 76.5 seconds, including 24 additional native ending frames. It uses different character designs from the wider original-pilot film shown here.

Workflow and recovery

Saved workflow instructions, immutable review bindings, a flushed provider-response journal and offline fault tests support revision and recovery. The hardened release records 100 tests and a replay using preserved media.

Current limits

Complete normal-speed acceptance of acting and mouth timing, new live provider trials and deployment to another machine remain pending.

On this page
Start with a conversation that has room to developThe audio worked better than some of the picturesWhy I asked for a studio, then stopped using itKeep the choices safe while changing the workSources & checks
ElevenLabsMiniMax H3HyperFramesRecoveryLLMs

Connected to this

All writing
Product-description comparison bench · Experiment

Comparing one model call with separate vision and writing steps

Warloop: Echoes of Solmara · Project story

Warloop: turning generated character art into a playable prototype

Ven PetrovSoftware engineer · Barcelona
GitHub ↗LinkedIn ↗Email ↗

Find a project or a note

17 results

Transfutur ERP · ExperienceERP for transport and logisticsAs the sole engineer, I built an ERP from zero for transport and logistics. It supported roughly €5–6 million in annual invoicing across two offices, and I kept it running for about a year.Financial review lab · Project storyExploring a financial report with Python and FastAPII started with one income change, then opened up the same 54-page report: products, regions, cash flow, core adjustments and a dataset whose figures lead back to the source.Crude-oil narrative tracker · Project storyCrude-oil research from global news and market dataI wanted help following global events that could matter for crude oil. The prototype combines news research with calculated market and position values, while keeping recent assessments separate from the longer numeric history.MNQ time-series research · ExperimentTime-series prediction experimentsAn exploration of high-resolution market data: choosing what to acquire, checking its limits, comparing time intervals and testing whether a prediction survived later data and the cost of acting on it.NQ/MNQ backtest engine · Technical noteA missing closing bar left the simulator’s short position openThe strategy reset for a new day while a shared counter still counted yesterday’s short. A small replay shows why closing the position has to happen before clearing its state.Small-cap edge research · Project storyTurning small-cap trading ideas into repeatable researchI asked Claude Code for a fresh research system that could test named price patterns, compare later periods and carry its methodology into new sessions. One candidate shows how features, entry timing and costs fit together.Gadgeon Europe applications · ExperienceConnected-device dashboards and mobile apps at Gadgeon EuropeI worked on Ionic and Angular applications that brought several APIs into dashboards for energy monitoring and connected-device control, with releases and maintenance across multiple client versions.ctxforge · Project storyctxforge: discovering what to build before codingA context discovery framework that asks an LLM to act like a senior engineering interviewer: understand the idea, uncover requirements and agree the scope before an agent starts building.Sociedades Inactivas enquiries · Technical noteSaving an enquiry before trying to send its emailOn the Sociedades Inactivas catalogue, a visitor can ask about a company or send a general enquiry. The form separates saving that request from delivering its notification, including when the visitor retries.Astro local-services website · Project storyA local-services site assembled from city, service and FAQ recordsThe Astro site describes flooring and other local services across different cities. Shared templates check availability, read the matching content and select one FAQ set for both visitors and structured data.3D Spaces website migration · Project storyMoving 3D Spaces to Next.js while its email stayed on the old serverI rebuilt the virtual-tour website with AI coding collaborators, preserving its content and URLs. The cutover also had to protect the mailbox, enquiry flow and existing analytics history.Capture CRM · Project storyConnecting classified listings to contacts in a small CRMA Chrome extension and Next.js dashboard bring classified listings, platform profiles and contact history together. Saving a listing again can add the person who was missing from an earlier import.Product-description comparison bench · ExperimentComparing one model call with separate vision and writing stepsA small product-description tool lets me inspect the visual analysis before the copy is written, change the model used for each step and compare request measurements.Between Us · Project storyBetween Us: why I kept the first take and widened the shotI compared dialogue takes, asked for wider shots and more physical acting, then changed the workflow when its studio limited the scenes I wanted to make.Restaurant-service voice agent · ExperimentDesigning a restaurant-service call around the real offerI worked through a Spanish outbound agent prompt, corrected a free visit to the actual paid service and compared how two drafts handled transfers and bookings.Vapi and Telnyx voice integration · Technical noteThe Vapi agent could speak, but it could not hear me clearlyMy Telnyx number connected to the assistant, but the caller audio was distorted. Three codec tests recovered the connection without fixing that original problem.Warloop: Echoes of Solmara · Project storyWarloop: turning generated character art into a playable prototypeGood-looking character images became tiny figures, a backwards walk and misplaced bosses in the game. I worked through the gap between generated art and playable behavior.
esc to close · Tab to move through results