Skip to main content

A pixel-art cassette tape labelled saidby

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.

PyPI CI License

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-offline enforces 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

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.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for saidby 0.4.4
File Size Uploaded
saidby-0.4.4.tar.gz 88.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for saidby 0.4.4
File Interpreter ABI Platform
saidby-0.4.4-py3-none-any.whl Python 3 none any Details

Total release size: 212.3 kB

Release files / saidby-0.4.4.tar.gz

Download URL saidby-0.4.4.tar.gz
Size 88.4 kB
Tags Source
SHA-256 checksum
How to use checksums
1ddfa0a25218026ebab5bd3bc0974393e377f108c5818eff41f2175e1c8bed7f
BLAKE2b-256 checksum
How to use checksums
50e2127b93ea3ce3faa43076cb88c5d51a8d728232a80d1ed49f3d2b84917301
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.4-py3-none-any.whl

Download URL saidby-0.4.4-py3-none-any.whl
Size 123.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
aca89e025dd1046b78f82352a9c6c356b5dce80cdbedefa6d1b025c5c60dc8de
BLAKE2b-256 checksum
How to use checksums
04a1f822edb3e79b0dc6b782f539734c0e7c783c9d0671551802d043faa5d058
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 history Release notifications | RSS feed

This release

0.4.4 This release

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.1.0

2 release files

0.0.1

2 release 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