Skip to main content

clicketysplit

Python 3.10+ License: MIT

A browser-based segmentation tool for speech recordings of single-word or pseudoword stimuli.

You give it a stimulus list (real words, pseudowords, whatever your study needs) and a recording. It proposes word boundaries, auto-labels each token from the stimulus list, and gives you a keyboard-driven review UI with fuzzy-match autocomplete for quick corrections. The output is a folder of cleanly-sliced WAV tokens plus a manifest — optionally a Praat TextGrid so the source recording stays usable in Praat.

The review step: waveform, spectrogram, and token list

Why this exists

This replaces the Praat-based workflow used in many labs for a specific kind of session: single-word tokens read in sequence, which may or may not be real words. That workflow means hand-placing every boundary and typing every filename. For a 60-word list at 2 repetitions each, that's 120 slices per speaker per condition, by hand.

  • Stimulus-list aware. You declare what the speaker was supposed to say. Autocomplete and auto-labeling work just as well on pseudowords as on real words — there's no dictionary or forced aligner assuming English lexical items, and nothing to transcribe.
  • Fast labeling. The tool knows the presentation order (massed aaa bbb ccc, spaced abc abc abc, or random) and how many repetitions to expect, so it prefills the label it expects next. When the speaker skips ahead, adds an extra repetition, or fumbles a take, the prediction adapts instead of dragging every later label out of alignment.
  • Praat-compatible, but you only touch Praat if you want to. Optional TextGrid export keeps the source recording useful for follow-up acoustic analysis. The fast path — propose → review → export — never opens Praat.
  • Browser UI, local backend. It's a Python package: pip install, run clicketysplit serve, and the segmenter opens in your browser. No Electron, no cloud, no audio leaves your machine.

Install

pip install clicketysplit          # core: Silero VAD, WAV/FLAC/OGG
pip install 'clicketysplit[all]'   # + webrtcvad, denoise, MP3, Praat TextGrid

Requires Python 3.10+. Optional system dependency: ffmpeg (only for MP3/M4A input).

Try it

clicketysplit demo

This boots a throwaway two-condition experiment against bundled audio — one clip of real words, one of pseudowords — so you can walk the whole flow without setting anything up.

Using it on your own recordings

clicketysplit serve

Point the setup wizard at a folder of recordings laid out by speaker and condition:

recordings/
├── f1/
│   ├── real_words/session.wav
│   └── pseudowords/session.wav
└── f2/
    └── ...
stimulus_lists/
├── real_words.txt
└── pseudowords.txt

The wizard discovers speakers and conditions, matches each condition to a stimulus list by name, and lets you set detection parameters. Then:

Review — one token at a time, entirely from the keyboard:

Key Action
Space / Tab play the token
Enter accept the label
R reject (not a token)
S skip
/ previous / next
A add a token the detector missed
L edit the label
scroll / shift+drag zoom / pan the waveform

To adjust a slice, click anywhere on the waveform or the spectrogram to move the nearest boundary there, or drag a boundary handle if you want to see it move. Both views are interactive and stay in sync.

Select — pick which repetitions of each word to keep.

The select step

Export — write the tokens out.

The export step

Each speaker × condition gets a tokens/ directory of WAVs, a token_manifest.json, and a tokens.csv. Sessions autosave and survive a restart or a move of the experiment folder — paths in the config are relative.

How it works

  1. Detect. Silero voice-activity detection proposes speech regions, with optional background-noise reduction first. (webrtcvad is available as an alternative via the [webrtc] extra.)
  2. Refine. Each boundary is snapped to the nearest energy-envelope crossing, so slices start and end on the actual acoustic edge rather than the VAD frame grid.
  3. Classify. Segments are typed by duration: too short is noise, too long is crosstalk, the rest are words. The crosstalk cutoff adapts to the recording's own median word length, so a slow speaker's ordinary words don't get thrown out.
  4. Label. For massed recordings, word tokens are clustered on the pauses between them — speakers pause briefly between repetitions of a word and longer when moving to the next one — and each cluster takes the next stimulus in the list.
  5. Review and export. You correct what the detector got wrong, choose the takes you want, and export.

Provenance

The detection engine is a port of a tool I wrote and used to cut the stimuli for a word learning experiment — recording each word and pseudoword several times, then slicing out the individual tokens to use as experimental items. The port is verified against the original's output on those recordings: identical segment counts and 0.0 ms boundary differences. The labeling behavior — how the predicted label reacts when a speaker skips ahead, adds a repetition, or produces a token you reject — is ported from the same tool, having been shaped by actually using it for hours.

The bundled demo audio is my own voice, cut from those recordings.

Development

pip install -e '.[dev,all]'
pytest                       # Python tests
cd frontend && npm ci && npm run test && npm run build

The Python and TypeScript labeling implementations share tests/labeling_test_vectors.json; both suites replay it so the two can't drift.

License

MIT — see LICENSE.

Download files

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

Source Distribution

clicketysplit-0.1.0.tar.gz (1.6 MB view details)

Uploaded Source

Built Distribution

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

clicketysplit-0.1.0-py3-none-any.whl (951.2 kB view details)

Uploaded Python 3

File details

Details for the file clicketysplit-0.1.0.tar.gz.

File metadata

  • Download URL: clicketysplit-0.1.0.tar.gz
  • Upload date:
  • Size: 1.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for clicketysplit-0.1.0.tar.gz
Algorithm Hash digest
SHA256 3f794b43785703ca17d930aad20b5c7bdce8440a7acd1270ecf3aaf8af6ad4d6
MD5 e94bd10eb1b45fc5056720ae4431ae9e
BLAKE2b-256 20713e79672a5bc9a45f737723ae0a08d5a5bd88281120dec6dffff37dbf69bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for clicketysplit-0.1.0.tar.gz:

Publisher: release.yml on daphneweiss/clicketysplit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file clicketysplit-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: clicketysplit-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 951.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for clicketysplit-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 62a200cfc98707f3764d75001435535a482769495a472324edd369955f1629e7
MD5 74d98ee325b0178118082bfcb025c2f4
BLAKE2b-256 6e4e42e06d87bde81e9ec3da786ea71de3d112a80aba4d8955d892c710153183

See more details on using hashes here.

Provenance

The following attestation bundles were made for clicketysplit-0.1.0-py3-none-any.whl:

Publisher: release.yml on daphneweiss/clicketysplit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page