No i zaczęło się. Na pierwszy ogień idzie TTS (text to speech) czyli zamiana tekstu na mowę.
Dużo czasu zajęła analiza rozwiązania zagadnienia oraz wybór odpowiedniego silnika. Mogłem użyć silników TTS zainstalowanych lokalnie, dzięki czemu Gerwazy byłby niezależny od internetu. Jednak te silniki zazwyczaj oferują słabą jakość translacji. Znowuż silniki TTS on-line wymagają stałego połączenia z internetem. Postanowiłem więc połączyć zalety obydwu wersji TTS. Rozwiązaniem jest nagranie na kartę raz pobranego dźwięku z silnika TTS i wielokrotne wykorzystywanie go lokalnie (z dysku). Dzięki takiemu pomysłowi mogłem pozwolić sobie na najprostsze rozwiązanie czyli Google TTS i to w wersji bez klucza.
Wersja 0,01 (czyli nawet nie 1.0) to kilka linijek skryptu PHP. Na razie jest on w wielkim bałaganie i jeszcze nie mogę wykorzystywać tego do generowania komunikatów ale od tej wersji to już tylko krok, by Gerwazy zaczął gadać nowym silnikiem i tym samym by się w końcu rozgadał. Na pewno na pierwszy ogień pójdą komunikaty z kalendarza systemowego. W nim zapisywane są różne ważne daty (choćby terminy wywozu śmieci). Obecnie sporo tych informacji z kalendarza trafia na jedną z diod urządzenia HM-OU-LED16. Chciałbym jednak to zmienić między innymi z powodu ograniczenia ilości informacji jaką tam można wyświetlić.
Mając już wstępnie opracowane rozwiązanie kupiłem:
- Raspberry PI 3 B+
- zasilacz (3,1A)
- obudowę
- radiatory
Do tego wszystkiego gdzieś w czeluściach swoich „przydasiów” wynalazłem głośniki komputerowe (aktywne).
Do tego na RPI należy zainstalować serwer WWW oraz PHP. Ja wybrałem apache2 oraz PHP w wersji 7 ale skrypt jest tak prosty, że bez problemów będzie funkcjonował nawet na PHP w wersji 5.
Padło na Raspberry PI 3 B+ gdyż mimo, że dziś komputerek jeszcze niewiele będzie rozbił to jednak docelowo dostanie sporo zadań do realizacji. Oczywiście sam silnik w tej wersji spokojnie można uruchomić na czymś znacznie słabszym.
Wracając do Gerwazego TTS – skrypt wygląda tak:
<?php ini_set( 'display_errors', 'On' ); error_reporting(E_ALL); $wyp='Jakiś przykładowy tekst.'; #koduj tekst na potrzeby adresu URL. $wyp=urlencode($wyp); GerwazySay($wyp); # funcja GerwazySAY - TTS function GerwazySay($text=''){ # generuj nazwę pliku $file="/mnt/gerwazy/".md5($text); # jeśli nie ma pliku to pobierz go z Google TTS if(!is_file($file)){ $url="http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=".$text."&tl=pl"; exec('wget -q -U Mozilla -O '.$file.' "'.$url.'"'); } #odtwórz test z pliku dźwiękowego exec('/usr/bin/mplayer -ao alsa -really-quiet -noconsolecontrols "'.$file.'" > /dev/null',$out); } ?>
Kilka uwag:
- w adresie pobierającym plik ważny jest parametr „client=tw-ob”. Bez tego parametru Google będzie żądało potwierdzenia poprzez captcha.
- by z poziomu PHP uruchomić Mplayer musiałem dodać użytkownika obsługującego WWW („www-data”) do grupy „music”, która ma uprawnienia do uruchamiania Mplayera. Pomogło w tym polecenie wydane w konsoli Raspbiana. Po wydaniu polecenia konieczny był restart Raspbiana.
sudo adduser www-data audio
- do tego były wymagane zmiany w konfiguracji samego Mplayer’a. Edycja pliku konfiguracyjnego:
sudo nano /etc/mplayer/mplayer.conf
Do tak otworzonego pliku dodałem
nolirc=yes prefer-ipv4=yes
Podwaliny pod Gerwazego położone, testy wykonane – działa 😉