catalog: replace dia with dia2-1b/dia2-2b; move zonos-api 8201->8203

Replace the single dia entry (legacy Dia 1.6B, retired) with two fixed-model
Dia2 entries (dia2-2b :8200, dia2-1b :8202), status ready (both exercised),
image local/dia:v2. Matching reproducibility_audit rows. catalog_version
unchanged (add/remove services = no vocab change).

Also fix a port collision I introduced earlier: the zonos-api adapter and
csm both claimed 8201 — move zonos-api to 8203 (catalog endpoint + voices
source_url, zonos .env.example, README).

NOTE FOR CONSUMERS: removing the dia id is a breaking catalog change for
asset_engine (it vendored dia in v0.1.4) — re-vendor + drop the dia tile,
add the two dia2 tiles.
This commit is contained in:
vh
2026-05-31 14:41:11 -07:00
parent 3139e81e8a
commit db15638d8e
3 changed files with 126 additions and 49 deletions
+119 -42
View File
@@ -1234,27 +1234,34 @@ services:
/history. Until then, expose ComfyUI as an external link in the UI.
User state at /worktank/comfyui/basedir/.
- id: dia
name: Dia / Dia2 TTS
# Dia2 runs as TWO fixed-model instances: the devnen wrapper is
# single-model and IGNORES the OpenAI `model` field (serves whatever
# checkpoint is loaded), so the only way to offer both Dia2 models to
# asset-engine as real per-request choices is one endpoint per model.
# Both live in the `dia` stack (one compose, two services); `compose up`
# starts both. The legacy Dia 1.6B entry was retired 2026-05-31 in favor
# of these — drop the old `dia` tile when re-vendoring.
- id: dia2-2b
name: Dia2 2B (High Quality)
description: >
Nari Labs' dialogue TTS — multi-speaker turn-taking in one pass with
[S1]/[S2] speaker tags and nonverbals (laughs)/(coughs)/(sighs).
Dia2 family (1B streaming, 2B high-quality) selectable on the host.
Nari Labs' Dia2 dialogue TTS, 2B high-quality checkpoint — multi-speaker
turn-taking in one pass with [S1]/[S2] speaker tags and nonverbals
(laughs)/(coughs)/(sighs). 24 kHz. Served via devnen/Dia-TTS-Server.
category: tts
version: 2
status: down
version: 1
status: ready
host: irv-ml1
lifecycle:
stack: dia
vram_gb: 7
vram_gb: 8
gpu_device_id: 0
endpoint: http://10.100.79.3:8200/v1/audio/speech
method: POST
content_type: application/json
model:
id: nari-labs/Dia-1.6B
id: nari-labs/Dia2-2B
revision: null
image: local/dia:v1
image: local/dia:v2
fields:
- name: input
type: textarea
@@ -1263,29 +1270,20 @@ services:
max_length: 5000
description: >
[S1]/[S2] tags mark speaker turns; nonverbals like (laughs),
(coughs), (sighs), (clears throat) go inline. For a clone voice,
prepend the reference transcript manually.
- name: model
type: select
options: [dia-1.6b]
default: dia-1.6b
description: >
Ignored by /v1/audio/speech (serves whatever checkpoint is loaded).
Switch Dia 1.6B / Dia2-1B / Dia2-2B via the wrapper config or Web UI.
(coughs), (sighs), (clears throat) go inline.
- name: voice
type: select
label: Voice / mode
options: [S1, S2, dialogue]
default: S1
options: [dialogue, single_s1, single_s2, predefined]
default: dialogue
description: >
S1 | S2 | dialogue speaker mode. Clone-reference filenames under
/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.
Speaker mode from the model's voice set. `clone` (prefix_speaker)
needs a reference clip, so it isn't a plain picker choice here.
- name: response_format
type: select
options: [opus, wav]
default: opus
description: 24 kHz output (Dia2; note dia1 was 44.1 kHz).
- name: speed
type: slider
min: 0.5
@@ -1305,21 +1303,95 @@ services:
seedable: true
deterministic: false
notes: >
Seed gives consistent voice/prosody but NOT byte-exact output —
upstream notes float-arithmetic variance across hardware/versions.
A richer custom /tts endpoint exposes cfg_scale/temperature/top_p/
cfg_filter_top_k for finer control.
Seed gives consistent voice/prosody but NOT byte-exact output (Dia2 is
temperature-sampled). Raw-bytes response carries no seed echo, so no
seed_field. A richer custom /tts endpoint exposes
cfg_scale/temperature/top_p/cfg_filter_top_k.
estimated_latency:
cold_start_s: 10
cold_start_s: 30
warm_per_unit: "dialogue one-pass; ~realtime on the 3090"
license: "Apache-2.0 (Dia weights); MIT (devnen wrapper)"
license: "Apache-2.0 (Dia2 weights); MIT (devnen wrapper)"
notes: |
OpenAI-compat /v1/audio/speech plus a richer custom /tts (cfg_scale 3.0,
temperature 1.3, top_p 0.95, cfg_filter_top_k 35, max_tokens,
split_text/chunk_size). Fields read from devnen documentation.md
(2026-05-31); confirm against live OpenAPI/Pydantic at deploy. Deployed
to irv-ml1 but PARKED (asset-engine orchestrates start) — flip to ready
after the first successful generation. Pin DIA_SHA before build.
One of two fixed-model instances in the `dia` stack; sibling dia2-1b
(:8202). `docker compose up` on the stack starts BOTH services — the
lifecycle vram_gb here is this instance alone (~8 GB); budget for both
if gating the whole stack. Image local/dia:v2 = upstream devnen wrapper
+ the dia2 package baked in (see stacks/dia/dia2-image/). Verified
end-to-end 2026-05-31 (HTTP 200, Ogg/Opus 24 kHz).
- id: dia2-1b
name: Dia2 1B (Streaming)
description: >
Nari Labs' Dia2 dialogue TTS, 1B streaming checkpoint — same [S1]/[S2]
dialogue + nonverbals as dia2-2b, lower latency / lighter weight. 24 kHz.
Served via devnen/Dia-TTS-Server.
category: tts
version: 1
status: ready
host: irv-ml1
lifecycle:
stack: dia
vram_gb: 5
gpu_device_id: 0
endpoint: http://10.100.79.3:8202/v1/audio/speech
method: POST
content_type: application/json
model:
id: nari-labs/Dia2-1B
revision: null
image: local/dia:v2
fields:
- name: input
type: textarea
label: Text ([S1]/[S2] dialogue + nonverbals)
required: true
max_length: 5000
description: >
[S1]/[S2] tags mark speaker turns; nonverbals like (laughs),
(coughs), (sighs), (clears throat) go inline.
- name: voice
type: select
label: Voice / mode
options: [dialogue, single_s1, single_s2, predefined]
default: dialogue
description: >
Speaker mode from the model's voice set. `clone` (prefix_speaker)
needs a reference clip, so it isn't a plain picker choice here.
- name: response_format
type: select
options: [opus, wav]
default: opus
description: 24 kHz output.
- name: speed
type: slider
min: 0.5
max: 2.0
step: 0.05
default: 1.0
description: Post-generation playback speed multiplier.
- name: seed
type: number
required: false
default: -1
description: -1 = random; any integer for repeatable (not byte-exact) output.
response:
type: audio
mime_from_field: response_format
reproducibility:
seedable: true
deterministic: false
notes: >
Same determinism story as dia2-2b (temperature-sampled, seed gives
consistent prosody not byte-exact). No seed echo -> no seed_field.
estimated_latency:
cold_start_s: 30
warm_per_unit: "streaming; lower latency than dia2-2b"
license: "Apache-2.0 (Dia2 weights); MIT (devnen wrapper)"
notes: |
Sibling of dia2-2b in the same `dia` stack (see its notes for the
single-model-per-endpoint rationale and the both-start-together caveat).
Image local/dia:v2. Verified end-to-end 2026-05-31 (HTTP 200, Ogg/Opus
24 kHz).
- id: csm
name: Sesame CSM (conversational)
@@ -1430,7 +1502,7 @@ services:
# 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
endpoint: http://10.100.79.3:8203/v1/audio/speech
method: POST
content_type: application/json
model:
@@ -1469,7 +1541,7 @@ services:
label: Clone voice (optional)
section: voice
optional: true
source_url: http://10.100.79.3:8201/v1/audio/voices
source_url: http://10.100.79.3:8203/v1/audio/voices
source_jsonpath: $.voices[*]
description: >
Reference clip filename under /worktank/zonos/voices/ (10–30s clean
@@ -1552,7 +1624,7 @@ services:
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.
ready (or experimental) after the first successful generation through 8203.
# Reproducibility audit — answers per service: (a) seedable, (b) model
# deterministic without seed, (c) image tag mutable (security/reproducibility risk).
@@ -1624,11 +1696,16 @@ reproducibility_audit:
model_deterministic: true
image_tag_mutable: false
notes: "Reproducibility requires persisting full workflow JSON + seed."
- service: dia
- service: dia2-2b
seedable: true
model_deterministic: false
image_tag_mutable: false
notes: "Seed gives consistent voice, not byte-exact (float variance). Build pin via DIA_SHA."
notes: "Dia2 2B, temperature-sampled (seed gives consistent prosody, not byte-exact). local/dia:v2 (derived; upstream wrapper SHA not pinned)."
- service: dia2-1b
seedable: true
model_deterministic: false
image_tag_mutable: false
notes: "Dia2 1B streaming; same determinism story as dia2-2b. local/dia:v2."
- service: csm
seedable: false
model_deterministic: false