Skip to content

SDKs

The official Gladia SDKs work with the Gladia Enterprise API: set the API address of your region.

Terminal window
pip install gladiaio-sdk # Python 3.10 or later
npm install @gladiaio/sdk # Node.js 20 or later, and browsers

Language, endpointing, custom vocabulary and spelling, translation, sentiment, callbacks, custom_metadata: pass them to start_session / startSession as usual.

sdk_session.py
# pip install gladiaio-sdk
import os
import sys
import threading
import wave
from gladiaio_sdk import GladiaClient, LiveV2InitRequest
API_URL = os.environ.get("GLADIA_API_URL", "https://eu1.api.gladia.io")
API_KEY = os.environ["GLADIA_API_KEY"]
with wave.open(sys.argv[1]) as wav: # a 16-bit PCM WAV file
rate, channels = wav.getframerate(), wav.getnchannels()
audio = wav.readframes(wav.getnframes())
config = {
"encoding": "wav/pcm",
"sample_rate": rate,
"bit_depth": 16,
"channels": channels,
"model": "solaria-3",
"language_config": {
"languages": [
"en"
]
},
"realtime_processing": {
"custom_vocabulary": True,
"custom_vocabulary_config": {
"vocabulary": [
"Gladia"
]
}
}
}
client = GladiaClient(api_key=API_KEY, api_url=API_URL)
session = client.live_v2().start_session(LiveV2InitRequest.from_dict(config))
ended, errors = threading.Event(), []
@session.on("message")
def on_message(message):
if message.type == "transcript" and message.data.is_final:
print(message.data.utterance.text)
session.on("error", errors.append)
session.once("ended", lambda _: ended.set())
step = rate * channels * 2 // 10 # 100 ms of audio per chunk
for start in range(0, len(audio), step):
session.send_audio(audio[start : start + step]) # live audio: send each chunk as it is captured
session.stop_recording()
ended.wait(timeout=60)
sys.exit(1 if errors or not ended.is_set() else 0)

GLADIA_API_KEY and GLADIA_API_URL in the environment work too.

profile, punctuation, numerals, end_of_turn, diarization, named_entity_recognition with options, pii and turn_router are not in the SDKs’ types yet (gladiaio/sdk#61).

  • JavaScript: pass them anyway, the SDK sends the configuration as is. In TypeScript, the configuration needs a cast (as LiveV2InitRequest).
  • Python: LiveV2InitRequest drops the fields it does not know, without an error. Create the session over HTTP, then hand it to the SDK with connect_session: it streams, buffers and reconnects as usual.
sdk_enterprise_options.py
# pip install gladiaio-sdk requests
import os
import sys
import threading
import wave
import requests
from gladiaio_sdk import GladiaClient, LiveV2ConnectSessionOptions
API_URL = os.environ.get("GLADIA_API_URL", "https://eu1.api.gladia.io")
API_KEY = os.environ["GLADIA_API_KEY"]
with wave.open(sys.argv[1]) as wav: # a 16-bit PCM WAV file
rate, channels = wav.getframerate(), wav.getnchannels()
audio = wav.readframes(wav.getnframes())
config = {
"encoding": "wav/pcm",
"sample_rate": rate,
"bit_depth": 16,
"channels": channels,
"model": "solaria-3",
"language_config": {
"languages": [
"en"
]
},
"numerals": True,
"end_of_turn": True
}
client = GladiaClient(api_key=API_KEY, api_url=API_URL)
# `numerals` and `end_of_turn` are Gladia Enterprise options the Python SDK does not send yet
# (gladiaio/sdk#61): create the session over HTTP, then let the SDK stream it.
created = requests.post(f"{API_URL}/v2/live", headers={"x-gladia-key": API_KEY}, json=config, timeout=10)
created.raise_for_status()
info = created.json()
session = client.live_v2().connect_session(LiveV2ConnectSessionOptions(id=info["id"], url=info["url"]))
ended, errors = threading.Event(), []
@session.on("message")
def on_message(message):
if message.type == "transcript" and message.data.is_final:
print(message.data.utterance.text)
def on_error(error):
if "Unsupported websocket message type" not in str(error): # end_of_turn messages: gladiaio/sdk#61
errors.append(error)
session.on("error", on_error)
session.once("ended", lambda _: ended.set())
step = rate * channels * 2 // 10 # 100 ms of audio per chunk
for start in range(0, len(audio), step):
session.send_audio(audio[start : start + step]) # live audio: send each chunk as it is captured
session.stop_recording()
ended.wait(timeout=60)
sys.exit(1 if errors or not ended.is_set() else 0)
  • Messages the Python SDK does not know (pii, end_of_turn, end_of_turn_score, error) reach your error handler as “Unsupported websocket message type”, and are lost to it. Read them with the JavaScript SDK or a raw WebSocket (Live WebSocket). The JavaScript SDK delivers every message.
  • Fields the Python SDK does not know on known messages (text_raw and entities of an utterance, the speaker of a word) are not in its objects. The JavaScript SDK keeps them.
  • model is typed "solaria-1" in both SDKs: solaria-3 and trantoria-1 work, with a cast in TypeScript.
  • In a browser, never put the API key in the page: create the session on your server and give the page its url, then use connectSession (Authentication).
  • region: leave the SDKs’ region option unset; the API address you set is the region.