Migrating from the OpenAI Whisper API to Speech Revolutions

OpenAI's transcription API is a single synchronous multipart POST to /v1/audio/transcriptions. It has a 25 MB file limit, and the current gpt-4o-transcribe model returns no word-level timestamps and no speaker diarization. Speech Revolutions returns the transcript, word timestamps, and speaker turns from a single call, for files up to 10 GB through the SDK.

Timestamps and speakers in one call

On OpenAI, word timestamps require the older whisper-1 model (via response_format=verbose_json + timestamp_granularities), and speaker labels require a separate gpt-4o-transcribe-diarize model — gpt-4o-transcribe returns text only. Speech Revolutions returns result.text, result.words (with times), and result.utterances (speakers) in every response.

Authentication

OpenAI uses Authorization: Bearer <key>. Speech Revolutions uses X-API-Key. The SDK reads the key from the environment.

OpenAISpeech Revolutions
Authorization: Bearer OPENAI_API_KEYX-API-Key: SPEECHREVOLUTIONS_API_KEY
OPENAI_API_KEY env varSPEECHREVOLUTIONS_API_KEY

Endpoint & method mapping

OpenAISpeech Revolutions RESTSpeech Revolutions SDK
POST /v1/audio/transcriptions (sync multipart)POST /api/v1/transcribe (raw bytes in, transcript streamed back; up to 200 MB)transcribe() (blocks until done)
— (response is inline)GET /api/v1/jobs/{id} / /streamget_transcript() / on_progress

Upload differences and the 25 MB limit

OpenAI expects the audio as a multipart file field in the request body and rejects files over 25 MB, so you split or compress long recordings yourself. Speech Revolutions has no 25 MB limit: the SDKs upload files up to 10 GB to storage in parts. Pass a path, URL, or bytes.

No more chunking long files

If you split files to stay under 25 MB for OpenAI, remove that step. Send the whole recording to transcribe().

Response shape

With response_format=json, OpenAI's gpt-4o-transcribe returns only { text }, with no words, segments, or speakers. Speech Revolutions returns all of these:

OpenAI fieldSpeech Revolutions
textresult.text
— (not returned by gpt-4o-transcribe)result.words (word + start/end/speaker, seconds)
— (not returned)result.utterances (speaker turns)
language (with verbose_json)result.languages

Diarization

gpt-4o-transcribe does not diarize; OpenAI offers the separate gpt-4o-transcribe-diarize model (as of July 2026). Speech Revolutions diarizes in the same call: set speaker_labels (on by default) and read result.utterances. Zephyr ranks #1 on diarization error rate on every benchmark subset. See the benchmarks and the comparison table.

Timestamps

On OpenAI, word timestamps require whisper-1 with response_format=verbose_json and timestamp_granularities: ["word"]. On Speech Revolutions, word_timestamps is on by default and the times are returned on result.words in seconds, with no model change.

Language selection

OpenAI takes an ISO 639-1 language hint. Speech Revolutions auto-detects by default and returns the detected spans in result.languages. To skip detection, pass the same language parameter with an ISO 639-1 code. As with Whisper, a wrong code does not fail: the model translates into that language. See pinning the language.

Custom vocabulary

OpenAI biases transcription only through the free-text prompt (about 224 tokens maximum). Speech Revolutions takes a custom_vocabulary list of domain terms.

Side by side

openai_transcribe.py

From OpenAI — Python (openai_transcribe.py)

from openai import OpenAI

client = OpenAI()  # OPENAI_API_KEY

with open("meeting.mp3", "rb") as f:  # must be <= 25 MB
    resp = client.audio.transcriptions.create(
        model="gpt-4o-transcribe",
        file=f,
        response_format="json",
    )

print(resp.text)
# no word timestamps, no speakers from gpt-4o-transcribe

Common pitfalls

  • Auth prefix. Drop Bearer; Speech Revolutions uses the X-API-Key header.
  • Expecting text only. Speech Revolutions returns words and utterances by default. You don't need a second model for timestamps or speakers.
  • Leftover 25 MB workarounds. Remove chunking or compression steps built for OpenAI.
  • Prompt-based biasing. Replace the prompt term list with custom_vocabulary.

See the migration playbook for cutover, and the benchmarks for accuracy, diarization, and timestamp comparisons.