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.
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.
Original generation script ↗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.
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
Original user feedback asks for longer, situation-specific dialogue, preservation of the earlier take, louder delivery, wider framing, gestures and flexible casts and voices.
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.
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.
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.
Complete normal-speed acceptance of acting and mouth timing, new live provider trials and deployment to another machine remain pending.