saidby
Who said what, and when, on your own machine.
saidby turns a recording (a phone call, a meeting, an interview) into a transcript with speakers, timestamps and one audio track per person. It knows your names and terms, can put names on voices (with consent), checks its own work, and never sends your audio anywhere. It is a command-line tool and a Python library.
recording → ingest → transcribe → diarize → align → tracks → results folder
│ │
[bias + transplant] [compare] [identify] [correct] [ ] = only when you ask for it
How the stages fit, with diagrams: how it works.
What you get
saidby process call.m4a --out out/ --language es
out/call/
├── transcript.txt [00:00:03] Ana Gómez: Hola, buenas tardes...
├── transcript.vtt subtitles with the speaker in every cue
├── transcript.words.json every word with start, end, confidence and speaker
├── diarization.rttm standard "who spoke when"
├── speakers/ana.flac one track per person, aligned with the original
├── corrections.jsonl every spelling change, with the reason
├── manifest.json which engines, models and versions produced it
└── logs/ timings and counts, never your text
Why saidby
- It stays on your machine. Processing runs offline. Models are downloaded once, on request.
A test fails the build if anything but loopback is touched, and
--strict-offlineenforces it on every run. - It spells your world right. Give it a YAML file with your people, your product names and your slang. A second recognition pass finds them and a strictly limited local LLM can fix what is left. Every change is logged and can be traced.
- It names the speakers. Voiceprints, created only with a recorded consent, put names on voices. A person split in two, or a wrong name, is one command to fix.
- It checks itself, and lets you check it. Two diarizers can vote; a review mode walks you through the doubtful spans and feeds your fixes back into the directory. A built-in bench (blind A/B arbitration, pre-set margins) lets you test the claims on your own recordings.
Install
NVIDIA GPU (driver 580 or newer):
uv tool install 'saidby[cuda]'
No GPU, or to skip about 1 GB of CUDA libraries:
uv tool install saidby --index https://download.pytorch.org/whl/cpu --index-strategy unsafe-best-match
You also need ffmpeg. Then:
saidby doctor # checks the machine and says how to fix what is missing
saidby models pull --all # downloads the models, about 3.5 GB; the only step using the network
Quick start
saidby process call.m4a --out out/ --language es # transcript, speakers, tracks
saidby directory init directory.yaml # your people and terms
saidby process call.m4a --out out/ --directory directory.yaml # with your spelling
saidby review out/call --directory directory.yaml # fix the doubtful spans
The getting started guide walks through each step, including naming the speakers.
Commands
Transcribe process recordings in, transcripts with speakers and tracks out
After a run review correct the spans the machine is unsure about
enroll store a voiceprint (needs recorded consent)
speakers show, rename and merge speakers without reprocessing
Set up doctor check this machine and say how to fix what is missing
models list, download and locate models
directory validate or create the directory file
Measure eval score a run; arbitrate differences between two systems blind
saidby --help and saidby COMMAND --help explain every option with examples. The full list is
in the command reference.
How well does it work?
On two real phone calls in Spanish, against WhisperX: the terms of the directory spelled right 85 to 88 % of the time against 12 to 20 %, speakers given the right name where WhisperX gives anonymous labels, and speaker confusion of 2 to 3 % against 6 to 11 %. On plain word errors it is a draw (ahead on one call, five words behind on the other). That is two calls and one language, so read the benchmarks, including what they do not show.
A 15-minute call takes about 2 minutes with a laptop GPU (5 with the glossary and the LLM) and about 6 to 7 on a 20-thread CPU.
Status
Pre-alpha. It is developed and tested on Linux; the command line and the output formats may still
change between 0.x versions. It is a library and a CLI, not a service: there is no server and no
account. Models keep their own licenses (saidby models licenses).
Documentation
- Getting started
- How it works: stages, glossary, voiceprints, privacy
- Commands and the reference
- Directory format
- Glossary and LLM correction
- Review and comparison
- Evaluation and benchmarks
- Troubleshooting
Contributing and license
See CONTRIBUTING.md: contributions are signed off under the Developer Certificate of Origin. Apache-2.0, see LICENSE, NOTICE and MODEL_LICENSES.md.
Metadata
Release files for saidby 0.4.3
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.3.tar.gz | 87.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| saidby-0.4.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 211.2 kB
Release files / saidby-0.4.3.tar.gz
| Download URL | saidby-0.4.3.tar.gz |
|---|---|
| Size | 87.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6b7e5f7c1c139dd02d435884f2533b442b9e872471098d2c4f145b463a422425
|
|
BLAKE2b-256 checksum How to use checksums |
7888d3465410e39d11dac286599542c400bb763f417dfad2f418a9bcbc8f205c
|
| 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.3-py3-none-any.whl
| Download URL | saidby-0.4.3-py3-none-any.whl |
|---|---|
| Size | 123.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2562782595747ad441986f24ca73f3355e062729e26200eededc9ab7ac24f985
|
|
BLAKE2b-256 checksum How to use checksums |
14720f0d6affc59248a366089c434f377f138bf875f4152e7d34ee2c8fa2a0dc
|
| 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}
|