autor: k2-fsa · Apache-2.0 · arXiv:2604.00688
Najnowocesniejszy wielojezyczny model TTS zero-shot obslugujacy ponad 600 jezykow — najszersza obsluga jezykowa wsrod modeli TTS zero-shot. Wykorzystuje architekture dyfuzyjnego modelu jezykowego z 8-warstwowym hierarchicznym koderem audio.
[laughter], [breath] oraz korekcja wymowyomnivoice-infer), demo Gradioautor: Resemble AI · Licencja MIT
Rodzina trzech modeli TTS open-source (Chatterbox, Chatterbox-Multilingual, Chatterbox-Turbo) zaprojektowanych do generowania naturalnej mowy z klonowaniem glosu. Wbudowany znak wodny Perth do wykrywania audio generowanego przez AI.
[laugh], [cough], [chuckle]pip install chatterbox-tts, HuggingFace| Chatterbox | OmniVoice | |
|---|---|---|
| Typ modelu | Autoregresywny (token po tokenie) | Dyfuzja z maskowaniem (iteracyjne odmaskowanie) |
| Backbone | Wlasny dekoder T3 | Qwen3-0.6B LLM (~600M parametrow) |
| Kodek audio | Pojedynczy strumien kodowy | 8-warstwowy hierarchiczny (8×1025 tokenow) |
| Streaming | Prawdziwy streaming token-po-tokenie | Brak natywnego streamingu — pelna sekwencja na wywolanie |
| Klonowanie glosu | Warunkowanie embeddingami | Tokenizacja audio referencyjnego + prefiks |
| Jezyki | Polski + podstawowy wielojezyczny | 600+ jezykow natywnie |
Chatterbox dziala w czasie rzeczywistym, poniewaz streamuje token po tokenie — dekoder autoregresywny emituje tokeny sekwencyjnie, kazdy moze byc natychmiast dekodowany do audio i wyslany. TTFA = czas do wygenerowania pierwszych kilku tokenow.
OmniVoice wykorzystuje dyfuzje z maskowaniem — wszystkie tokeny audio zaczynaja jako [MASK] i sa iteracyjnie odmaskowane w N krokach. Kazdy krok uruchamia pelne przejscie przez caly model. Tokeny sa ujawniane wg wyniku pewnosci, nie pozycji. Czesciowe audio nie moze byc dekodowane w trakcie generowania.
Jednak surowa szybkosc inferencji OmniVoice jest na tyle duza (RTF 0.01–0.04), ze chunking na poziomie tekstu osiaga porownywalne lub lepsze TTFA niz streaming tokenowy Chatterboxa.
Pelne generowanie, klonowany glos, bez chunkingu. Calkowity czas od wywolania generate() do zwrocenia tensora.
| Tekst | Znaki | Audio | 32 kroki | 16 krokow | 8 krokow |
|---|---|---|---|---|---|
| mini | 12 | 1.2–1.5s | 269ms (RTF 0.222) | 136ms (RTF 0.094) | 72ms (RTF 0.054) |
| krotki | 66 | 4.3s | 298ms (RTF 0.069) | 151ms (RTF 0.035) | 80ms (RTF 0.019) |
| sredni | 196 | 12.6s | 503ms (RTF 0.040) | 255ms (RTF 0.020) | 137ms (RTF 0.011) |
| dlugi | 488 | 28.5–28.9s | 849ms (RTF 0.030) | 446ms (RTF 0.015) | 255ms (RTF 0.009) |
Symulacja streamingu: podzial tekstu na granicach zdan, niezalezne generowanie kazdego chunka, pomiar czasu do pierwszego gotowego chunka.
| Kroki | TTFA (chunk 0) | Audio chunk 0 | Gen chunk 1 | Audio chunk 1 | Lacznie |
|---|---|---|---|---|---|
| 32 | 335ms | 7.00s | 327ms | 5.80s | 662ms |
| 16 | 169ms | 7.00s | 165ms | 5.80s | 333ms |
| 8 | 88ms | 7.00s | 86ms | 5.80s | 173ms |
| Kroki | TTFA (chunk 0) | Chunki | Gen lacznie | Audio lacznie | RTF |
|---|---|---|---|---|---|
| 32 | 331ms | 5 | 1605ms | 29.6s | 0.054 |
| 16 | 168ms | 5 | 813ms | 29.6s | 0.027 |
| 8 | 87ms | 5 | 423ms | 29.6s | 0.014 |
Rozklad po chunkach (tekst dlugi, 16 krokow):
| Chunk | Czas gen. | Audio | Tresc |
|---|---|---|---|
| 0 | 168ms | 7.00s | "Powazny blad w obiegu dokumentow..." |
| 1 | 165ms | 5.80s | "Przez pomylke dokumentacja..." |
| 2 | 150ms | 4.08s | "Incydent zostal zgloszony..." |
| 3 | 171ms | 7.44s | "Linia lotnicza przeprosila..." |
| 4 | 159ms | 5.32s | "Zwiazki zawodowe domagaja sie..." |
create_voice_clone_prompt() wstepnie koduje audio referencyjne do wielokrotnego uzycia.
| Tryb | Czas generowania |
|---|---|
| Surowa sciezka ref_audio (kodowanie przy kazdym wywolaniu) | 264ms |
| Wstepnie zcachowany VoiceClonePrompt | 255ms |
| Koszt utworzenia promptu | 37ms (jednorazowo) |
| Oszczednosc na wywolanie | 9ms (3%) |
Kodowanie promptu jest juz szybkie (37ms). Cache jest nadal warty implementacji na serwerze, aby uniknac redundantnego kodowania.
| Tryb | Czas calkowity | Na zapytanie | Przyspieszenie |
|---|---|---|---|
| Sekwencyjnie | 767ms | 255ms kazde | 1.0x |
| 3x rownolegle (pula watkow + strumienie CUDA) | 462ms | 436–460ms kazde | 1.66x |
| Zapytanie | Tekst | Latencja | Audio |
|---|---|---|---|
| 0 | mini (12 znakow) | 408ms | 1.51s |
| 1 | sredni (196 znakow) | 502ms | 12.58s |
| 2 | dlugi (488 znakow) | 555ms | 28.61s |
| Czas calkowity | 558ms |
InferenceSlot + SlotPool z Chatterboxa poprawilby to dalej.Izolacja narzutow (srednia z 10 uruchomien, tekst sredni, 16 krokow):
| Etap | Czas | % calkowitego |
|---|---|---|
| Generowanie tokenow (16 krokow) | ~245ms | 92% |
| Dekodowanie audio (HiggsAudioV2) | 10ms | 4% |
| Postprocessing (usuwanie ciszy, fade, normalizacja) | 10ms | 4% |
Generowanie tokenow dominuje. Dekodowanie i postprocessing sa pomijalne. Optymalizacja powinna skupic sie na forward pass.
Najlepsza strategia: podzial na pierwszym zdaniu, generowanie krotkiego pierwszego chunka dla minimalnego TTFA, reszta generuje sie podczas odtwarzania pierwszego chunka.
| Kroki | TTFA | Pierwszy chunk gra | Czas gen. reszty | Przerwa? |
|---|---|---|---|---|
| 32 | 335ms | 7.00s | 700ms | Nie — reszta gotowa 6.3s wczesniej |
| 16 | 169ms | 7.00s | 357ms | Nie — reszta gotowa 6.6s wczesniej |
| 8 | 87ms | 7.00s | 185ms | Nie — reszta gotowa 6.8s wczesniej |
Nawet dla najdluzszego tekstu (488 znakow, 29s audio) nie ma zadnej przerwy w odtwarzaniu przy zadnej liczbie krokow. Pierwszy chunk generuje 7s audio, zapewniajac ogromne okno buforowania. Margines wynosi 6–7 sekund — wystarczajaco na jitter sieciowy, kodowanie i buforowanie po stronie klienta.
| Scenariusz | Szczytowy VRAM |
|---|---|
| Model zaladowany (idle) | 5.41 GB |
| 1 inferencja | 5.61 GB |
| 3 rownolegle inferencje | 5.87 GB |
| Zapas na 32 GB | 26.1 GB wolne |
| Szacowane max rownolegych | ~5 |
Przyrostowy koszt na rownola inferencje to ~150 MB. Duzy zapas na dodatkowe instancje modelu lub rownolegle zapytania.
| Metryka | Chatterbox | OmniVoice (16 krokow) | Zwyciezca |
|---|---|---|---|
| TTFA | ~250ms | 169ms | OmniVoice |
| RTF (tekst sredni) | 0.05–0.10 | 0.020 | OmniVoice |
| Typ streamingu | Prawdziwy token-po-tokenie | Na poziomie chunkow | Chatterbox |
| Przerwy w odtwarzaniu | Brak | Brak (bufor 7s) | Remis |
| Jakosc glosu | Dobra | Doskonala | OmniVoice |
| Klonowanie glosu | Warunkowanie embeddingami | Audio ref. + tekst | OmniVoice |
| Jezyki | Polski + ograniczone | 600+ | OmniVoice |
| Zuzycie VRAM | 4–6 GB | 5.6 GB | Remis |
| Rownolegych uzytkownikow | 3–4 z pula slotow | 3–5 na jednym GPU | Remis |
Ten sam tekst, ten sam glos (weronika), ten sam GPU. Chatterbox wygenerowany przez serwer produkcyjny. OmniVoice przy 16 krokach (rekomendowane) i 32 krokach (najlepsza jakosc).
Kompromisy miedzy liczba krokow a chunkingiem.
OmniVoice obsluguje ekspresyjne tagi niewerbalne osadzone bezposrednio w tekscie. Wszystkie probki: polski, glos klonowany (weronika), 16 krokow.
Obslugiwane tagi: [laughter], [sigh], [confirmation-en], [question-ah], [question-oh], [question-ei], [question-yi], [surprise-ah], [surprise-oh], [surprise-wa], [surprise-yo], [dissatisfaction-hnn]
| Tag | Tekst | Gen. | Audio |
|---|---|---|---|
[laughter] | "...to sie stalo [laughter] naprawde nie moge." | 156ms | 3.91s |
[sigh] | "No coz [sigh] trzeba bylo to przewidziec." | 150ms | 2.41s |
[confirmation-en] | "[confirmation-en] tak, dokladnie o to mi chodzilo." | 152ms | 2.77s |
[question-ah] | "Naprawde tak uwazasz [question-ah] bo ja mam watpliwosci." | 153ms | 3.68s |
[question-oh] | "[question-oh] a to ciekawe, kiedy to sie stalo?" | 151ms | 2.74s |
[question-ei] | "Mowisz powaznie [question-ei] nie zartujesz?" | 147ms | 2.71s |
[surprise-ah] | "[surprise-ah] nie spodziewalam sie tego!" | 146ms | 2.61s |
[surprise-oh] | "[surprise-oh] to niesamowite co sie wydarzylo." | 151ms | 2.76s |
[surprise-wa] | "[surprise-wa] ale rewelacja, nie do wiary!" | 150ms | 2.30s |
[surprise-yo] | "Wygralismy konkurs [surprise-yo] fantastycznie!" | 148ms | 3.08s |
[dissatisfaction-hnn] | "[dissatisfaction-hnn] no nie wiem, to mnie nie przekonuje." | 155ms | 3.38s |
| Mix (4 tagi) | "...co sie stalo [question-ah] ...wygrali [surprise-oh] ...stracili [sigh] ...[dissatisfaction-hnn] trzeba bylo..." | 247ms | 10.44s |
| Bez tagow (kontrolna) | "Nie moge uwierzyc, ze to sie stalo, naprawde nie moge." | 153ms | 3.40s |
[laughter] naprawde nie moge."[sigh] trzeba bylo to przewidziec."[confirmation-en] tak, dokladnie o to mi chodzilo."[dissatisfaction-hnn] no nie wiem, to mnie nie przekonuje."[question-ah] bo ja mam watpliwosci."[question-oh] a to ciekawe, kiedy to sie stalo?"[question-ei] nie zartujesz?"[surprise-ah] nie spodziewalam sie tego!"[surprise-oh] to niesamowite co sie wydarzylo."[surprise-wa] ale rewelacja, nie do wiary!"[surprise-yo] fantastycznie!"[question-ah] okazuje sie ze wygrali [surprise-oh] a potem wszystko stracili [sigh] no i co tu duzo mowic [dissatisfaction-hnn] trzeba bylo lepiej planowac."Wszystkie tagi generuja wyrazne dzwieki niewerbalne w oznaczonych miejscach. Probka mieszana (4 tagi, 10.44s) demonstruje naturalny przeplyw miedzy mowa a emocjami. Czas generowania pozostaje stalny (~150ms) niezaleznie od liczby tagow; probka mieszana jest dluzsza (247ms) tylko dlatego, ze sam tekst jest dluzszy.
OmniVoice jest gotowy do uzycia w streamingu TTS w czasie rzeczywistym i przewyzsza Chatterbox pod wzgledem surowych metryk szybkosci. Architektura dyfuzji z maskowaniem uniemozliwia prawdziwy streaming na poziomie tokenow, ale chunking na poziomie zdan osiaga TTFA 169ms przy 16 krokach z zerowymi przerwami w odtwarzaniu. W polaczeniu z doskonala jakoscia glosu, obsluga 600+ jezykow i niskim zuzciem VRAM, OmniVoice jest mocnym kandydatem do produkcyjnego wdrozenia TTS.
W sprawie konsultacji dotyczacych integracji TTS w czasie rzeczywistym, architektury streamingu lub inzynierii AI/ML, skontaktuj sie z Folx.