Jak dałem mojemu blogowi głos? Budujemy własne API AI na Proxmoxie! 🗣️⚡
Docker, Piper TTS, Cloudflare Tunnel, Next.js
Jak dałem mojemu blogowi głos? Budujemy własne API AI na Proxmoxie! 🗣️⚡
Czy zdarzyło Ci się kiedyś kliknąć "Czytaj na głos" w przeglądarce i skrzywić się, słysząc metaliczny, bezduszny głos robota z lat 90.? Mnie też. 🤖
Marzyłem o czymś lepszym. O blogu, który mówi do czytelnika naturalnym, płynnym głosem. Ale nie chciałem płacić milionów za API od gigantów technologicznych. Przecież mam w domu serwer (Proxmox), mam Debiana i mam chęci! 🏠💪
W tym artykule pokażę Wam, jak zbudowałem własne, prywatne API Text-to-Speech (TTS), które działa na moim domowym sprzęcie i "nadaje" głos prosto do Waszych przeglądarek – nawet na Steam Decku! 🚀
Architektura: Plan Bitwy 🗺️
Nasz cel był ambitny: połączyć statycznego bloga (Next.js na Netlify) z kontenerem w mojej piwnicy, bez wystawiania routera na świat.
Użyliśmy do tego:
- Backend: Domowy Debian na Proxmoxie.
- Silnik: Piper TTS – niesamowicie szybki i lekki model AI (wybrałem głos
pl_PL-gosia-medium). - API: Własny mikro-serwer w Pythonie (Flask).
- Transport: Cloudflare Tunnel – magiczna rura, która bezpiecznie wystawia nasz lokalny serwer na świat (HTTPS) bez przekierowywania portów! 🛡️
- Frontend: Inteligentny komponent w React, który decyduje, kiedy użyć AI.
Krok 1: Serwer "Szyty na Miarę" 🧵
Początkowo próbowaliśmy gotowych rozwiązań (OpenTTS, wyoming), ale ciągle czegoś brakowało. Biblioteki się gryzły, Python marudził... Postanowiliśmy więc zbudować własny kontener od zera na bazie Ubuntu.
Oto serce naszego systemu – skrypt server.py, który przyjmuje tekst i zamienia go na plik WAV przy użyciu Pipera:
Aby to uruchomić, potrzebowaliśmy solidnego środowiska. Oto nasz pancerny Dockerfile:
Krok 2: Wielkie Spięcie (Docker Compose) 🐳
Mając obraz, musieliśmy go połączyć ze światem. Tu wchodzi Cloudflare Tunnel. Dzięki niemu mój lokalny kontener jest dostępny pod adresem https://tts.lmk.one, a ja mam darmowy certyfikat SSL i śpię spokojnie.
Plik docker-compose.yml:
Wystarczyło jedno polecenie, by ożywić bestię:
Krok 3: Inteligentny Frontend (React) 🧠
Teraz najciekawsze. Nie chciałem, żeby każdy używał mojego domowego serwera. Jeśli ktoś ma Chrome na Androidzie, ma tam świetne wbudowane głosy Google. Po co marnować mój prąd?
Stworzyłem więc system hybrydowy w SpeechControl.js:
- Sprawdź przeglądarkę: Czy masz wbudowane głosy (Web Speech API)?
- Tak (np. Chrome): Użyj ich! Szybko, lokalnie, za darmo.
- Nie (np. Firefox na Linuxie/Steam Deck): Aaa, tutaj cię mam! 🕵️♂️
- Fallback: Połącz się z moim serwerem
tts.lmk.one, wyślij tekst, odbierz głos Gosi wygenerowany przez AI i odtwórz go w przeglądarce.
Dodatkowo zadbaliśmy o detale:
- Słownik wymowy: "vs" czytamy jako "kontra", "ssh" jako "es es ha".
- Czyszczenie: Wycinamy emoji 🚀, bo lektor czytający "rakieta startuje" psuje klimat.
- Interpunkcja: Podmieniamy kropki na spacje, żeby lektor nie mówił słowa "kropka", ale zostawiamy przecinki, żeby robił naturalne pauzy.
Efekt Końcowy ✨
Teraz mogę wejść na bloga z mojego Steam Decka, wcisnąć "Czytaj" i usłyszeć płynny, polski głos generowany w czasie rzeczywistym na serwerze w drugim pokoju. Zero reklam, zero opłat, pełna kontrola.
To był projekt "teoretyczny", który stał się praktyczny. I to jest w IT najpiękniejsze! ❤️