Skip to main content
Making captions and burning them in are separate decisions, and the commands reflect that: transcribe writes a file, caption attaches one.

Transcribe

transcribe writes captions.srt beside the project, not into the cache, so the file is yours to edit and can outlive a cache wipe. It attaches the captions only with --attach; otherwise you get the SRT and its word count and can review it first. Silence is not a failure: a recording with no speech returns {"words":0,"speech":false} with an asr_no_speech warning.

Providers and keys

Keys never go in splice.json and never in argv.
  • gemini and deepgram are hosted; whisper runs a local binary.
  • An environment variable beats the config file for the same provider.
  • config list reports whether a key is set, from which source, and a fingerprint — never the key itself.

Burn them in

splice text and splice caption share one engine (libass). That is why a title and a subtitle look consistent, and why a build without libass cannot do either.

Fixing the words

captions.srt is a normal SRT. Edit it, then re-run splice caption. The render cache is keyed on the file’s content, so changing it invalidates only the burn-in step.
Timing lives in the SRT, not the document. If the transcription is right but the timing is not, edit the SRT rather than asking the provider again.