Turn any audio (or video) into a TTS training dataset: drop files in, press Start, get clean
sentence-length clips with matching transcripts and a Hugging Face-ready metadata.csv.
- Transcribes with faster-whisper (CTranslate2) using word-level timestamps — any language, CPU or NVIDIA GPU, models download on first use.
- Splits by sentence (
.!?in any script, numbers like3.5never split). Short sentences are merged with the next one, overlong ones are split at the longest pause; clips always end at the last word, never at the next word's start. - Filters with YAMNet (AudioSet classifier, runs on onnxruntime): music, singing, speech over music, noise, silence — plus Whisper's own word confidence and optional drop first/last segments for intros / outros.
- Exports each clip with boundary buffers that extend into the surrounding pause but never into the neighbouring
word, silence trimming, stray-fragment removal and optional cutoff detection (clips with a clipped first/last word
are skipped or tagged
_CUTSTART/_CUTEND).
output/
audio/ speaker_0001.wav … (wav / flac / mp3, original or chosen sample rate)
transcripts/ speaker_0001.txt …
metadata.csv file_name,transcription,duration <- Hugging Face AudioFolder
metadata.json full per-clip info (confidence, classification scores, flags)
manifest.txt audio|transcript pairs
logs/
Grab a prebuilt binary from the latest release (Windows / Linux / macOS, no Python needed), or run from source:
pip install -r requirements.txt
python speech_splitter_gui.py # GUI (run.cmd / run.sh do the same)
python speech_splitter.py --help # CLI
You also need FFmpeg in PATH or next to the app for anything other than plain WAV input.
faster-whisper runs on CUDA 12 and needs cuBLAS 12 + cuDNN 9. Either pip install -r requirements-cuda.txt,
or use Model → Download CUDA libraries in the app (official NVIDIA wheels from PyPI, ~1 GB, resumable, stored in a
cuda folder next to the app). The Model tab shows the GPU, the driver and which libraries were found; leave Device
on auto. Expect ~10–30× realtime with large-v3-turbo on a mid-range card vs ~1–3× on a CPU with small.
| Tab | |
|---|---|
| Model | model (any size or Hugging Face repo id), language / auto-detect, device, compute type, beam size, VAD, initial prompt, model folder, transcription cache, YAMNet + CUDA downloads, GPU status |
| Segmentation | min / max clip length, merge short sentences, what to do with overlong ones (split / tag / skip), start & end buffers, cutoff detection (mode, sensitivity, skip / tag / keep) |
| Quality | min word confidence, music / mixed / noise / silence thresholds, edge-segment removal |
| Export | output folder, speaker id (numbering continues across runs), wav / flac / mp3, sample rate, silence trimming, fragment removal |
Presets menu: Fast / Balanced / Strict, plus save / load / import / export your own and save as defaults.
Transcriptions are cached next to the source as <file>.transcription.json (tagged with the model used) — re-running
with different segmentation / filter settings is instant.
python speech_splitter.py audiobook/ -o dataset --model large-v3 --language cs --speaker-id jan \
--min-length 1.5 --max-length 12 --check-cutoff --filter-noise --min-confidence 0.6
All GUI options exist as flags (--help). Folders are searched recursively.
- Words still clipped? Lower
--cutoff-sensitivity, or raise the buffers a little (they can't cut into words anyway). - Too many clips rejected? Raise
--music-threshold/--mixed-threshold, lower--min-confidence, or turn off--filter-noisefor room-tone recordings. - Proper names wrong? Put them into the initial prompt; Whisper copies their spelling.
- Garbage at file edges (jingles, "thanks for listening")? Drop first / last segments.
- The
tools/folder has helpers for chunking large datasets into parquet shards and converting wav → mp3.
pip install -r requirements.txt pyinstaller && python build.py produces dist/speech-splitter-<version>-<os>-<arch>.
The GitHub workflow builds all three platforms on every tag and attaches them to the release; the Linux build runs a
headless self-test (SPEECH_SPLITTER_SELFTEST=<audio file>).
- Helper processes (ffmpeg / ffprobe decoders started by pydub, nvidia-smi) are tracked and killed when the app quits, is stopped, or crashes — Windows Job object, Linux parent-death signal
- No partial output files: clips, transcripts, metadata.csv / metadata.json / manifest.txt, the transcription cache and presets are written to a temporary name and renamed into place when complete; the run log is
.log.partuntil the run finishes - Adding files or folders never queues the same path twice (status bar reports "n already in queue")
- Folder scans, the queue, output listings and presets use natural order (
take2 < take10)
- faster-whisper replaces WhisperX (no torch / pyannote; word timestamps built in; CUDA libraries downloadable in-app)
- YAMNet runs on onnxruntime instead of TensorFlow — the app is a ~270 MB standalone download instead of a Python 3.10 virtualenv with 5 GB of dependencies
- new GUI in the style of whisperer / videer: queue with per-file status, live progress, presets, GPU panel, model downloads
- sentence splitting works for all languages (was ASCII-only); short sentences are merged instead of dropped;
long sentences are split at pauses instead of just being tagged
_LONG - end buffers no longer cut into the next word;
metadata.csvis now valid for Hugging Face AudioFolder (audio/…paths,transcriptioncolumn); transcription cache is invalidated when the model changes - fixed: the CLI could not start (duplicate
--check-cutoff/--cutoff-actionflags, missing--min-confidence), crash when YAMNet was unavailable, filter silence and trim silence toggles being ignored - DeepFilterNet enhancement was removed (needed torch and a CPU-only monkeypatch); run your audio through a denoiser first if you need it