Weave narration with extracted media segments into audiovisual productions
Project description
braidio
Weave commentary — solo, duo, panel, debate, interview, documentary — with source clips into a production.
braidio braids the strands of a piece that talks about something (a song, a
book, a film, an event) into one rendered production. The talk is the spine —
a single presenter, two hosts, a panel, a narrator — and source clips and
narration bridges are the "illustration" layers woven onto it. Audio today,
with visual support to follow (it braids A/V — braid-io, and it sounds like
radio).
Two things braidio gives you:
- Ready-made format templates under the standard, industry names people already recognize — Deep Dive, Song Exploder-style, Panel, Debate, Documentary VO — each a high-quality bundle of defaults you can render in one call.
- Full parametrization underneath, so any style is expressible: a
Scriptof beats, cast via aConversationCast, tuned byWeaveConfig+Delivery, with per-beat voice/delivery overrides.
Status: early.
braidiois extracted from the Hamilton lyrics-podcast (its first application) into a reusable engine. APIs will move quickly.
The model
A production is a Script — an ordered list of beats:
| Beat | What it is |
|---|---|
Narration(text, voice?, voice_settings?, …) |
one voice reading — a narrator or a solo presenter. voice / voice_settings override per beat, so one timeline can carry a lively presenter and a graver book-narrator. |
Dialogue(turns=[(role, text)]) |
a multi-speaker exchange, synthesized in one pass (so it sounds like people talking to each other, not alternating monologues). A ConversationCast maps roles → voices. |
SegmentBeat(reference) |
a span of source media to cut and weave in (resolved by a pluggable SegmentSource — quote → [start, end]). |
WeaveConfig holds every editing knob (casting, turns, pacing, clip pre/post-roll,
duck, crossfades, loudness). Delivery presets bundle the TTS model + voice
settings (e.g. V2_PRESENTER lively vs V2_NARRATOR grave). The renderer
loudness-normalizes every part, tucks clips under the speech (speech stays
dominant), and masters the result.
Ready-made formats
Pick a standard format and render it — the template supplies the cast, voices, delivery and mix defaults:
from braidio import DEEP_DIVE, render_format
render_format(DEEP_DIVE, script, source=my_source, out_path="episode.mp3")
| Preset id | Standard name | Shape |
|---|---|---|
solo_explainer |
Solo-Presenter Explainer (video/audio essay, close reading) | one presenter + exhibits |
deep_dive |
Two-Host Conversation ("Deep Dive", Switched on Pop, NotebookLM) | two hosts; one teaches, one probes |
interview |
Interview (host + guest) | Q→A, guest is the center |
interview_host_removed |
Song Exploder-style (host removed) | guest monologue; each claim illustrated by its isolated stem; full artifact at the tail |
panel |
Panel / Roundtable (Pop Culture Happy Hour) | moderator routes distinct voices |
debate |
Debate (Oxford-style) | proposition / opposition / moderator, phased |
documentary_vo |
Documentary Voice-Over ("Voice of God", This American Life) | narrator on top; interviews + clips + actuality beneath |
Narration bridges and source clips are optional illustration layers
usable with any format. The taxonomy, weaving grammar, exemplar recipes and the
full template specs are in
misc/docs/research/commentary-formats-and-styles.md.
Render support note: the cast, per-role voices, narration deliveries, loudness
master, per-clip placement — SegmentBeat(placement="before" | "under" | "after"), where under lays the clip concurrently beneath the talk, ducked —
and a music bed (MusicBed, an app-supplied instrumental laid under the whole
production) are applied today. Scene stings and fade-to-spotlight (dropping the
bed before a key exhibit) remain on the render-side roadmap (braidio#1).
Parametrize anything
The templates are just good defaults over the primitives — compose directly for full control:
from braidio import Script, Dialogue, Narration, SegmentBeat, WeaveConfig
from braidio.conversation import ConversationCast, JESSICA, CHRIS
from braidio import V2_NARRATOR, render_production
script = Script(
title="…",
id_slug="01",
beats=[
Dialogue(
(("A", "First thing that gets me…"), ("B", "right — but isn't that…"))
),
SegmentBeat("the lyric being discussed", label="hook"),
Narration(
"Here's how the book tells it —", voice_settings=V2_NARRATOR.voice_settings
), # graver, per-beat
],
)
render_production(
script,
source=my_source,
cast=ConversationCast(roles={"A": JESSICA, "B": CHRIS}),
config=WeaveConfig(),
out_path="out.mp3",
)
What it deliberately does not do
braidio is a thin orchestration layer. It delegates:
| Concern | Owner |
|---|---|
| Content acquisition (Genius, audiobooks, news…) | the consuming app, via SegmentSource adapters |
| Linked-artifact graph / content-addressed media | lacing |
| Project workflow, provenance, plan/execute, partial re-render | nw |
| Video render + visual support | reelee |
| Raw audio DSP + TTS (crop, concat, duck, loudnorm, synth) | mixing / falaw |
braidio orchestrates these; it never reimplements the DSP or the graph.
Ecosystem
braidio is a production kind on top of nw — a reusable definition of
"commentary that weaves talk with extracted media" — the way a music video is
another production kind. It sits on lacing (graph) + nw (workflow /
provenance) + mixing/falaw (audio/TTS), and will use reelee for video. The
optional nw-app layer (braidio.HAS_GRAPH / HAS_NW) records render choices as
provenance so a change re-renders only the affected parts.
Install
pip install braidio # (once published)
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file braidio-0.0.2.tar.gz.
File metadata
- Download URL: braidio-0.0.2.tar.gz
- Upload date:
- Size: 85.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23aa10948868a353a6e82b49617e21b6d9eed5c721cf759d3aa05ed6a35744b0
|
|
| MD5 |
b86a68df89645ac3315f25fe023d16ba
|
|
| BLAKE2b-256 |
a2ed162c6ce4c47b7f24f5698b5d12def8ae4f7c29704a9016eb1c026036af6e
|
File details
Details for the file braidio-0.0.2-py3-none-any.whl.
File metadata
- Download URL: braidio-0.0.2-py3-none-any.whl
- Upload date:
- Size: 50.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb8e71134f1b3fb2112da8ca11d35a5e6c2f4123f2adbddd264e68c106464244
|
|
| MD5 |
98d3252df84c35acfc0c8a336d1341ef
|
|
| BLAKE2b-256 |
e251ac747ec1e0c94c6c87a0c8c54efb116bba1258f6ada58a45be374f242d50
|