← Blog
AI14 min czytania

NeuTTS — synteza mowy i klonowanie głosu na urządzeniu

NeuTTS syntezuje mowę i klonuje głos z trzech sekund nagrania, w całości na urządzeniu — nawet na Raspberry Pi. Rozdzielamy trzy modele i ich licencje, opisujemy znak wodny i pułapkę instalacji, która go cicho wyłącza.

Synteza mowy przez ostatnie lata zamknęła się w interfejsach webowych. Wysyłasz tekst, dostajesz plik audio, płacisz od znaku i akceptujesz, że treść, którą syntezujesz, przechodzi przez cudzy serwer. Dla lektora w aplikacji edukacyjnej to nie problem. Dla asystenta głosowego w urządzeniu, systemu powiadomień w szpitalu albo aplikacji czytającej dokumenty klientów — problem zasadniczy, i to jednocześnie techniczny i formalny.

NeuTTS jest propozycją z drugiej strony: zbiorem modeli mowy działających w całości na urządzeniu, z klonowaniem głosu z kilku sekund nagrania. Autorzy piszą, że kwantyzacje w formacie GGUF są gotowe do uruchomienia na telefonach, laptopach, a nawet na Raspberry Pi. Zanim jednak cokolwiek pobierzesz, trzeba zrozumieć jedną rzecz — bo w tym projekcie nie wszystkie modele są na tej samej licencji, a różnica jest fundamentalna.

Stan projektu

Repozytorium: neuphonic/neutts. 6274 gwiazdki, 657 forków, start w październiku 2025 — projekt ma niespełna rok. Ostatnie commity na gałęzi main pochodzą z 22 lipca 2026 i dotyczą wydania modelu NeuTTS-2E. Otwartych zgłoszeń jest 37, czyli niewiele przy tej popularności.

Za projektem stoi firma — Neuphonic Limited — i to widać w konstrukcji licencji. Warto też odnotować ostrzeżenie, które autorzy umieścili w README wysoko i wyróżnili: powstają strony w rodzaju neutts.com, niepowiązane z Neuphonic ani z tym repozytorium. Oficjalna domena to neuphonic.com. Przy narzędziu do klonowania głosu podszywanie się pod projekt jest szczególnie nieprzyjemnym rodzajem oszustwa, więc wypada tę uwagę powtórzyć.

Trzy modele, dwie licencje

To najważniejsza sekcja i miejsce, w którym łatwo się pomylić, bo README opisuje wszystko jako „open source", a tabela z modelami mówi coś bardziej złożonego.

NeuTTS-Air — około 360 mln aktywnych parametrów, wejście fonemowe, obsługuje klonowanie głosu — jest wydany na licencji Apache 2.0. To licencja w pełni otwarta, permisywna, z jawnym udzieleniem patentowym. Bez ograniczeń komercyjnych.

NeuTTS-Nano (około 120 mln aktywnych parametrów, wejście fonemowe, z klonowaniem) oraz NeuTTS-2E (około 125 mln, wejście tekstowe, cztery ustalone głosy, sześć emocji plus neutralna) są wydane na NeuTTS Open License v1.0 — licencji własnej Neuphonic. Mimo słowa „Open" w nazwie nie jest to licencja otwarta w rozumieniu przyjętym w tej serii, i warto wiedzieć dokładnie dlaczego.

Sama licencja formułuje swój cel bez owijania: ma pozwalać na darmowe użycie badawcze i ograniczone użycie komercyjne, wymagając płatnej licencji przy wdrożeniach o dużych przychodach. Mechanizm jest następujący:

  • Próg zdefiniowany jest jako roczny przychód w wysokości 5 milionów dolarów amerykańskich lub więcej.
  • Prawa do użycia komercyjnego są uwarunkowane nieprzekroczeniem tego progu przez ciebie lub twój podmiot prawny.
  • Użycie komercyjne przez podmiot przekraczający próg nie jest objęte tą licencją — trzeba wykupić osobną.
  • Próg nie dotyczy kwalifikowanych organizacji nienastawionych na zysk, o ile korzystają z modelu w celach niekomercyjnych lub badawczych.

Trzy szczegóły z definicji warto wyłuskać, bo zmieniają praktyczną ocenę. Pierwszy: „użycie komercyjne" jest zdefiniowane bardzo szeroko — jako jakiekolwiek użycie dla bezpośredniej lub pośredniej korzyści handlowej albo za wynagrodzeniem pieniężne. Wewnętrzne narzędzie firmowe, które nie jest sprzedawane, ale daje korzyść — mieści się w tej definicji.

Drugi: ograniczenie dotyczy nie tylko modelu i dzieł pochodnych, ale również wyników (Outputs). Wygenerowane pliki audio są więc objęte tym samym warunkiem.

Trzeci: „podmiot prawny" jest w licencji zdefiniowany tak, że obejmuje podmioty kontrolujące, kontrolowane i pod wspólną kontrolą, przy czym kontrola to między innymi posiadanie 50% udziałów. Innymi słowy: jeśli twoja spółka jest częścią grupy, próg liczy się dla grupy, nie dla twojego działu.

Praktyczny wniosek dla polskiego czytelnika. Próg pięciu milionów dolarów to około dwudziestu milionów złotych rocznego przychodu — sporo powyżej tego, co osiąga większość mniejszych firm, więc dla znacznej części odbiorców tej serii modele Nano i 2E są legalnie dostępne bez opłat. Ale to jest warunek, który się przekracza w miarę wzrostu, i to bez ostrzeżenia od nikogo. Jeżeli wbudowujesz taki model w produkt, który ma rosnąć, przewidzenie tego progu w planie jest tańsze niż odkrycie go po fakcie. A jeśli chcesz mieć spokój — NeuTTS-Air na Apache 2.0 nie ma żadnego progu i to jest właściwy wybór dla wdrożenia, którego nie chcesz później przeglądać pod kątem licencji.

Co potrafią poszczególne modele

Wybór między modelami to nie tylko licencja, ale też realne różnice funkcjonalne, i tabela w README podaje je czytelnie.

Klonowanie głosu obsługują Air i Nano — autorzy podają, że wystarczą trzy sekundy nagrania, by stworzyć własnego mówcę. NeuTTS-2E klonowania nie ma: daje cztery ustalone głosy, ale w zamian obsługuje sześć emocji plus neutralną, czego nie mają dwa pozostałe. To sensowny podział: jeśli potrzebujesz konkretnego, cudzego głosu — Air albo Nano; jeśli potrzebujesz wyrazistości i nie zależy ci na tożsamości mówcy — 2E.

Różnica w formacie wejścia też ma znaczenie praktyczne. Air i Nano przyjmują fonemy, czyli wymagają wcześniejszej transkrypcji fonetycznej (w zależnościach jest do tego phonemizer). NeuTTS-2E przyjmuje tekst wprost, co upraszcza potok i usuwa całą klasę problemów z wymową — a przy językach fleksyjnych, jak polski, warstwa fonemizacji bywa właśnie tym miejscem, gdzie jakość się psuje.

Języki obsługiwane to angielski, hiszpański, niemiecki i francuski, zależnie od modelu — są osobne warianty neutts-nano-german, neutts-nano-french i neutts-nano-spanish. Polskiego na tej liście nie ma i to trzeba powiedzieć wprost: dla polskojęzycznych zastosowań ten projekt w obecnym stanie nie jest gotowym rozwiązaniem. Jest natomiast dobrym punktem odniesienia architektonicznym i przydatnym narzędziem, jeśli syntezujecie treści w tych czterech językach.

Strumieniowanie działa wyłącznie w wariantach GGUF, nie w wersjach PyTorch — to istotne, jeśli budujesz interfejs, w którym mowa ma zacząć się odtwarzać przed zakończeniem generowania.

Architektura

Konstrukcja jest prosta i to jej zaleta: mały model językowy jako rdzeń plus kodek neuronowy. Kodek nazywa się NeuCodec, pracuje z częstotliwością 50 Hz i — jak podkreślają autorzy — osiąga dobrą jakość przy niskiej przepływności, używając jednej książki kodowej. Prostota tej pary jest wprost wymieniona jako cecha: „proste LM plus kodek" ma czynić rozwój i wdrożenie łatwiejszymi.

Ograniczenie, o którym trzeba wiedzieć przed projektowaniem: okno kontekstu to 2048 tokenów, co odpowiada około trzydziestu sekundom audio — wraz z nagraniem wzorcowym. To znaczy, że jeśli podajesz trzysekundową próbkę głosu do klonowania, mieści się ona w tym samym budżecie co generowana wypowiedź. Dłuższych tekstów nie zsyntetyzujesz jednym wywołaniem; trzeba je dzielić, a przy dzieleniu pilnować, by głos pozostał spójny między fragmentami.

Kwantyzacje dostępne są w GGUF w wariantach q4 i q8, obok wersji PyTorch. Kodek ma też wariant destylowany (distill-neucodec) oraz dekoder w formacie ONNX, przydatny przy minimalizowaniu opóźnienia.

Instalacja

Paczka nazywa się neutts i wymaga Pythona w wersji od 3.10 do poniżej 3.14. Zależności produkcyjne to między innymi torch od 2.8, transformers przypięte do 5.1.0, librosa, soundfile, phonemizer, neucodec oraz resemble-perth. Są też grupy opcjonalne: llama (dodająca llama-cpp-python i gguf), onnx oraz all.

pip install neutts

I tu przechodzimy do rzeczy, która w tym projekcie jest najważniejsza po licencjach.

Brak polskiego, ale jest droga obejścia

Skoro polskiego na liście nie ma, naturalne następne pytanie brzmi: czy da się model douczyć. Odpowiedź jest twierdząca i — co rzadkie — udokumentowana z podaniem konkretnych liczb.

NeuTTS-Air podąża w treningu i inferencji za projektem LLaSA, a dostrajanie wykonuje się zwyczajną biblioteką transformers. W repozytorium jest gotowy skrypt examples/finetune.py wraz z przykładową konfiguracją, uruchamiany jednym poleceniem:

python examples/finetune.py examples/finetune_config.yaml

Przygotowanie własnego zbioru to cztery kroki: zakodować pliki audio modelem NeuCodec do formatu zgodnego ze zbiorem referencyjnym, ustawić konfigurację, sprawdzić i dostosować fonemizator oraz tokenizator do swojego zadania, a potem uruchomić skrypt. Ten trzeci krok jest tu kluczem dla polszczyzny: warstwa fonemizacji opiera się na espeak-ng (paczka dowozi jego dane), a espeak-ng polski obsługuje. Ścieżka do polskiego głosu prowadzi więc przez podmianę backendu fonemizatora na polski i dostrojenie na polskim materiale.

Najcenniejsze są jednak hiperparametry, które autorzy podają wprost ze swojego doświadczenia — bo to one decydują, czy przedsięwzięcie jest realne dla mniejszej firmy, czy nie:

  • Współczynnik uczenia od 1e-5 do 4e-5, zależnie od rozmiaru zbioru.
  • Nie potrzeba wielu kroków. Dla zbioru o długości dziesięciu godzin autorzy podają, że zwykle wystarcza od 1000 do 2000 kroków.
  • Warto poeksperymentować z rozgrzewaniem i różnymi harmonogramami współczynnika uczenia.

Dziesięć godzin nagrań i około półtora tysiąca kroków to skala, która mieści się w budżecie małego zespołu — zwłaszcza jeśli macie własnego lektora i jego zgodę. Autorzy odsyłają też do trwającej dyskusji w zgłoszeniu, w której użytkownicy raportują udane dostrojenia, więc nie jest to droga wyłącznie teoretyczna.

Dwie rzeczy warto przy tym zauważyć. Pierwsza: bazą NeuTTS-Air jest Qwen2.5 0.5B, i można trenować od tego modelu zamiast od gotowego NeuTTS-a, zmieniając jeden parametr w konfiguracji — wtedy trzeba samodzielnie dodać do słownika znaczniki mowy. Druga, ciekawsza: lista znaczników specjalnych w dokumentacji zawiera obok obowiązkowych także opcjonalne, które można dodać, jeśli ma się odpowiednie etykiety w zbiorze — są tam <|EN|>, <|ZH|>, <|LAUGHING|> i <|WHISPERING|>. Nic nie stoi na przeszkodzie, by dołożyć własny znacznik języka albo etykiety mówcy i emocji, o ile są w danych.

I rzecz, o której nie wolno zapomnieć przy tej ścieżce: dostrajaj NeuTTS-Air, czyli ten model, który jest na Apache 2.0. Dzieło pochodne modelu wydanego na licencji własnej odziedziczy jej warunki wraz z progiem przychodowym, a nie chcesz odkryć tego po zainwestowaniu w trening.

Znak wodny i pułapka, która go wyłącza

Autorzy podjęli decyzję, którą trzeba pochwalić: każdy plik audio wygenerowany przez NeuTTS zawiera domyślnie znak wodny — Perth, czyli znak wodny działający poniżej progu percepcji, z projektu Resemble AI. Przy narzędziu do klonowania głosu to nie ozdoba, a element odpowiedzialności: pozwala później stwierdzić, że dane nagranie zostało wygenerowane maszynowo.

Ale README zawiera notatkę, która tę ochronę relatywizuje, i jest to najważniejsza pułapka w całym projekcie. Jeśli zainstalujesz neutts przez uv sync wewnątrz repozytorium, program nadal działa, ale znakowanie wodne jest wyłączone — zobaczysz jedynie ostrzeżenie, że brakuje Perth. Powód jest prozaiczny: uv sync nie zaciąga wymaganych zależności Perth. Autorzy zalecają instalację przez PyPI, żeby znakowanie było aktywne.

Trzeba to nazwać precyzyjnie, bo ma konsekwencje. Mechanizm bezpieczeństwa, który jest jednym z głównych argumentów za tym projektem, wyłącza się w zależności od sposobu instalacji, a jedynym sygnałem jest ostrzeżenie w logu. Nie ma odmowy uruchomienia, nie ma błędu — jest ostrzeżenie, którego nikt nie czyta w potoku CI. Jeśli więc znak wodny jest częścią waszej odpowiedzi na pytanie „skąd wiemy, że to nagranie jest syntetyczne", to jego obecność trzeba sprawdzać automatycznie, a nie zakładać. Warto dodać test, który generuje próbkę i weryfikuje obecność znaku, i uruchamiać go przy każdej zmianie zależności.

Zgoda na klonowanie głosu — sekcja, której projekt nie napisał

Cały dział o odpowiedzialności w README to znak wodny plus jednozdaniowe zastrzeżenie: nie używaj tego modelu do złych rzeczy… proszę. Sympatyczne, ale to nie wyczerpuje tematu, więc uzupełnijmy.

Nagranie głosu konkretnej, rozpoznawalnej osoby jest jej daną osobową. Przetwarzanie takiego nagrania w celu stworzenia modelu jej głosu wymaga podstawy prawnej, a przy głosie wykorzystywanym do rozpoznawania tożsamości wchodzimy dodatkowo w kategorię danych szczególnych, z surowszym reżimem. Nie wchodząc w rozstrzygnięcia, które i tak trzeba zrobić dla konkretnego przypadku, praktyczne minimum wygląda tak:

  • Zgoda osoby, której głos klonujesz, na piśmie i na konkretny zakres. „Zgoda na nagranie" nie jest zgodą na wygenerowanie dowolnych wypowiedzi tym głosem. Zakres powinien mówić, do czego głos będzie użyty i jak długo.
  • Wycofywalność. Jeśli lektor kończy współpracę, musisz wiedzieć, gdzie jest jego model głosu i móc go usunąć — wraz z wygenerowanymi materiałami, jeśli tak ustaliliście.
  • Trzy sekundy to bardzo mało. Ta imponująca cecha techniczna oznacza, że wystarczy krótki fragment z nagrania rozmowy, webinaru czy poczty głosowej. Materiał do sklonowania głosu waszego prezesa jest publicznie dostępny i wy nic na to nie poradzicie — ale możecie założyć, że ktoś to zrobi, i nie opierać procedur na rozpoznaniu głosu w telefonie. To dziś realny scenariusz oszustwa, nie hipoteza.
  • Oznaczaj syntetyczne nagrania jawnie, nie tylko znakiem wodnym. Znak wodny jest dowodem po fakcie; informacja dla słuchacza jest kwestią uczciwości, a przy części zastosowań również wymogu.

Sam fakt, że model działa lokalnie, jest tu przy okazji zaletą po stronie ochrony danych: nagranie wzorcowe i syntezowany tekst nie opuszczają urządzenia, więc nie powstaje powierzenie przetwarzania zewnętrznemu dostawcy. To realna różnica względem usług chmurowych i prawdopodobnie najmocniejszy argument za tym projektem w kontekście firmowym.

Pułapki w jednym miejscu

  • Tylko NeuTTS-Air jest na Apache 2.0. Nano i 2E mają licencję własną z progiem przychodowym.
  • Próg to 5 mln USD rocznego przychodu i liczy się dla podmiotu wraz z podmiotami powiązanymi kapitałowo, nie dla działu.
  • Ograniczenie licencyjne obejmuje także wygenerowane nagrania, nie tylko sam model.
  • „Użycie komercyjne" jest zdefiniowane szeroko — obejmuje korzyść pośrednią, więc również narzędzia wewnętrzne.
  • Instalacja przez uv sync w repozytorium cicho wyłącza znak wodny. Instaluj z PyPI i weryfikuj obecność znaku testem.
  • Okno kontekstu to około 30 sekund audio wraz z nagraniem wzorcowym. Dłuższe teksty trzeba dzielić.
  • Strumieniowanie tylko w wariantach GGUF, nie w PyTorch.
  • Brak polskiego. Obsługiwane są angielski, hiszpański, niemiecki i francuski, zależnie od modelu.
  • Air i Nano przyjmują fonemy, nie tekst — potrzebna jest warstwa fonemizacji. Tekst wprost przyjmuje tylko 2E.
  • NeuTTS-2E nie klonuje głosu — daje cztery ustalone głosy i emocje.
  • Dostrajaj model na Apache 2.0. Dzieło pochodne modelu na licencji własnej odziedziczy jej próg przychodowy.
  • Uwaga na podrobione strony. Autorzy ostrzegają, że domeny w rodzaju neutts.com nie są z nimi powiązane.

Podsumowanie

NeuTTS rozwiązuje problem, który dla części zastosowań jest nie do obejścia inaczej: syntezę mowy dobrej jakości bez wysyłania czegokolwiek na zewnątrz, na sprzęcie, który już macie. Przy modelach rzędu stu kilkudziesięciu milionów parametrów i kwantyzacjach GGUF mówimy o urządzeniach, nie o serwerowni.

  • Działanie w całości na urządzeniu — od telefonu i laptopa po Raspberry Pi, bez powierzania danych dostawcy usługi.
  • Klonowanie głosu z trzech sekund nagrania w modelach Air i Nano.
  • Emocje w NeuTTS-2E — sześć plus neutralna, z wejściem tekstowym zamiast fonemowego.
  • Prosta architektura — mały model językowy plus kodek NeuCodec z jedną książką kodową przy 50 Hz.
  • Znak wodny w każdym wygenerowanym pliku, o ile zainstalujesz paczkę właściwą drogą.
  • Jeden model w pełni otwarty — NeuTTS-Air na Apache 2.0, bez progów i bez warunków.

Licencyjnie jest to pozycja, którą trzeba rozstrzygnąć przed pierwszym pobraniem wag, a nie po wdrożeniu. NeuTTS-Air na Apache 2.0 to licencja permisywna z jawnym udzieleniem patentowym — użycie komercyjne bez ograniczeń, bez obowiązku otwierania własnego kodu. NeuTTS Open License v1.0, pod którą wydane są Nano i 2E, jest licencją źródłowo dostępną, nie otwartą: pozwala na użycie badawcze i komercyjne poniżej progu pięciu milionów dolarów rocznego przychodu, a powyżej wymaga wykupienia osobnej licencji od Neuphonic Limited. Dla mniejszej firmy jest to układ całkowicie do przyjęcia i uczciwie opisany. Dla produktu, który ma rosnąć, wybór modelu na Apache 2.0 jest decyzją, której się później nie żałuje.