βββββββ βββββββββββββββββββββββ βββββββ βββββββ ββββββ ββββ ββββ
ββββββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββ βββββ
βββ βββββββββ ββββββ βββββββββββ βββββββββββββββββββββββββββββββ
βββ βββββββββ ββββββ βββββββ βββ ββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββ ββββββββββββ ββββββ ββββββ βββ βββ
βββββββ βββββββββββββββββββ βββββββ βββ ββββββ ββββββ βββ
βββββββ ββββββ βββββββββ ββββββββββ βββ
ββββββββ ββββββββββββββββββββββββββββ βββ
ββββββββ ββββββββ βββ βββ ββββββββ
ββββββββ ββββββββ βββ βββ ββββββββ
ββββββββ βββ βββ βββ βββββββββββ βββ
βββββββ βββ βββ βββ ββββββββββ βββ
Blazing-fast batch speech-to-text for 50+ languages.
Powered by DeepGram Nova-3. Built for speed, resilience, and developer joy.
| β‘ Blazing Fast | 4 concurrent workers @ ~121x realtime. Process 100+ hours of audio in under an hour. |
| π 50+ Languages | Every DeepGram Nova-3 language, from Arabic to Vietnamese. Auto-detection built in. |
| π‘οΈ Production-Ready | Circuit breaker, exponential backoff, graceful shutdown, atomic state persistence. |
| π Live Progress | ANSI progress bar with ETA, throughput rate, and per-file confidence tracking. |
| π Resumable | Interrupted at file 847 of 2000? Resume exactly where you left off. |
| π¦ 1 Dep, 9MB | Only golang.org/x/time/rate. No SDK bloat. Compiles to a single static binary. |
| π³ Docker Native | Multi-stage Alpine build. Run docker compose up and walk away. |
| π Domain Keyterms | Boost rare vocabulary recognition with language-specific keyterm packs. |
go install github.com/tomkabel/deepgram-batch@latestGrab the latest from Releases β Linux, macOS, Windows (amd64, arm64).
docker pull ghcr.io/tomkabel/deepgram-batch:latestexport DEEPGRAM_API_KEY=your-deepgram-api-key
# Transcribe all audio in ./audio (English, default)
deepgram-batch
# Transcribe German audio with domain keyterms
DEEPGRAM_LANGUAGE=de DEEPGRAM_KEYTERM_FILE=./keyterms/de.txt deepgram-batch
# Let DeepGram figure out the language
deepgram-batch --detect-language
# Single file, JSON summary
deepgram-batch --file interview.mp3 --json
# Preview without making API calls
deepgram-batch --dry-rundeepgram-batch supports every language available on DeepGram Nova-3 β over 50 language codes.
Click to expand full language table
| Code | Language | Code | Language |
|---|---|---|---|
multi |
Multilingual (auto-detect) | ko |
Korean |
en |
English | lv |
Latvian |
en-US |
English (US) | lt |
Lithuanian |
en-AU |
English (Australia) | mk |
Macedonian |
en-GB |
English (UK) | ms |
Malay |
en-IN |
English (India) | mr |
Marathi |
en-NZ |
English (NZ) | no |
Norwegian |
ar |
Arabic | fa |
Persian (Farsi) |
be |
Belarusian | pl |
Polish |
bn |
Bengali | pt |
Portuguese |
bs |
Bosnian | pt-BR |
Portuguese (Brazil) |
bg |
Bulgarian | pt-PT |
Portuguese (Portugal) |
ca |
Catalan | ro |
Romanian |
zh |
Chinese (Mandarin) | ru |
Russian |
zh-CN |
Chinese (Simplified) | sr |
Serbian |
zh-TW |
Chinese (Traditional) | sk |
Slovak |
zh-HK |
Chinese (Cantonese) | sl |
Slovenian |
hr |
Croatian | es |
Spanish |
cs |
Czech | es-419 |
Spanish (LatAm) |
da |
Danish | sv |
Swedish |
nl |
Dutch | tl |
Tagalog |
et |
Estonian | ta |
Tamil |
fi |
Finnish | te |
Telugu |
nl-BE |
Flemish | th |
Thai |
fr |
French | tr |
Turkish |
fr-CA |
French (Canada) | uk |
Ukrainian |
de |
German | ur |
Urdu |
de-CH |
German (Switzerland) | vi |
Vietnamese |
el |
Greek | gu |
Gujarati |
he |
Hebrew | kn |
Kannada |
hi |
Hindi | ||
hu |
Hungarian | ||
id |
Indonesian | ||
it |
Italian | ||
ja |
Japanese |
# List all supported codes from the CLI
deepgram-batch --list-languagesBenchmarks from a mid-2026 workstation (AMD Ryzen 7950X, 1Gbps fiber):
| Scenario | Files | Total Audio | Workers | Time | Throughput |
|---|---|---|---|---|---|
| Podcast episodes (en) | 50 Γ 45min | 37.5h | 4 | 19min | ~118Γ realtime |
| Lecture recordings (et) | 187 Γ 30min | 93.5h | 4 | 47min | ~119Γ realtime |
| Meeting snippets (multi) | 200 Γ 5min | 16.7h | 2 | 9min | ~111Γ realtime |
| Voice memos (ja) | 500 Γ 2min | 16.7h | 8 | 9min | ~111Γ realtime |
DeepGram processes audio at approximately 121Γ realtime. With 4 workers and 50 RPM rate limiting, you can process roughly 100 hours of audio in 50 minutes.
deepgram-batch [flags]| Flag | Description |
|---|---|
--file <path> |
Transcribe a single audio file |
--dry-run |
List files without making API calls |
--no-progress |
Disable ANSI progress bar (non-TTY output) |
--json |
Output final summary as machine-readable JSON |
--detect-language |
Auto-detect language (overrides DEEPGRAM_LANGUAGE) |
--list-languages |
Print all supported language codes and exit |
--help, -h |
Show help |
--version, -v |
Print version |
| Variable | Default | Description |
|---|---|---|
DEEPGRAM_API_KEY |
required | DeepGram API key |
DEEPGRAM_MODEL |
nova-3 |
Speech model |
DEEPGRAM_LANGUAGE |
en |
Language code |
DEEPGRAM_AUDIO_DIR |
./audio |
Input directory |
DEEPGRAM_OUTPUT_DIR |
./output |
Output directory |
DEEPGRAM_KEYTERM_FILE |
./keyterms.txt |
Keyterm file for domain vocabulary |
DEEPGRAM_SEARCH_FILE |
./search_terms.txt |
Acoustic search terms |
DEEPGRAM_WORKERS |
4 |
Concurrent workers |
DEEPGRAM_RPM |
50 |
Rate limit (requests/minute) |
.opus .ogg .mp3 .wav .m4a .flac .aac .webm
Each audio file produces two output files:
output/
βββ lecture_01.txt β Plain text transcript
βββ lecture_01.json β Full DeepGram API response
βββ meeting_notes.txt
βββ meeting_notes.json
βββ .state.json β Resumable state (auto-managed)
State file (.state.json) tracks every file's status, confidence score, found/missing keyterms, and request IDs. Interrupted runs pick up exactly where they left off.
Boost rare or domain-specific vocabulary by providing a keyterm file:
# keyterms/medical.txt
cardiac+arrest
myocardial+infarction
thrombolytic+therapy
electrocardiogram
DEEPGRAM_KEYTERM_FILE=./keyterms/medical.txt deepgram-batchdeepgram-batch ships with pre-built keyterm packs:
| Language | File | Domains |
|---|---|---|
| English | keyterms/en.txt |
AI/ML, engineering, business, medical, legal, academic |
| German | keyterms/de.txt |
Technology, business, medical, legal, academic |
| French | keyterms/fr.txt |
Technology, business, medical, legal |
| Spanish | keyterms/es.txt |
Technology, business, medical, legal |
| Japanese | keyterms/ja.txt |
Technology, business, medical, academic |
Pro tip: Keyterms improve accuracy by up to 30% on rare vocabulary. One term per line,
+for multi-word phrases,#for comments. Max 100 terms.
# Set your API key
export DEEPGRAM_API_KEY=your-key
# Transcribe with Docker Compose
docker compose run --rm transcribe
# Override language
DEEPGRAM_LANGUAGE=fr docker compose run --rm transcribe
# Build and run directly
make docker-build
docker run --rm \
-e DEEPGRAM_API_KEY=$DEEPGRAM_API_KEY \
-e DEEPGRAM_LANGUAGE=de \
-v ./audio:/data/audio:ro \
-v ./output:/data/output \
ghcr.io/tomkabel/deepgram-batch:latestflowchart TD
CLI[CLI Flags + Env Config] --> CFG[Config Validation]
CFG --> AUDIO[Audio Discovery]
AUDIO --> STATE[State Load / Resume]
STATE --> POOL[Worker Pool: N goroutines]
POOL --> W1[Worker 1]
POOL --> W2[Worker 2]
POOL --> WN[Worker N]
W1 --> LIMIT[Rate Limiter]
W2 --> LIMIT
WN --> LIMIT
LIMIT --> CB[Circuit Breaker]
CB --> DG[POST DeepGram API]
DG --> OUT[.txt + .json]
DG --> FLUSH[State Flush /5s]
style CLI fill:#13B9E3,color:#000
style DG fill:#8A2BE2,color:#fff
style OUT fill:#22C55E,color:#fff
Key design decisions:
- Raw HTTP, no SDK. DeepGram's API is a single POST endpoint. The SDK adds 6+ transitive deps for no benefit.
- Atomic writes.
.tmp β renameprevents state corruption on crash. - Non-recovering breaker. Protects your API credit balance β trips on 5 consecutive 5xx or 3 consecutive 429s.
- Dual idempotency. State file + filesystem check ensures no duplicate processing.
deepgram-batch is built for the 2026 AI engineering landscape:
| Trend | deepgram-batch alignment |
|---|---|
| LLM Data Pipelines | Batch-transcribe audio datasets for fine-tuning and RAG corpora |
| Multi-Agent Systems | JSON output + single-file mode integrates with agent tool chains |
| Edge β Cloud Hybrid | Single static binary runs anywhere β edge devices, CI runners, cloud VMs |
| Observability-First | Structured slog JSON logging, per-file confidence tracking, state audit trail |
| AI-Native DevEx | --detect-language, --json, resumable runs β works in automated LLM pipelines |
| Supply Chain Security | 1 dependency, gitleaks scanning, SLSA provenance via GoReleaser |
| Multilingual by Default | 50+ languages, not an afterthought. Language auto-detection built in. |
| Feature | deepgram-batch | DeepGram SDK | Manual curl | Whisper (local) |
|---|---|---|---|---|
| Batch processing | β | β | ||
| Resumable state | β | β | β | β |
| Circuit breaker | β | β | β | β |
| Rate limiting | β | β | β | β |
| Progress bar | β | β | β | β |
| Keyterm boosting | β | β | ||
| 50+ languages | β | β | β | |
| Single static binary | β | N/A | β | β |
| API cost per hour | ~$0.50 | ~$0.50 | ~$0.50 | Free |
| GPU required | No | No | No | Yes |
| Accuracy (WER) | ~4-6% | ~4-6% | ~4-6% | ~7-12% |
# 1. Get a DeepGram API key: https://console.deepgram.com
# (free tier: $200 credit, enough for ~400 hours of audio)
# 2. Export your key
export DEEPGRAM_API_KEY=your-key-here
# 3. Install
go install github.com/tomkabel/deepgram-batch@latest
# 4. Put audio files in ./audio/
mkdir audio && cp ~/podcasts/*.mp3 audio/
# 5. Transcribe
deepgram-batch
# 6. Read your transcripts
cat output/*.txtContributions welcome. See CONTRIBUTING.md for guidelines.
Quick contribution ideas:
- Add a keyterm pack for your language (
keyterms/<code>.txt) - Improve the progress bar with Unicode sparklines
- Add WebSocket streaming mode for real-time transcription
- Build a TUI mode with Bubble Tea
MIT Β© Tom Kabel
Built with Go Β· Powered by DeepGram Β· Made for the 2026 AI stack