decktalk 0.1.0__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- decktalk-0.2.0/PKG-INFO +221 -0
- decktalk-0.2.0/README.md +188 -0
- decktalk-0.2.0/THIRD_PARTY_NOTICES.md +22 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/pyproject.toml +15 -4
- {decktalk-0.1.0 → decktalk-0.2.0}/pyproject.toml.orig +23 -5
- decktalk-0.2.0/src/decktalk/__init__.py +104 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/_report.py +60 -13
- decktalk-0.2.0/src/decktalk/artifacts.py +464 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/cli.py +182 -75
- decktalk-0.2.0/src/decktalk/config.py +275 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/errors.py +1 -1
- decktalk-0.2.0/src/decktalk/media/browser.py +282 -0
- decktalk-0.2.0/src/decktalk/media/ffmpeg.py +461 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/project.py +59 -4
- decktalk-0.2.0/src/decktalk/providers/__init__.py +1 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/providers/_http.py +35 -7
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/providers/speech.py +6 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/runtime/decktalk-runtime.js +231 -33
- decktalk-0.2.0/src/decktalk/scaffold.py +264 -0
- decktalk-0.2.0/src/decktalk/stages/assemble.py +830 -0
- decktalk-0.2.0/src/decktalk/stages/beats.py +357 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/stages/build.py +25 -4
- decktalk-0.2.0/src/decktalk/stages/measure.py +203 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/stages/narrate.py +69 -21
- decktalk-0.2.0/src/decktalk/stages/record.py +150 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/stages/shots.py +30 -14
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/stages/soundscape.py +2 -2
- decktalk-0.2.0/src/decktalk/stages/verify.py +519 -0
- decktalk-0.2.0/src/decktalk/status.py +149 -0
- decktalk-0.2.0/src/decktalk/template/cues.json +86 -0
- decktalk-0.2.0/src/decktalk/template/deck/fonts/Inter-OFL.txt +93 -0
- decktalk-0.2.0/src/decktalk/template/deck/fonts/Inter-greek.woff2 +0 -0
- decktalk-0.2.0/src/decktalk/template/deck/fonts/Inter-latin.woff2 +0 -0
- decktalk-0.2.0/src/decktalk/template/deck/fonts/InterTight-OFL.txt +93 -0
- decktalk-0.2.0/src/decktalk/template/deck/fonts/InterTight-greek.woff2 +0 -0
- decktalk-0.2.0/src/decktalk/template/deck/fonts/InterTight-latin.woff2 +0 -0
- decktalk-0.2.0/src/decktalk/template/deck/fonts/JetBrainsMono-OFL.txt +93 -0
- decktalk-0.2.0/src/decktalk/template/deck/fonts/JetBrainsMono-greek.woff2 +0 -0
- decktalk-0.2.0/src/decktalk/template/deck/fonts/JetBrainsMono-latin.woff2 +0 -0
- decktalk-0.2.0/src/decktalk/template/deck/index.html +624 -0
- decktalk-0.2.0/src/decktalk/template/deck/lesson.html +835 -0
- decktalk-0.2.0/src/decktalk/template/decktalk.toml +115 -0
- decktalk-0.2.0/src/decktalk/template/script.md +66 -0
- decktalk-0.2.0/src/decktalk/verdicts.py +101 -0
- decktalk-0.1.0/PKG-INFO +0 -137
- decktalk-0.1.0/README.md +0 -104
- decktalk-0.1.0/THIRD_PARTY_NOTICES.md +0 -14
- decktalk-0.1.0/src/decktalk/__init__.py +0 -59
- decktalk-0.1.0/src/decktalk/artifacts.py +0 -232
- decktalk-0.1.0/src/decktalk/config.py +0 -164
- decktalk-0.1.0/src/decktalk/media/browser.py +0 -161
- decktalk-0.1.0/src/decktalk/media/ffmpeg.py +0 -273
- decktalk-0.1.0/src/decktalk/providers/__init__.py +0 -1
- decktalk-0.1.0/src/decktalk/scaffold.py +0 -107
- decktalk-0.1.0/src/decktalk/stages/assemble.py +0 -538
- decktalk-0.1.0/src/decktalk/stages/beats.py +0 -196
- decktalk-0.1.0/src/decktalk/stages/measure.py +0 -135
- decktalk-0.1.0/src/decktalk/stages/record.py +0 -93
- decktalk-0.1.0/src/decktalk/stages/verify.py +0 -135
- decktalk-0.1.0/src/decktalk/template/cues.json +0 -33
- decktalk-0.1.0/src/decktalk/template/deck/index.html +0 -79
- decktalk-0.1.0/src/decktalk/template/decktalk.toml +0 -92
- decktalk-0.1.0/src/decktalk/template/script.md +0 -38
- {decktalk-0.1.0 → decktalk-0.2.0}/LICENSE +0 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/NOTICE +0 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/__main__.py +0 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/_env.py +0 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/media/__init__.py +0 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/providers/elevenlabs.py +0 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/py.typed +0 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/stages/__init__.py +0 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/template/env.example +0 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/template/gitignore +0 -0
- {decktalk-0.1.0 → decktalk-0.2.0}/src/decktalk/template/media/markers.json +0 -0
decktalk-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: decktalk
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Narrated presentations, cut to the word. A markdown script, an ElevenLabs voice, and HTML slides go in, and one mp4 comes out.
|
|
5
|
+
Keywords: presentation,narration,elevenlabs,video,slides,text-to-speech,markdown,video-generation,explainer-video,lesson,screencast,word-timestamps,playwright,ffmpeg
|
|
6
|
+
Author: Jacob Beaudin
|
|
7
|
+
License-Expression: Apache-2.0
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
License-File: NOTICE
|
|
10
|
+
License-File: THIRD_PARTY_NOTICES.md
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: Education
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
|
+
Classifier: Operating System :: OS Independent
|
|
21
|
+
Classifier: Typing :: Typed
|
|
22
|
+
Classifier: Topic :: Multimedia :: Video
|
|
23
|
+
Classifier: Topic :: Multimedia :: Sound/Audio :: Speech
|
|
24
|
+
Requires-Dist: playwright>=1.50
|
|
25
|
+
Requires-Dist: static-ffmpeg>=2.7
|
|
26
|
+
Requires-Python: >=3.12
|
|
27
|
+
Project-URL: Homepage, https://decktalk.app
|
|
28
|
+
Project-URL: Repository, https://github.com/jacobcbeaudin/decktalk
|
|
29
|
+
Project-URL: Documentation, https://docs.decktalk.app
|
|
30
|
+
Project-URL: Issues, https://github.com/jacobcbeaudin/decktalk/issues
|
|
31
|
+
Project-URL: Changelog, https://github.com/jacobcbeaudin/decktalk/blob/main/CHANGELOG.md
|
|
32
|
+
Description-Content-Type: text/markdown
|
|
33
|
+
|
|
34
|
+
<picture>
|
|
35
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/hero-dark.svg">
|
|
36
|
+
<img alt="A playhead moves along a spoken sentence, one tick per word. The slide reacts on exactly the right words." src="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/hero-light.svg" width="100%">
|
|
37
|
+
</picture>
|
|
38
|
+
|
|
39
|
+
<h1 align="center">DeckTalk</h1>
|
|
40
|
+
|
|
41
|
+
<p align="center"><b>Narrated presentations, cut to the word.</b><br>
|
|
42
|
+
DeckTalk makes a narrated video from a markdown script and HTML slides.
|
|
43
|
+
Each reveal starts on the word that introduces it.
|
|
44
|
+
If you change a sentence, DeckTalk voices only that section again.</p>
|
|
45
|
+
|
|
46
|
+
<p align="center">DeckTalk is for lecturers, course authors, developer advocates, and the agents that help them.</p>
|
|
47
|
+
|
|
48
|
+
<!-- demo: the video waits for the founder's approval. GitHub strips a <video> tag, so do
|
|
49
|
+
not paste one.
|
|
50
|
+
1. Upload the mp4 through GitHub's editor.
|
|
51
|
+
2. Put the user-attachments URL on its own line in place of the hero picture at the top.
|
|
52
|
+
3. Move the caption below under that line, and uncomment it.
|
|
53
|
+
4. Under "Make your first video", change "The scaffold is a five-section lesson" to
|
|
54
|
+
"The scaffold is the project that made the demo video above".
|
|
55
|
+
<p align="center">DeckTalk built this video from the project that <code>decktalk init</code> writes, in a cloned voice. Turn the sound on, and each reveal starts on its word.</p>
|
|
56
|
+
-->
|
|
57
|
+
|
|
58
|
+
<p align="center">
|
|
59
|
+
<a href="https://pypi.org/project/decktalk/"><img src="https://img.shields.io/pypi/v/decktalk?style=flat-square&label=pypi&color=2c1fea" alt="PyPI"></a>
|
|
60
|
+
<a href="https://github.com/jacobcbeaudin/decktalk/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/jacobcbeaudin/decktalk/ci.yml?style=flat-square&label=ci" alt="ci"></a>
|
|
61
|
+
<a href="https://github.com/jacobcbeaudin/decktalk/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-black?style=flat-square&labelColor=0a0a0a&color=2c1fea" alt="Apache-2.0"></a>
|
|
62
|
+
</p>
|
|
63
|
+
|
|
64
|
+
<p align="center">
|
|
65
|
+
<a href="https://docs.decktalk.app/quickstart">Quickstart</a> ·
|
|
66
|
+
<a href="https://docs.decktalk.app">Docs</a> ·
|
|
67
|
+
<a href="https://docs.decktalk.app/requirements">Requirements and costs</a> ·
|
|
68
|
+
<a href="https://docs.decktalk.app/reference/card">Reference card for agents</a> ·
|
|
69
|
+
<a href="https://docs.decktalk.app/changelog">Changelog</a><br>
|
|
70
|
+
Agents can read <a href="https://docs.decktalk.app/llms.txt">llms.txt</a>.
|
|
71
|
+
</p>
|
|
72
|
+
|
|
73
|
+
## Make your first video
|
|
74
|
+
|
|
75
|
+
You need Python 3.12 or later. These steps use `uv`, a Python package manager. If you use pipx, run `pipx install decktalk` in step 1 instead.
|
|
76
|
+
|
|
77
|
+
1. Install DeckTalk.
|
|
78
|
+
|
|
79
|
+
```console
|
|
80
|
+
uv tool install decktalk
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
uv ends with `Installed 1 executable: decktalk`.
|
|
84
|
+
|
|
85
|
+
2. Download Chromium, ffmpeg, and KaTeX. You do this one time per machine.
|
|
86
|
+
|
|
87
|
+
```console
|
|
88
|
+
decktalk setup
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
On Linux, this step asks for sudo. The last line is `setup complete`.
|
|
92
|
+
|
|
93
|
+
3. Create the scaffold, a complete example project.
|
|
94
|
+
|
|
95
|
+
```console
|
|
96
|
+
decktalk init my-lesson
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
4. Go into the project.
|
|
100
|
+
|
|
101
|
+
```console
|
|
102
|
+
cd my-lesson
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
5. Build the video without an account.
|
|
106
|
+
|
|
107
|
+
```console
|
|
108
|
+
decktalk build --silent
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
The build ends with `built` and the path of `build/out/my-lesson.mp4`. The build took 224.4 seconds on a MacBook Pro with Apple M5 Pro and 64 GB memory, because recording runs in real time.
|
|
112
|
+
|
|
113
|
+
6. Copy the example settings file.
|
|
114
|
+
|
|
115
|
+
```console
|
|
116
|
+
cp .env.example .env
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
7. In `.env`, set your ElevenLabs API key and voice id. DeckTalk never prints the key.
|
|
120
|
+
|
|
121
|
+
8. Build the video with your voice.
|
|
122
|
+
|
|
123
|
+
```console
|
|
124
|
+
decktalk build
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
This build spends ElevenLabs credits for every section. It writes the video, SRT and VTT captions, and one chapter per section. [What spends credits](https://docs.decktalk.app/requirements#what-spends-credits) lists the cost.
|
|
128
|
+
|
|
129
|
+
The scaffold is a five-section lesson. The [quickstart](https://docs.decktalk.app/quickstart) shows the output of each step and [what the example video shows](https://docs.decktalk.app/quickstart#what-the-example-video-shows).
|
|
130
|
+
|
|
131
|
+
## What you write
|
|
132
|
+
|
|
133
|
+
<picture>
|
|
134
|
+
<source media="(prefers-color-scheme: dark) and (max-width: 640px)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-dark-stacked.svg">
|
|
135
|
+
<source media="(max-width: 640px)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-light-stacked.svg">
|
|
136
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-dark.svg">
|
|
137
|
+
<img alt="Four panels. Write shows a markdown script. Narrate runs narrate and beats, and shows a tick for every word of "A bowl. A ball. One. Two, three." with 1.25 over "bowl". Record runs record, measure, and check, and shows a slide where a bowl draws on and a ball steps down it. Assemble runs assemble and verify, and shows one mp4." src="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-light.svg" width="100%">
|
|
138
|
+
</picture>
|
|
139
|
+
|
|
140
|
+
You write four files. One cue id per reveal, such as `1.1bowl`, ties the script, the cues, and the page together.
|
|
141
|
+
|
|
142
|
+
| File | What it holds |
|
|
143
|
+
|---|---|
|
|
144
|
+
| `script.md` | What the voice says, under one `## N. Title` heading per section. |
|
|
145
|
+
| `decktalk.toml` | The project file. It ties each section to a page or to a clip of your own. |
|
|
146
|
+
| `cues.json` | The phrase that each reveal starts on. |
|
|
147
|
+
| A page in `deck/` | The slides, as plain HTML. |
|
|
148
|
+
|
|
149
|
+
The `narrate` stage writes a words file with the start and end of every spoken word. If a cue phrase is not in the spoken words, the build stops and names the cue. [Your first deck](https://docs.decktalk.app/guides/first-deck) writes one section in all four files.
|
|
150
|
+
|
|
151
|
+
## Why the cuts are exact
|
|
152
|
+
|
|
153
|
+
<picture>
|
|
154
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/alignment-dark.svg">
|
|
155
|
+
<img alt="A strip of recorded frames. Three magenta cover frames come first, and a line marks t=0 at the first clean frame. Under the strip, the narration "A bowl. A ball. Watch it step down" starts at t=0. Dashed leads join "bowl" and "ball" to the outlined frames where the bowl and then the ball appear." src="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/alignment-light.svg" width="100%">
|
|
156
|
+
</picture>
|
|
157
|
+
|
|
158
|
+
A browser does not start recording at a known time, so DeckTalk does not use a timer. The recorder covers the page in magenta until the narration starts. The first frame without magenta is narration t=0, on Linux, macOS, and Windows.
|
|
159
|
+
|
|
160
|
+
`decktalk verify` then measures every reveal in the finished video. This sample comes from a silent build of the scaffold.
|
|
161
|
+
|
|
162
|
+
<!-- sample: decktalk verify 1:1.1bowl 3:3.4name 4:4.1words, silent build of the scaffold (cue table only) -->
|
|
163
|
+
```text
|
|
164
|
+
check cue at chg % ctl % offset a/v result
|
|
165
|
+
1:1.1bowl 1.25 1.25 1.05 0.00 -10ms -9ms changed
|
|
166
|
+
3:3.4name 71.98 110.58 2.77 0.00 +20ms +11ms changed
|
|
167
|
+
4:4.1words 14.31 172.99 1.47 0.00 +10ms -11ms changed
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
The offset column is the time from the cue time to the onset of the reveal, in milliseconds. [Verify](https://docs.decktalk.app/reference/verify) defines every column and limit.
|
|
171
|
+
|
|
172
|
+
## Requirements and costs
|
|
173
|
+
|
|
174
|
+
- **Software.** DeckTalk needs Python 3.12 or later, on Linux, macOS, or Windows. `decktalk setup` downloads the rest.
|
|
175
|
+
- **Accounts.** A silent build needs no account. A voiced build needs an ElevenLabs API key and a voice id.
|
|
176
|
+
- **Cost.** Every ElevenLabs plan can call the API. The free plan has limits for a video you publish.
|
|
177
|
+
|
|
178
|
+
[Requirements and costs](https://docs.decktalk.app/requirements) lists every download and every command that spends credits.
|
|
179
|
+
|
|
180
|
+
## How it compares
|
|
181
|
+
|
|
182
|
+
| Tool | Timing comes from | Slides are | After you edit one sentence |
|
|
183
|
+
|---|---|---|---|
|
|
184
|
+
| **DeckTalk** | the spoken words, one time per word | your HTML | DeckTalk voices one section again. `build --only N` records only that section. |
|
|
185
|
+
| Remotion, Motion Canvas | frame numbers or seconds in code, by default | code | You time the change again by hand and render again. |
|
|
186
|
+
| Manim | seconds in code, or bookmarks in the narration with manim-voiceover | code | With manim-voiceover, bookmarks follow the new text. You still render the scene again in Python. |
|
|
187
|
+
| Descript | a recording you made | your screen | Overdub voices the new words. The screen recording does not move with them. |
|
|
188
|
+
| Synthesia, HeyGen | the avatar's speech | their avatar and scenes | You generate the video again. |
|
|
189
|
+
|
|
190
|
+
The [FAQ](https://docs.decktalk.app/help/faq#how-is-this-different-from-the-other-tools) has the full comparison. Every build also gives you these parts:
|
|
191
|
+
|
|
192
|
+
- **A free silent build.** Every stage runs with no key, and a click marks each word.
|
|
193
|
+
- **Cached narration.** DeckTalk voices a section again only when it changes.
|
|
194
|
+
- **Captions and chapters.** Every build writes SRT, VTT, and chapters.
|
|
195
|
+
- **A soundscape.** Add [an underscore, an ambience bed, and sound effects](https://docs.decktalk.app/concepts/sound).
|
|
196
|
+
- **Loudness.** DeckTalk normalizes the mix to -16 LUFS.
|
|
197
|
+
- **Checked output.** `check` and `verify` catch bad recordings and late reveals.
|
|
198
|
+
|
|
199
|
+
## Status and support
|
|
200
|
+
|
|
201
|
+
DeckTalk is alpha, and a minor release can still break things. One person maintains it.
|
|
202
|
+
|
|
203
|
+
CI runs the unit tests and a full offline build on Linux for every push to `main` and every pull request. [CONTRIBUTING](https://github.com/jacobcbeaudin/decktalk/blob/main/CONTRIBUTING.md#what-ci-runs) lists the macOS and Windows runs.
|
|
204
|
+
|
|
205
|
+
- Report bugs and ask questions in [Issues](https://github.com/jacobcbeaudin/decktalk/issues).
|
|
206
|
+
- Report a vulnerability privately. [SECURITY.md](https://github.com/jacobcbeaudin/decktalk/blob/main/SECURITY.md) explains how.
|
|
207
|
+
- The [changelog](https://docs.decktalk.app/changelog) lists every release.
|
|
208
|
+
|
|
209
|
+
## Documentation
|
|
210
|
+
|
|
211
|
+
The docs are at **[docs.decktalk.app](https://docs.decktalk.app)**.
|
|
212
|
+
|
|
213
|
+
- **Install and build a first video:** [Quickstart](https://docs.decktalk.app/quickstart)
|
|
214
|
+
- **Write your own section:** [Your first deck](https://docs.decktalk.app/guides/first-deck)
|
|
215
|
+
- **Give an agent the whole contract:** [Reference card for agents](https://docs.decktalk.app/reference/card)
|
|
216
|
+
|
|
217
|
+
## Contributing
|
|
218
|
+
|
|
219
|
+
To work on DeckTalk itself, start with [CONTRIBUTING.md](https://github.com/jacobcbeaudin/decktalk/blob/main/CONTRIBUTING.md).
|
|
220
|
+
|
|
221
|
+
<p align="center">Apache-2.0. Made by <a href="https://github.com/jacobcbeaudin">Jacob Beaudin</a>.</p>
|
decktalk-0.2.0/README.md
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
<picture>
|
|
2
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/hero-dark.svg">
|
|
3
|
+
<img alt="A playhead moves along a spoken sentence, one tick per word. The slide reacts on exactly the right words." src="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/hero-light.svg" width="100%">
|
|
4
|
+
</picture>
|
|
5
|
+
|
|
6
|
+
<h1 align="center">DeckTalk</h1>
|
|
7
|
+
|
|
8
|
+
<p align="center"><b>Narrated presentations, cut to the word.</b><br>
|
|
9
|
+
DeckTalk makes a narrated video from a markdown script and HTML slides.
|
|
10
|
+
Each reveal starts on the word that introduces it.
|
|
11
|
+
If you change a sentence, DeckTalk voices only that section again.</p>
|
|
12
|
+
|
|
13
|
+
<p align="center">DeckTalk is for lecturers, course authors, developer advocates, and the agents that help them.</p>
|
|
14
|
+
|
|
15
|
+
<!-- demo: the video waits for the founder's approval. GitHub strips a <video> tag, so do
|
|
16
|
+
not paste one.
|
|
17
|
+
1. Upload the mp4 through GitHub's editor.
|
|
18
|
+
2. Put the user-attachments URL on its own line in place of the hero picture at the top.
|
|
19
|
+
3. Move the caption below under that line, and uncomment it.
|
|
20
|
+
4. Under "Make your first video", change "The scaffold is a five-section lesson" to
|
|
21
|
+
"The scaffold is the project that made the demo video above".
|
|
22
|
+
<p align="center">DeckTalk built this video from the project that <code>decktalk init</code> writes, in a cloned voice. Turn the sound on, and each reveal starts on its word.</p>
|
|
23
|
+
-->
|
|
24
|
+
|
|
25
|
+
<p align="center">
|
|
26
|
+
<a href="https://pypi.org/project/decktalk/"><img src="https://img.shields.io/pypi/v/decktalk?style=flat-square&label=pypi&color=2c1fea" alt="PyPI"></a>
|
|
27
|
+
<a href="https://github.com/jacobcbeaudin/decktalk/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/jacobcbeaudin/decktalk/ci.yml?style=flat-square&label=ci" alt="ci"></a>
|
|
28
|
+
<a href="https://github.com/jacobcbeaudin/decktalk/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-black?style=flat-square&labelColor=0a0a0a&color=2c1fea" alt="Apache-2.0"></a>
|
|
29
|
+
</p>
|
|
30
|
+
|
|
31
|
+
<p align="center">
|
|
32
|
+
<a href="https://docs.decktalk.app/quickstart">Quickstart</a> ·
|
|
33
|
+
<a href="https://docs.decktalk.app">Docs</a> ·
|
|
34
|
+
<a href="https://docs.decktalk.app/requirements">Requirements and costs</a> ·
|
|
35
|
+
<a href="https://docs.decktalk.app/reference/card">Reference card for agents</a> ·
|
|
36
|
+
<a href="https://docs.decktalk.app/changelog">Changelog</a><br>
|
|
37
|
+
Agents can read <a href="https://docs.decktalk.app/llms.txt">llms.txt</a>.
|
|
38
|
+
</p>
|
|
39
|
+
|
|
40
|
+
## Make your first video
|
|
41
|
+
|
|
42
|
+
You need Python 3.12 or later. These steps use `uv`, a Python package manager. If you use pipx, run `pipx install decktalk` in step 1 instead.
|
|
43
|
+
|
|
44
|
+
1. Install DeckTalk.
|
|
45
|
+
|
|
46
|
+
```console
|
|
47
|
+
uv tool install decktalk
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
uv ends with `Installed 1 executable: decktalk`.
|
|
51
|
+
|
|
52
|
+
2. Download Chromium, ffmpeg, and KaTeX. You do this one time per machine.
|
|
53
|
+
|
|
54
|
+
```console
|
|
55
|
+
decktalk setup
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
On Linux, this step asks for sudo. The last line is `setup complete`.
|
|
59
|
+
|
|
60
|
+
3. Create the scaffold, a complete example project.
|
|
61
|
+
|
|
62
|
+
```console
|
|
63
|
+
decktalk init my-lesson
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
4. Go into the project.
|
|
67
|
+
|
|
68
|
+
```console
|
|
69
|
+
cd my-lesson
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
5. Build the video without an account.
|
|
73
|
+
|
|
74
|
+
```console
|
|
75
|
+
decktalk build --silent
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The build ends with `built` and the path of `build/out/my-lesson.mp4`. The build took 224.4 seconds on a MacBook Pro with Apple M5 Pro and 64 GB memory, because recording runs in real time.
|
|
79
|
+
|
|
80
|
+
6. Copy the example settings file.
|
|
81
|
+
|
|
82
|
+
```console
|
|
83
|
+
cp .env.example .env
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
7. In `.env`, set your ElevenLabs API key and voice id. DeckTalk never prints the key.
|
|
87
|
+
|
|
88
|
+
8. Build the video with your voice.
|
|
89
|
+
|
|
90
|
+
```console
|
|
91
|
+
decktalk build
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
This build spends ElevenLabs credits for every section. It writes the video, SRT and VTT captions, and one chapter per section. [What spends credits](https://docs.decktalk.app/requirements#what-spends-credits) lists the cost.
|
|
95
|
+
|
|
96
|
+
The scaffold is a five-section lesson. The [quickstart](https://docs.decktalk.app/quickstart) shows the output of each step and [what the example video shows](https://docs.decktalk.app/quickstart#what-the-example-video-shows).
|
|
97
|
+
|
|
98
|
+
## What you write
|
|
99
|
+
|
|
100
|
+
<picture>
|
|
101
|
+
<source media="(prefers-color-scheme: dark) and (max-width: 640px)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-dark-stacked.svg">
|
|
102
|
+
<source media="(max-width: 640px)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-light-stacked.svg">
|
|
103
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-dark.svg">
|
|
104
|
+
<img alt="Four panels. Write shows a markdown script. Narrate runs narrate and beats, and shows a tick for every word of "A bowl. A ball. One. Two, three." with 1.25 over "bowl". Record runs record, measure, and check, and shows a slide where a bowl draws on and a ball steps down it. Assemble runs assemble and verify, and shows one mp4." src="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-light.svg" width="100%">
|
|
105
|
+
</picture>
|
|
106
|
+
|
|
107
|
+
You write four files. One cue id per reveal, such as `1.1bowl`, ties the script, the cues, and the page together.
|
|
108
|
+
|
|
109
|
+
| File | What it holds |
|
|
110
|
+
|---|---|
|
|
111
|
+
| `script.md` | What the voice says, under one `## N. Title` heading per section. |
|
|
112
|
+
| `decktalk.toml` | The project file. It ties each section to a page or to a clip of your own. |
|
|
113
|
+
| `cues.json` | The phrase that each reveal starts on. |
|
|
114
|
+
| A page in `deck/` | The slides, as plain HTML. |
|
|
115
|
+
|
|
116
|
+
The `narrate` stage writes a words file with the start and end of every spoken word. If a cue phrase is not in the spoken words, the build stops and names the cue. [Your first deck](https://docs.decktalk.app/guides/first-deck) writes one section in all four files.
|
|
117
|
+
|
|
118
|
+
## Why the cuts are exact
|
|
119
|
+
|
|
120
|
+
<picture>
|
|
121
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/alignment-dark.svg">
|
|
122
|
+
<img alt="A strip of recorded frames. Three magenta cover frames come first, and a line marks t=0 at the first clean frame. Under the strip, the narration "A bowl. A ball. Watch it step down" starts at t=0. Dashed leads join "bowl" and "ball" to the outlined frames where the bowl and then the ball appear." src="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/alignment-light.svg" width="100%">
|
|
123
|
+
</picture>
|
|
124
|
+
|
|
125
|
+
A browser does not start recording at a known time, so DeckTalk does not use a timer. The recorder covers the page in magenta until the narration starts. The first frame without magenta is narration t=0, on Linux, macOS, and Windows.
|
|
126
|
+
|
|
127
|
+
`decktalk verify` then measures every reveal in the finished video. This sample comes from a silent build of the scaffold.
|
|
128
|
+
|
|
129
|
+
<!-- sample: decktalk verify 1:1.1bowl 3:3.4name 4:4.1words, silent build of the scaffold (cue table only) -->
|
|
130
|
+
```text
|
|
131
|
+
check cue at chg % ctl % offset a/v result
|
|
132
|
+
1:1.1bowl 1.25 1.25 1.05 0.00 -10ms -9ms changed
|
|
133
|
+
3:3.4name 71.98 110.58 2.77 0.00 +20ms +11ms changed
|
|
134
|
+
4:4.1words 14.31 172.99 1.47 0.00 +10ms -11ms changed
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
The offset column is the time from the cue time to the onset of the reveal, in milliseconds. [Verify](https://docs.decktalk.app/reference/verify) defines every column and limit.
|
|
138
|
+
|
|
139
|
+
## Requirements and costs
|
|
140
|
+
|
|
141
|
+
- **Software.** DeckTalk needs Python 3.12 or later, on Linux, macOS, or Windows. `decktalk setup` downloads the rest.
|
|
142
|
+
- **Accounts.** A silent build needs no account. A voiced build needs an ElevenLabs API key and a voice id.
|
|
143
|
+
- **Cost.** Every ElevenLabs plan can call the API. The free plan has limits for a video you publish.
|
|
144
|
+
|
|
145
|
+
[Requirements and costs](https://docs.decktalk.app/requirements) lists every download and every command that spends credits.
|
|
146
|
+
|
|
147
|
+
## How it compares
|
|
148
|
+
|
|
149
|
+
| Tool | Timing comes from | Slides are | After you edit one sentence |
|
|
150
|
+
|---|---|---|---|
|
|
151
|
+
| **DeckTalk** | the spoken words, one time per word | your HTML | DeckTalk voices one section again. `build --only N` records only that section. |
|
|
152
|
+
| Remotion, Motion Canvas | frame numbers or seconds in code, by default | code | You time the change again by hand and render again. |
|
|
153
|
+
| Manim | seconds in code, or bookmarks in the narration with manim-voiceover | code | With manim-voiceover, bookmarks follow the new text. You still render the scene again in Python. |
|
|
154
|
+
| Descript | a recording you made | your screen | Overdub voices the new words. The screen recording does not move with them. |
|
|
155
|
+
| Synthesia, HeyGen | the avatar's speech | their avatar and scenes | You generate the video again. |
|
|
156
|
+
|
|
157
|
+
The [FAQ](https://docs.decktalk.app/help/faq#how-is-this-different-from-the-other-tools) has the full comparison. Every build also gives you these parts:
|
|
158
|
+
|
|
159
|
+
- **A free silent build.** Every stage runs with no key, and a click marks each word.
|
|
160
|
+
- **Cached narration.** DeckTalk voices a section again only when it changes.
|
|
161
|
+
- **Captions and chapters.** Every build writes SRT, VTT, and chapters.
|
|
162
|
+
- **A soundscape.** Add [an underscore, an ambience bed, and sound effects](https://docs.decktalk.app/concepts/sound).
|
|
163
|
+
- **Loudness.** DeckTalk normalizes the mix to -16 LUFS.
|
|
164
|
+
- **Checked output.** `check` and `verify` catch bad recordings and late reveals.
|
|
165
|
+
|
|
166
|
+
## Status and support
|
|
167
|
+
|
|
168
|
+
DeckTalk is alpha, and a minor release can still break things. One person maintains it.
|
|
169
|
+
|
|
170
|
+
CI runs the unit tests and a full offline build on Linux for every push to `main` and every pull request. [CONTRIBUTING](https://github.com/jacobcbeaudin/decktalk/blob/main/CONTRIBUTING.md#what-ci-runs) lists the macOS and Windows runs.
|
|
171
|
+
|
|
172
|
+
- Report bugs and ask questions in [Issues](https://github.com/jacobcbeaudin/decktalk/issues).
|
|
173
|
+
- Report a vulnerability privately. [SECURITY.md](https://github.com/jacobcbeaudin/decktalk/blob/main/SECURITY.md) explains how.
|
|
174
|
+
- The [changelog](https://docs.decktalk.app/changelog) lists every release.
|
|
175
|
+
|
|
176
|
+
## Documentation
|
|
177
|
+
|
|
178
|
+
The docs are at **[docs.decktalk.app](https://docs.decktalk.app)**.
|
|
179
|
+
|
|
180
|
+
- **Install and build a first video:** [Quickstart](https://docs.decktalk.app/quickstart)
|
|
181
|
+
- **Write your own section:** [Your first deck](https://docs.decktalk.app/guides/first-deck)
|
|
182
|
+
- **Give an agent the whole contract:** [Reference card for agents](https://docs.decktalk.app/reference/card)
|
|
183
|
+
|
|
184
|
+
## Contributing
|
|
185
|
+
|
|
186
|
+
To work on DeckTalk itself, start with [CONTRIBUTING.md](https://github.com/jacobcbeaudin/decktalk/blob/main/CONTRIBUTING.md).
|
|
187
|
+
|
|
188
|
+
<p align="center">Apache-2.0. Made by <a href="https://github.com/jacobcbeaudin">Jacob Beaudin</a>.</p>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
DeckTalk is licensed under Apache-2.0 (see LICENSE). This file lists the third-party software that DeckTalk depends on, downloads, or embeds, and the license of each.
|
|
4
|
+
|
|
5
|
+
| Component | How DeckTalk uses it | License |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| [Playwright](https://playwright.dev/python/) | Playwright is a Python dependency. It drives headless Chromium to record pages and take screenshots. | Apache-2.0 |
|
|
8
|
+
| Chromium (headless shell) | `decktalk setup` downloads it through Playwright. | BSD-3-Clause and the licenses of its components |
|
|
9
|
+
| [static-ffmpeg](https://github.com/zackees/static_ffmpeg) | static-ffmpeg is a Python dependency. It downloads the ffmpeg and ffprobe binaries into the Python environment, and `decktalk setup` runs that download ahead of time. | BSD-3-Clause |
|
|
10
|
+
| [ffmpeg](https://ffmpeg.org/) source | DeckTalk runs ffmpeg as a separate process to cut, mix, and analyze audio and video. DeckTalk does not link against ffmpeg. | LGPL-2.1-or-later |
|
|
11
|
+
| ffmpeg builds for Linux, Windows, and Intel macOS | static-ffmpeg fetches these builds. They include libx264 and use `--enable-gpl --enable-version3 --enable-libx264`. | GPL-3.0-or-later |
|
|
12
|
+
| ffmpeg build for Apple silicon macOS | static-ffmpeg fetches this build. It includes libx264 and uses `--enable-gpl --enable-libx264`. | GPL-2.0-or-later |
|
|
13
|
+
| [Inter Tight](https://rsms.me/inter/) | The scaffold deck bundles the latin and greek woff2 subsets in `deck/fonts/`, with `InterTight-OFL.txt`. A subset is also embedded in the README graphics under `assets/`. | SIL Open Font License 1.1 |
|
|
14
|
+
| [Inter](https://rsms.me/inter/) | The scaffold deck bundles the latin and greek woff2 subsets in `deck/fonts/`, with `Inter-OFL.txt`. | SIL Open Font License 1.1 |
|
|
15
|
+
| [JetBrains Mono](https://www.jetbrains.com/lp/mono/) | The scaffold deck bundles the latin and greek woff2 subsets in `deck/fonts/`, with `JetBrainsMono-OFL.txt`. | SIL Open Font License 1.1 |
|
|
16
|
+
| [KaTeX](https://katex.org/) | KaTeX typesets equations in the scaffold deck. `decktalk setup` downloads a release into a per-user cache, and `decktalk init` copies it into `deck/katex/`. | MIT |
|
|
17
|
+
| [ElevenLabs](https://elevenlabs.io/) | ElevenLabs is a web API for speech, sound effects, and music. DeckTalk calls it with your own key, under your own account terms. | ElevenLabs terms of service |
|
|
18
|
+
|
|
19
|
+
Notes:
|
|
20
|
+
|
|
21
|
+
- DeckTalk uses an ffmpeg on your PATH only when static-ffmpeg cannot give one. To use a build of your own, set `DECKTALK_FFMPEG` and `DECKTALK_FFPROBE`.
|
|
22
|
+
- The wheel does not include KaTeX. If the KaTeX download fails, `decktalk setup` warns and continues. If KaTeX is not cached, `decktalk init` warns, and the pages load KaTeX from a CDN.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "decktalk"
|
|
3
|
-
version = "0.
|
|
4
|
-
description = "Narrated presentations, cut to the word
|
|
3
|
+
version = "0.2.0"
|
|
4
|
+
description = "Narrated presentations, cut to the word. A markdown script, an ElevenLabs voice, and HTML slides go in, and one mp4 comes out."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
7
7
|
license = "Apache-2.0"
|
|
@@ -17,6 +17,14 @@ keywords = [
|
|
|
17
17
|
"video",
|
|
18
18
|
"slides",
|
|
19
19
|
"text-to-speech",
|
|
20
|
+
"markdown",
|
|
21
|
+
"video-generation",
|
|
22
|
+
"explainer-video",
|
|
23
|
+
"lesson",
|
|
24
|
+
"screencast",
|
|
25
|
+
"word-timestamps",
|
|
26
|
+
"playwright",
|
|
27
|
+
"ffmpeg",
|
|
20
28
|
]
|
|
21
29
|
classifiers = [
|
|
22
30
|
"Development Status :: 3 - Alpha",
|
|
@@ -87,5 +95,8 @@ python-version = "3.12"
|
|
|
87
95
|
|
|
88
96
|
[tool.pytest.ini_options]
|
|
89
97
|
testpaths = ["tests"]
|
|
90
|
-
markers = [
|
|
91
|
-
|
|
98
|
+
markers = [
|
|
99
|
+
"browser: needs headless Chromium (run `decktalk setup` first)",
|
|
100
|
+
"media: runs the ffmpeg that `decktalk setup` fetches",
|
|
101
|
+
]
|
|
102
|
+
addopts = "-m 'not browser and not media'"
|
|
@@ -1,13 +1,28 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "decktalk"
|
|
3
|
-
version = "0.
|
|
4
|
-
description = "Narrated presentations, cut to the word
|
|
3
|
+
version = "0.2.0"
|
|
4
|
+
description = "Narrated presentations, cut to the word. A markdown script, an ElevenLabs voice, and HTML slides go in, and one mp4 comes out."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
7
7
|
license = "Apache-2.0"
|
|
8
8
|
license-files = ["LICENSE", "NOTICE", "THIRD_PARTY_NOTICES.md"]
|
|
9
9
|
authors = [{ name = "Jacob Beaudin" }]
|
|
10
|
-
keywords = [
|
|
10
|
+
keywords = [
|
|
11
|
+
"presentation",
|
|
12
|
+
"narration",
|
|
13
|
+
"elevenlabs",
|
|
14
|
+
"video",
|
|
15
|
+
"slides",
|
|
16
|
+
"text-to-speech",
|
|
17
|
+
"markdown",
|
|
18
|
+
"video-generation",
|
|
19
|
+
"explainer-video",
|
|
20
|
+
"lesson",
|
|
21
|
+
"screencast",
|
|
22
|
+
"word-timestamps",
|
|
23
|
+
"playwright",
|
|
24
|
+
"ffmpeg",
|
|
25
|
+
]
|
|
11
26
|
classifiers = [
|
|
12
27
|
"Development Status :: 3 - Alpha",
|
|
13
28
|
"Environment :: Console",
|
|
@@ -60,5 +75,8 @@ python-version = "3.12"
|
|
|
60
75
|
|
|
61
76
|
[tool.pytest.ini_options]
|
|
62
77
|
testpaths = ["tests"]
|
|
63
|
-
markers = [
|
|
64
|
-
|
|
78
|
+
markers = [
|
|
79
|
+
"browser: needs headless Chromium (run `decktalk setup` first)",
|
|
80
|
+
"media: runs the ffmpeg that `decktalk setup` fetches",
|
|
81
|
+
]
|
|
82
|
+
addopts = "-m 'not browser and not media'"
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""DeckTalk: narrated presentation videos, cut to the word.
|
|
2
|
+
|
|
3
|
+
Public API. The file formats and the page contract are covered by the changelog: a change
|
|
4
|
+
to them bumps the minor version and ships with a migration note. The Python names below may
|
|
5
|
+
still move, and a rename is a breaking change once the project leaves the 0.x series.
|
|
6
|
+
|
|
7
|
+
Project, Section types, Settings, load_settings
|
|
8
|
+
project tables: Voice, Mix, Soundscape, Transition
|
|
9
|
+
errors: DeckTalkError, ConfigError, MissingInputError, ProviderError, ToolError
|
|
10
|
+
artifacts: Manifest, Timeline, Beats, Word, Sidecar
|
|
11
|
+
stages: narrate, resolve_beats, record, measure, check, assemble, verify, shoot,
|
|
12
|
+
soundscape, build, status
|
|
13
|
+
results: NarrateResult, BeatsResult, Recording, LeadMeasurement, RecordingCheck,
|
|
14
|
+
AssembleResult, VerifyResult, SoundscapeItem, BuildResult, StatusReport
|
|
15
|
+
speech: SpeechProvider, SpeechRequest, register
|
|
16
|
+
|
|
17
|
+
Everything under decktalk.media, everything under decktalk.providers other than the
|
|
18
|
+
three speech names above, and every name starting with an underscore is internal.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
24
|
+
|
|
25
|
+
from .artifacts import Beats, Manifest, Sidecar, Timeline, Word
|
|
26
|
+
from .config import Settings, load_settings
|
|
27
|
+
from .errors import ConfigError, DeckTalkError, MissingInputError, ProviderError, ToolError
|
|
28
|
+
from .project import ClipSection, Mix, PageSection, Project, Section, Soundscape, Transition, Voice
|
|
29
|
+
from .providers.speech import SpeechProvider, SpeechRequest, register
|
|
30
|
+
from .stages import (
|
|
31
|
+
AssembleResult,
|
|
32
|
+
BeatsResult,
|
|
33
|
+
BuildResult,
|
|
34
|
+
LeadMeasurement,
|
|
35
|
+
NarrateResult,
|
|
36
|
+
Recording,
|
|
37
|
+
RecordingCheck,
|
|
38
|
+
SoundscapeItem,
|
|
39
|
+
VerifyResult,
|
|
40
|
+
assemble,
|
|
41
|
+
build,
|
|
42
|
+
check,
|
|
43
|
+
measure,
|
|
44
|
+
narrate,
|
|
45
|
+
record,
|
|
46
|
+
resolve_beats,
|
|
47
|
+
shoot,
|
|
48
|
+
soundscape,
|
|
49
|
+
verify,
|
|
50
|
+
)
|
|
51
|
+
from .status import StatusReport, status
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
__version__ = version("decktalk")
|
|
55
|
+
except PackageNotFoundError: # running from a checkout without an install
|
|
56
|
+
__version__ = "0+unknown"
|
|
57
|
+
|
|
58
|
+
__all__ = [
|
|
59
|
+
"AssembleResult",
|
|
60
|
+
"Beats",
|
|
61
|
+
"BeatsResult",
|
|
62
|
+
"BuildResult",
|
|
63
|
+
"ClipSection",
|
|
64
|
+
"ConfigError",
|
|
65
|
+
"DeckTalkError",
|
|
66
|
+
"LeadMeasurement",
|
|
67
|
+
"Manifest",
|
|
68
|
+
"MissingInputError",
|
|
69
|
+
"Mix",
|
|
70
|
+
"NarrateResult",
|
|
71
|
+
"PageSection",
|
|
72
|
+
"Project",
|
|
73
|
+
"ProviderError",
|
|
74
|
+
"Recording",
|
|
75
|
+
"RecordingCheck",
|
|
76
|
+
"Section",
|
|
77
|
+
"Settings",
|
|
78
|
+
"Sidecar",
|
|
79
|
+
"Soundscape",
|
|
80
|
+
"SoundscapeItem",
|
|
81
|
+
"SpeechProvider",
|
|
82
|
+
"SpeechRequest",
|
|
83
|
+
"StatusReport",
|
|
84
|
+
"Timeline",
|
|
85
|
+
"ToolError",
|
|
86
|
+
"Transition",
|
|
87
|
+
"VerifyResult",
|
|
88
|
+
"Voice",
|
|
89
|
+
"Word",
|
|
90
|
+
"__version__",
|
|
91
|
+
"assemble",
|
|
92
|
+
"build",
|
|
93
|
+
"check",
|
|
94
|
+
"load_settings",
|
|
95
|
+
"measure",
|
|
96
|
+
"narrate",
|
|
97
|
+
"record",
|
|
98
|
+
"register",
|
|
99
|
+
"resolve_beats",
|
|
100
|
+
"shoot",
|
|
101
|
+
"soundscape",
|
|
102
|
+
"status",
|
|
103
|
+
"verify",
|
|
104
|
+
]
|