Switching STT APIs in under 30 minutes
To switch speech-to-text providers safely, put transcription behind an interface, compare outputs on your own audio, and roll out gradually with a fallback. This page is the provider-agnostic playbook. The per-provider guides (Deepgram, AssemblyAI, OpenAI Whisper, ElevenLabs, self-hosted Whisper) cover the exact field mappings.
1. Why teams switch
- Accuracy on your audio. General WER doesn't show how a model performs on your domain, accents, and multi-speaker recordings.
- Diarization and timestamps. Speaker labels and word times make a transcript searchable and seekable.
- Price at volume, output formats (SRT/VTT/DOCX), and operational simplicity (no GPUs to manage).
2. What to evaluate
| Dimension | How to judge it |
|---|---|
| Accuracy | WER on a sample of your own audio, not a vendor's demo clip |
| Diarization | DER, and whether speaker labels hold up on your own recordings |
| Timestamps | Word-level start/end accuracy (important for subtitles and search) |
| Languages | The specific languages and code-switching you serve |
| Formats and features | JSON shape, SRT/VTT/DOCX, custom vocabulary, webhooks |
| Throughput and price | Batch latency and cost at your monthly volume |
The public benchmark suite is reproducible and provider-agnostic. Run it on your own audio against the providers you're comparing.
3. Migrate behind an interface
Put transcription behind one function that returns your own normalized shape, instead of calling a vendor SDK throughout your codebase. Switching providers then changes one file. The Speech Revolutions result exposes .text, .words, and .utterances, and to_deepgram() returns a Deepgram-shaped dict if you are migrating from Deepgram.
# transcription.py — the ONE place your app calls
from speechrevolutions import SpeechRevolutions
_client = SpeechRevolutions() # SPEECHREVOLUTIONS_API_KEY
def transcribe(audio: str) -> dict:
r = _client.transcribe(audio, speaker_labels=True, word_timestamps=True)
return {
"text": r.text,
"speakers": [{"speaker": u.speaker, "text": u.text} for u in r.utterances],
"words": [w.to_dict() for w in r.words],
}4. Compare outputs before you cut over
Run both providers on the same sample set through your interface, store both outputs, and compare them. Measure WER against a reference transcript if you have one; otherwise, spot-check the transcripts, speaker turns, and timestamps your product depends on. Keep the sample as a regression set.
5. Roll out incrementally
- Shadow. Send a copy of production traffic to Speech Revolutions and compare results without serving them.
- Ramp. Route 5% → 25% → 100% of traffic behind a feature flag, and check quality and error metrics at each step.
- Fall back. On error or timeout, have the interface call the old provider until the rollout is complete.
To re-transcribe an existing library, use submit() with polling or webhooks instead of blocking calls. See the batch tutorial.
6. The 30-minute quickstart
Install the SDK, set your API key, transcribe, and read the result.
pip install speechrevolutions
export SPEECHREVOLUTIONS_API_KEY=stt_...from speechrevolutions import SpeechRevolutions
client = SpeechRevolutions()
result = client.transcribe("meeting.mp3", speaker_labels=True)
print(result.text)Next, see the provider-specific guide for exact field mappings, or the Quickstart.