decktalk 0.2.1__tar.gz → 0.4.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.4.0/NOTICE +4 -0
- decktalk-0.4.0/PKG-INFO +184 -0
- decktalk-0.4.0/README.md +152 -0
- decktalk-0.4.0/THIRD_PARTY_NOTICES.md +22 -0
- {decktalk-0.2.1 → decktalk-0.4.0}/pyproject.toml +37 -17
- decktalk-0.4.0/pyproject.toml.orig +115 -0
- decktalk-0.4.0/src/decktalk/__init__.py +139 -0
- decktalk-0.4.0/src/decktalk/artifacts/__init__.py +45 -0
- decktalk-0.4.0/src/decktalk/artifacts/cue_times.py +82 -0
- decktalk-0.4.0/src/decktalk/artifacts/cuts.py +107 -0
- decktalk-0.4.0/src/decktalk/artifacts/progress.py +59 -0
- decktalk-0.4.0/src/decktalk/artifacts/recordings.py +173 -0
- decktalk-0.4.0/src/decktalk/artifacts/takes.py +139 -0
- decktalk-0.4.0/src/decktalk/artifacts/words.py +40 -0
- decktalk-0.4.0/src/decktalk/captions/__init__.py +35 -0
- decktalk-0.4.0/src/decktalk/captions/files.py +143 -0
- decktalk-0.4.0/src/decktalk/captions/layout.py +217 -0
- decktalk-0.4.0/src/decktalk/cli/__init__.py +122 -0
- decktalk-0.4.0/src/decktalk/cli/authoring.py +179 -0
- decktalk-0.4.0/src/decktalk/cli/dispatch.py +40 -0
- decktalk-0.4.0/src/decktalk/cli/envelope.py +265 -0
- decktalk-0.4.0/src/decktalk/cli/machine.py +56 -0
- decktalk-0.4.0/src/decktalk/cli/options.py +242 -0
- decktalk-0.4.0/src/decktalk/cli/output.py +412 -0
- decktalk-0.4.0/src/decktalk/cli/parser.py +378 -0
- decktalk-0.4.0/src/decktalk/cli/schema.py +643 -0
- decktalk-0.4.0/src/decktalk/cli/video.py +240 -0
- decktalk-0.4.0/src/decktalk/errors.py +78 -0
- decktalk-0.4.0/src/decktalk/jsonio.py +173 -0
- decktalk-0.4.0/src/decktalk/katex/LICENSE +21 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- decktalk-0.4.0/src/decktalk/katex/katex.min.css +1 -0
- decktalk-0.4.0/src/decktalk/katex/katex.min.js +1 -0
- decktalk-0.4.0/src/decktalk/media/__init__.py +6 -0
- decktalk-0.4.0/src/decktalk/media/audio.py +213 -0
- {decktalk-0.2.1 → decktalk-0.4.0}/src/decktalk/media/browser.py +111 -78
- decktalk-0.4.0/src/decktalk/media/encode.py +89 -0
- decktalk-0.4.0/src/decktalk/media/ffmpeg.py +186 -0
- decktalk-0.4.0/src/decktalk/media/frames.py +173 -0
- decktalk-0.4.0/src/decktalk/media/origin.py +297 -0
- decktalk-0.4.0/src/decktalk/model/__init__.py +51 -0
- decktalk-0.4.0/src/decktalk/model/cues.py +162 -0
- decktalk-0.4.0/src/decktalk/model/document.py +504 -0
- decktalk-0.4.0/src/decktalk/model/env.py +91 -0
- decktalk-0.4.0/src/decktalk/model/markers.py +86 -0
- decktalk-0.4.0/src/decktalk/model/project.py +332 -0
- decktalk-0.4.0/src/decktalk/model/script.py +203 -0
- decktalk-0.4.0/src/decktalk/model/workspace.py +120 -0
- decktalk-0.4.0/src/decktalk/pagescan.py +149 -0
- decktalk-0.4.0/src/decktalk/pipeline.py +95 -0
- decktalk-0.4.0/src/decktalk/runtime/decktalk-probe.js +175 -0
- decktalk-0.4.0/src/decktalk/runtime/decktalk-runtime.js +1039 -0
- decktalk-0.4.0/src/decktalk/scaffold/__init__.py +36 -0
- decktalk-0.4.0/src/decktalk/scaffold/doctor.py +103 -0
- decktalk-0.4.0/src/decktalk/scaffold/examples.py +72 -0
- decktalk-0.4.0/src/decktalk/scaffold/init.py +120 -0
- decktalk-0.4.0/src/decktalk/scaffold/install.py +34 -0
- decktalk-0.4.0/src/decktalk/scaffold/skills.py +80 -0
- decktalk-0.4.0/src/decktalk/secret.py +53 -0
- decktalk-0.4.0/src/decktalk/settings.py +484 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-build/SKILL.md +109 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-build/references/json-fields.md +127 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-cues/SKILL.md +91 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-cues/references/cue-phrases.md +92 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-fix/SKILL.md +81 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-fix/references/verdicts.md +73 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-revise/SKILL.md +96 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-revise/references/claims-ledger.md +54 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-revise/references/edit-scope.md +64 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-script/SKILL.md +93 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-script/references/claims-ledger.md +54 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-script/references/spoken-math.md +75 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-slide/SKILL.md +90 -0
- decktalk-0.4.0/src/decktalk/skills/decktalk-slide/references/slide-patterns.md +123 -0
- decktalk-0.4.0/src/decktalk/speech/__init__.py +113 -0
- decktalk-0.4.0/src/decktalk/speech/elevenlabs.py +179 -0
- decktalk-0.4.0/src/decktalk/speech/http.py +153 -0
- decktalk-0.4.0/src/decktalk/stages/__init__.py +49 -0
- decktalk-0.4.0/src/decktalk/stages/align/__init__.py +369 -0
- decktalk-0.4.0/src/decktalk/stages/align/pages.py +71 -0
- decktalk-0.4.0/src/decktalk/stages/assemble/__init__.py +271 -0
- decktalk-0.4.0/src/decktalk/stages/assemble/cut.py +264 -0
- decktalk-0.4.0/src/decktalk/stages/assemble/loudness.py +76 -0
- decktalk-0.4.0/src/decktalk/stages/assemble/mix.py +343 -0
- decktalk-0.4.0/src/decktalk/stages/assemble/publish.py +373 -0
- decktalk-0.4.0/src/decktalk/stages/build.py +303 -0
- decktalk-0.4.0/src/decktalk/stages/clip.py +303 -0
- decktalk-0.4.0/src/decktalk/stages/narrate/__init__.py +255 -0
- decktalk-0.4.0/src/decktalk/stages/narrate/plan.py +255 -0
- decktalk-0.4.0/src/decktalk/stages/narrate/script_rules.py +83 -0
- decktalk-0.4.0/src/decktalk/stages/narrate/takes.py +155 -0
- decktalk-0.4.0/src/decktalk/stages/preflight/__init__.py +288 -0
- decktalk-0.4.0/src/decktalk/stages/preflight/freeze.py +177 -0
- decktalk-0.4.0/src/decktalk/stages/preflight/scan.py +244 -0
- decktalk-0.4.0/src/decktalk/stages/record/__init__.py +275 -0
- decktalk-0.4.0/src/decktalk/stages/record/capture.py +312 -0
- decktalk-0.4.0/src/decktalk/stages/record/checks.py +87 -0
- decktalk-0.4.0/src/decktalk/stages/record/start.py +58 -0
- decktalk-0.4.0/src/decktalk/stages/screenshots.py +201 -0
- {decktalk-0.2.1 → decktalk-0.4.0}/src/decktalk/stages/soundscape.py +92 -42
- decktalk-0.4.0/src/decktalk/stages/status.py +351 -0
- decktalk-0.4.0/src/decktalk/stages/verify/__init__.py +232 -0
- decktalk-0.4.0/src/decktalk/stages/verify/measure.py +259 -0
- decktalk-0.4.0/src/decktalk/stages/verify/plan.py +235 -0
- decktalk-0.4.0/src/decktalk/stages/verify/seams.py +184 -0
- decktalk-0.4.0/src/decktalk/template/AGENTS.md +11 -0
- decktalk-0.4.0/src/decktalk/template/examples/lesson/cues.json +57 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/deck/lesson.html +72 -68
- decktalk-0.4.0/src/decktalk/template/examples/lesson/decktalk.toml +34 -0
- decktalk-0.4.0/src/decktalk/template/examples/lesson/gitignore +5 -0
- decktalk-0.4.0/src/decktalk/template/examples/lesson/script.md +35 -0
- decktalk-0.4.0/src/decktalk/template/starter/cues.json +34 -0
- decktalk-0.4.0/src/decktalk/template/starter/deck/index.html +149 -0
- decktalk-0.4.0/src/decktalk/template/starter/decktalk.toml +57 -0
- decktalk-0.4.0/src/decktalk/template/starter/env.example +4 -0
- decktalk-0.4.0/src/decktalk/template/starter/gitignore +5 -0
- decktalk-0.4.0/src/decktalk/template/starter/script.md +29 -0
- decktalk-0.4.0/src/decktalk/tomlmap.py +288 -0
- decktalk-0.4.0/src/decktalk/toolchain/__init__.py +6 -0
- decktalk-0.4.0/src/decktalk/toolchain/assets.py +83 -0
- decktalk-0.4.0/src/decktalk/toolchain/cache.py +25 -0
- decktalk-0.4.0/src/decktalk/toolchain/ffmpeg_fetch.py +246 -0
- decktalk-0.4.0/src/decktalk/verdicts.py +254 -0
- decktalk-0.2.1/NOTICE +0 -4
- decktalk-0.2.1/PKG-INFO +0 -221
- decktalk-0.2.1/README.md +0 -188
- decktalk-0.2.1/THIRD_PARTY_NOTICES.md +0 -22
- decktalk-0.2.1/pyproject.toml.orig +0 -82
- decktalk-0.2.1/src/decktalk/__init__.py +0 -104
- decktalk-0.2.1/src/decktalk/_env.py +0 -70
- decktalk-0.2.1/src/decktalk/_report.py +0 -167
- decktalk-0.2.1/src/decktalk/artifacts.py +0 -523
- decktalk-0.2.1/src/decktalk/cli.py +0 -482
- decktalk-0.2.1/src/decktalk/config.py +0 -275
- decktalk-0.2.1/src/decktalk/errors.py +0 -23
- decktalk-0.2.1/src/decktalk/media/__init__.py +0 -1
- decktalk-0.2.1/src/decktalk/media/ffmpeg.py +0 -461
- decktalk-0.2.1/src/decktalk/project.py +0 -626
- decktalk-0.2.1/src/decktalk/providers/__init__.py +0 -1
- decktalk-0.2.1/src/decktalk/providers/_http.py +0 -78
- decktalk-0.2.1/src/decktalk/providers/elevenlabs.py +0 -136
- decktalk-0.2.1/src/decktalk/providers/speech.py +0 -66
- decktalk-0.2.1/src/decktalk/runtime/decktalk-runtime.js +0 -579
- decktalk-0.2.1/src/decktalk/scaffold.py +0 -264
- decktalk-0.2.1/src/decktalk/stages/__init__.py +0 -34
- decktalk-0.2.1/src/decktalk/stages/assemble.py +0 -861
- decktalk-0.2.1/src/decktalk/stages/beats.py +0 -357
- decktalk-0.2.1/src/decktalk/stages/build.py +0 -106
- decktalk-0.2.1/src/decktalk/stages/measure.py +0 -203
- decktalk-0.2.1/src/decktalk/stages/narrate.py +0 -522
- decktalk-0.2.1/src/decktalk/stages/record.py +0 -150
- decktalk-0.2.1/src/decktalk/stages/shots.py +0 -110
- decktalk-0.2.1/src/decktalk/stages/verify.py +0 -519
- decktalk-0.2.1/src/decktalk/status.py +0 -149
- decktalk-0.2.1/src/decktalk/template/cues.json +0 -113
- decktalk-0.2.1/src/decktalk/template/deck/edit/after-first.webp +0 -0
- decktalk-0.2.1/src/decktalk/template/deck/edit/after-last-864.webp +0 -0
- decktalk-0.2.1/src/decktalk/template/deck/edit/after-last.webp +0 -0
- decktalk-0.2.1/src/decktalk/template/deck/edit/before-first.webp +0 -0
- decktalk-0.2.1/src/decktalk/template/deck/edit/before-last-864.webp +0 -0
- decktalk-0.2.1/src/decktalk/template/deck/edit/before-last.webp +0 -0
- decktalk-0.2.1/src/decktalk/template/deck/edit/s3-last.webp +0 -0
- decktalk-0.2.1/src/decktalk/template/deck/index.html +0 -790
- decktalk-0.2.1/src/decktalk/template/decktalk.toml +0 -154
- decktalk-0.2.1/src/decktalk/template/gitignore +0 -8
- decktalk-0.2.1/src/decktalk/template/media/markers.json +0 -8
- decktalk-0.2.1/src/decktalk/template/script.md +0 -88
- decktalk-0.2.1/src/decktalk/verdicts.py +0 -101
- {decktalk-0.2.1 → decktalk-0.4.0}/LICENSE +0 -0
- {decktalk-0.2.1 → decktalk-0.4.0}/src/decktalk/__main__.py +0 -0
- {decktalk-0.2.1 → decktalk-0.4.0}/src/decktalk/py.typed +0 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/deck/fonts/Inter-OFL.txt +0 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/deck/fonts/Inter-greek.woff2 +0 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/deck/fonts/Inter-latin.woff2 +0 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/deck/fonts/InterTight-OFL.txt +0 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/deck/fonts/InterTight-greek.woff2 +0 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/deck/fonts/InterTight-latin.woff2 +0 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/deck/fonts/JetBrainsMono-OFL.txt +0 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/deck/fonts/JetBrainsMono-greek.woff2 +0 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/deck/fonts/JetBrainsMono-latin.woff2 +0 -0
- {decktalk-0.2.1/src/decktalk/template → decktalk-0.4.0/src/decktalk/template/examples/lesson}/env.example +0 -0
decktalk-0.4.0/NOTICE
ADDED
decktalk-0.4.0/PKG-INFO
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: decktalk
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Summary: Every picture lands on its word, and you edit the video like a doc. DeckTalk turns a markdown script, HTML slides, and your voice into one narrated mp4, for technical tutorials, product demos, and lessons.
|
|
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,<2
|
|
25
|
+
Requires-Python: >=3.12
|
|
26
|
+
Project-URL: Homepage, https://decktalk.ai
|
|
27
|
+
Project-URL: Repository, https://github.com/jacobcbeaudin/decktalk
|
|
28
|
+
Project-URL: Documentation, https://docs.decktalk.ai
|
|
29
|
+
Project-URL: Issues, https://github.com/jacobcbeaudin/decktalk/issues
|
|
30
|
+
Project-URL: Changelog, https://github.com/jacobcbeaudin/decktalk/blob/main/CHANGELOG.md
|
|
31
|
+
Description-Content-Type: text/markdown
|
|
32
|
+
|
|
33
|
+
<h1 align="center">DeckTalk</h1>
|
|
34
|
+
|
|
35
|
+
<p align="center"><b>Every picture lands on its word, and you edit the video like a doc.</b><br>
|
|
36
|
+
Before this, one wrong word meant editing, rendering and recording the whole thing again.</p>
|
|
37
|
+
|
|
38
|
+
<p align="center"><a href="https://decktalk.ai/#watch"><img src="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/site/media/decktalk-demo-poster.jpg" alt="The first frame of the demo film. A blue ball rests in a bowl above three boxes named one, two, and three, and under each box is the second at which its word was spoken." width="100%"></a><br>
|
|
39
|
+
DeckTalk built this film from text files, and every reveal in it starts on its word. <a href="https://decktalk.ai/#watch">Watch it with the sound on at decktalk.ai</a>.</p>
|
|
40
|
+
|
|
41
|
+
<p align="center">
|
|
42
|
+
<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>
|
|
43
|
+
<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>
|
|
44
|
+
<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>
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
<p align="center">
|
|
48
|
+
<a href="https://docs.decktalk.ai/quickstart">Quickstart</a> ·
|
|
49
|
+
<a href="https://docs.decktalk.ai">Docs</a> ·
|
|
50
|
+
<a href="https://docs.decktalk.ai/requirements">Requirements and costs</a> ·
|
|
51
|
+
<a href="https://docs.decktalk.ai/reference/card">Reference card for agents</a> ·
|
|
52
|
+
<a href="https://docs.decktalk.ai/changelog">Changelog</a><br>
|
|
53
|
+
Agents can read <a href="https://docs.decktalk.ai/llms.txt">llms.txt</a>.
|
|
54
|
+
</p>
|
|
55
|
+
|
|
56
|
+
## What it is
|
|
57
|
+
|
|
58
|
+
DeckTalk makes a narrated video from a markdown script and plain HTML slides. Your cloned voice reads the script and comes back with a time for every word, so each reveal starts on the word that introduces it. The script and the slides are text you keep in a repository, so you change a sentence and build again, the way you would change a doc or a codebase.
|
|
59
|
+
|
|
60
|
+
Four things are different from a video editor, a slide tool, or an animation library.
|
|
61
|
+
|
|
62
|
+
- **Every reveal is cut to the spoken word.** A cue names a phrase, not a second, so a reveal follows the narration wherever the voice puts it. `decktalk verify` measures every reveal in the finished video, and in the [sample below](#why-the-cuts-are-exact) each one lands within one frame of its word.
|
|
63
|
+
- **A changed sentence voices only its own section again.** DeckTalk caches every section's narration by its text and voice settings, so an edit spends credits only on the sections that changed. `build --only N` records only the section you name.
|
|
64
|
+
- **The whole video is text.** You write four files, and an agent can write them too. There is no timeline to drag and no project file a person cannot read.
|
|
65
|
+
- **Your coding agent already knows how to drive it.** `decktalk init` installs six skills into the project, one each for the script, the slides, the cues, the build, the fixes and a revision, so an agent writes the files, reads the JSON every command prints, and fixes what it finds. [The skills](https://docs.decktalk.ai/agents/skills) lists them.
|
|
66
|
+
|
|
67
|
+
## Who it is for
|
|
68
|
+
|
|
69
|
+
- **Technical tutorials.** A viewer watches a walkthrough whose commands and screenshots match the version she just installed. When the library changes, you change the sentence and build again.
|
|
70
|
+
- **Product demos.** A viewer sees the feature narrated over the screen it runs on, with every callout landing on the word that names it.
|
|
71
|
+
- **Lessons.** A viewer follows an explanation in which each idea appears as it is spoken, so nothing is read ahead.
|
|
72
|
+
|
|
73
|
+
Internal presentations and estimation walkthroughs run the same pipeline. Neither has a shipped example yet.
|
|
74
|
+
|
|
75
|
+
## Make your first video
|
|
76
|
+
|
|
77
|
+
You need Python 3.12 or later. These commands use `uv`, a Python package manager. If you use pipx, run `pipx install decktalk` instead of the first line.
|
|
78
|
+
|
|
79
|
+
```console
|
|
80
|
+
uv tool install decktalk
|
|
81
|
+
decktalk install
|
|
82
|
+
decktalk init my-lesson && cd my-lesson
|
|
83
|
+
decktalk build --no-voice
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
`decktalk install` downloads Chromium and ffmpeg one time per machine, and on Linux it asks for sudo. `decktalk init` writes the starter, a working three-section project with one equation, and nothing in it has to be deleted first. The build without voice needs no account, ends with `built`, and prints the path of `build/out/my-lesson.mp4`. Recording runs in real time, so the build takes about a minute and makes a 44 second video.
|
|
87
|
+
|
|
88
|
+
To hear it in your own voice, copy `.env.example` to `.env`, set your ElevenLabs API key and voice id, and run `decktalk build`. DeckTalk never prints the key. A voiced build of the starter sends about 420 characters, and `decktalk narrate --dry-run` prices that run before it starts. Every build writes the mp4, SRT and VTT captions, a chapter per section and a transcript page. [What spends credits](https://docs.decktalk.ai/requirements#what-spends-credits) lists the cost of every command.
|
|
89
|
+
|
|
90
|
+
The [quickstart](https://docs.decktalk.ai/quickstart) shows the output of each step and [what the starter shows](https://docs.decktalk.ai/quickstart#what-the-starter-shows). If you try DeckTalk on one section of something you teach, tell me in [Issues](https://github.com/jacobcbeaudin/decktalk/issues) what stopped you.
|
|
91
|
+
|
|
92
|
+
## What you write
|
|
93
|
+
|
|
94
|
+
<picture>
|
|
95
|
+
<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">
|
|
96
|
+
<source media="(max-width: 640px)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-light-stacked.svg">
|
|
97
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-dark.svg">
|
|
98
|
+
<img alt="Four panels. Write shows a markdown script. Narrate runs narrate and align, and shows a tick for every word of "A bowl. A ball. One. Two, three." with 1.25 over "bowl". Record runs record, 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%">
|
|
99
|
+
</picture>
|
|
100
|
+
|
|
101
|
+
You write four files. One cue id per reveal, such as `1.1script`, ties the script, the cues, and the page together.
|
|
102
|
+
|
|
103
|
+
| File | What it holds |
|
|
104
|
+
|---|---|
|
|
105
|
+
| `script.md` | What the voice says, under one `## N. Title` heading per section. |
|
|
106
|
+
| `decktalk.toml` | The project file. It ties each section to a page or to a clip of your own. |
|
|
107
|
+
| `cues.json` | The phrase that each reveal starts on. |
|
|
108
|
+
| A page in `deck/` | The slides, as plain HTML. |
|
|
109
|
+
|
|
110
|
+
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.ai/guides/first-deck) writes one section in all four files.
|
|
111
|
+
|
|
112
|
+
## Why the cuts are exact
|
|
113
|
+
|
|
114
|
+
<picture>
|
|
115
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/alignment-dark.svg">
|
|
116
|
+
<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%">
|
|
117
|
+
</picture>
|
|
118
|
+
|
|
119
|
+
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.
|
|
120
|
+
|
|
121
|
+
`decktalk verify` then measures every reveal in the finished video. This sample comes from a build without voice of the starter, and one frame lasts 40 ms.
|
|
122
|
+
|
|
123
|
+
<!-- sample: decktalk verify 1:1.1title 2:2.1code 3:3.1make, build without voice of the starter (cue table only) -->
|
|
124
|
+
```text
|
|
125
|
+
check cue at chg % ctl % offset a/v result
|
|
126
|
+
1:1.1title 0.70 0.70 1.87 0.00 +20ms +16ms changed
|
|
127
|
+
2:2.1code 8.93 23.41 10.79 0.00 -10ms -34ms changed
|
|
128
|
+
3:3.1make 8.21 38.13 10.85 0.00 -10ms +8ms changed
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
The offset column is the time from the cue time to the onset of the reveal, in milliseconds. [Verify](https://docs.decktalk.ai/reference/verify) defines every column and limit.
|
|
132
|
+
|
|
133
|
+
## Requirements and costs
|
|
134
|
+
|
|
135
|
+
- **Software.** DeckTalk needs Python 3.12 or later, on Linux, macOS, or Windows. `decktalk install` downloads the rest.
|
|
136
|
+
- **Accounts.** A build without voice needs no account. A voiced build needs an ElevenLabs API key and a voice id.
|
|
137
|
+
- **Cost.** Every ElevenLabs plan can call the API. The free plan has limits for a video you publish.
|
|
138
|
+
|
|
139
|
+
[Requirements and costs](https://docs.decktalk.ai/requirements) lists every download and every command that spends credits.
|
|
140
|
+
|
|
141
|
+
## How it compares
|
|
142
|
+
|
|
143
|
+
| Tool | Timing comes from | Slides are | After you edit one sentence |
|
|
144
|
+
|---|---|---|---|
|
|
145
|
+
| **DeckTalk** | the spoken words, one time per word | your HTML | DeckTalk voices one section again. `build --only N` records only that section. |
|
|
146
|
+
| Remotion, Motion Canvas | frame numbers or seconds in code, by default | code | You time the change again by hand and render again. |
|
|
147
|
+
| 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. |
|
|
148
|
+
| Descript | a recording you made | your screen | Overdub voices the new words. The screen recording does not move with them. |
|
|
149
|
+
| Synthesia, HeyGen | the avatar's speech | their avatar and scenes | You generate the video again. |
|
|
150
|
+
|
|
151
|
+
The [FAQ](https://docs.decktalk.ai/help/faq#how-is-this-different-from-the-other-tools) has the full comparison. Every build also gives you these parts:
|
|
152
|
+
|
|
153
|
+
- **A free build without voice.** Every stage runs with no key, and a click marks each word.
|
|
154
|
+
- **Cached narration.** DeckTalk voices a section again only when it changes, and keeps a recording whose page, words and cues have not moved.
|
|
155
|
+
- **Captions, chapters and a transcript.** Every build writes SRT, VTT, chapters and a transcript page.
|
|
156
|
+
- **A soundscape.** Add [music, an ambience bed, and sound effects](https://docs.decktalk.ai/concepts/sound).
|
|
157
|
+
- **Loudness.** DeckTalk normalizes the mix to -16 LUFS.
|
|
158
|
+
- **Checked output.** `record` and `verify` catch bad recordings and late reveals.
|
|
159
|
+
|
|
160
|
+
## Status and support
|
|
161
|
+
|
|
162
|
+
DeckTalk is alpha, and a minor release can still break things. One person maintains it.
|
|
163
|
+
|
|
164
|
+
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.
|
|
165
|
+
|
|
166
|
+
- Report bugs and ask questions in [Issues](https://github.com/jacobcbeaudin/decktalk/issues).
|
|
167
|
+
- Show what you made in [Discussions](https://github.com/jacobcbeaudin/decktalk/discussions).
|
|
168
|
+
- Report a vulnerability privately. [SECURITY.md](https://github.com/jacobcbeaudin/decktalk/blob/main/SECURITY.md) explains how.
|
|
169
|
+
- The [changelog](https://docs.decktalk.ai/changelog) lists every release.
|
|
170
|
+
|
|
171
|
+
## Documentation
|
|
172
|
+
|
|
173
|
+
The docs are at **[docs.decktalk.ai](https://docs.decktalk.ai)**.
|
|
174
|
+
|
|
175
|
+
- **Install and build a first video:** [Quickstart](https://docs.decktalk.ai/quickstart)
|
|
176
|
+
- **Write your own section:** [Your first deck](https://docs.decktalk.ai/guides/first-deck)
|
|
177
|
+
- **Give an agent the whole contract:** [Reference card for agents](https://docs.decktalk.ai/reference/card)
|
|
178
|
+
- **Understand how it is built:** [ARCHITECTURE.md](https://github.com/jacobcbeaudin/decktalk/blob/main/ARCHITECTURE.md) and the [decision notes](https://github.com/jacobcbeaudin/decktalk/tree/main/docs/decisions)
|
|
179
|
+
|
|
180
|
+
## Contributing
|
|
181
|
+
|
|
182
|
+
To work on DeckTalk itself, start with [CONTRIBUTING.md](https://github.com/jacobcbeaudin/decktalk/blob/main/CONTRIBUTING.md).
|
|
183
|
+
|
|
184
|
+
<p align="center">Apache-2.0. Made by <a href="https://github.com/jacobcbeaudin">Jacob Beaudin</a>.</p>
|
decktalk-0.4.0/README.md
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
<h1 align="center">DeckTalk</h1>
|
|
2
|
+
|
|
3
|
+
<p align="center"><b>Every picture lands on its word, and you edit the video like a doc.</b><br>
|
|
4
|
+
Before this, one wrong word meant editing, rendering and recording the whole thing again.</p>
|
|
5
|
+
|
|
6
|
+
<p align="center"><a href="https://decktalk.ai/#watch"><img src="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/site/media/decktalk-demo-poster.jpg" alt="The first frame of the demo film. A blue ball rests in a bowl above three boxes named one, two, and three, and under each box is the second at which its word was spoken." width="100%"></a><br>
|
|
7
|
+
DeckTalk built this film from text files, and every reveal in it starts on its word. <a href="https://decktalk.ai/#watch">Watch it with the sound on at decktalk.ai</a>.</p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<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>
|
|
11
|
+
<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>
|
|
12
|
+
<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>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<a href="https://docs.decktalk.ai/quickstart">Quickstart</a> ·
|
|
17
|
+
<a href="https://docs.decktalk.ai">Docs</a> ·
|
|
18
|
+
<a href="https://docs.decktalk.ai/requirements">Requirements and costs</a> ·
|
|
19
|
+
<a href="https://docs.decktalk.ai/reference/card">Reference card for agents</a> ·
|
|
20
|
+
<a href="https://docs.decktalk.ai/changelog">Changelog</a><br>
|
|
21
|
+
Agents can read <a href="https://docs.decktalk.ai/llms.txt">llms.txt</a>.
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
## What it is
|
|
25
|
+
|
|
26
|
+
DeckTalk makes a narrated video from a markdown script and plain HTML slides. Your cloned voice reads the script and comes back with a time for every word, so each reveal starts on the word that introduces it. The script and the slides are text you keep in a repository, so you change a sentence and build again, the way you would change a doc or a codebase.
|
|
27
|
+
|
|
28
|
+
Four things are different from a video editor, a slide tool, or an animation library.
|
|
29
|
+
|
|
30
|
+
- **Every reveal is cut to the spoken word.** A cue names a phrase, not a second, so a reveal follows the narration wherever the voice puts it. `decktalk verify` measures every reveal in the finished video, and in the [sample below](#why-the-cuts-are-exact) each one lands within one frame of its word.
|
|
31
|
+
- **A changed sentence voices only its own section again.** DeckTalk caches every section's narration by its text and voice settings, so an edit spends credits only on the sections that changed. `build --only N` records only the section you name.
|
|
32
|
+
- **The whole video is text.** You write four files, and an agent can write them too. There is no timeline to drag and no project file a person cannot read.
|
|
33
|
+
- **Your coding agent already knows how to drive it.** `decktalk init` installs six skills into the project, one each for the script, the slides, the cues, the build, the fixes and a revision, so an agent writes the files, reads the JSON every command prints, and fixes what it finds. [The skills](https://docs.decktalk.ai/agents/skills) lists them.
|
|
34
|
+
|
|
35
|
+
## Who it is for
|
|
36
|
+
|
|
37
|
+
- **Technical tutorials.** A viewer watches a walkthrough whose commands and screenshots match the version she just installed. When the library changes, you change the sentence and build again.
|
|
38
|
+
- **Product demos.** A viewer sees the feature narrated over the screen it runs on, with every callout landing on the word that names it.
|
|
39
|
+
- **Lessons.** A viewer follows an explanation in which each idea appears as it is spoken, so nothing is read ahead.
|
|
40
|
+
|
|
41
|
+
Internal presentations and estimation walkthroughs run the same pipeline. Neither has a shipped example yet.
|
|
42
|
+
|
|
43
|
+
## Make your first video
|
|
44
|
+
|
|
45
|
+
You need Python 3.12 or later. These commands use `uv`, a Python package manager. If you use pipx, run `pipx install decktalk` instead of the first line.
|
|
46
|
+
|
|
47
|
+
```console
|
|
48
|
+
uv tool install decktalk
|
|
49
|
+
decktalk install
|
|
50
|
+
decktalk init my-lesson && cd my-lesson
|
|
51
|
+
decktalk build --no-voice
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
`decktalk install` downloads Chromium and ffmpeg one time per machine, and on Linux it asks for sudo. `decktalk init` writes the starter, a working three-section project with one equation, and nothing in it has to be deleted first. The build without voice needs no account, ends with `built`, and prints the path of `build/out/my-lesson.mp4`. Recording runs in real time, so the build takes about a minute and makes a 44 second video.
|
|
55
|
+
|
|
56
|
+
To hear it in your own voice, copy `.env.example` to `.env`, set your ElevenLabs API key and voice id, and run `decktalk build`. DeckTalk never prints the key. A voiced build of the starter sends about 420 characters, and `decktalk narrate --dry-run` prices that run before it starts. Every build writes the mp4, SRT and VTT captions, a chapter per section and a transcript page. [What spends credits](https://docs.decktalk.ai/requirements#what-spends-credits) lists the cost of every command.
|
|
57
|
+
|
|
58
|
+
The [quickstart](https://docs.decktalk.ai/quickstart) shows the output of each step and [what the starter shows](https://docs.decktalk.ai/quickstart#what-the-starter-shows). If you try DeckTalk on one section of something you teach, tell me in [Issues](https://github.com/jacobcbeaudin/decktalk/issues) what stopped you.
|
|
59
|
+
|
|
60
|
+
## What you write
|
|
61
|
+
|
|
62
|
+
<picture>
|
|
63
|
+
<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">
|
|
64
|
+
<source media="(max-width: 640px)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-light-stacked.svg">
|
|
65
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/how-it-works-dark.svg">
|
|
66
|
+
<img alt="Four panels. Write shows a markdown script. Narrate runs narrate and align, and shows a tick for every word of "A bowl. A ball. One. Two, three." with 1.25 over "bowl". Record runs record, 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%">
|
|
67
|
+
</picture>
|
|
68
|
+
|
|
69
|
+
You write four files. One cue id per reveal, such as `1.1script`, ties the script, the cues, and the page together.
|
|
70
|
+
|
|
71
|
+
| File | What it holds |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `script.md` | What the voice says, under one `## N. Title` heading per section. |
|
|
74
|
+
| `decktalk.toml` | The project file. It ties each section to a page or to a clip of your own. |
|
|
75
|
+
| `cues.json` | The phrase that each reveal starts on. |
|
|
76
|
+
| A page in `deck/` | The slides, as plain HTML. |
|
|
77
|
+
|
|
78
|
+
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.ai/guides/first-deck) writes one section in all four files.
|
|
79
|
+
|
|
80
|
+
## Why the cuts are exact
|
|
81
|
+
|
|
82
|
+
<picture>
|
|
83
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jacobcbeaudin/decktalk/main/assets/alignment-dark.svg">
|
|
84
|
+
<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%">
|
|
85
|
+
</picture>
|
|
86
|
+
|
|
87
|
+
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.
|
|
88
|
+
|
|
89
|
+
`decktalk verify` then measures every reveal in the finished video. This sample comes from a build without voice of the starter, and one frame lasts 40 ms.
|
|
90
|
+
|
|
91
|
+
<!-- sample: decktalk verify 1:1.1title 2:2.1code 3:3.1make, build without voice of the starter (cue table only) -->
|
|
92
|
+
```text
|
|
93
|
+
check cue at chg % ctl % offset a/v result
|
|
94
|
+
1:1.1title 0.70 0.70 1.87 0.00 +20ms +16ms changed
|
|
95
|
+
2:2.1code 8.93 23.41 10.79 0.00 -10ms -34ms changed
|
|
96
|
+
3:3.1make 8.21 38.13 10.85 0.00 -10ms +8ms changed
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The offset column is the time from the cue time to the onset of the reveal, in milliseconds. [Verify](https://docs.decktalk.ai/reference/verify) defines every column and limit.
|
|
100
|
+
|
|
101
|
+
## Requirements and costs
|
|
102
|
+
|
|
103
|
+
- **Software.** DeckTalk needs Python 3.12 or later, on Linux, macOS, or Windows. `decktalk install` downloads the rest.
|
|
104
|
+
- **Accounts.** A build without voice needs no account. A voiced build needs an ElevenLabs API key and a voice id.
|
|
105
|
+
- **Cost.** Every ElevenLabs plan can call the API. The free plan has limits for a video you publish.
|
|
106
|
+
|
|
107
|
+
[Requirements and costs](https://docs.decktalk.ai/requirements) lists every download and every command that spends credits.
|
|
108
|
+
|
|
109
|
+
## How it compares
|
|
110
|
+
|
|
111
|
+
| Tool | Timing comes from | Slides are | After you edit one sentence |
|
|
112
|
+
|---|---|---|---|
|
|
113
|
+
| **DeckTalk** | the spoken words, one time per word | your HTML | DeckTalk voices one section again. `build --only N` records only that section. |
|
|
114
|
+
| Remotion, Motion Canvas | frame numbers or seconds in code, by default | code | You time the change again by hand and render again. |
|
|
115
|
+
| 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. |
|
|
116
|
+
| Descript | a recording you made | your screen | Overdub voices the new words. The screen recording does not move with them. |
|
|
117
|
+
| Synthesia, HeyGen | the avatar's speech | their avatar and scenes | You generate the video again. |
|
|
118
|
+
|
|
119
|
+
The [FAQ](https://docs.decktalk.ai/help/faq#how-is-this-different-from-the-other-tools) has the full comparison. Every build also gives you these parts:
|
|
120
|
+
|
|
121
|
+
- **A free build without voice.** Every stage runs with no key, and a click marks each word.
|
|
122
|
+
- **Cached narration.** DeckTalk voices a section again only when it changes, and keeps a recording whose page, words and cues have not moved.
|
|
123
|
+
- **Captions, chapters and a transcript.** Every build writes SRT, VTT, chapters and a transcript page.
|
|
124
|
+
- **A soundscape.** Add [music, an ambience bed, and sound effects](https://docs.decktalk.ai/concepts/sound).
|
|
125
|
+
- **Loudness.** DeckTalk normalizes the mix to -16 LUFS.
|
|
126
|
+
- **Checked output.** `record` and `verify` catch bad recordings and late reveals.
|
|
127
|
+
|
|
128
|
+
## Status and support
|
|
129
|
+
|
|
130
|
+
DeckTalk is alpha, and a minor release can still break things. One person maintains it.
|
|
131
|
+
|
|
132
|
+
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.
|
|
133
|
+
|
|
134
|
+
- Report bugs and ask questions in [Issues](https://github.com/jacobcbeaudin/decktalk/issues).
|
|
135
|
+
- Show what you made in [Discussions](https://github.com/jacobcbeaudin/decktalk/discussions).
|
|
136
|
+
- Report a vulnerability privately. [SECURITY.md](https://github.com/jacobcbeaudin/decktalk/blob/main/SECURITY.md) explains how.
|
|
137
|
+
- The [changelog](https://docs.decktalk.ai/changelog) lists every release.
|
|
138
|
+
|
|
139
|
+
## Documentation
|
|
140
|
+
|
|
141
|
+
The docs are at **[docs.decktalk.ai](https://docs.decktalk.ai)**.
|
|
142
|
+
|
|
143
|
+
- **Install and build a first video:** [Quickstart](https://docs.decktalk.ai/quickstart)
|
|
144
|
+
- **Write your own section:** [Your first deck](https://docs.decktalk.ai/guides/first-deck)
|
|
145
|
+
- **Give an agent the whole contract:** [Reference card for agents](https://docs.decktalk.ai/reference/card)
|
|
146
|
+
- **Understand how it is built:** [ARCHITECTURE.md](https://github.com/jacobcbeaudin/decktalk/blob/main/ARCHITECTURE.md) and the [decision notes](https://github.com/jacobcbeaudin/decktalk/tree/main/docs/decisions)
|
|
147
|
+
|
|
148
|
+
## Contributing
|
|
149
|
+
|
|
150
|
+
To work on DeckTalk itself, start with [CONTRIBUTING.md](https://github.com/jacobcbeaudin/decktalk/blob/main/CONTRIBUTING.md).
|
|
151
|
+
|
|
152
|
+
<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 install` downloads it through Playwright. | BSD-3-Clause and the licenses of its components |
|
|
9
|
+
| [ffmpeg](https://ffmpeg.org/) source | DeckTalk runs ffmpeg and ffprobe as separate processes to cut, mix, and analyze audio and video. DeckTalk does not link against ffmpeg. | LGPL-2.1-or-later |
|
|
10
|
+
| ffmpeg 8.1.2 builds for Linux (x86_64 and arm64) and Windows (x86_64) by [BtbN/FFmpeg-Builds](https://github.com/BtbN/FFmpeg-Builds) | `decktalk install` downloads the build for your platform from the release URL pinned in `src/decktalk/media/ffmpeg.py`, checks it against the SHA-256 recorded there, and keeps it in DeckTalk's cache. It is a GPL build: it includes libx264 and uses `--enable-gpl --enable-version3 --enable-libx264`. The wheel never contains it. | GPL-3.0-or-later |
|
|
11
|
+
| ffmpeg 8.1.2 build for Intel macOS by [evermeet.cx](https://evermeet.cx/ffmpeg/) | Downloaded, verified and kept the same way. It is a GPL build: it includes libx264 and uses `--enable-gpl --enable-version3 --enable-libx264`. The wheel never contains it. | GPL-3.0-or-later |
|
|
12
|
+
| ffmpeg 8.1.2 build for Apple silicon macOS by [Martin Riedl](https://ffmpeg.martin-riedl.de/) | Downloaded, verified and kept the same way. It is a GPL build: it includes libx264 and uses `--enable-gpl --enable-version3 --enable-libx264`. The wheel never contains it. | GPL-3.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. The wheel ships one release (`katex.min.js`, `katex.min.css` and the woff2 fonts) under `decktalk/katex/` with its licence file, and `decktalk init` copies it into `deck/katex/`, so no page loads it from a CDN. | 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
|
+
- The ffmpeg build is downloaded at install, or on the first render that needs it, and is never distributed in the wheel or in any DeckTalk package. DeckTalk uses an ffmpeg on your PATH only when the download cannot run or no build is pinned for your platform. To use a build of your own, set `DECKTALK_FFMPEG` and `DECKTALK_FFPROBE`.
|
|
22
|
+
- The wheel includes KaTeX and nothing is downloaded for it.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "decktalk"
|
|
3
|
-
version = "0.
|
|
4
|
-
description = "
|
|
3
|
+
version = "0.4.0"
|
|
4
|
+
description = "Every picture lands on its word, and you edit the video like a doc. DeckTalk turns a markdown script, HTML slides, and your voice into one narrated mp4, for technical tutorials, product demos, and lessons."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
7
7
|
license = "Apache-2.0"
|
|
@@ -41,18 +41,15 @@ classifiers = [
|
|
|
41
41
|
"Topic :: Multimedia :: Video",
|
|
42
42
|
"Topic :: Multimedia :: Sound/Audio :: Speech",
|
|
43
43
|
]
|
|
44
|
-
dependencies = [
|
|
45
|
-
"playwright>=1.50",
|
|
46
|
-
"static-ffmpeg>=2.7",
|
|
47
|
-
]
|
|
44
|
+
dependencies = ["playwright>=1.50,<2"]
|
|
48
45
|
|
|
49
46
|
[[project.authors]]
|
|
50
47
|
name = "Jacob Beaudin"
|
|
51
48
|
|
|
52
49
|
[project.urls]
|
|
53
|
-
Homepage = "https://decktalk.
|
|
50
|
+
Homepage = "https://decktalk.ai"
|
|
54
51
|
Repository = "https://github.com/jacobcbeaudin/decktalk"
|
|
55
|
-
Documentation = "https://docs.decktalk.
|
|
52
|
+
Documentation = "https://docs.decktalk.ai"
|
|
56
53
|
Issues = "https://github.com/jacobcbeaudin/decktalk/issues"
|
|
57
54
|
Changelog = "https://github.com/jacobcbeaudin/decktalk/blob/main/CHANGELOG.md"
|
|
58
55
|
|
|
@@ -63,12 +60,9 @@ decktalk = "decktalk.cli:main"
|
|
|
63
60
|
requires = ["uv_build>=0.8.0,<0.13.0"]
|
|
64
61
|
build-backend = "uv_build"
|
|
65
62
|
|
|
66
|
-
[
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"ruff>=0.11",
|
|
70
|
-
"ty>=0.0.1",
|
|
71
|
-
]
|
|
63
|
+
[tool.uv.build-backend]
|
|
64
|
+
source-exclude = ["**/.DS_Store"]
|
|
65
|
+
wheel-exclude = ["**/.DS_Store"]
|
|
72
66
|
|
|
73
67
|
[tool.ruff]
|
|
74
68
|
line-length = 120
|
|
@@ -95,8 +89,34 @@ python-version = "3.12"
|
|
|
95
89
|
|
|
96
90
|
[tool.pytest.ini_options]
|
|
97
91
|
testpaths = ["tests"]
|
|
92
|
+
consider_namespace_packages = true
|
|
93
|
+
pythonpath = ["tests"]
|
|
98
94
|
markers = [
|
|
99
|
-
"browser: needs headless Chromium (run `decktalk
|
|
100
|
-
"media: runs the ffmpeg that `decktalk
|
|
95
|
+
"browser: needs headless Chromium (run `decktalk install` first)",
|
|
96
|
+
"media: runs the ffmpeg that `decktalk install` fetches",
|
|
97
|
+
"e2e: builds the pipeline fixture in tests/e2e with Chromium and ffmpeg, about a minute",
|
|
98
|
+
"scaffold: records and verifies every packaged project without a voice, about five minutes",
|
|
99
|
+
]
|
|
100
|
+
addopts = "-m 'not browser and not media and not e2e and not scaffold' --strict-markers --import-mode=importlib"
|
|
101
|
+
filterwarnings = ["error"]
|
|
102
|
+
|
|
103
|
+
[tool.coverage.run]
|
|
104
|
+
source = ["decktalk"]
|
|
105
|
+
concurrency = [
|
|
106
|
+
"thread",
|
|
107
|
+
"greenlet",
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
[tool.coverage.report]
|
|
111
|
+
fail_under = 91
|
|
112
|
+
show_missing = false
|
|
113
|
+
skip_empty = true
|
|
114
|
+
|
|
115
|
+
[dependency-groups]
|
|
116
|
+
dev = [
|
|
117
|
+
"pytest>=8",
|
|
118
|
+
"pytest-cov>=6",
|
|
119
|
+
"pytest-timeout>=2.3",
|
|
120
|
+
"ruff>=0.11",
|
|
121
|
+
"ty>=0.0.1",
|
|
101
122
|
]
|
|
102
|
-
addopts = "-m 'not browser and not media'"
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "decktalk"
|
|
3
|
+
version = "0.4.0"
|
|
4
|
+
description = "Every picture lands on its word, and you edit the video like a doc. DeckTalk turns a markdown script, HTML slides, and your voice into one narrated mp4, for technical tutorials, product demos, and lessons."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.12"
|
|
7
|
+
license = "Apache-2.0"
|
|
8
|
+
license-files = ["LICENSE", "NOTICE", "THIRD_PARTY_NOTICES.md"]
|
|
9
|
+
authors = [{ name = "Jacob Beaudin" }]
|
|
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
|
+
]
|
|
26
|
+
classifiers = [
|
|
27
|
+
"Development Status :: 3 - Alpha",
|
|
28
|
+
"Environment :: Console",
|
|
29
|
+
"Intended Audience :: Developers",
|
|
30
|
+
"Intended Audience :: Education",
|
|
31
|
+
"Programming Language :: Python :: 3",
|
|
32
|
+
"Programming Language :: Python :: 3.12",
|
|
33
|
+
"Programming Language :: Python :: 3.13",
|
|
34
|
+
"Programming Language :: Python :: 3.14",
|
|
35
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
36
|
+
"Operating System :: OS Independent",
|
|
37
|
+
"Typing :: Typed",
|
|
38
|
+
"Topic :: Multimedia :: Video",
|
|
39
|
+
"Topic :: Multimedia :: Sound/Audio :: Speech",
|
|
40
|
+
]
|
|
41
|
+
dependencies = ["playwright>=1.50,<2"]
|
|
42
|
+
|
|
43
|
+
[project.urls]
|
|
44
|
+
Homepage = "https://decktalk.ai"
|
|
45
|
+
Repository = "https://github.com/jacobcbeaudin/decktalk"
|
|
46
|
+
Documentation = "https://docs.decktalk.ai"
|
|
47
|
+
Issues = "https://github.com/jacobcbeaudin/decktalk/issues"
|
|
48
|
+
Changelog = "https://github.com/jacobcbeaudin/decktalk/blob/main/CHANGELOG.md"
|
|
49
|
+
|
|
50
|
+
[project.scripts]
|
|
51
|
+
decktalk = "decktalk.cli:main"
|
|
52
|
+
|
|
53
|
+
[build-system]
|
|
54
|
+
requires = ["uv_build>=0.8.0,<0.13.0"]
|
|
55
|
+
build-backend = "uv_build"
|
|
56
|
+
|
|
57
|
+
# `uv build` reads the working tree, so a Finder sidecar next to the template would ship in a wheel
|
|
58
|
+
# cut from a laptop. tests/test_wheel.py checks the built wheel against the files git tracks.
|
|
59
|
+
[tool.uv.build-backend]
|
|
60
|
+
source-exclude = ["**/.DS_Store"]
|
|
61
|
+
wheel-exclude = ["**/.DS_Store"]
|
|
62
|
+
|
|
63
|
+
[dependency-groups]
|
|
64
|
+
dev = [
|
|
65
|
+
"pytest>=8",
|
|
66
|
+
"pytest-cov>=6",
|
|
67
|
+
"pytest-timeout>=2.3",
|
|
68
|
+
"ruff>=0.11",
|
|
69
|
+
"ty>=0.0.1",
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
[tool.ruff]
|
|
73
|
+
line-length = 120
|
|
74
|
+
target-version = "py312"
|
|
75
|
+
|
|
76
|
+
[tool.ruff.lint]
|
|
77
|
+
select = ["E", "F", "W", "I", "B", "UP"]
|
|
78
|
+
|
|
79
|
+
[tool.ruff.lint.per-file-ignores]
|
|
80
|
+
"scripts/*" = ["E501"] # generated CSS and SVG strings
|
|
81
|
+
|
|
82
|
+
[tool.ruff.format]
|
|
83
|
+
quote-style = "double"
|
|
84
|
+
|
|
85
|
+
[tool.ty.environment]
|
|
86
|
+
python-version = "3.12"
|
|
87
|
+
|
|
88
|
+
[tool.pytest.ini_options]
|
|
89
|
+
testpaths = ["tests"]
|
|
90
|
+
# Two modules of the tree are named plan.py, so their mirrored test files share a basename.
|
|
91
|
+
consider_namespace_packages = true
|
|
92
|
+
# tests/ is on the path, so a module that holds pages several test modules share is imported by name.
|
|
93
|
+
pythonpath = ["tests"]
|
|
94
|
+
markers = [
|
|
95
|
+
"browser: needs headless Chromium (run `decktalk install` first)",
|
|
96
|
+
"media: runs the ffmpeg that `decktalk install` fetches",
|
|
97
|
+
"e2e: builds the pipeline fixture in tests/e2e with Chromium and ffmpeg, about a minute",
|
|
98
|
+
"scaffold: records and verifies every packaged project without a voice, about five minutes",
|
|
99
|
+
]
|
|
100
|
+
# A bare `pytest` runs the unit suite alone. Pass -m to pick the slower suites, as scripts/check.py does.
|
|
101
|
+
addopts = "-m 'not browser and not media and not e2e and not scaffold' --strict-markers --import-mode=importlib"
|
|
102
|
+
filterwarnings = ["error"]
|
|
103
|
+
|
|
104
|
+
[tool.coverage.run]
|
|
105
|
+
source = ["decktalk"]
|
|
106
|
+
# Playwright runs every synchronous call on a greenlet, so without this every line after the first
|
|
107
|
+
# page call inside a browser test reads as dead and the floor below would be blind to the recorder.
|
|
108
|
+
concurrency = ["thread", "greenlet"]
|
|
109
|
+
|
|
110
|
+
[tool.coverage.report]
|
|
111
|
+
# The floor is the whole suite with `-m 'not scaffold'`, rounded down, with one point of room for the
|
|
112
|
+
# paths a platform takes and no more. Raise it when coverage grows.
|
|
113
|
+
fail_under = 91
|
|
114
|
+
show_missing = false
|
|
115
|
+
skip_empty = true
|