Skip to content

Voice-over

Set "voice": true in video.json and each callout is spoken as it appears. The music ducks under it. The provider is set once per project in reelson.config.json voice.

The default: gpt-4o-mini-tts, voice alloy. Set the pace and tone in instructions. Needs OPENAI_API_KEY.

"voice": { "provider": "openai", "voice": "marin", "instructions": "Warm, calm, unhurried product narrator." }

With baseURL, it talks to a local OpenAI-compatible server instead (Kokoro-FastAPI at http://localhost:8880/v1, Speaches, LocalAI), with no key needed.

reelson voices lists the voices you can pick (--provider, --all, --library).

video.json
{
"voice": { "intro": "Here's how to find any customer in seconds." },
"callouts": [
{ "marker": "customers-list", "text": "Open Customers" },
{ "marker": "search-results", "text": "Type → match", "say": "Type a name, and the match appears." }
]
}
  • say replaces what is spoken (a full sentence for a terse pill). "say": false keeps a callout silent.
  • "voice": { "intro": "…" } adds a line over the intro. provider, model, voice, instructions and speed there override the project for one video.
  • A spoken callout stays up until its line is said, and the next callout waits for it. When a line can’t fit, build and check warn you: shorten its say, or pause longer in the scenario.

reelson voice <slug> makes the missing lines (build and render do it for you) into <demo>/voice/<hash>.mp3. Lines are cached by their words and every sound setting, so each one is made once. Commit the folder to render without a key.