Contract
Vexa appends/v1/audio/transcriptions to TRANSCRIPTION_SERVICE_URL and sends multipart form data:
The minimum response Vexa needs is:
text is present.
Configure Vexa
Set these variables indeploy/compose/.env:
TRANSCRIPTION_SERVICE_URL is the base URL. Do not include /v1/audio/transcriptions; Vexa appends
that path.
If the backend ignores the model form part, leave TRANSCRIPTION_MODEL unset. If it validates model
ids, set the exact served name.
Example: FunASR or SenseVoice
Client path validated upstream; complete meeting deployment still needs a witness. The FunASR
maintainers ran Vexa’s own
TranscriptionClient against the FunASR 1.3.26 OpenAI-compatible server
with SenseVoice on CPU (#928). Chinese, English,
Cantonese, Japanese, Korean, and concatenated Chinese-English samples all produced non-empty
transcripts, verbose segments, and duration metadata. No Vexa maintainer has reproduced this — a
bot-in-meeting run and the platform_settings override path remain unwitnessed on either side, and
are tracked in #863.funasr-server --model sensevoice exposes sensevoice as its served model id. A Hub
checkpoint path such as FunAudioLLM/SenseVoiceSmall is not automatically an API model id; verify
the names exposed by your gateway’s GET /v1/models route. The official Fun-ASR-Nano server uses
fun-asr-nano. Other gateways may expose different names.
Vexa treats the STT service as a network dependency. Put the ASR runtime on a GPU box if needed, and
keep the main stack CPU-only.
Preflight before a meeting
Test the endpoint from the Vexa host before sending a bot:text field. A 404 usually means the
base URL already included /v1 or /v1/audio/transcriptions. A 401 or 403 means the token is missing
or wrong. A model_not_found response means TRANSCRIPTION_MODEL does not match the served model id.
Keep provider errors attributable
When adding or operating a custom STT backend:- Preserve the raw HTTP status in logs.
- Keep provider error messages sanitized, but do not collapse every failure into “transcription failed”.
- Separate route errors, auth errors, model-id errors, and audio-format errors.
- Keep long-audio chunking on the backend side if the model has a fixed window limit.