Tools for processing Epic Web course recordings
A Bun-based CLI that processes recorded course videos by splitting chapter markers into separate files, trimming silence at the start/end, and optionally removing spoken "Jarvis" command windows via transcript timestamps refined with audio-based silence detection.
--whisper-binary-path if not on PATH.cache/whispercpp/ggml-small.en.bin.cache/silero-vad.onnx on first usebun install
bun src/process-course-video.ts "/path/to/input.mp4" "/path/to/output" \
--enable-transcription \
--keep-intermediates \
--write-logs
Start the Remix-powered UI shell (watch mode enabled):
bun run app:start
To preload a local video path for the UI:
bun run app:start -- --video-path "/path/to/video.mp4"
Then open http://localhost:3000. Use -- --port, -- --host, or
-- --video-path to override the defaults.
| Option | Alias | Description | Default |
|---|---|---|---|
input | Input video file (mp4/mkv) | required | |
outputDir | Output directory | output | |
--min-chapter-seconds | -m | Skip chapters shorter than this | 15 |
--dry-run | -d | Don't write files or run ffmpeg | false |
--keep-intermediates | -k | Keep .tmp files for debugging | false |
--write-logs | -l | Write log files for skips/fallbacks | false |
--enable-transcription | Run whisper.cpp for command detection | false | |
--whisper-model-path | Path to whisper.cpp model file | auto-cached | |
--whisper-language | Language for whisper | en | |
--whisper-binary-path | Path to whisper-cli binary | system PATH | |
--chapter | -c | Filter to specific chapters (see below) | all |
The --chapter flag supports flexible selection:
--chapter 4--chapter 4-6--chapter 4-* (chapter 4 to end)--chapter 4,6,9-12Chapter numbers are 1-based by default.
Final files are written to the output directory with names like:
chapter-01-intro.mp4
chapter-02-getting-started.mp4
chapter-03-custom-title.mp4
When --keep-intermediates is enabled, intermediate files go to output/.tmp/:
| File Pattern | Description |
|---|---|
*-raw.mp4 | Raw chapter clip with initial padding removed |
*-normalized.mp4 | Audio normalized (highpass + denoise + loudnorm) |
*-transcribe.wav | Audio extracted for whisper |
*-transcribe.json | Whisper JSON output |
*-transcribe.txt | Whisper text output |
*-splice-*.mp4 | Segments before/after command windows |
*-spliced.mp4 | Concatenated output after command removal |
*.log | Per-chapter skip/fallback logs |
process-summary.log | Overall processing summary |
Commands are spoken in the format: jarvis <command> ... thanks
| Command | Effect |
|---|---|
jarvis bad take thanks | Skip the entire chapter |
jarvis filename my-custom-name thanks | Rename output file |
The command window (from "jarvis" to "thanks") is removed from the final video.
Implementation notes and pipeline details live in docs/README.md.
This project was created using bun init in bun v1.3.1. Bun
is a fast all-in-one JavaScript runtime.