> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kugelaudio.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Speech to Text

> Transcribe audio with the Python SDK

`client.asr.transcribe()` uploads a complete audio file to `luchs-1` and
returns the transcript. See [Speech to Text](/api-reference/endpoints/speech-to-text)
for the full wire contract, supported language, audio limits, and the
WebSocket streaming protocol — the SDK does not yet wrap streaming.

## Transcribe a file

```python theme={null}
from kugelaudio import KugelAudio

client = KugelAudio(api_key="your_api_key")

with open("speech.wav", "rb") as f:
    result = client.asr.transcribe(f.read())

print(result.text)           # OpenAI-compatible alias
print(result.transcript)     # KugelAudio's own field
print(result.model)          # "luchs-1"
print(result.model_revision) # immutable checkpoint revision
```

`model` defaults to `"luchs-1"` and does not need to be passed. Passing any
other value raises `ValidationError` client-side, before any network call:

```python theme={null}
from kugelaudio import ValidationError

try:
    client.asr.transcribe(audio_bytes, model="qwen3-asr")
except ValidationError as e:
    print(e)  # Unsupported ASR model 'qwen3-asr'; use 'luchs-1'
```

### Optional arguments

```python theme={null}
result = client.asr.transcribe(
    audio_bytes,
    filename="call.wav",
    content_type="audio/wav",
    language="en",  # accepted, but does not change what gets recognized
)
```

`language` is forwarded but currently has no effect on recognition — see
[Supported language](/api-reference/endpoints/speech-to-text#supported-language).

## Migrating from `qwen3-asr`

`model="qwen3-asr"` (or any other prior identifier) now raises
`ValidationError`. Drop the argument, or pass `model="luchs-1"` explicitly.
Any code that read the previous default off the response must also account
for `result.model` now always being `"luchs-1"`; use `result.model_revision`
if you need the underlying artifact identity. This changed in the next major
release of the Python SDK.

## Streaming

The Python SDK does not currently include a WebSocket streaming client for
speech-to-text. Use the raw WebSocket protocol in
[Speech to Text](/api-reference/endpoints/speech-to-text#stream-live-audio)
directly for live transcription.
