Migrate Whisper transcription to GPT-Transcribe models
Migration guide from Whisper to gpt-transcribe and gpt-live-transcribe, covering field changes and compatibility gaps.
Why it matters
Upgrade existing Whisper-based transcription integrations to OpenAI's new GPT-Transcribe and GPT-Live-Transcribe models, preserving API endpoints while adopting improved accuracy, multilingual hints, streaming output, and low-latency live captioning capabilities.
Outcomes
What it gets done
Replace whisper-1 model calls with gpt-transcribe for recorded audio files
Update language hints from single language to multilingual arrays with keyword context
Stream transcription output for completed files using delta and done events
Migrate live captioning workflows from gpt-realtime-whisper to gpt-live-transcribe
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/oai-migratingfromwhispertogpttranscribe | bash Steps
Steps in the chain
Overview
Migrate from Whisper to GPT-Transcribe and GPT-Live-Transcribe
A migration guide from Whisper to gpt-transcribe and gpt-live-transcribe, covering the language/prompt/keywords field changes, streaming and Realtime event handling, and features with no drop-in replacement. Use when migrating an existing Whisper integration to completed-file or live transcription with the new models. Stay on Whisper or legacy endpoints for subtitles, timestamps, translation, or diarization the new models don't support directly.
What it does
This is a guide for migrating from Whisper to OpenAI's two new transcription models: gpt-transcribe (accurate transcription of completed audio via uploaded files) and gpt-live-transcribe (low-latency, continuously streaming transcription). The API endpoints stay the same - file requests still use POST /v1/audio/transcriptions, and Realtime integrations still configure a transcription session and handle transcription events - what changes are the supported request fields, output formats, and contextual/multilingual hints.
Three migration paths: recorded or uploaded audio moves whisper-1 to gpt-transcribe on the same file endpoint; live captions or continuous microphone audio move gpt-realtime-whisper to gpt-live-transcribe in a Realtime session; and higher-accuracy transcription after a manually committed audio turn uses gpt-transcribe inside a Realtime session over WebSocket. The legacy single-value language hint is replaced by a languages array of expected spoken languages; a separate prompt field carries free-form context while keywords carries literal terms (product names, medication names, account IDs) expected in the audio - keywords must be single-line literals with no <, >, or line breaks, or the whole request is rejected. gpt-transcribe can return detected-language predictions - including a valid empty array when it can't predict reliably - on both file and Realtime results; gpt-live-transcribe does not return detected-language predictions in its initial contract. For committed-turn Realtime use, audio is appended to the input buffer and input_audio_buffer.commit is sent - transcription runs per committed chunk, not continuously, and delta events may arrive before the completed event for that chunk.
When to use - and when NOT to
Use this guide when migrating an existing Whisper integration to the new models for either completed-file transcription or continuous live captioning. Several features have no drop-in replacement, so stay on whisper-1 (or the relevant legacy endpoint) if the integration depends on native SRT/VTT subtitles, word or segment timestamps, or /v1/audio/translations; for speaker diarization, use gpt-4o-transcribe-diarize with response_format: "diarized_json" instead - it isn't supported in the Realtime API.
Inputs and outputs
Input is Python 3.11+, the OpenAI Python SDK (pip install --upgrade openai), an OPENAI_API_KEY, and either a completed audio file or a Realtime session. Output is a JSON transcription response for files, streamable via transcript.text.delta/transcript.text.done events, or conversation.item.input_audio_transcription.delta/.completed events for Realtime sessions, with item_id-based reconciliation preserved from the legacy flow and a delay setting to trade partial-transcript speed against final accuracy.
Integrations
Calls OpenAI's Audio API (POST /v1/audio/transcriptions) for files and the Realtime transcription session over WebSocket or WebRTC for streaming; recommends evaluating word error rate, exact-match accuracy on names/IDs/numbers, and keyword hallucination - the transcript inserting a hinted word that wasn't actually spoken - before fully cutting over.
Who it's for
Teams with an existing Whisper-based transcription integration who need a field-by-field migration plan, including the common mistakes to avoid: sending both language and languages, treating an empty detected-language array as an error, or expecting subtitle, timestamp, or diarization output from a model that doesn't support it.
Source README
Migrate from Whisper to GPT-Transcribe and GPT-Live-Transcribe
Overview
OpenAI’s new transcription models give existing Whisper users two focused upgrade paths. GPT-Transcribe (gpt-transcribe) is designed for accurate transcription of completed audio via uploaded files. GPT-Live-Transcribe (gpt-live-transcribe) is designed for low-latency, continuously streaming transcription.
At a high level, the API endpoints are the same. File requests continue to use POST /v1/audio/transcriptions. Realtime integrations continue to configure a transcription session and handle transcription events. What’s different are the supported request fields, the output formats, and contextual/multilingual hints.
What stays the same
- File transcription uses the existing Audio API transcription endpoint.
- Realtime transcription uses the existing Realtime transcription session, WebSocket or WebRTC transport, and transcription events.
- Applications still provide audio, receive transcription text, and handle API or connection errors.
What changes
- Use
gpt-transcribefor completed files, streamed file transcripts, or committed Realtime turns. - Use
gpt-live-transcribefor continuously streaming, low-latency live transcription. - Replace the legacy
languagehint with the new-modellanguagesarray. - Use
promptfor free-form context andkeywordsfor literal terms expected in the audio. - Handle detected-language output for GPT-Transcribe, including an empty languages array.
1. Choose your migration path
- Recorded meetings, calls, or uploaded audio: migrate
whisper-1togpt-transcribeon POST /v1/audio/transcriptions. - Live captions or continuously arriving microphone audio: migrate
gpt-realtime-whispertogpt-live-transcribein a Realtime transcription session. - Higher-accuracy transcription after a manually committed audio turn: use
gpt-transcribein a Realtime transcription session over WebSocket.
Treat live audio and streaming output as separate decisions. A completed file can produce streamed transcript events, and a Realtime session can wait for an audio turn to be committed before producing deltas.
2. Migrate recorded audio
The smallest file migration preserves the endpoint, SDK call, and file upload. Replace the model identifier, then consume the JSON transcription response.
Prerequisites
- Python 3.11 or later.
- The OpenAI Python SDK:
python -m pip install --upgrade openai. - An
OPENAI_API_KEYenvironment variable. - A completed recording named
meeting.wav, or updateaudio_pathto point to your own file. - Access to the transcription models used in the example.
File examples make live API requests. Realtime examples construct the session payloads. Use WebSocket or WebRTC for gpt-live-transcribe, and use WebSocket for committed-turn gpt-transcribe.
Before - Whisper file transcription
After - GPT-Transcribe
Do’s and don’ts
- Note that the new model returns JSON. If the existing application requests
text,verbose_json,srt, orvtt, do not assume the same response_format remains valid. Keep Whisper for those formats or explicitly build and test the downstream conversion your application requires.
3. Update language hints and domain context
Legacy Whisper integrations commonly send a single language value and place domain vocabulary in a free-form prompt. The new models accept multiple expected input languages and separate structured keyword hints from the general prompt.
Before - single-language Whisper request
After - multilingual GPT-Transcribe request
Do’s and don’ts
- Use
promptto describe the recording’s topic or setting. - Use
keywordsfor literal product names, medication names, account identifiers, or other domain-specific terms that may actually be spoken. - Use
languagesto indicate expected spoken languages. - Do not send both
languageandlanguages. - Validate keyword input before making the request: each keyword must be a single-line literal and must not include
<,>, a carriage return, or a line feed. Invalid keyword input rejects the whole request or session update.
4. Stream the transcription of a completed file
Streaming applies to the transcription output, not the audio input. The application first supplies a completed recording; the API then streams text as it transcribes that recording.
Before - blocking Whisper file request
After - streamed GPT-Transcribe file request
Do’s and don’ts
- Use transcription events to distinguish in-progress from completed transcripts. Update your transcript or progress UI with
transcript.text.deltaevents, then usetranscript.text.doneto mark the transcript as final. - Do not label file streaming as live audio capture: the file must already exist.
5. Migrate continuous live transcription
For a live captioning workflow, preserve the Realtime connection and transcription-session architecture. Change the transcription model and update the model-specific configuration.
Before - GPT-Realtime-Whisper
After - GPT-Live-Transcribe
Do’s and don’ts
- Continue handling
conversation.item.input_audio_transcription.deltaandconversation.item.input_audio_transcription.completed. - Preserve the existing item_id-based reconciliation logic.
- Use the model’s
delaysetting to trade off faster partial transcripts against a more accurate final transcript. - Preserve the existing WebSocket or WebRTC transport; Realtime transcription supports both.
6. Use GPT-Transcribe in a committed-turn Realtime session
GPT-Transcribe is not limited to uploaded files. Use it as the input transcription model in a Realtime session over WebSocket when your application needs higher-accuracy transcription after a manually committed audio turn.
Before - legacy live-transcription session
After - committed-turn GPT-Transcribe session
Do’s and don’ts
- Append audio to the input buffer, then send
input_audio_buffer.commit. Transcription happens per committed chunk of audio, not continuous live captioning. GPT-Transcribe may emit transcript delta events before the completed event for that chunk.
7. Update response and event handling
GPT-Transcribe can include detected input languages in completed file and Realtime results. These are predictions returned by the model, not a restatement of the caller’s language hints.
Before - transcript without language predictions
After - GPT-Transcribe detected-language response
Do’s and don’ts
- Handle
languages: []as a valid result when the model cannot make a reliable prediction. - Do not infer that no one spoke, that the request failed, or that a synthetic
unknownlanguage was returned. GPT-Live-Transcribe does not return detected-language predictions in its initial contract. - For Realtime, inspect
conversation.item.input_audio_transcription.completed; GPT-Transcribe may attach the same language metadata to that event.
8. Check compatibility before switching
Some existing transcription features do not have a drop-in replacement in gpt-transcribe or gpt-live-transcribe.
- Subtitles: retain
whisper-1if the integration depends on native SRT or VTT output. - Timestamps: retain a model and response format that explicitly support word or segment timestamps.
- Translation: retain
/v1/audio/translationswith a supported translation model if the application translates audio into English. - Speaker diarization: use
gpt-4o-transcribe-diarizeon/v1/audio/transcriptionswithresponse_format: "diarized_json"when your application requires speaker labels. Setchunking_strategy: "auto"for recordings longer than 30 seconds. This model is not supported in the Realtime API.
9. Evaluate before and after
Use the same representative audio clips across both models. Compare the baseline, a direct model-only replacement, and a version that adds the new context fields. This isolates improvements from the model itself versus improvements caused by prompt, keywords, or language hints.
Evaluate transcription quality
- Overall word error rate on representative recordings.
- Exact-match accuracy for names, product names, medication names, account identifiers, numbers, and email addresses.
- Performance with accents, background noise, telephony audio, and short utterances.
- Accuracy during language switching and mixed-language speech.
- Keyword hallucination: confirm the transcript does not insert hinted words that were not actually spoken.
- Completeness of the final transcript and any expected language metadata.
Evaluate streaming and operational behavior
- Time to first transcript delta, reported separately for file streaming and live audio.
- Time from an explicit committed turn to the final transcript.
- Median and tail latency, including p95 or the team’s existing service-level threshold.
- How frequently partial transcript text changes before completion.
- Event ordering and item_id reconciliation across overlapping turns.
- Reconnect, retry, empty-audio, and interrupted-session behavior.
- Actual request pricing and production rate limits from the released source of truth.
Common migration errors
- Treating
gpt-transcribeas incompatible with Realtime solely because it is optimized for completed audio. - Describing GPT-Transcribe as unable to stream because processing begins after a commit.
- Assuming streamed file output means the endpoint accepts an ongoing microphone stream.
- Sending both legacy
languageand new-modellanguages. - Expecting subtitle formats, timestamps, speaker labels, or detected-language output from a model that does not support them.
- Treating an empty detected-language array as an API error.
- Forcing keywords into the transcript instead of treating them as hints.
- Assuming every Realtime model supports the same voice activity detection and latency controls.
Related resources
FAQ
Common questions
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.