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

DimensionHow to judge it
AccuracyWER on a sample of your own audio, not a vendor's demo clip
DiarizationDER, and whether speaker labels hold up on your own recordings
TimestampsWord-level start/end accuracy (important for subtitles and search)
LanguagesThe specific languages and code-switching you serve
Formats and featuresJSON shape, SRT/VTT/DOCX, custom vocabulary, webhooks
Throughput and priceBatch latency and cost at your monthly volume
Measure on your data

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.