File size: 13,523 Bytes
c00d50c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
---
license: apache-2.0
language:
  - en
  - es
  - it
library_name: onnxruntime
tags:
  - text-to-speech
  - tts
  - onnx
  - litert
  - speech-synthesis
  - duration-flow
  - multilingual
  - expressive-tts
  - emotion
  - cpu-inference
pipeline_tag: text-to-speech
---

# Scylla's Band

Scylla's Band is a multilingual, multi-voice, expressive text-to-speech model for local and self-hosted inference. It predicts phone durations, generates continuous acoustic latents with rectified flow, and decodes those latents to a 24 kHz waveform through a Scylla's Band acoustic adapter and Vocos vocoder.

Scylla's Band is developed and published by [Spybyscript](https://huggingface.co/spybyscript).

Public resources:

- Model bundles and voice assets: [`spybyscript/scyllasband`](https://huggingface.co/spybyscript/scyllasband)
- Runtime source: [`lowkeytea/scyllasband`](https://github.com/lowkeytea/scyllasband)
- [Interactive voice, language, and affect samples](https://lowkeytea.github.io/scyllasband/)

The public resources are inference-only. Training data, trainer checkpoints, and export tooling are not distributed with the model.

## Intended Use

Scylla's Band is intended for:

- Single-voice speech synthesis with ten managed voices.
- English, Spanish, and Italian synthesis.
- Long-form narration with automatic planning and chunking.
- Multi-voice dialogue from tagged text.
- Continuous control over calm, joy, anger, sadness, sarcasm, and questioning delivery.
- Desktop and server inference through ONNX Runtime.
- Native and mobile execution through ONNX Runtime and `libscyllasband`, with LiteRT available as an explicit experimental backend.

Scylla's Band is not an arbitrary-speaker cloning system. It is not intended for impersonation, fraud, deception, or generating speech that falsely represents a real person as speaking.

## Quick Start

```bash
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip wheel setuptools
pip install -e .
pip install numpy huggingface_hub onnxruntime

python -m scyllasband download
python -m scyllasband validate-bundle
python -m scyllasband speak \
    --voice scylla \
    --language en_us \
    --emotion calm=0.5 \
    -o hello.wav \
    "Hello from Scylla's Band."
```

Download both public backend bundles with:

```bash
python -m scyllasband download --runtime-bundles both
```

An expressive example:

```bash
python -m scyllasband speak \
    --backend onnx \
    --voice gwen \
    --language en_us \
    --emotion joy=0.75,sarcasm=0.25 \
    --emotion-scale 1.5 \
    --steps 8 \
    --sampler heun \
    -o expressive.wav \
    "Oh, brilliant! The dragon ate the map, and somehow this is going perfectly."
```

## Model Details

| Field | Value |
| --- | --- |
| Model family | Continuous-latent duration/flow TTS |
| Public bundle contract | `1.0.0` / `scyllasband-duration-flow` |
| Main public backend | ONNX Runtime |
| Additional backend | LiteRT with native `libscyllasband` support |
| License | Apache 2.0 |
| Output sample rate | 24 kHz |
| Acoustic representation | 100 mel bins, 24-dimensional acoustic latents |
| Hop lengths | 256 waveform hop, 512 latent hop |
| Public languages | `en_us`, `en_gb`, `es`, `it` |
| Managed voices | 10 |
| Affect controls | 6 independently scored axes |
| CLI quality default | 8-step Heun sampling |
| Fixed graph budgets | 512 G2P text tokens, 512 phone frames, 640 latent frames |
| Latent target buckets | 256, 384, 512, 640, selected by smallest fit |

Managed voices:

```text
ariadne, felix, gwen, ink, max, orpheus, rex, scylla, stone, tuesday
```

English defaults to `en_us` for most voices. Ink, Orpheus, and Tuesday default to `en_gb`. Every managed voice supports `en_us`, `en_gb`, `es`, and `it` in the current public bundles.

## Architecture

```text
text
  -> spoken-text normalization and phrase planning
  -> Scylla's Band G2P
  -> phone IDs, punctuation, and boundary/context features
  -> duration prediction
  -> duration-expanded phone conditioning
  -> rectified-flow acoustic latent estimation
  -> Scylla's Band acoustic adapter and Vocos vocoder
  -> 24 kHz waveform
  -> long-form assembly when needed
```

| Component | Details |
| --- | --- |
| Text frontend | Phrase-level multilingual G2P with a 74-phone vocabulary and fixed 512-token input budget |
| Duration predictor | 192 hidden size, 4 layers, 4 heads, up to 512 phone positions |
| Acoustic generator | 24-dimensional rectified-flow latents, 512 hidden size, 12 layers, 8 heads, AdaLN conditioning, and QK normalization |
| Span context | Three context segments over up to 768 phones with a 512-dimensional context state |
| Prefix context | Up to 24 acoustic latent frames from the preceding chunk |
| Voice references | 128-dimensional style and 32-dimensional prosody features |
| Vocoder | Scylla's Band acoustic adapter into a frozen `charactr/vocos-mel-24khz` backbone |

The duration predictor and acoustic generator are conditioned on voice, language, reference features, boundary labels, and the six-axis affect vector. The acoustic generator additionally receives prefix latents and span context for long-form continuity. Voice/reference conditioning remains active in the affect CFG null branch so guidance changes delivery without intentionally removing speaker identity.

Punctuation boundaries use explicit silence phones. Runtime pause floors apply to internal sentence and clause boundaries, while the final learned silence keeps its predicted duration and host assembly supplies clean inter-chunk silence.

## Affect Controls

Scylla's Band exposes four core delivery axes and two overlays:

```text
core:     calm, joy, anger, sadness
overlays: sarcasm, questioning
```

Each value is independently bounded in `[0, 1]`. Multiple values may be nonzero, so a request can combine a core delivery with sarcasm or questioning instead of selecting one mutually exclusive category.

The training ratings used a `0` to `4` scale and are normalized for inference:

| Human rating | Runtime value |
| ---: | ---: |
| 0 | 0.0 |
| 1 | 0.25 |
| 2 | 0.5 |
| 3 | 0.75 |
| 4 | 1.0 |

Values around `0.5` or `0.75` often provide more natural range than setting every requested axis to `1.0`. The shipped presets use `calm=0.5`, `joy=0.75`, `anger=0.75`, and `sadness=0.75`; sarcasm and questioning presets combine a quieter calm core with a `0.75` overlay.

Affect classifier-free guidance is controlled separately:

```text
guided = null + scale * (conditioned - null)
```

- `0` selects the learned null-affect prediction.
- `1` uses the requested affect vector directly.
- Values above `1` strengthen the conditional difference.
- The runtime accepts finite non-negative values without a fixed upper cap.

The selected flow estimator was trained with `0.15` affect-condition dropout to provide the null branch used by CFG. A practical first range for stronger delivery is `1.25` to `1.5`. Higher values are extrapolation and can produce exaggerated timing, voice instability, or distortion depending on the voice and sentence. Guidance scales other than `1` also require both null and conditioned model evaluation and therefore cost more than direct conditioning.

## Runtime Bundles

The selected bundle's `manifest.json` is authoritative for its shapes, controls, components, and preferred backend.

### ONNX

ONNX is the default path across Python, desktop/server, native `libscyllasband`, and the Android sample. The export uses opset 18, four full acoustic-generator/vocoder target buckets, and shared external weights. CPU execution through `CPUExecutionProvider` is the validated baseline.

```text
scyllasband/models/onnx/
  manifest.json
  onnx/g2p/model.onnx
  onnx/components/duration_predictor.onnx
  onnx/components/vector_context_encoder.onnx
  onnx/components/vector_estimator_b{256,384,512,640}.onnx
  onnx/components/vocoder_b{256,384,512,640}.onnx
  onnx/components/vocoder_adapter_b{256,384,512,640}.onnx
  onnx/components/shared_weights.bin
  onnx/components/shared_weights.json
  assets/
```

### LiteRT

LiteRT provides an explicit experimental native/mobile bundle for `libscyllasband`; it is never selected as an implicit fallback. The current public bundle uses one full acoustic-generator graph per target bucket rather than separate prefix/tail graphs. Accelerator support and fallback policy remain platform- and runtime-dependent.

```text
scyllasband/models/litert/
  manifest.json
  litert/g2p.tflite
  litert/duration_predictor.tflite
  litert/vector_context_encoder.tflite
  litert/vector_estimator_{256,384,512}.tflite
  litert/vector_estimator.tflite
  litert/vocoder_{256,384,512}.tflite
  litert/vocoder.tflite
  litert/vocoder_adapter_{256,384,512}.tflite
  litert/vocoder_adapter.tflite
  assets/
```

Both bundles include phone and language indexes, G2P sidecars, affect metadata, and managed voice/reference packs under `assets/`.

## Long-Form Synthesis

Long-form planning is enabled by default in the CLI. It provides:

- Normalization before chunk planning.
- Sentence, paragraph, clause, and artificial-continuation boundary labels.
- Duration preflight and retry splitting for fixed graph budgets.
- Prefix-latent carryover and span/lookahead context.
- Internal punctuation pause floors.
- Short fades and clean host-side silence at assembled boundaries.

Use `--no-chunk-text` only when intentionally debugging one raw synthesis request.

## Training Data and Labels

Training data is not distributed with the public inference resources. Scylla's Band was trained primarily on synthetic multilingual speech. Seed vocabulary came from Wiktionary-derived word lists, scripted prompt generation placed target words in varied sentences, and the text was rendered as synthetic speech across the managed voices and languages.

Prepared audio was filtered with text/audio validation, ASR checks, alignment targets, and audio-quality review. Alignment-derived durations supervise the duration predictor and explicit punctuation silences.

The original desired-delivery categories were not treated as ground truth. A human-validated pilot was scored across calm, joy, anger, sadness, sarcasm, and questioning, allowing multiple nonzero values for one clip. Those labels were used to fit a programmatic rescoring process for the remaining emotional dataset. This gives the model continuous per-axis supervision instead of one mutually exclusive emotion label.

## Validation

The public ONNX and LiteRT bundles pass the 1.0 bundle contract. Machine-local `export_status.json` files are exporter diagnostics and are intentionally omitted from the public inference payload. Runtime validation uses matched text, voice, language, affect, guidance, sampler, steps, and seed, and checks each backend against its validated deterministic reference output.

Useful checks:

```bash
python -m scyllasband validate-bundle scyllasband/models/onnx
python -m scyllasband validate-bundle scyllasband/models/litert

python -m scyllasband speak scyllasband/models/onnx \
    --backend onnx \
    --voice scylla \
    --language en_us \
    --emotion anger=0.75 \
    --emotion-scale 1.5 \
    --metadata /tmp/scyllasband_onnx_smoke.json \
    -o /tmp/scyllasband_onnx_smoke.wav \
    "That was not the agreement."
```

Compare normalized synthesis metadata with:

```bash
python -m scyllasband compare-metadata LEFT.json RIGHT.json
```

The public sample gallery contains 30 matched multilingual voice previews and 50 affect demonstrations covering all ten voices.

## Limitations

- Public text input is limited to `en_us`, `en_gb`, `es`, and `it`.
- The model uses managed voice/reference packs and does not accept arbitrary speaker cloning references.
- Affect response varies with the voice, language, wording, requested mixture, sampler, steps, and CFG scale. Some voices and sentences are naturally subtler than others.
- Strong CFG can exaggerate timing or destabilize the voice even when the six-axis values themselves remain within range.
- ONNX, LiteRT, and the training runtime can have small numerical or acoustic differences. Validate the chosen backend on representative text and target hardware.
- Long-form output is planned in chunks. Very unusual boundaries or extremely short fragments may still sound less natural than complete sentences.
- Names, rare words, code, malformed text, and language-mismatched input can be mispronounced.
- Synthetic training data can carry the pronunciation, prosody, and language biases of its source systems and filtering process.

## Safety and Misuse

Do not use Scylla's Band to impersonate people, deceive listeners, bypass consent, or create speech that represents a real person as saying something they did not say. Generated audio should be disclosed as synthetic whenever the context could otherwise confuse a listener.

## License

Scylla's Band is released under Apache 2.0. See [`LICENSE`](LICENSE).

## Citation

```bibtex
@software{spybyscript_scyllasband2026,
  author = {Spybyscript},
  title = {Scylla's Band: Multilingual Expressive Duration-Flow Text-to-Speech},
  year = {2026},
  url = {https://huggingface.co/spybyscript/scyllasband},
  license = {Apache-2.0}
}
```

## Acknowledgments

Scylla's Band uses ONNX Runtime as the default Python, desktop/server, native, and mobile backend; LiteRT is an explicit experimental alternative. Vocos provides the frozen 24 kHz vocoder backbone. Wiktionary-derived vocabulary and alignment tooling contributed to data preparation and duration supervision.