RSS Amplifier

Dostępnik · Aug 10, 2026

Dostępnik o klonie mojego głosu

0
Sign in to vote or save

Jacek Zadrożny · Dostępnik

W filmie Aleksa Szacha na YouTubie usłyszałem o modelu do syntezy mowy o nazwie Dots.TTS. Otwarty, darmowy, podobno wspiera polski. Brzmiało jak kolejne „obejrzymy, ale nie zadziała”. Rzuciłem hasło mojemu asystentowi — sprawdź. Nie spodziewałem się, że skończy się to wspólną, wielogodzinną robotą i nagraniem, w którym mój Mac Mini mówi moim własnym głosem. Oto ta historia.

Modele syntezy mowy można podzielić na zamknięte, jak ElevenLabs czy MiniMax, i otwarte. Te otwarte z reguły nie radzą sobie z polskim. Dots.TTS ma 2 miliardy parametrów, licencję Apache 2.0 i na papierze obsługuje 90 języków, a wśród nich polski. Na komputerach Apple Silicon jest gotowa wersja MLX — bez CUDA, bez osobnego GPU. Mac Mini M4 z 24 GB pamięci to niby powinno wystarczyć. Mieliśmy się zaraz przekonać, czy na pewno.

Asystent zainstalował model i pobrał wagi (3 GB na dysku). Poprosiłem go, żeby znalazł jakąś moją próbkę nagrania — znalazł na dyktafonie Maca: osiem sekund „nagrywam teraz próbkę, nie wiem, czy to działa w ten sposób”. Wygenerowaliśmy pierwsze zdanie.

Działało. Ale bardzo wolno.

Jedna sekunda mowy potrzebowała 26 sekund obliczeń. Asystent zameldował: osiemdziesiąt dwie sekundy na siedem sekund nagrania. Coś tu było nie tak, więc zaczęliśmy szukać przyczyny.

Testowaliśmy parametry. Zmniejszaliśmy liczbę kroków generowania, wyłączaliśmy przewidywanie bezwytyczne (CFG), zmienialiśmy skalę. I nic — czas prawie się nie zmieniał. Wąskie gardło leżało gdzie indziej.

Asystent zajrzał do kodu. I znalazł:

mx.set_memory_limit(int(45 * (1 << 30))) # 45 gigabajtów

Mam 24 GB pamięci. Model próbował zaalokować prawie dwa razy tyle, ile fizycznie istnieje, a macOS zaczynał zapisywać dane na SSD — stąd te 26 sekund na sekundę mowy. Zmieniliśmy limit na 18 GB, czyli trzy czwarte fizycznej pamięci. Czas spadł z 26× do 18×. To była jedyna zmiana, która naprawdę pomogła — żadna korekta parametrów nie dała porównywalnego efektu.

Co ciekawe, okazało się później, że model i tak nie potrzebuje aż tyle. Podczas najdłuższego przebiegu pamięć szczytowo doszła do 12,5 GB, przy krótszych tekstach mieścił się w okolicach 8,5 GB. Czyli 18 GB to był zapas — a prawdziwe minimum było sporo niżej. Też trzeba było się tego dowiedzieć, a nie przyjmować za pewnik.

Wniosek, który zapamiętałem na dłużej: zawsze warto zajrzeć do kodu, nawet jeśli nie jestem programistą. Czasem wystarczy zmienić jedną liczbę.

Kiedy limit pamięci przestał być wąskim gardłem, przeszliśmy do parametrów czysto generacyjnych. Najważniejsze były trzy.

Pierwszy to liczba kroków, czyli ile razy model dopracowuje wynik. Trzymaliśmy ją na szóstce, ale spróbowaliśmy też dziesięciu. Więcej kroków zwykle znaczy lepszy dźwięk, ale i grubszy rachunek czasu — to typowy kompromis, który trzeba sprawdzić na własnym tekście, a nie brać z góry.

Drugi to parametr zbliżania do próbki, który mówi modelowi, jak mocno ma się trzymać nagranego głosu, a na ile pozwala sobie na własną ekspresję. Domyślnie mieliśmy wartość 1,2, czyli niemal wierną kopię. Podnieśliśmy ją do 3,0 — efekt był wyraźnie pewniejszy, choć to ruch tylko w jedną stronę: za bardzo i głos przestaje brzmieć jak Twój.

Wreszcie próg zakończenia zdania. Tu akurat poszliśmy w drugą stronę — podnieśliśmy go z 0,85 do 0,95, żeby model nie ucinał wypowiedzi w połowie. Im wyżej, tym dłużej model może się zastanowić, zanim stwierdzi, że koniec. Drobna liczba, a oszczędziła nam kompletowania „połówkowych” zdań na żywo.

Niby drobiazgi, ale to z nich składa się różnica między syntezą, którą słucha się z trudem, a taką, której nie odróżniasz od oryginału. I żadna nie wynikała z liczenia „na oko” — każdą sprawdzaliśmy konkretnie, co widać było w kodzie i logach po zmianie.

Pierwsza próbka była krótka i słaba. „Nagrywam teraz próbkę” to za mało, żeby sklonować głos. Wrzuciłem asystentowi inną — siedemnaście sekund, mówię pełnym zdaniem, z imieniem i nazwiskiem, o dostępności i o sztucznej inteligencji.

Efekt był natychmiast lepszy. Naturalniejszy, bardziej „mój”. Asystent porównał profile: stara próbka miała 269 KB profilu, nowa 497 KB. Więcej informacji o głosie — to się tłumaczyło samo. Dobra próbka źródłowa to połowa sukcesu.

Chciałem wygenerować akapit o Jakobie Nielsenie. Asystent uruchamiał proces w tle, a ten wisał i wisał — godzina, druga, zero rezultatu. Okazało się, że generowanie w tle na macOS bywa kapryśne, a długi tekst nie mieścił się w limicie czasu, bo model przetwarzał każde nowe słowo w kontekście wszystkiego, co już wygenerował.

Rozwiązanie przyszło z podzieleniem tekstu na zdania i generowaniem każdego osobno — Dots.TTS ma do tego funkcję generate_long. Zadziałała.

Drugi problem: model kończył w połowie zdania. Domyślny próg zakończenia był za niski — model zbyt chętnie myślał „no dobra, wystarczy”. Podnieśliśmy próg i nagle cały akapit, bez braków. Czasem poprawka to zmiana jednej liczby, nawet w takim miejscu.

Dots.TTS sam z siebie nie wie, że 2023” to dwa tysiące dwudziesty trzeci”, a UX” wypada przeczytać po angielsku. Gotowe normalizatory tekstu, które to załatwiają, są na razie tylko dla chińskiego i angielskiego — polskiego oficjalnie brakuje.

U nas skończyło się to napisaniem własnego — i to jest chyba najbardziej satysfakcjonująca część. Powstał dwuwarstwowy normalizator. Pierwsza, strukturalna warstwa działa na początku i na końcu: e-maile i adresy URL zamienia na placeholdery (mam wrażenie, że jan@x.pl czytamy jako jan małpa x kropka pl”), żeby kolejne etapy nie zjadły kropek i znaków, a na końcu przywraca je w gotowej, wymawianej formie. Druga, językowa warstwa to dziesięć kroków w ściśle ustalonej kolejności: skróty (dr → doktor, np. → na przykład), waluty (5 zł → pięć złotych), liczby rzymskie (XVII wiek → siedemnasty), daty (27.02.2026), godziny (13:45), zakresy (8–16 → od osiem do szesnaście), znaki specjalne (§, stopnie Celsjusza), a na samym końcu słownie wszelkie pozostałe liczby — każda po polsku, z poprawną odmianą, bo liczebniki odmieniamy przez przypadki. Telefony wyciągamy tak, żeby nie pogubić cyfr, zanim skleją się w grupach.

Kolejność nie była fanaberią — każdy krok musi być wykonany przed tym, który zjadłby” potrzebny mu znak. Daty przed kropkami, godziny przed dwukropkiem, zakresy przed myślnikiem. Jeden pechowy porządek i całość się sypie. Zawsze warto patrzeć na cały przepływ, nie tylko na pojedynczy krok.

LinkedIn nie przyjmuje samego audio — potrzebuje wideo. Asystent znalazł na OneDrive moje zdjęcia z złotym visorem, zrobił kwadratową grafikę z transkryptem i połączył z audio. Efekt: plik o rozmiarze 716 KB i długości 25 sekund, gotowy do publikacji.

Po pierwsze, sprawdzaj limity. Programiści ustawiają wartości, które na twoim sprzęcie mogą nie mieć sensu — 45 GB limitu na 24 GB komputerze. Wystarczyło zmienić jedną liczbę, żeby zyskać prawie jedną trzecią wydajności. Co więcej — smarowanie po dysku SSD skraca jego żywotność, a to jednak jest dość drogi sprzęt.

Po drugie, dobra próbka to podstawa. Osiem sekund „na szybko” to za mało. Siedemnaście sekund z imieniem i konkretną treścią robi różnicę. Chociaż po eksperymentach wiem, że próbka powinna być jeszcze raz przygotowana — model potyka się o gęste zbitki spółgłosek, które w polskim bywają okrutne, zwłaszcza w liczebnikach („sześdziesiąt” czy „pięćdziesiąt” potrafią być potknięciem). Tak więc muszę nagrać jeszcze jedną próbkę, w której zmieszczę takie głoski.

Po trzecie, procesy w tle potrafią wisieć. Czasem lepiej uruchomić na przedzie i poczekać, niż gubić się w domysłach.

Najważniejsze jednak: ten model jest otwarty i działa w całości lokalnie. Żadnych chmur, żadnych opłat, żadnych limitów API. Licencja Apache 2.0, wagi do pobrania, uruchomienie na zwykłym Macu Mini. Dla osoby, która od dziesięcioleci patrzy na dostępność przez pryzmat otwartych narzędzi, to bardzo budujący kierunek.

A w tle cały czas kotłuje się pytanie, którego nie zamierzam udawać, że nie ma. Mój głos właśnie stał się rzeczą, którą da się skopiować. Do tej pory klonowanie głosu było tematem rozmów, ostrzeżeń i artykułów. Teraz zrobiłem to sam, w jednym popołudniu, darmowym narzędziem. Generowanie mowy jest dla mnie narzędziem dostępności. Ale każdy — dosłownie każdy — ma teraz w zasięgu ręki sposób, by brzmieć jak ktoś inny. I to jest ta część, nad którą trzeba się zatrzymać i pomyśleć, zanim zaczniesz klonować.

Z drugiej strony — mam wagi dla swojego głosu i może kiedyś, kiedy odejdę na drugą stronę, moje dzieci będą mogły posłuchać mojego głosu i wspomnieć. Cudowne i przerażające równocześnie.

Dzisiaj autopromocja. Od kilkunastu lat mam kanał na YouTube, na którym prawie nic się nie działo. Postanowiłem to zmienić. Aktualnie wrzucam kolejne nagrania podcastu Salonik u Jacka. Potem przyjdzie czas na nagrania z AutomaticA11y. Mam już zgody od dwojga osób, więc one pójdą na pierwszy ogień. W kolejce czekają nagrania z poprzednich edycji konferencji. Ogromnie dziękuję Ani i Januszowi za ich pracę nad filmami i napisami do nich. Tak więc zajrzyj na mój kanał, bo może coś Ci się spodoba.

Na początku września rozpoczynam organizowanie kolejnej edycji. Jeżeli zatem masz jakiś pomysł na prezentację lub stolik tematyczny, to już układaj opis. To się chyba nazywa “wzywanie papierów”.

I to by było na tyle. Tego lata płonęła Kanada, Hiszpania, Portugalia, Grecja, Francja i Polska. Temperatury w okolicach 40 stopni zdarzały się jednak każdego lata, więc nie ma się o co martwić. Tylko ja już coraz gorzej znoszę upały i trochę mi przeszkadzały. Dlatego pisałem mniej. A jeżeli ciekawi Cię, co po drugiej stronie naszej planety, to Nowa Zelandia była sparaliżowana śniegiem. Miliarderzy zbudują sobie luksusowe schrony lub uciekną z Ziemi, ale ja nie jestem miliarderem. Pozdrawiam Cię i pomyśl bardzo ciepło o tych politykach od oze-sroze. Tak ciepło, żeby się zadymiło.

Read the original on dostepnik.substack.com

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.