Skip to main content

sprezzature-audio

Local-first speech processing for the sprezzature stack.

Point it at a recording (a meeting, an interview, a lecture) and it hands back a transcript that says not just what was said, but who said it and in which language. Everything runs on your own machine: no audio leaves it, and no API key is needed. If you instead need to cut, resample, or clean up the audio signal itself (trim silence, separate a voice from background music), that is a different job, handled by a sibling package, audio-helper; this package starts once the audio is already usable and asks what was said in it.

What it does

Six scripts, each one stage of the pipeline. A few terms recur throughout the table below, so here they are once, up front, rather than repeated at every mention:

  • ASR (automatic speech recognition) is the technical name for speech-to-text: turning a sound wave into written words.
  • WebVTT and SRT are two competing plain-text file formats for storing subtitles: a list of [start time, end time, text] triples. WebVTT is the web-standard one (what a <video> tag expects); SRT is older and more universally supported by video players.
  • RTTM is a plain-text format from the speech-research world for recording who spoke when: one line per speaker turn, with a start time, a duration, and a speaker label.
  • NeMo is NVIDIA's open-source toolkit for speech models; Sortformer and TitaNet are two specific NeMo models used here (diarization and speaker fingerprinting, explained below).
Script What it produces
captions_from_whisper.py WebVTT, SRT, or a plain transcript, via a local Whisper model (through vocal-helper)
diarize_from_nemo.py An RTTM file plus a JSON turn list, via NeMo's Sortformer model (up to 4 speakers)
identify_from_titanet.py A speaker's identity, matched against a reference voice sample, via NeMo's TitaNet model
caption_diarize.py The combined pipeline: transcript and speaker turns merged in one pass
name_from_transcript.py A guess at each speaker's real name, read off the diarized transcript (pattern matching, with an optional LLM assist)
translate_captions.py A translated copy of a VTT/SRT file, via a local LLM

Install

# Base (no ML dependencies)
pip install sprezzature-audio

# Add captioning (Whisper via vocal-helper)
pip install "sprezzature-audio[captions]"

# Add diarization and speaker ID (NeMo; install torch first, since the right
# build depends on your hardware: CUDA, Apple-silicon MPS, or plain CPU)
pip install torch
pip install "sprezzature-audio[diarize]"

# Add LLM translation (best-engine-ai-helper + a local Ollama server)
pip install "sprezzature-audio[translate]"

# Everything
pip install "sprezzature-audio[all]"

Quick start

# Transcribe a video to WebVTT
sprezzature-audio-captions talk.mp4

# Same, as a plain-text transcript
sprezzature-audio-captions podcast.mp3 --format text

# Diarize an audio file: who spoke when
sprezzature-audio-diarize interview.wav

# Full pipeline: caption_diarize.py merges caption + diarization files
# already produced by the two steps above (it takes no media file itself)
sprezzature-audio-captions meeting.mp4
sprezzature-audio-diarize meeting.mp4
sprezzature-audio-pipeline --captions meeting.vtt --diarization meeting.diarization.json

# Guess speaker names from the diarized transcript
sprezzature-audio-name meeting.speakers.vtt

# Translate captions to French
sprezzature-audio-translate talk.vtt --lang fr

How this differs from audio-helper

audio-helper works at the signal level: converting formats, slicing a waveform, resampling, separating a voice from background music with Demucs. It has no notion of words; a silence and a sentence look the same to it.

sprezzature-audio works at the content level: it reads speech, attributes it to a speaker, and translates it. The two packages are meant to be used together, not as alternatives; captions_from_whisper.py in fact calls audio-helper internally, to extract a 16 kHz mono WAV file (the format Whisper expects) before it ever runs the speech model.

Models used

Task Model Backend
ASR (speech to text) large-v3-turbo by default, or any other GGML-format Whisper weights (the compact file format vocal-helper's underlying engine, whisper.cpp, expects) vocal-helper / pywhispercpp
Diarization (who spoke when) nvidia/diar_sortformer_4spk-v1 NeMo
Speaker ID (matching a voice to a reference sample) nvidia/speakerverification_en_titanet_large NeMo
Translation Configured through the SPREZZATURE_LLM_* environment variables best-engine-ai-helper

Environment variables

Variable Purpose
SPREZZATURE_WHISPER_MODEL Override the Whisper model path or alias
SPREZZATURE_CACHE_DIR Cache directory for Whisper weights and transcripts
SPREZZATURE_NO_CACHE Set to any value to disable the transcript cache
NEMO_DIAR_MODEL Override the NeMo diarization checkpoint
SPREZZATURE_LLM_* LLM backend configuration (see best-engine-ai-helper)

License

BSD 3-Clause. See LICENSE.

Author

Warith HARCHAOUI: deraison.ai

Metadata

Release files for sprezzature-audio 1.1.1

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

Source distribution (sdist)

Source distribution for sprezzature-audio 1.1.1
File Size Uploaded Provenance
sprezzature_audio-1.1.1.tar.gz 93.3 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for sprezzature-audio 1.1.1
File Interpreter ABI Platform
sprezzature_audio-1.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 183.5 kB

Release files / sprezzature_audio-1.1.1.tar.gz

Download URL sprezzature_audio-1.1.1.tar.gz
Size 93.3 kB
Tags Source
SHA-256 checksum
How to use checksums
a9233d358cbea7d6121e79754d530ffb6fa7fa0a0b3cbd8a46f186678c747493
BLAKE2b-256 checksum
How to use checksums
6686593bca8192a7b17143ffe697d152c750dbcce94bbf3e5242011b63804404
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.13

Release files / sprezzature_audio-1.1.1-py3-none-any.whl

Download URL sprezzature_audio-1.1.1-py3-none-any.whl
Size 90.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6cce9b7fdddff8b764d0be2bdfc6fee1180d1ea8e151b4f0d4b2558851c610e9
BLAKE2b-256 checksum
How to use checksums
3e78e917e38cc8f547d775700dd16fe415b8367a374bb41d2ad6008c2c822eb9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.13

Security for sprezzature-audio 1.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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