decktalk.toml. Every path in it is relative to the project
directory. An unknown top-level table fails the load, so a typo cannot silently do
nothing. The file has two kinds of content. The document tables on this page describe
the presentation. The tuning tables change how DeckTalk
renders and are rarely needed.
decktalk.toml
[project]
[voice]
These are the voice settings for this presentation. The model key overrides the tool
default, which is eleven_multilingual_v2 unless [narration] says otherwise.
The voice id and the API key are secrets, so they live in
.env as
ELEVENLABS_VOICE_ID and ELEVENLABS_API_KEY, or in the environment.
[[section]]
Write one table per ## N. section of the script. The order does not matter, because
DeckTalk sorts them by number. Every script section must have one. A section is either
a page or a clip.
A clip that is not 1920 by 1080 is scaled and padded to fit. A missing clip is not an
error unless you pass
--strict. A titled slate plays for slate_seconds in its place,
so a project builds before every asset exists.
[transition]
[mix]
The mix is optional. Without this table the film carries narration and clip audio only.
Sound explains how the parts fit together.
[soundscape]
These tables hold the prompts for decktalk soundscape, which generates sound with
ElevenLabs. Ambience and music write to the ambience and underscore paths named in
[mix]. When [mix] names none, they write to build/sfx/ambience.mp3 and
build/music/underscore.mp3. Each sound effect writes to build/sfx/<name>.mp3 unless
its out key says otherwise.
Tuning tables
Any settings section can be overridden per project with a table of the same name, such as[video] or [record], or per shell with a DECKTALK_<SECTION>_<FIELD> variable.
Configuration lists every field with its default.
script.md
The script is markdown with one rule. Each ## N. Title heading starts section N, and
the text under it is what the voice says for that section.
- Text in square brackets, such as
[Deck scene 3.], is a stage direction. It is not spoken, and a short pause is left where it sat. - A bracket in capitals, such as
[NAME], is a placeholder. Thenarratestage refuses to synthesize a section that still has one unless you pass--allow-placeholders. - A tag such as
<break time="1.0s"/>inserts a pause of that length. - Other markdown, such as emphasis, is stripped before synthesis.