Providers¶
Every engine SlideStream can use for each job, how to switch it on, and what
happens when it isn't available. Set providers in slidestream.yaml (see
configuration) or per run with a flag such as
--tts-provider or --llm-provider (enrich also takes --image-provider). For the servers behind the
self-hosted providers (ports, health checks, licences) see
SERVICES.md.
Fallbacks. Each job falls back from the configured service to a local
engine to a bare minimum, so a render always finishes
(ADR-0012). With
settings.strict: true (or --strict) a provider you chose explicitly is
never replaced; the run fails instead. slide-stream doctor <deck> reports
any configured provider whose package or key is missing.
API keys come from the environment. Reference them in config as
"${VAR}", or let the provider read its standard variable.
Voice (text to speech)¶
providers.tts.provider. Default: voicebox, which with no server set
quietly uses the voice floor below.
| Provider | What it is | Needs |
|---|---|---|
auto |
The voice floor: Kokoro if installed, else gTTS. Written by slide-stream init. |
nothing |
kokoro |
Kokoro-82M, fully offline; voices include af_sarah, af_bella, am_adam, am_michael |
slide-stream[local-tts] (in [all]); about 340 MB downloaded once |
gtts |
Google Text-to-Speech; English accents via accent: (australian, british, american, canadian, indian, irish, south-african) |
internet; sends text to Google |
voicebox |
Self-hosted Voicebox studio, several engines (engine: kokoro, chatterbox, qwen, …); a stored profile_id, or voice_sample for a clone deleted after the run |
base_url |
chatterbox |
Self-hosted Chatterbox TTS Server voice cloning; voice_sample uploaded under a random name per run |
base_url |
elevenlabs |
ElevenLabs voices (voice: rachel, …) |
ELEVENLABS_API_KEY, slide-stream[elevenlabs] |
openai |
OpenAI TTS (voice: alloy, echo, fable, nova, onyx, shimmer) |
OPENAI_API_KEY, slide-stream[openai] |
openai-compatible |
Any OpenAI-style /v1/audio/speech server (LocalAI, Kokoro-FastAPI, …) |
base_url |
Voice floor. When no voice is configured, or the chosen one fails, the
floor speaks: Kokoro when installed (offline, text stays on the machine),
else gTTS. Force one with settings.voice_floor: kokoro or gtts. As the
floor, Kokoro uses providers.tts.kokoro_voice (default af_sarah).
Your own voice. Record 10 to 30 seconds of clean speech and set
voice_sample: ./me.wav (or pass --voice-sample) with voicebox or
chatterbox. The sample is uploaded for that run only and deleted
afterwards (ADR-0005). Turn on
strict so a server problem never swaps in another voice. Non-WAV samples
are converted with ffmpeg (bundled).
providers:
tts:
provider: voicebox
base_url: https://voice.example.org
voice_sample: ./my_voice.wav
api_key: "${VOICEBOX_TOKEN}"
settings:
strict: true
Pictures¶
providers.images.provider. Default: text. fallback: names the
provider to use if the main one can't start; a single picture that fails
mid-render becomes a text card.
| Provider | What it is | Needs |
|---|---|---|
text |
The slide's title and content drawn on the frame, code syntax-coloured | nothing |
local |
Pictures from a folder, matched by file name (folder:); slide-stream scan can name them for you |
a folder |
swarmui |
Self-hosted SwarmUI (model:, steps:, width:, height:) |
base_url |
openai-compatible |
Any OpenAI-style /v1/images server |
base_url |
gemini |
Google Imagen, about $0.02 a picture (model: picks the tier) |
GEMINI_API_KEY, slide-stream[gemini] |
dalle3 |
OpenAI image generation | OPENAI_API_KEY, slide-stream[openai] |
pexels |
Pexels stock photos | PEXELS_API_KEY |
unsplash |
Unsplash stock photos | UNSPLASH_ACCESS_KEY |
With a picture provider other than text, video slides show the bullets on
the left and the picture on the right (settings.video.bullets_overlay).
Narration writer (LLM)¶
providers.llm.provider. Default: none, which speaks the slide text,
speaker notes or --script as written. With an LLM, SlideStream writes what
a presenter would say, fitted to settings.narration.target_seconds, and
describes picture-only slides with a vision model. draft, enrich --notes
and scan need one.
| Provider | Needs |
|---|---|
ollama |
a local Ollama; base_url for a remote one, think: false for reasoning models |
openai-compatible |
base_url (LocalAI, vLLM, LM Studio, …) |
claude |
ANTHROPIC_API_KEY, slide-stream[claude]; default model claude-haiku-4-5 |
openai |
OPENAI_API_KEY, slide-stream[openai] |
gemini |
GEMINI_API_KEY, slide-stream[gemini] |
groq |
GROQ_API_KEY, slide-stream[groq] |
Set model: (or --llm-model) to choose the model; built-in defaults for
some providers are older models.
Presenter (talking head)¶
providers.avatar.provider, used when you pass --avatar. Default: none.
slide-stream avatars lists the built-in mascots (teddy, panda, koala,
robot, wizard, owl); source: takes a mascot name or an image path.
| Provider | What it does | Needs | Mascots? |
|---|---|---|---|
static |
Holds the image in a corner circle | nothing | yes |
puppet |
Cartoon mouth that opens with the voice's loudness; mouth: [cx, cy, w, h] for your own image |
nothing | yes |
precomputed |
Uses ready-made head_1.mp4, head_2.mp4, … from assets_dir |
clips | yes |
wan-s2v |
Wan2.2-S2V lip-sync from a still image and the narration, no face detector (API); clip_seconds or full_length |
ComfyUI base_url, a GPU (minutes per slide) |
yes |
sadtalker |
Talking head from a photo (API) | ComfyUI base_url, source_image |
no, human faces only |
wav2lip |
Lip-sync on a short video (API) | ComfyUI base_url, source_video |
no |
comfyui |
Picks SadTalker for a photo, Wav2Lip for a video | ComfyUI base_url, source |
no |
d-id |
Hosted D-ID, about $1–2 per minute of video | DID_API_KEY, source_image |
yes |
Show the head on some slides only with --avatar-slides first,last (also
all, none, 1,3,5, every:3), or render one clip and loop it with
--reuse-avatar (ADR-0006).
Position and size: settings.avatar (position, size, margin).
Background on choosing an engine: talking-head options.
Slide design¶
How slides look. Plain SlideStream slides need nothing; the others are optional.
| Option | What it does | Needs |
|---|---|---|
| (default) | SlideStream's own slides: plain layout, code and tables drawn properly | nothing |
--preserve-style |
Narrates a styled .pptx and keeps its look in the video |
LibreOffice, slide-stream[presenton] |
--slides-pdf FILE |
Uses a PDF you exported as the video frames | slide-stream[presenton] |
--template NAME |
Designed slides from Presenton (experimental); see USE_CASES | a Presenton server, slide-stream[presenton] |
--pptx-template FILE |
New slides in your own PowerPoint template (ADR-0014) | planned |
Presenton settings live under providers.presenton: base_url, api_key,
template, instructions, code_slides (auto, always, never),
fidelity (warn, strict, off), fidelity_min_kept
(ADR-0013).