---
title: "Complete the open turn, streaming audio as it is generated"
method: POST
path: "/v1/converse/stream"
tags: ["Speech"]
---

# Complete the open turn, streaming audio as it is generated

`POST /v1/converse/stream`

Same request as /v1/converse; the response is a text/event-stream: one `meta` event, `audio` chunk events as audio is generated (`pcm_b64` = base64 raw 16-bit LE PCM at `sample_rate`), then exactly one `end` (reply text, audio_seconds, usage, meta) or `error`. First audio arrives after one ~80 ms frame instead of after the whole clip; closing the connection aborts generation.

## Request body

- ConverseRequest — Complete the open (final) turn of a conversation. Every turn except the last must carry ``text`` and/or ``audio_wav_b64`` (grounded history). The **last** turn is the one to generate: it may be ``speaker``-only (model authors text + audio) or ``speaker`` + ``text`` (render that text as contextual TTS). A last turn already carrying both text and audio has nothing to generate → ``400``; audio alone on the last turn is ignored — reference audio belongs on history turns.
  - `conversation` ConversationTurnModel[], required — The conversation, oldest turn first; the last turn is the open turn to complete.
    - `speaker` string — Role label for this turn (one of the model's `speakers`).
    - `text` string, nullable — Text spoken in this turn, if known.
    - `audio_wav_b64` string, nullable — Base64 16-bit PCM WAV of this turn's audio, if any.
  - `model` string, nullable — Public model id (see GET /v1/models). Omit/null for the default model.
  - `params` GenParamsModel — Generation knobs, all optional — the defaults are the tuned production sampling, shared by every generation endpoint (served with UI ranges at GET /v1/info).
    - `temperature` number
    - `acoustic_temperature` number, nullable — Temperature for the voice's fine acoustic detail; null = follow `temperature`.
    - `top_k` integer, nullable — Sample from the k most-likely tokens; null = full vocabulary.
    - `max_new_tokens` integer, nullable — Optional generation cap; null uses the model's remaining context window.
    - `audio_quality` 'low' | 'medium' | 'high' — Playback fidelity: high = full quality (default); lower tiers reduce fidelity, not payload size.

## Response `200`

Server-sent event stream: meta, audio chunks, then end or error.

## Other responses

- `400` — Semantically invalid request.
- `401` — Missing or invalid API key.
- `422` — Request validation failed.
- `429` — Rate limit exceeded.
- `500` — Unexpected internal error.
- `502` — The inference backend failed.
- `503` — API-key verification is temporarily unavailable.

---

[API](https://skmtc.net/kalpalabs/apis/kalpa-speech-api.md) · [All operations](https://skmtc.net/kalpalabs/apis/kalpa-speech-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/kalpalabs/kalpa-speech-api/versions/60add3abf640/schema)
