VoiceStudioDocs
Local reference

Engines and models

GET
/model/status

Report model loading state for frontend warm-up indicators.

Response Body

application/json

bash
curl -X GET "https://example.com/model/status"
json
{
  "status": "string",
  "checkpoint": "string",
  "loaded_at": "string",
  "sub_stage": "string",
  "detail": "string",
  "error": "string"
}
GET
/model/loaded

List all currently loaded models for the flush dropdown (MM2-04). Thin delegation to the model_lifecycle facade — shape unchanged: {models, count}.

Response Body

application/json

bash
curl -X GET "https://example.com/model/loaded"
json
null
POST
/model/unload/{model_id}

Unload a specific model by id (MM2-04). Delegates to model_lifecycle; an unknown id maps to HTTP 400. tts | diarization | sidecar:<id> | sidecars.

Path Parameters

model_id*Model Id

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/model/unload/string"
json
null
GET
/engines

Response Body

application/json

bash
curl -X GET "https://example.com/engines"
json
null
GET
/engines/tts

Response Body

application/json

bash
curl -X GET "https://example.com/engines/tts"
json
null
GET
/engines/asr

Response Body

application/json

bash
curl -X GET "https://example.com/engines/asr"
json
null
GET
/engines/llm

Response Body

application/json

bash
curl -X GET "https://example.com/engines/llm"
json
null
GET
/engines/effects/presets

Return available DSP effect presets for the dub pipeline.

Each preset is a named chain of audio effects (EQ, compressor, reverb, etc.) that can be applied to generated TTS audio on a per-segment basis.

Response Body

application/json

bash
curl -X GET "https://example.com/engines/effects/presets"
json
{
  "presets": [
    {
      "id": "string",
      "label": "string",
      "icon": "string",
      "description": "string"
    }
  ]
}
GET
/engines/translation

Translation engines with per-engine pip-package availability.

Separate from the tts/asr/llm "family" endpoints because these are pip-installable on demand rather than select-from-what's-available. The UI uses this to show a one-click Install chip when the user picks an engine whose Python dependency isn't importable yet.

Response Body

application/json

bash
curl -X GET "https://example.com/engines/translation"
json
null
POST
/engines/translation/{engine_id}/install

Path Parameters

engine_id*Engine Id

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/engines/translation/string/install"
json
null
DELETE
/engines/translation/{engine_id}

Path Parameters

engine_id*Engine Id

Response Body

application/json

application/json

bash
curl -X DELETE "https://example.com/engines/translation/string"
json
null
POST
/engines/sidecar/{engine_id}/install

Start (or report) the one-click install for a sidecar engine.

Returns {status: "started"|"already_running"|"already_installed"}. 404 for engines that have no sidecar installer — the response names the translation-engine route so a mis-aimed client can self-correct.

Path Parameters

engine_id*Engine Id

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/engines/sidecar/string/install"
json
null
DELETE
/engines/sidecar/{engine_id}/install

Remove an app-managed sidecar install (checkout + venv + weights) and clear the persisted path. Refuses user-managed installs (a clone the user made themselves) and installs with a job still running.

Path Parameters

engine_id*Engine Id

Response Body

application/json

application/json

bash
curl -X DELETE "https://example.com/engines/sidecar/string/install"
json
null
GET
/engines/sidecar/{engine_id}/install/status

Step-by-step status of the sidecar install job (poll while running).

Shape: {engine_id, installed, managed, install_dir, job} where job is null before the first run, else {state, steps[], log[], error, remediation, weights_progress, started_at, finished_at}.

Path Parameters

engine_id*Engine Id

Response Body

application/json

application/json

bash
curl -X GET "https://example.com/engines/sidecar/string/install/status"
json
null
GET
/engines/{engine_id}/health

Spawn-and-ping a SubprocessBackend; is_available() for the rest.

Returns: { id, ok, message, latency_ms }

text
Never raises through to a 500: backend diagnostics stay in the local
log and the response carries a fixed failure message, so the UI can
render a per-row failure without exposing private data. Unknown engine
ids return 404.

Path Parameters

engine_id*Engine Id

Response Body

application/json

application/json

bash
curl -X GET "https://example.com/engines/string/health"
json
null
POST
/engines/{engine_id}/selftest

Run a bounded, real synthesis on an available in-process TTS engine.

404 for an unknown TTS id; 400 when the engine is subprocess-isolated or not currently available (a real synth on either is meaningless). Never raises through to a 500 on a synth failure — the exception is captured into ok=False / message so the panel renders a per-row failure.

Path Parameters

engine_id*Engine Id

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/engines/string/selftest"
json
{
  "id": "string",
  "ok": true,
  "message": "string",
  "duration_ms": 0,
  "sample_rate": 0,
  "num_samples": 0,
  "audio_seconds": 0,
  "timed_out": false
}
POST
/engines/select

Persist a family's engine pick to prefs.json. Refuses unknown backends, backends whose deps aren't installed, AND backends that cannot run on THIS host's hardware (routing_status == "unavailable") — so the UI can't silently brick a pipeline by picking an engine that needs a GPU this machine lacks. A cpu_fallback pick is allowed (it runs, just slower) — only a hard unavailable is blocked. LLM is never routing-gated (its status is "n/a").

Request Body

application/json

family*Family
backend_id*Backend Id
model_id?string|null

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/engines/select" \
  -H "Content-Type: application/json" \
  -d '{
    "family": "string",
    "backend_id": "string"
  }'
json
{
  "family": "string",
  "active": "string",
  "env_override": true,
  "routing_status": "cpu_only",
  "effective_device": "cpu",
  "routing_reason": "string"
}
GET
/models

Catalogue every known model + its on-disk install state.

Uses a 10 s response cache to avoid repeated scan_cache_dir() disk walks when the frontend polls.

Response Body

application/json

bash
curl -X GET "https://example.com/models"
json
null
POST
/models/install

Download one HF repo snapshot; progress goes through the shared /setup/download-stream SSE feed.

Request Body

application/json

repo_id*Repo Id
target?string|null

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/models/install" \
  -H "Content-Type: application/json" \
  -d '{
    "repo_id": "string"
  }'
json
null
POST
/models/install/cancel

Request cancellation of an in-flight install (FDL-11).

Best-effort: stops further retry attempts and marks the row cancelled. A single in-flight snapshot_download/Xet fetch isn't interruptible mid-file in hf_hub 1.7.2, so an already-streaming file finishes; the cancel takes effect at the next retry boundary. Clears the cooldown so the user can immediately restart.

Request Body

application/json

repo_id*Repo Id
target?string|null

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/models/install/cancel" \
  -H "Content-Type: application/json" \
  -d '{
    "repo_id": "string"
  }'
json
null
DELETE
/models/{repo_id}

Remove every cached revision of a repo from the HF cache.

Path Parameters

repo_id*Repo Id

Response Body

application/json

application/json

bash
curl -X DELETE "https://example.com/models/string"
json
null