Audio transcription CLI with speaker identification
Project description
whotalksitron
Audio transcription CLI with speaker identification. Accepts audio files, produces markdown transcripts with speaker-attributed segments and timestamps.
Features
- Multiple inference backends: Gemini via Vertex AI (primary), pyannote+Whisper (local), Whisper-only (Ollama/LM Studio)
- Speaker voiceprint enrollment per podcast — enroll known voices, re-identify them automatically in future episodes
- Markdown output with timestamps and speaker labels
- Machine-parseable progress output for scripting
Installation
Gemini-only (lean, no GPU required):
uv tool install whotalksitron
With local backends (pyannote+faster-whisper, requires GPU or Apple Silicon):
uv tool install whotalksitron --with local
Quickstart
# Transcribe with Gemini (requires API credentials — see docs/gcloud.md)
whotalksitron transcribe episode.mp3 --backend gemini --podcast my-show
# Transcribe with a local backend
whotalksitron transcribe episode.mp3 --backend pyannote
# Enroll a known speaker
whotalksitron enroll --name alice --podcast my-show --sample alice-sample.wav
# Transcribe with speaker identification
whotalksitron transcribe episode.mp3 --backend gemini --podcast my-show
Output is written alongside the audio file as <stem>-transcript.md by default. Use --overwrite / -f to replace an existing output file.
Commands
transcribe
whotalksitron transcribe AUDIO_FILE [OPTIONS]
| Option | Description |
|---|---|
--backend |
gemini, pyannote, or whisper. Defaults to auto-select. |
--podcast NAME |
Load enrolled speakers for this podcast and run voiceprint matching. |
--output PATH / -o |
Output path. Defaults to <stem>-transcript.md alongside the audio file. |
--model NAME |
Override the model for the selected backend. |
--overwrite / -f |
Overwrite output file if it exists. |
--identify-speakers |
Force speaker identification even without enrolled voices. |
enroll
Add a voice sample for a speaker. Run multiple times to add more samples.
whotalksitron enroll --name NAME --podcast PODCAST --sample AUDIO_FILE
| Option | Description |
|---|---|
--name |
Speaker name as it will appear in transcripts. |
--podcast |
Podcast identifier (used to scope speakers per show). |
--sample |
Audio file containing only this speaker's voice. |
--rebuild |
Recompute embeddings from existing samples. |
extract-samples
Transcribe an episode and extract short audio clips per speaker — useful for building an enrollment library without manually slicing audio.
whotalksitron extract-samples AUDIO_FILE [--podcast PODCAST] [--output DIR]
Prints enrollment commands for any unrecognised speakers at the end.
import-speaker
Copy an enrolled speaker from one podcast to another without re-enrolling.
whotalksitron import-speaker --name NAME --from SOURCE_PODCAST --to TARGET_PODCAST
list-speakers
whotalksitron list-speakers [--podcast PODCAST]
config
whotalksitron config --init # Write default config to ~/.config/whotalksitron/config.toml
whotalksitron config --show # Print resolved config (with secrets masked)
whotalksitron config --set key=value # Update a single key in the config file
Global flags
These apply to all commands:
| Flag | Description |
|---|---|
--log-level |
debug, info, warn, error |
--log-format |
text (default) or json |
--progress |
Emit structured progress lines to stderr |
--quiet / -q |
Suppress non-error output |
Configuration
Config file lives at ~/.config/whotalksitron/config.toml. Generate a template with whotalksitron config --init.
Configuration is resolved in this order (later overrides earlier):
- Config file
- macOS Keychain (for Gemini API key)
- 1Password CLI (for Gemini API key, if
gemini.op_referenceis set) - Environment variables
- CLI flags
Environment variables
| Variable | Config key | Description |
|---|---|---|
GOOGLE_CLOUD_API_KEY |
gemini.api_key |
Gemini/Vertex AI API key |
GOOGLE_CLOUD_PROJECT |
gemini.project |
GCP project ID |
GOOGLE_CLOUD_LOCATION |
gemini.location |
GCP region |
GOOGLE_GENAI_USE_VERTEXAI |
gemini.use_adc |
Set to 1 to use Vertex AI instead of AI Studio |
GOOGLE_CLOUD_STORAGE_BUCKET |
gemini.gcs_bucket |
GCS bucket for staging large audio files (Vertex AI only) |
GEMINI_API_KEY |
gemini.api_key |
Alternative to GOOGLE_CLOUD_API_KEY |
WHOTALKSITRON_BACKEND |
defaults.backend |
Default backend |
WHOTALKSITRON_LOG_LEVEL |
defaults.log_level |
Default log level |
WHOTALKSITRON_CONFIG |
— | Override config file path |
WHOTALKSITRON_SPEAKERS_DIR |
— | Override speakers directory |
Config file reference
[defaults]
backend = "auto" # auto, gemini, pyannote, whisper
log_level = "info"
log_format = "text" # text or json
progress = false
[gemini]
api_key = ""
use_adc = false # true = Vertex AI via ADC
project = "" # GCP project (Vertex AI)
location = "" # GCP region (Vertex AI)
gcs_bucket = "" # GCS bucket for large files (Vertex AI)
model = "gemini-2.5-flash"
keychain_service = "vertex-apikey" # macOS Keychain service name
keychain_account = "vertex" # macOS Keychain account name
op_reference = "" # 1Password secret reference
[pyannote]
whisper_model = "large-v3"
diarization_model = "pyannote/speaker-diarization-3.1"
device = "auto" # auto, cpu, cuda, mps
[whisper]
endpoint = "http://localhost:1234/v1"
model = "whisper-large-v3"
[speakers]
match_threshold = 0.7 # cosine similarity threshold for voiceprint matching
[output]
timestamp_format = "HH:MM:SS"
[logging]
file = "~/.config/whotalksitron/whotalksitron.log"
file_max_bytes = 10_485_760 # 10MB, range: 1MB-1GB
file_backup_count = 5 # range: 1-10
Backends
| Backend | Requires | Diarization | Notes |
|---|---|---|---|
gemini |
Gemini or Vertex AI credentials | Yes | Best quality, handles any format |
pyannote |
--with local, torch, GPU recommended |
Yes | Fully local, slower |
whisper |
Ollama or LM Studio running locally | No | Transcription only |
Backend is selected automatically in the order above based on what credentials are available. Override with --backend.
Speakers directory
Enrolled speaker data lives at ~/.config/whotalksitron/speakers/. Each speaker is stored per podcast:
~/.config/whotalksitron/speakers/
my-show/
alice/
samples/
sample-<uuid>.wav
embedding.npy
meta.toml
Development
Requires: Python 3.11+, uv, just
git clone <repo-url>
cd whotalksitron
uv sync --all-extras --group dev
just test # run tests
just lint # lint
just ensureci-sandbox # full local CI (no network)
See docs/gcloud.md for Vertex AI setup.
License
Apache-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file whotalksitron-1.1.0.tar.gz.
File metadata
- Download URL: whotalksitron-1.1.0.tar.gz
- Upload date:
- Size: 115.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0800830f8f204e5e2111bc831ff7519a49c031d7ceb700a0c0c3c19f05cdc918
|
|
| MD5 |
c2f990a46e864917f7b0236d2b6df418
|
|
| BLAKE2b-256 |
431282f625633fe855c97da919b464e5b47bfe9fa3437374a38cae8c02165201
|
Provenance
The following attestation bundles were made for whotalksitron-1.1.0.tar.gz:
Publisher:
release.yml on moutons/whotalksitron
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
whotalksitron-1.1.0.tar.gz -
Subject digest:
0800830f8f204e5e2111bc831ff7519a49c031d7ceb700a0c0c3c19f05cdc918 - Sigstore transparency entry: 1396256822
- Sigstore integration time:
-
Permalink:
moutons/whotalksitron@92f78934afbe131e702c10169ed37871c2c56ad7 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/moutons
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@92f78934afbe131e702c10169ed37871c2c56ad7 -
Trigger Event:
workflow_run
-
Statement type:
File details
Details for the file whotalksitron-1.1.0-py3-none-any.whl.
File metadata
- Download URL: whotalksitron-1.1.0-py3-none-any.whl
- Upload date:
- Size: 36.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64abf8af31e95b83b599cfe4a66fdd9c93f10a4d939838107bb8f28b7260b584
|
|
| MD5 |
ea32db2836ab5f1093131ffca6eecc67
|
|
| BLAKE2b-256 |
94179dd0fa2741bbd23396fd873552ff55f7bed55c79f444d4a115c2c127e4b9
|
Provenance
The following attestation bundles were made for whotalksitron-1.1.0-py3-none-any.whl:
Publisher:
release.yml on moutons/whotalksitron
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
whotalksitron-1.1.0-py3-none-any.whl -
Subject digest:
64abf8af31e95b83b599cfe4a66fdd9c93f10a4d939838107bb8f28b7260b584 - Sigstore transparency entry: 1396256826
- Sigstore integration time:
-
Permalink:
moutons/whotalksitron@92f78934afbe131e702c10169ed37871c2c56ad7 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/moutons
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@92f78934afbe131e702c10169ed37871c2c56ad7 -
Trigger Event:
workflow_run
-
Statement type: