saidby
Offline-first diarized transcription: a command-line tool and Python library that turns any recording into a transcript with speakers, timestamps, glossary-aware spelling and one audio track per speaker.
Status: pre-alpha. Version 0.4.0 transcribes with faster-whisper, diarizes with Nemotron-3,
aligns words to speakers, renders one aligned audio track per speaker and names speakers by
voiceprint (with recorded consent). With a directory it also spells your names and terms
correctly (biased pass, transplant and an optional local LLM, all logged). A second
diarizer can be compared on the same audio, and saidby review walks through the uncertain
spans so you can type the right text and feed new spellings back into the directory.
Install
NVIDIA GPU (driver 580 or newer):
uv tool install 'saidby[cuda]'
No GPU (or you do not want the CUDA libraries, about 1 GB): use the CPU build of PyTorch.
uv tool install saidby --index https://download.pytorch.org/whl/cpu --index-strategy unsafe-best-match
You also need ffmpeg on the PATH. Then check the machine:
saidby doctor # what works, what does not, and how to fix it
saidby doctor --smoke # also runs a short transcription with the tiny model
On a 20-thread desktop CPU, large-v3 (int8) transcribed at 0.39 times real time and the diarizer at
0.05, so a 15-minute call takes about 6 minutes. Slower CPUs can use a smaller model with
--asr-model tiny or small. If a GPU is present but not usable, saidby falls back to the CPU and
says why in manifest.json.
Quick start
saidby models pull --all # one-time download, the only step that uses the network
saidby process call.m4a --out out/ --language es
Each recording gets its own folder under out/:
| File | Content |
|---|---|
manifest.json |
Engines, models and versions per stage, speakers, timings |
transcript.txt |
[HH:MM:SS] Speaker: text |
transcript.vtt |
WebVTT with <v Speaker> voice tags |
transcript.words.json |
Word-level transcript with timestamps and speaker labels |
corrections.jsonl |
Every glossary change, accepted or rejected, with its reason |
diarization.rttm |
Standard "who spoke when" |
speakers/<id>.flac |
One track per speaker, same length as the original, silent elsewhere |
logs/run.log, logs/telemetry.jsonl |
Local log and closed-field telemetry |
To name speakers, enroll them once and pass the directory:
saidby enroll out/call --speaker SPEAKER_00=ana --directory directory.yaml \
--consent-source "signed form" --consent-declared-by "Ana Gomez"
saidby process next-call.m4a --out out/ --directory directory.yaml
A failed run keeps .work/ so the next run resumes from the last finished stage;
--keep-intermediates keeps it on success too. See docs/cli.md.
Measuring
saidby eval scores a run against a hand-corrected reference and arbitrates blind the spans where two
systems disagree. See docs/evaluation.md.
Models
Models are never bundled and are only downloaded by an explicit command:
saidby models list
saidby models pull --all
Processing always runs offline (HF_HUB_OFFLINE=1). A Hugging Face token (HF_TOKEN)
is needed only for gated models such as pyannote/speaker-diarization-community-1;
if the conditions have not been accepted, the error shows the URL where to accept them.
Privacy
- No telemetry leaves the machine. Logs and telemetry are written locally and never contain transcript text, names, glossary terms or voiceprints.
- A test suite blocks any non-loopback network access during processing.
License
Apache-2.0. See LICENSE, NOTICE and MODEL_LICENSES.md. Contributions are accepted under the Developer Certificate of Origin.
Metadata
Release files for saidby 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| saidby-0.4.1.tar.gz | 83.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| saidby-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 202.6 kB
Release files / saidby-0.4.1.tar.gz
| Download URL | saidby-0.4.1.tar.gz |
|---|---|
| Size | 83.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
553277f75ed133dd44a1bf7df5c42287153d8f8c0f5de825f92f98f0f192fb35
|
|
BLAKE2b-256 checksum How to use checksums |
2f46eada5bea10b28a40d48064c138de591199d577c7ee5131d88b7c1f4e4749
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / saidby-0.4.1-py3-none-any.whl
| Download URL | saidby-0.4.1-py3-none-any.whl |
|---|---|
| Size | 119.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
234e9ed8433b57927006321cee226fa307c2b7b1355e9a4e38e6b69900e7395b
|
|
BLAKE2b-256 checksum How to use checksums |
3fe17efb1d5d36f94aab8044e17809f53864945a856c05a157b1c41d4e0f01bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|