How to add a voiceover to a Claude Code video
To add a voiceover to a Claude Code video, have the agent write the script first. Make the narration with a free local voice or with ElevenLabs and read how long the audio is. Then Claude times every scene to that length, adds the audio to the film and renders again.
Do it in that order. If you render the pictures first and record the voice afterwards, the words never line up with the right scene. Below are the six steps my kits use, with the commands from their render notes. If you want to know how long a script will run before you voice it, paste it into the free words to minutes calculator.
Step 1: write the script in short lines
Ask Claude for the narration as a plain text file with one short sentence per line. Short lines give the voice natural pauses, and it's easy to match one line to one scene.
Write script.txt for a 30-second film: one sentence per line, at most 12 words per line, spoken language, no stage directions. Do not build any scenes yet.
Read it out loud once yourself, and change anything you trip over. Every later step depends on these words.
Step 2: make the narration
There are two ways to do this.
The first is a free voice on your own computer. My kit notes use Kokoro through HyperFrames, which needs a Python environment set up once:
python3 -m venv ~/.kokoro && ~/.kokoro/bin/pip install kokoro-onnx soundfile export HYPERFRAMES_PYTHON=~/.kokoro/bin/python npx -y hyperframes@0.8.96 tts script.txt -o audio/voice.wav -v af_heart -s 0.95
-v picks the voice and -s sets the speed. The kits name af_heart, am_michael and am_echo as voices that work.
The second is ElevenLabs, if you already have an account. Use your own API key and keep it out of any file you commit. Your plan's licence terms apply to the audio.
Step 3: read the audio length
Ask ffprobe how long the narration file is:
ffprobe -v error -show_entries format=duration -of csv=p=0 audio/voice.wav
It prints the length in seconds. With the local voice you can also get the timing of each word:
npx -y hyperframes@0.8.96 transcribe audio/voice.wav --json
Step 4: let the agent set the scene lengths
Give Claude the length, plus the word timings if you have them, and tell it to fit the film to the voice:
voice.wav is 31.4 seconds long. The word times are in the transcript JSON. Set every scene length from the line it illustrates, start each scene on the first word of its line, and make the film end 0.5 seconds after the last word.
My kits work the same way. They write the narration first, render the voice, and then time the shots to it.
Step 5: add the audio and check the render
Add the audio as one clip inside the root element of the composition. The data attributes below are the ones from the kit notes. Set data-duration to the length of the film:
<audio id="mix" class="clip" data-start="0" data-duration="31.9" data-track-index="0" src="audio/voice.wav" data-volume="1"></audio>
Then render and check the file:
npx -y hyperframes@0.8.96 render . -o out.mp4 --quality looks --workers 2 ffprobe -v error -show_entries format=duration -of csv=p=0 out.mp4 ffmpeg -hide_banner -i out.mp4 -vf freezedetect=n=-50dB:d=1.2 -an -f null - 2>&1 | grep freeze_start
The ffprobe result should be close to the voice length plus your tail. The ffmpeg command prints nothing if no scene stands still for more than 1.2 seconds. If a scene did freeze, the agent probably held it too long for its line.
Step 6: music and sound effects
Only use music you have a licence for. The kit notes put the voice at about −16 LUFS and the music 18 to 22 LU below it, and they duck the music about 8 dB under the voice. If you don't have a track, a silent bed is fine. Some kits also include ffmpeg recipes that generate small sound effects, so you don't have to download any.
Which styles to start with
Every style on the site can carry a voice, and several kits show how to time the pictures to the words. Pick a look in the style catalog. There are 121 styles ready, and 41 of them also have a vertical template. If you don't have the kits yet, the pricing page lists the one-time licence. The FAQ has a short answer on what the kits do about sound.

Sources
The commands, voice names, audio clip and loudness values come from the sound and render notes in my kits (Art Nouveau, Spy Titles, Glitch Datamosh, Game Trailer, Evidence Board and Ukiyo-e). The ffprobe and freeze checks come from the render notes of the Art Nouveau kit. The ffprobe duration command is the one the kits run on out.mp4, pointed at the voice file.