scribed
One façade over many speech-to-text (ASR) engines — plus a ledger to help you choose between them.
Transcription ("turn this audio into text") is solved a dozen ways: local engines
(Whisper, faster-whisper, whisper.cpp, Vosk), fast cheap cloud APIs (Groq, OpenAI),
and feature-rich premium services (Deepgram, AssemblyAI, Google, ElevenLabs) —
each with its own install, API, pricing, latency, language coverage, and
diarization quirks. scribed gives you a uniform call, a browsable catalog of
every option, and the tools to wrap any of them.
import scribed
text = scribed.transcribe_text("talk.mp3") # just the text, default backend
t = scribed.transcribe("talk.mp3") # full result: text + timed segments
print(t) # -> the transcript
print(t.srt) # -> SRT subtitles
for seg in t:
print(
seg.start, seg.speaker, seg.text
) # iterate timed (optionally diarized) segments
The same call, the same Transcript back, no matter which engine ran.
Install
import scribed is dependency-free. Install only the backends you use, via extras:
pip install "scribed[faster-whisper]" # local, free — recommended default
pip install "scribed[whispercpp]" # local, free, light (great on Apple Silicon)
pip install "scribed[vosk]" # local, free, streaming/offline
pip install "scribed[openai]" # cloud API (whisper-1 / gpt-4o-transcribe)
pip install "scribed[groq]" # cloud API — fastest & cheapest hosted Whisper
pip install "scribed[deepgram]" # cloud API — real-time + diarization
pip install "scribed[cli]" # the `scribed` command
Backends that ship today
| Backend | backend= id |
Local / Remote | Cost | Diarize | Stream | Notable |
|---|---|---|---|---|---|---|
| faster-whisper | faster-whisper |
local | free | – | – | Recommended local default — Whisper via CTranslate2, no system ffmpeg |
| OpenAI Whisper | whisper |
local | free | – | – | The reference PyTorch Whisper (needs system ffmpeg) |
| whisper.cpp | whispercpp |
local | free | – | ~ | Pure C/C++ — light, excellent on Apple Silicon / edge |
| Vosk | vosk |
local | free | ~ | ✓ | Fully offline, streaming, tiny models (Raspberry Pi / mobile) |
| OpenAI | openai |
remote | paid | – | ✓ | Simple & ubiquitous; whisper-1 / gpt-4o-transcribe |
| Groq | groq |
remote | free tier | – | – | Fastest & cheapest hosted Whisper (OpenAI-compatible) |
| Deepgram | deepgram |
remote | free tier | ✓ | ✓ | Nova-3: real-time + diarization, cheap, feature-rich |
| AssemblyAI | assemblyai |
remote | free tier | ✓ | ✓ | Audio intelligence (diarization, sentiment, topics, summary) |
| Google STT | google-speech |
remote | free tier | ✓ | ✓ | Widest language coverage (125+); Chirp models |
| ElevenLabs | elevenlabs |
remote | free tier | ✓ | ~ | Scribe — top accuracy, diarization, audio-event tags |
…plus more engines catalogued in the ledger (NVIDIA Parakeet/Canary, WhisperX, wav2vec2, Moonshine, sherpa-onnx, AWS Transcribe, Azure Speech, Speechmatics, Gladia, Rev, Fireworks, Cloudflare …) that you can turn into a working façade with one command (see Add a backend below).
Getting a backend running
Some backends need more than pip install (Whisper's system ffmpeg, GPU wheels,
first-run model weights, or an API key). scribed turns that into structured,
OS-aware guidance — handy for humans and AI agents alike:
scribed.doctor() # what's usable now vs what each missing one needs
scribed.check("faster-whisper") # -> True/False (usable right now?)
print(
scribed.requirements("whisper").instructions()
) # exact plan: system deps + pip + weights
scribed.install("faster-whisper", yes=True) # plan, or actually run the pip install
The ledger — choose with eyes open
The catalog describes every engine we researched, not only the ones with a
working façade. It lives in data (scribed/data/backends.json), not code, so you
can read, filter, diff, and extend it:
scribed.catalog # the whole ledger
scribed.find(is_local=True, open_source=True) # only local OSS engines
scribed.find(diarization="yes", is_remote=True) # speaker-labelling cloud APIs
scribed.find(implemented=True) # only what scribed can run today
scribed.catalog.supports_language("French") # engines that list French
scribed.catalog.to_dataframe() # browse as a pandas table
implemented is computed live from the registry, so the ledger can never lie
about what scribed can actually run.
The result model
Every backend returns the same Transcript — progressive disclosure from "just
the text" to full structure:
t = scribed.transcribe("interview.wav", backend="deepgram", diarize=True)
str(t) # the full transcript text
t.text # same string
t.language # detected language
t.duration # audio duration (seconds)
for seg in t: # Segment: .text .start .end .speaker .confidence .words
...
t.words # flattened word-level units (when the engine reports them)
t.speakers # ['speaker_0', 'speaker_1', ...] when diarized
t.srt # SRT subtitles
t.vtt # WebVTT subtitles
t.raw # the untouched backend response
Three tiers of access
scribed.transcribe(audio) # 1. facade, default backend
scribed.services.deepgram.transcribe(
audio, diarize=True
) # 2. pick a backend explicitly
scribed.services.deepgram.adapter # 3. the raw engine adapter
CLI
pip install "scribed[cli]"
scribed transcribe talk.mp3 --backend faster-whisper --output srt
scribed backends --capability diarize
scribed find --local --free --diarization
scribed status # readiness table: all ⊇ implemented ⊇ set-up ⊇ tested
scribed doctor # what's usable now, how to install the rest
scribed requirements whisper # exact install plan
Add a backend
The catalog is large; scribed ships a façade for a curated subset and gives you the machinery (and a SKILL) to wrap any other in minutes:
from scribed.make_backend import scaffold_backend, validate_adapter
scaffold_backend(
"speechmatics"
) # generate scribed/backends/speechmatics/ from the ledger entry
# ...fill in param_map (config.py) and implement adapter.py's _transcribe...
validate_adapter("speechmatics") # smoke-test it end to end
A backend is just a subpackage with a config.py (BACKEND_CONFIG) and an
adapter.py (Adapter(BaseTranscriberAdapter) implementing _transcribe). The
registry discovers it automatically; engine SDKs are imported lazily so
import scribed stays dependency-free.
Design notes
- Dependency-free import. The base package declares no dependencies; every engine SDK is an optional extra, imported lazily inside its adapter.
- Data-driven ledger. Engine metadata is curated research in JSON, separate from code.
- Normalized everything. One input type (path / URL / bytes / file / numpy
waveform), one result type (
Transcript), one vocabulary of options translated per-engine via each backend'sparam_map.
scribed is the speech-to-text sibling of ocracy
(the same pattern for OCR).
License
MIT
Metadata
Release files for scribed 0.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| scribed-0.0.5.tar.gz | 86.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| scribed-0.0.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 194.1 kB
Release files / scribed-0.0.5.tar.gz
| Download URL | scribed-0.0.5.tar.gz |
|---|---|
| Size | 86.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f9a288931a9ed0f1b0c290e605ea277d817179be7172500d7c182af82995c6d9
|
|
BLAKE2b-256 checksum How to use checksums |
4992aef158ac7f33a8dbc52f543de45f780b77c256f682f12b985cc6e6eced94
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","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 / scribed-0.0.5-py3-none-any.whl
| Download URL | scribed-0.0.5-py3-none-any.whl |
|---|---|
| Size | 107.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4c4458f8ee3946e4f7392671842765238e7e999c9a45075729e398c65472bc72
|
|
BLAKE2b-256 checksum How to use checksums |
e0fc7e7cc766b958fadb54e170e48c64d67cfb4dad948570b7d1643cdd02dfbb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","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}
|