Skip to main content

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:

  1. 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.
  2. Full parametrization underneath, so any style is expressible: a Script of beats, cast via a ConversationCast, tuned by WeaveConfig + Delivery, with per-beat voice/delivery overrides.

Status: early. braidio is 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 placementSegmentBeat(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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

braidio-0.0.2.tar.gz (85.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

braidio-0.0.2-py3-none-any.whl (50.9 kB view details)

Uploaded Python 3

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

Hashes for braidio-0.0.2.tar.gz
Algorithm Hash digest
SHA256 23aa10948868a353a6e82b49617e21b6d9eed5c721cf759d3aa05ed6a35744b0
MD5 b86a68df89645ac3315f25fe023d16ba
BLAKE2b-256 a2ed162c6ce4c47b7f24f5698b5d12def8ae4f7c29704a9016eb1c026036af6e

See more details on using hashes here.

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

Hashes for braidio-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 fb8e71134f1b3fb2112da8ca11d35a5e6c2f4123f2adbddd264e68c106464244
MD5 98d3252df84c35acfc0c8a336d1341ef
BLAKE2b-256 e251ac747ec1e0c94c6c87a0c8c54efb116bba1258f6ada58a45be374f242d50

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page