- Deepgram
- ElevenLabs
- OpenAI
- Google Cloud
- AWS Transcribe
- Azure
WebSocket
- wss://api.deepgram.com/v1/listen?model=nova-2&language=en
- Authorization: Token DEEPGRAM_KEY
+ wss://api.telnyx.com/v2/speech-to-text/transcription?transcription_engine=Deepgram&model=nova-3&language=en
+ Authorization: Bearer TELNYX_KEY
| Deepgram | Telnyx | |
|---|---|---|
| Auth scheme | Token | Bearer |
| Engine | implicit | transcription_engine=Deepgram |
| Model name | nova-2 | nova-3 |
| Deepgram | → Telnyx |
|---|---|
results.channels[0].alternatives[0].transcript | transcript |
is_final | is_final |
speech_final | is_final |
REST
# Before (Deepgram)
curl -X POST https://api.deepgram.com/v1/listen?model=nova-2 \
-H "Authorization: Token DEEPGRAM_KEY" \
-H "Content-Type: audio/wav" \
--data-binary @audio.wav
# After (Telnyx)
curl -X POST https://api.telnyx.com/v2/ai/audio/transcriptions \
-H "Authorization: Bearer TELNYX_KEY" \
-F model="deepgram/nova-3" \
-F file=@audio.wav
| Deepgram | Telnyx | |
|---|---|---|
| Auth scheme | Token | Bearer |
| Body | raw binary | multipart/form-data |
| Model name | nova-2 | deepgram/nova-3 |
| Deepgram | → Telnyx |
|---|---|
results.channels[0].alternatives[0].transcript | text |
results.channels[0].alternatives[0].words | available via model_config.diarize / model_config.smart_format |
WebSocket
- wss://api.elevenlabs.io/v1/speech-to-text/realtime?model_id=scribe_v1&language_code=en
- xi-api-key: ELEVENLABS_KEY
+ wss://api.telnyx.com/v2/speech-to-text/transcription?transcription_engine=Deepgram&model=nova-3&language=en
+ Authorization: Bearer TELNYX_KEY
| ElevenLabs | Telnyx query parameter |
|---|---|
model_id | transcription_engine + model |
language_code | language |
keywords | keyterm (Nova-3/Flux) — see Keyword Boosting |
| ElevenLabs | → Telnyx |
|---|---|
text | transcript |
is_final | is_final |
REST
# Before (ElevenLabs)
curl -X POST https://api.elevenlabs.io/v1/speech-to-text \
-H "xi-api-key: ELEVENLABS_KEY" \
-F "audio=@audio.mp3" \
-F "model_id=scribe_v1"
# After (Telnyx)
curl -X POST https://api.telnyx.com/v2/ai/audio/transcriptions \
-H "Authorization: Bearer TELNYX_KEY" \
-F model="openai/whisper-large-v3-turbo" \
-F file=@audio.mp3
| ElevenLabs | Telnyx | |
|---|---|---|
| Auth header | xi-api-key | Authorization: Bearer |
| File field | audio | file |
| Model field | model_id | model |
{"text": "..."} shape — no parsing changes needed.REST
The easiest migration — Telnyx REST is OpenAI SDK compatible. Change the API key and base URL, everything else stays the same.from openai import OpenAI
client = OpenAI(
- api_key="sk-OPENAI_KEY",
+ api_key="YOUR_TELNYX_API_KEY",
+ base_url="https://api.telnyx.com/v2",
)
result = client.audio.transcriptions.create(
model="openai/whisper-large-v3-turbo",
file=open("audio.mp3", "rb"),
)
| OpenAI | Telnyx | |
|---|---|---|
api_key | sk-... | Telnyx API key |
base_url | (default) | https://api.telnyx.com/v2 |
| Method | client.audio.transcriptions.create(...) | unchanged |
| Response | result.text | unchanged |
{"text": "..."} shape — no parsing changes needed for the default json response format.Note on verbose_json: OpenAI’s Whisper API returns segments with timestamps when you set response_format=verbose_json. Telnyx’s Whisper models (openai/whisper-large-v3-turbo, openai/whisper-tiny) return text only — no segments. If you need timestamps, switch to model="deepgram/nova-3" which supports segment- and word-level timestamps via model_config.WebSocket
Google uses gRPC with protobuf. Telnyx uses WebSocket with JSON — no protobuf compilation, no service account credentials.# Before (Google Cloud)
from google.cloud import speech
client = speech.SpeechClient()
config = speech.RecognitionConfig(
encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
sample_rate_hertz=16000,
language_code="en-US",
enable_automatic_punctuation=True,
)
streaming_config = speech.StreamingRecognitionConfig(
config=config,
interim_results=True,
)
# ... gRPC streaming setup
# After (Telnyx)
wss://api.telnyx.com/v2/speech-to-text/transcription?transcription_engine=Google&language=en-US&interim_results=true&input_format=linear16&sample_rate=16000
Authorization: Bearer TELNYX_KEY
| Google gRPC | Telnyx query parameter |
|---|---|
language_code | language |
encoding | input_format |
sample_rate_hertz | sample_rate |
interim_results | interim_results |
enable_automatic_punctuation | enabled by default |
| Google Cloud | → Telnyx |
|---|---|
results[0].alternatives[0].transcript | transcript |
results[0].is_final | is_final |
WebSocket
AWS Transcribe Streaming uses HTTP/2 with event streams via theamazon-transcribe-streaming-sdk. Telnyx uses a plain WebSocket — no AWS SDK, no SigV4 signing, no IAM credentials.# Before (AWS) — amazon-transcribe-streaming-sdk
from amazon_transcribe.client import TranscribeStreamingClient
from amazon_transcribe.handlers import TranscriptResultStreamHandler
class Handler(TranscriptResultStreamHandler):
async def handle_transcript_event(self, event):
for result in event.transcript.results:
for alt in result.alternatives:
print(alt.transcript)
client = TranscribeStreamingClient(region="us-east-1")
stream = await client.start_stream_transcription(
language_code="en-US",
media_sample_rate_hz=16000,
media_encoding="pcm",
)
# Send audio chunks via stream.input_stream.send_audio_event(...)
# Receive results via Handler
# After (Telnyx) — plain WebSocket
wss://api.telnyx.com/v2/speech-to-text/transcription?transcription_engine=Deepgram&model=nova-3&language=en-US&input_format=linear16&sample_rate=16000
Authorization: Bearer TELNYX_KEY
| AWS Transcribe Streaming | Telnyx query parameter |
|---|---|
language_code | language |
media_encoding | input_format |
media_sample_rate_hz | sample_rate |
enable_partial_results_stabilization | interim_results |
vocabulary_name | keyterm (Nova-3/Flux) — see Keyword Boosting |
| AWS Transcribe Streaming | → Telnyx |
|---|---|
transcript.results[].alternatives[].transcript | transcript |
transcript.results[].is_partial | is_final (inverted) |
WebSocket
The Azure Speech SDK wraps a region-specific WebSocket with SDK abstractions and event handlers. Telnyx uses a plain WebSocket — no SDK install, no region routing.# Before (Azure Speech SDK)
import azure.cognitiveservices.speech as speechsdk
speech_config = speechsdk.SpeechConfig(
subscription="AZURE_KEY",
region="eastus",
)
speech_config.speech_recognition_language = "en-US"
audio_config = speechsdk.audio.AudioConfig(use_default_microphone=True)
recognizer = speechsdk.SpeechRecognizer(
speech_config=speech_config,
audio_config=audio_config,
)
recognizer.recognizing.connect(lambda evt: print(f"partial: {evt.result.text}"))
recognizer.recognized.connect(lambda evt: print(f"FINAL: {evt.result.text}"))
recognizer.start_continuous_recognition()
# After (Telnyx) — plain WebSocket
wss://api.telnyx.com/v2/speech-to-text/transcription?transcription_engine=Azure&language=en-US&interim_results=true
Authorization: Bearer TELNYX_KEY
| Azure Speech SDK | Telnyx query parameter |
|---|---|
speech_recognition_language | language |
recognizing event | partial result (is_final: false) |
recognized event | final result (is_final: true) |
region | not needed — single global endpoint |
| Azure Speech SDK | → Telnyx |
|---|---|
evt.result.text (recognizing/recognized) | transcript |
recognizing event | is_final: false |
recognized event | is_final: true |
REST
# Before (Azure)
curl -X POST \
"https://eastus.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US" \
-H "Ocp-Apim-Subscription-Key: AZURE_KEY" \
-H "Content-Type: audio/wav" \
--data-binary @audio.wav
# After (Telnyx)
curl -X POST https://api.telnyx.com/v2/ai/audio/transcriptions \
-H "Authorization: Bearer TELNYX_KEY" \
-F model="openai/whisper-large-v3-turbo" \
-F file=@audio.wav
| Azure | Telnyx | |
|---|---|---|
| Auth | Ocp-Apim-Subscription-Key header | Authorization: Bearer |
| URL | region-specific | single global endpoint |
| Body | raw binary | multipart/form-data |
| Language | required query param | auto-detected or optional |
| Azure | → Telnyx |
|---|---|
DisplayText | text |
NBest[0].Lexical | text |