Upload fp32 HolosTTS bundle (official onnx/, vocab truncated to 181)
Browse files- holos-onnx/README.md +75 -30
- holos-onnx/SHA256SUMS +7 -7
- holos-onnx/decoder.onnx +2 -2
- holos-onnx/decoder_window.onnx +2 -2
- holos-onnx/encoder.onnx +2 -2
- holos-onnx/holos_onnx.json +16 -4
- holos-onnx/prosody.onnx +2 -2
- holos-onnx/source.onnx +2 -2
- holos-onnx/voices.npz +2 -2
holos-onnx/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
-
# HolosTTS → Promin ONNX bundle (`holos-onnx`)
|
| 2 |
|
| 3 |
Багатоетапний ONNX-бандл для рушія
|
| 4 |
[Promin TTS](https://github.com/Karnemorkon/promin-tts) (`format_version: 2`).
|
| 5 |
Це не один граф, а набір сесій: Rust рахує вирівнювання кадрів між ними й
|
| 6 |
-
передає `f0`/`energy`
|
| 7 |
|
| 8 |
> **Голоси та згода дикторів.** `voices.npz` містить 27 пресетів із HolosTTS.
|
| 9 |
> Автор HolosTTS зазначає, що диктори не надавали згоди на синтез їхніх голосів
|
|
@@ -13,27 +13,65 @@
|
|
| 13 |
> людини. Не використовуйте ці пресети для публікації або монетизації
|
| 14 |
> синтезованого мовлення без окремого дозволу диктора.
|
| 15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
## Вміст
|
| 17 |
|
| 18 |
| Файл | Розмір | Призначення |
|
| 19 |
|---|---|---|
|
| 20 |
-
| `holos_onnx.json` | 2.
|
| 21 |
-
| `encoder.onnx` |
|
| 22 |
| `prosody.onnx` | 68 MB | `prosodic_tokens`, `frame_to_token[F]`, `voice` → `f0[1,2F]`, `energy[1,2F]` |
|
| 23 |
-
| `decoder.onnx` |
|
| 24 |
-
| `source.onnx` |
|
| 25 |
| `decoder_window.onnx` | 210 MB | віконний декодер, споживає готовий `source` |
|
| 26 |
-
| `voices.npz` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
|
| 31 |
## Використання
|
| 32 |
|
| 33 |
```bash
|
| 34 |
pip install huggingface_hub
|
| 35 |
python -c "from huggingface_hub import snapshot_download; \
|
| 36 |
-
snapshot_download('Morkon/holos-native-models',
|
|
|
|
| 37 |
local_dir='models')"
|
| 38 |
```
|
| 39 |
|
|
@@ -41,32 +79,39 @@ python -c "from huggingface_hub import snapshot_download; \
|
|
| 41 |
`holos-onnx/holos_onnx.json` і підніме всі етапи. Якщо каталогу моделей
|
| 42 |
немає зовсім, Promin завантажує бандл автоматично з цього репозиторію.
|
| 43 |
|
| 44 |
-
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
## Походження та ліцензія
|
| 48 |
|
| 49 |
- Ваги й архітектура: [patriotyk/HolosTTS](https://github.com/patriotyk/HolosTTS),
|
| 50 |
модель [`patriotyk/HolosTTS`](https://huggingface.co/patriotyk/HolosTTS)
|
| 51 |
-
(MIT, © автор HolosTTS).
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
- **Голосові пресети (`voices.npz`) не покриваються MIT як дозволом на
|
| 56 |
використання голосу.** Згода дикторів не підтверджена; див. попередження
|
| 57 |
вище та [discussion #5](https://huggingface.co/patriotyk/HolosTTS/discussions/5).
|
| 58 |
- Репозиторій загалом має окрему ліцензію через Gemma-вербалізатор.
|
| 59 |
-
|
| 60 |
-
## Перевірка
|
| 61 |
-
|
| 62 |
-
Експорт звірено з PyTorch на трьох фразах:
|
| 63 |
-
|
| 64 |
-
- `encoder` — `allclose` з точністю ~2e-6, `durations` збігаються точно;
|
| 65 |
-
- `prosody` — `f0`/`energy` з точністю ~5e-5;
|
| 66 |
-
- `decoder` — довжина `600·F` семплів, RMS-відношення ≈1.000, косинус 0.995+;
|
| 67 |
-
- `decoder_window` — максимальна різниця ~4e-6 (детермінований `source`);
|
| 68 |
-
- довільні довжини 1, 2, 7, 37, 101 кадр — коректна довжина й скінченні
|
| 69 |
-
значення.
|
| 70 |
-
|
| 71 |
-
Скрипт експорту й перевірки: `tools/export_holos_bundle.py` у репозиторії
|
| 72 |
-
Promin TTS. Контрольні суми — у `SHA256SUMS`.
|
|
|
|
| 1 |
+
# HolosTTS → Promin ONNX bundle (`holos-onnx`, fp32)
|
| 2 |
|
| 3 |
Багатоетапний ONNX-бандл для рушія
|
| 4 |
[Promin TTS](https://github.com/Karnemorkon/promin-tts) (`format_version: 2`).
|
| 5 |
Це не один граф, а набір сесій: Rust рахує вирівнювання кадрів між ними й
|
| 6 |
+
передає `f0`/`energy`.
|
| 7 |
|
| 8 |
> **Голоси та згода дикторів.** `voices.npz` містить 27 пресетів із HolosTTS.
|
| 9 |
> Автор HolosTTS зазначає, що диктори не надавали згоди на синтез їхніх голосів
|
|
|
|
| 13 |
> людини. Не використовуйте ці пресети для публікації або монетизації
|
| 14 |
> синтезованого мовлення без окремого дозволу диктора.
|
| 15 |
|
| 16 |
+
## Джерело та версія
|
| 17 |
+
|
| 18 |
+
Це **офіційний fp32-бандл** із релізу
|
| 19 |
+
[`patriotyk/HolosTTS`](https://huggingface.co/patriotyk/HolosTTS) від
|
| 20 |
+
2026-11-01, зазеркалений без донавчання. Використано `onnx/` та нові
|
| 21 |
+
`holos.pt` / `voices.pt` / `voice_encoder.pt`:
|
| 22 |
+
|
| 23 |
+
| Файл | SHA-256 |
|
| 24 |
+
|---|---|
|
| 25 |
+
| `holos.pt` | `ecb427ea9dce0ec5d3587e36016cfd25f447581eb1eb9579d35d28cef5d7dda6` |
|
| 26 |
+
| `voices.pt` | `58033c9bedfed0a34d581310f89e1053a091c80356e23ab18baec2881c861ef8` |
|
| 27 |
+
| `voice_encoder.pt` | `81d6134dbfe105131d908333f5132a01c471e80d9070f5f381745eabdd48fe74` |
|
| 28 |
+
|
| 29 |
+
Маніфест змінено лише в одному місці: `vocab` обрізано з 184 до **181**
|
| 30 |
+
записів. Офіційний список має 184 символи, але лише 181 унікальний, тоді як
|
| 31 |
+
таблиці ембедінгів мають 181 рядок. Зайві три записи — дублікати апострофа та
|
| 32 |
+
рідкісні `̩`/`ᵻ`, яких немає в таблиці; без обрізання токенізатор міг би
|
| 33 |
+
видати id ≥ 181 і зламати граф. Перші 181 запис збігаються з попереднім
|
| 34 |
+
опублікованим вокабуляром.
|
| 35 |
+
|
| 36 |
## Вміст
|
| 37 |
|
| 38 |
| Файл | Розмір | Призначення |
|
| 39 |
|---|---|---|
|
| 40 |
+
| `holos_onnx.json` | 2.5 KB | маніфест: вокабуляр, частота, етапи, ліміти |
|
| 41 |
+
| `encoder.onnx` | 266 MB | `tokens[1,T]`, `voice[1,256]`, `speed[1]` → `acoustic_tokens[1,512,T]`, `prosodic_tokens[1,T,512]`, `durations[1,T]` |
|
| 42 |
| `prosody.onnx` | 68 MB | `prosodic_tokens`, `frame_to_token[F]`, `voice` → `f0[1,2F]`, `energy[1,2F]` |
|
| 43 |
+
| `decoder.onnx` | 212 MB | exact-декодер на всю репліку → `audio[1,600F]` |
|
| 44 |
+
| `source.onnx` | 2.5 MB | `f0[1,2F]` → збудження `source[1,600F]` для стрімінгу |
|
| 45 |
| `decoder_window.onnx` | 210 MB | віконний декодер, споживає готовий `source` |
|
| 46 |
+
| `voices.npz` | 26 KB | 27 пресетів голосів (`names`, `values[27,256]`) |
|
| 47 |
+
| `../tts/voice_encoder.onnx` | 195 MB | **окремо**: wave `[1,N]` @24 кГц → voice `[1,256]` для клонування |
|
| 48 |
+
|
| 49 |
+
24 кГц, 600 семплів на кадр (25 мс).
|
| 50 |
+
|
| 51 |
+
## Ліміт 1000 кадрів
|
| 52 |
|
| 53 |
+
`max_frames: 1000` — це **жорсткий ліміт усередині графів**, а не порада.
|
| 54 |
+
Офіційний експорт робить `seq_length = 1000` статичним; 987 кадрів
|
| 55 |
+
працюють, а 1125 падають в ONNX Runtime з помилкою broadcast
|
| 56 |
+
(`600000 by 675000`). 1000 кадрів — це ≈25 с аудіо на один виклик моделі.
|
| 57 |
+
|
| 58 |
+
Promin TTS v0.19+ ріже занадто довгі фонемні частини по пробілах/межах слів,
|
| 59 |
+
а якщо передбачена довжина все одно перевищує ліміт — ділить шматок навпіл і
|
| 60 |
+
повторює. Інші клієнти мають робити так само або відхиляти задовгі входи.
|
| 61 |
+
|
| 62 |
+
## Стрімінг
|
| 63 |
+
|
| 64 |
+
`chunk_frames: 40` (1 с), `context_frames: 20` (0.5 с), вікно 80 кадрів
|
| 65 |
+
(2 с). Для fp32 exact- і віконний декодер дають **біт-у-біт однакове**
|
| 66 |
+
аудіо на тестових фразах.
|
| 67 |
|
| 68 |
## Використання
|
| 69 |
|
| 70 |
```bash
|
| 71 |
pip install huggingface_hub
|
| 72 |
python -c "from huggingface_hub import snapshot_download; \
|
| 73 |
+
snapshot_download('Morkon/holos-native-models', \
|
| 74 |
+
allow_patterns=['holos-onnx/*', 'tts/voice_encoder.onnx'], \
|
| 75 |
local_dir='models')"
|
| 76 |
```
|
| 77 |
|
|
|
|
| 79 |
`holos-onnx/holos_onnx.json` і підніме всі етапи. Якщо каталогу моделей
|
| 80 |
немає зовсім, Promin завантажує бандл автоматично з цього репозиторію.
|
| 81 |
|
| 82 |
+
`voice_encoder.onnx` лежить у `models/tts/voice_encoder.onnx` (або плоско в
|
| 83 |
+
`models/voice_encoder.onnx`). Без нього клонування вимкнено.
|
| 84 |
+
|
| 85 |
+
**Старі клони несумісні.** Новий `voice_encoder.pt` дає інший 256-вимірний
|
| 86 |
+
простір, ніж попередній: ембеддінги з `speakers/*.npy`, зроблені старим
|
| 87 |
+
енкодером, не можна використовувати з новими вагами. Перезапишіть кожен
|
| 88 |
+
клонований голос із референсного WAV (енролмент заново).
|
| 89 |
+
|
| 90 |
+
## Перевірка
|
| 91 |
+
|
| 92 |
+
- ONNX Runtime 1.31.0, IR 10 / opset 20 — графи завантажуються.
|
| 93 |
+
- Офіційний fp32: exact і streaming біт-у-біт; 987 кадрів — OK, 1125 —
|
| 94 |
+
очікувана помилка broadcast.
|
| 95 |
+
- Новий `voice_encoder.onnx` звірено з PyTorch `VoiceEncoder`: maxdiff
|
| 96 |
+
≈1e-5, cosine 1.000000.
|
| 97 |
+
- Синтезоване мовлення `Speaker_0`, закодоване новим енкодером, найближче до
|
| 98 |
+
пресета `Speaker_0` (cosine 0.55–0.64; наступний пресет ≈0.33).
|
| 99 |
+
- INT8-бандл (окремо, `holos-onnx-int8/`) має log-spectrogram correlation
|
| 100 |
+
≈0.88–0.95 з fp32; streaming vs exact ≈0.71. Для максимальної якості
|
| 101 |
+
використовуйте fp32.
|
| 102 |
+
|
| 103 |
+
Скрипт експорту/перевірки: `tools/export_holos_bundle.py` у репозиторії
|
| 104 |
+
Promin TTS. Контрольні суми — у `SHA256SUMS`.
|
| 105 |
|
| 106 |
## Походження та ліцензія
|
| 107 |
|
| 108 |
- Ваги й архітектура: [patriotyk/HolosTTS](https://github.com/patriotyk/HolosTTS),
|
| 109 |
модель [`patriotyk/HolosTTS`](https://huggingface.co/patriotyk/HolosTTS)
|
| 110 |
+
(MIT, © автор HolosTTS). Це офіційний ONNX-експорт, без донавчання.
|
| 111 |
+
- `voice_encoder.onnx` експортовано з офіційного `voice_encoder.pt`
|
| 112 |
+
(PyTorch → ONNX, opset 20) у Promin TTS; інтерфейс
|
| 113 |
+
`wave[1,N] → voice[1,256]` збережено.
|
| 114 |
- **Голосові пресети (`voices.npz`) не покриваються MIT як дозволом на
|
| 115 |
використання голосу.** Згода дикторів не підтверджена; див. попередження
|
| 116 |
вище та [discussion #5](https://huggingface.co/patriotyk/HolosTTS/discussions/5).
|
| 117 |
- Репозиторій загалом має окрему ліцензію через Gemma-вербалізатор.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
holos-onnx/SHA256SUMS
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
|
|
|
| 1 |
+
948e4ebcc0fac1c8a31f5804d65459275a841cffff78e75d11b4fb14ae183060 encoder.onnx
|
| 2 |
+
ac5ca06e46b4e4c44670ecb94744e4f5d4214931bfb070b1c63e9f50dbe5e901 prosody.onnx
|
| 3 |
+
8de4592bea18d15398a949a60ea794c3affec31845623179f5245d48e301c800 decoder.onnx
|
| 4 |
+
d75b9820a694a8bd6468aa6925817603f0853e2f906afd34cb3723772f65ee64 decoder_window.onnx
|
| 5 |
+
ced5242be197382289663f8a0b2760c92593b7c8a4dfedb976e43b0420aeac6b source.onnx
|
| 6 |
+
5124ef2311e03c89228cc62ffdf8cefd88f8c07f0d8161063a03538af8f1b436 voices.npz
|
| 7 |
+
c244c21c8e2d888cc540fed98a5eaaf4d110a5ee56bde290468d55c9d54e24b8 holos_onnx.json
|
holos-onnx/decoder.onnx
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:8de4592bea18d15398a949a60ea794c3affec31845623179f5245d48e301c800
|
| 3 |
+
size 212379551
|
holos-onnx/decoder_window.onnx
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:d75b9820a694a8bd6468aa6925817603f0853e2f906afd34cb3723772f65ee64
|
| 3 |
+
size 209942803
|
holos-onnx/encoder.onnx
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:948e4ebcc0fac1c8a31f5804d65459275a841cffff78e75d11b4fb14ae183060
|
| 3 |
+
size 266448569
|
holos-onnx/holos_onnx.json
CHANGED
|
@@ -190,13 +190,25 @@
|
|
| 190 |
],
|
| 191 |
"sample_rate": 24000,
|
| 192 |
"samples_per_frame": 600,
|
| 193 |
-
"max_frames":
|
| 194 |
"decoder_mode": "exact",
|
| 195 |
"alignment_format": "gather",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 196 |
"streaming": {
|
| 197 |
-
"source": "source.onnx",
|
| 198 |
"decoder": "decoder_window.onnx",
|
| 199 |
-
"
|
| 200 |
-
"
|
|
|
|
|
|
|
| 201 |
}
|
| 202 |
}
|
|
|
|
| 190 |
],
|
| 191 |
"sample_rate": 24000,
|
| 192 |
"samples_per_frame": 600,
|
| 193 |
+
"max_frames": 1000,
|
| 194 |
"decoder_mode": "exact",
|
| 195 |
"alignment_format": "gather",
|
| 196 |
+
"attention_format": "tensorrt_fused_bmm",
|
| 197 |
+
"projection_format": "fused_qkv_swiglu",
|
| 198 |
+
"shape_inference_format": "onnx_standard",
|
| 199 |
+
"tensorrt_profile": {
|
| 200 |
+
"min_text_length": 2,
|
| 201 |
+
"opt_text_length": 128,
|
| 202 |
+
"max_text_length": 512,
|
| 203 |
+
"min_frames": 2,
|
| 204 |
+
"opt_frames": 256,
|
| 205 |
+
"max_frames": 1000
|
| 206 |
+
},
|
| 207 |
"streaming": {
|
|
|
|
| 208 |
"decoder": "decoder_window.onnx",
|
| 209 |
+
"source": "source.onnx",
|
| 210 |
+
"chunk_frames": 40,
|
| 211 |
+
"context_frames": 20,
|
| 212 |
+
"window_frames": 80
|
| 213 |
}
|
| 214 |
}
|
holos-onnx/prosody.onnx
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ac5ca06e46b4e4c44670ecb94744e4f5d4214931bfb070b1c63e9f50dbe5e901
|
| 3 |
+
size 68411510
|
holos-onnx/source.onnx
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ced5242be197382289663f8a0b2760c92593b7c8a4dfedb976e43b0420aeac6b
|
| 3 |
+
size 2467810
|
holos-onnx/voices.npz
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5124ef2311e03c89228cc62ffdf8cefd88f8c07f0d8161063a03538af8f1b436
|
| 3 |
+
size 26289
|