catalog: add zonos service entry; fix dia voice picker options
zonos: new tts entry routing to the REST adapter on 8201, JSON-envelope response with reproducibility.seed_field=seed (seedable+deterministic), lifecycle block, section groups. Matching reproducibility_audit row. dia: voice select had a default (S1) but no options/source_url -> empty picker; add options [S1, S2, dialogue] (per asset-engine-dev), bump dia to version 2. Closed select drops clone-by-filename free-text; flagged inline for a future source_url-backed picker. catalog_version unchanged (add-service + field-options = no vocab change).
This commit is contained in:
@@ -1241,7 +1241,7 @@ services:
|
|||||||
[S1]/[S2] speaker tags and nonverbals (laughs)/(coughs)/(sighs).
|
[S1]/[S2] speaker tags and nonverbals (laughs)/(coughs)/(sighs).
|
||||||
Dia2 family (1B streaming, 2B high-quality) selectable on the host.
|
Dia2 family (1B streaming, 2B high-quality) selectable on the host.
|
||||||
category: tts
|
category: tts
|
||||||
version: 1
|
version: 2
|
||||||
status: down
|
status: down
|
||||||
host: irv-ml1
|
host: irv-ml1
|
||||||
lifecycle:
|
lifecycle:
|
||||||
@@ -1275,10 +1275,13 @@ services:
|
|||||||
- name: voice
|
- name: voice
|
||||||
type: select
|
type: select
|
||||||
label: Voice / mode
|
label: Voice / mode
|
||||||
|
options: [S1, S2, dialogue]
|
||||||
default: S1
|
default: S1
|
||||||
description: >
|
description: >
|
||||||
S1 | S2 | dialogue, or a predefined/clone reference filename under
|
S1 | S2 | dialogue speaker mode. Clone-reference filenames under
|
||||||
/worktank/dia/reference_audio (e.g. "my_ref.wav").
|
/worktank/dia/reference_audio are NOT selectable here (a closed
|
||||||
|
select can't carry free-text); promote to a source_url-backed
|
||||||
|
picker or a separate free-text field if clone-by-file is wanted.
|
||||||
- name: response_format
|
- name: response_format
|
||||||
type: select
|
type: select
|
||||||
options: [opus, wav]
|
options: [opus, wav]
|
||||||
@@ -1408,6 +1411,149 @@ services:
|
|||||||
first start. Because it is non-deterministic, when started it belongs
|
first start. Because it is non-deterministic, when started it belongs
|
||||||
at status: experimental (not ready). Pin CSM_SHA before build.
|
at status: experimental (not ready). Pin CSM_SHA before build.
|
||||||
|
|
||||||
|
- id: zonos
|
||||||
|
name: Zonos-v0.1 TTS
|
||||||
|
description: >
|
||||||
|
Zyphra's expressive multilingual open-weight TTS (Apache-2.0) — 44 kHz,
|
||||||
|
zero-shot voice cloning from a 10–30s clip, and an 8-axis emotion
|
||||||
|
vector plus pitch/rate/fmax conditioning. First genuinely seedable TTS
|
||||||
|
in the fleet: the adapter returns the seed so regenerate/fork can pin it.
|
||||||
|
category: tts
|
||||||
|
version: 1
|
||||||
|
status: down
|
||||||
|
host: irv-ml1
|
||||||
|
lifecycle:
|
||||||
|
stack: zonos
|
||||||
|
# Adapter alone (~6 GB). NOTE: the zonos stack currently ships TWO
|
||||||
|
# services (the Gradio eval UI + this adapter); if orchestration does a
|
||||||
|
# whole-stack `compose up` it loads the model twice (~12 GB). Target the
|
||||||
|
# zonos-api service, or drop the Gradio service at promotion.
|
||||||
|
vram_gb: 6
|
||||||
|
gpu_device_id: 0
|
||||||
|
endpoint: http://10.100.79.3:8201/v1/audio/speech
|
||||||
|
method: POST
|
||||||
|
content_type: application/json
|
||||||
|
model:
|
||||||
|
id: Zyphra/Zonos-v0.1-transformer
|
||||||
|
revision: null
|
||||||
|
image: local/zonos-api:v1
|
||||||
|
section_groups:
|
||||||
|
- id: text
|
||||||
|
label: Text
|
||||||
|
- id: voice
|
||||||
|
label: Voice
|
||||||
|
- id: expression
|
||||||
|
label: Expression
|
||||||
|
hint: Conditioning knobs; leave emotion blank to keep it unconditional.
|
||||||
|
- id: generation
|
||||||
|
label: Generation
|
||||||
|
fields:
|
||||||
|
- name: input
|
||||||
|
type: textarea
|
||||||
|
label: Text to synthesize
|
||||||
|
section: text
|
||||||
|
required: true
|
||||||
|
max_length: 500
|
||||||
|
description: eSpeak-phonemized. Upstream Gradio caps the box at ~500 chars.
|
||||||
|
- name: language
|
||||||
|
type: select
|
||||||
|
label: Language code
|
||||||
|
section: text
|
||||||
|
default: en-us
|
||||||
|
# eSpeak code list is large; these are the documented multilingual
|
||||||
|
# set. The adapter accepts any code in zonos.supported_language_codes.
|
||||||
|
options: [en-us, ja, cmn, fr-fr, de]
|
||||||
|
description: Any eSpeak code Zonos supports; 400 on an unknown code.
|
||||||
|
- name: voice
|
||||||
|
type: select
|
||||||
|
label: Clone voice (optional)
|
||||||
|
section: voice
|
||||||
|
optional: true
|
||||||
|
source_url: http://10.100.79.3:8201/v1/audio/voices
|
||||||
|
source_jsonpath: $.voices[*]
|
||||||
|
description: >
|
||||||
|
Reference clip filename under /worktank/zonos/voices/ (10–30s clean
|
||||||
|
WAV). Omit for Zonos's default unconditioned voice.
|
||||||
|
- name: response_format
|
||||||
|
type: select
|
||||||
|
section: generation
|
||||||
|
options: [wav, flac]
|
||||||
|
default: wav
|
||||||
|
description: 44.1 kHz. Both lossless (libsndfile); no mp3/opus in v1.
|
||||||
|
- name: emotion
|
||||||
|
type: json
|
||||||
|
label: Emotion vector (optional)
|
||||||
|
section: expression
|
||||||
|
optional: true
|
||||||
|
description: >
|
||||||
|
8 floats 0.0–1.0 [happy, sad, disgust, fear, surprise, anger, other,
|
||||||
|
neutral]. Omit to leave emotion unconditional (the Gradio default;
|
||||||
|
upstream warns the sliders are finicky and can destabilize output).
|
||||||
|
- name: speaking_rate
|
||||||
|
type: slider
|
||||||
|
section: expression
|
||||||
|
min: 5.0
|
||||||
|
max: 30.0
|
||||||
|
step: 0.5
|
||||||
|
default: 15.0
|
||||||
|
- name: pitch_std
|
||||||
|
type: slider
|
||||||
|
label: Pitch std
|
||||||
|
section: expression
|
||||||
|
min: 0.0
|
||||||
|
max: 300.0
|
||||||
|
step: 1
|
||||||
|
default: 45.0
|
||||||
|
- name: fmax
|
||||||
|
type: slider
|
||||||
|
label: Fmax (Hz)
|
||||||
|
section: expression
|
||||||
|
min: 0
|
||||||
|
max: 24000
|
||||||
|
step: 1
|
||||||
|
default: 24000
|
||||||
|
- name: cfg_scale
|
||||||
|
type: slider
|
||||||
|
label: CFG scale
|
||||||
|
section: generation
|
||||||
|
min: 1.0
|
||||||
|
max: 5.0
|
||||||
|
step: 0.1
|
||||||
|
default: 2.0
|
||||||
|
- name: seed
|
||||||
|
type: number
|
||||||
|
section: generation
|
||||||
|
optional: true
|
||||||
|
description: Omit for a random seed; the seed used is returned in the envelope.
|
||||||
|
response:
|
||||||
|
# JSON envelope (like kokoro-captioned) so the seed rides back with the
|
||||||
|
# audio. Adapter returns: {audio: <base64 in response_format>,
|
||||||
|
# audio_format: "audio/wav"|"audio/flac", seed: <int>}.
|
||||||
|
type: audio
|
||||||
|
audio_field: audio
|
||||||
|
audio_format_field: audio_format
|
||||||
|
reproducibility:
|
||||||
|
seedable: true
|
||||||
|
deterministic: true
|
||||||
|
seed_field: seed
|
||||||
|
notes: >
|
||||||
|
torch.manual_seed(seed); the adapter echoes the seed it used in the
|
||||||
|
envelope's `seed` key. Same seed + params + GPU → byte-stable in
|
||||||
|
practice; cross-GPU (3090 vs A6000) may differ at bf16. Wire shape
|
||||||
|
is defined by the adapter (stacks/zonos/adapter/server.py) — verify
|
||||||
|
against the live endpoint at deploy per CATALOG-CONTRACT.
|
||||||
|
estimated_latency:
|
||||||
|
cold_start_s: 30
|
||||||
|
warm_per_unit: "~2x realtime on the 3090 (transformer variant)"
|
||||||
|
license: Apache-2.0
|
||||||
|
notes: |
|
||||||
|
Served via a thin OpenAI-ish FastAPI adapter (stacks/zonos/adapter/) in
|
||||||
|
front of the Zonos Python SDK — upstream ships only Gradio + SDK, no REST.
|
||||||
|
Transformer variant only (mamba-ssm absent → no hybrid). Fields read from
|
||||||
|
upstream gradio_interface.py (2026-05-31), the CATALOG-CONTRACT blessed
|
||||||
|
source for defaults/ranges. Adapter not yet deployed/verified — flip to
|
||||||
|
ready (or experimental) after the first successful generation through 8201.
|
||||||
|
|
||||||
# Reproducibility audit — answers per service: (a) seedable, (b) model
|
# Reproducibility audit — answers per service: (a) seedable, (b) model
|
||||||
# deterministic without seed, (c) image tag mutable (security/reproducibility risk).
|
# deterministic without seed, (c) image tag mutable (security/reproducibility risk).
|
||||||
reproducibility_audit:
|
reproducibility_audit:
|
||||||
@@ -1488,3 +1634,8 @@ reproducibility_audit:
|
|||||||
model_deterministic: false
|
model_deterministic: false
|
||||||
image_tag_mutable: false
|
image_tag_mutable: false
|
||||||
notes: "⚠️ No seed + temperature-sampled → non-reproducible. Catalogued experimental by operator direction; upstream seed support is the fix. Gated Sesame license."
|
notes: "⚠️ No seed + temperature-sampled → non-reproducible. Catalogued experimental by operator direction; upstream seed support is the fix. Gated Sesame license."
|
||||||
|
- service: zonos
|
||||||
|
seedable: true
|
||||||
|
model_deterministic: true
|
||||||
|
image_tag_mutable: false
|
||||||
|
notes: "Adapter echoes the seed used (reproducibility.seed_field=seed). Byte-stable same-GPU; bf16 may drift cross-GPU. local/zonos-api:v1 built FROM local/zonos (pin ZONOS_SHA for true repro)."
|
||||||
|
|||||||
Reference in New Issue
Block a user