Get Started
Before we begin, make sure you have an AssemblyAI account and an API key. You can sign up for a free account and get your API key from your dashboard.Side-By-Side Code Comparison
Below is a side-by-side comparison of a basic snippet to transcribe live audio by Deepgram and AssemblyAI using a microphone:- Deepgram
- AssemblyAI
Authentication
- Deepgram
- AssemblyAI
Protect Your API KeyFor improved security, store your API key as an environment variable.
Connection Parameters & Microphone Setup
- Deepgram
- AssemblyAI
-
Universal-3.5 Pro model — Connect to
wss://streaming.assemblyai.com/v3/wswithspeech_model=universal-3-5-proto use our latest, highest-accuracy streaming model. Unlike Deepgram’smodel="nova-3", you use a singlespeech_modelparameter. -
Built-in formatting — Universal-3.5 Pro always returns formatted transcripts with smart punctuation & casing, similar to Deepgram’s
punctuate=true. No extra parameter is needed. -
Partials are always on — like Deepgram’s
interim_results=true— AssemblyAI streams interim results automatically. Universal-3.5 Pro emits partials during periods of silence, with at most one partial per silence period.
Opening the WebSocket
- Deepgram
- AssemblyAI
Tip: Adding error-handling and log lines (as in the AssemblyAI snippet) lets you see exactly when the socket opens, audio starts, or a read fails—catching issues early saving time debugging silent failures.
Receiving Messsages from the WebSocket
- Deepgram
- AssemblyAI
-
Clear message types – Instead of checking
is_final, you’ll receive explicit"Begin","Turn", and"Termination"events, making your logic simpler and more readable. -
Session metadata up-front – The first
"Begin"message delivers asession_idand expiry timestamp. You can log or surface these for tracing or billing. -
End-of-turn detection – Each
"Turn"object includes anend_of_turnboolean. Whenend_of_turnistrue, the transcript is a final, formatted result. Whenfalse, it is a partial transcript. Universal-3.5 Pro always returns formatted transcripts with smart punctuation & casing built in.
Handling Errors
- Deepgram
- AssemblyAI
Closing the WebSocket
- Deepgram
- AssemblyAI
- Connection diagnostics on tap - If the socket closes unexpectedly, AssemblyAI supplies both a status code and a reason message (close_status_code, close_msg), so you know immediately whether the server timed out, refused auth, or encountered another error.
- Metadata arrives at session start, not at close - Deepgram sends its final metadata only when the socket closes. AssemblyAI delivers session information up front in the initial “Begin” message, so you can log IDs and expiry times right away.
Opening the Microphone Stream & Creating a WebSocket
- Deepgram
- AssemblyAI
Session Shutdown
- Deepgram
- AssemblyAI
-
JSON payload difference - When closing the stream with AssemblyAI, your JSON payload will be
{"type: "Terminate" }instead of{"type: "CloseStream" } - No metadata race condition - Because AssemblyAI already provided session info at “Begin” and doesn’t append extra data at shutdown, you don’t have to sleep (time.sleep(0.5)) to wait for “final metadata” before closing—making the exit faster and less error-prone.