wtorek, 31 sierpnia 2010

Rock on!

Brak wykształcenia muzycznego może być sporym problem, kiedy człowiek chciałby jakoś zapisać wymyśloną melodię. Brak kumpli do zespołu z kolei mocno utrudnia wymyślenie aranżacji (chyba, że jesteś multiinstrumentalistą ze studiem nagraniowym.
Cóż więc może zrobić biedak spędzający za dużo czasu przed monitorem jak ja? Oczywiście użyje stosownej aplikacji. Guitar Pro w wersji 6 zostało napisane przy użyciu Qt (technologii bliskiej memu sercu) więc tym chętniej chciałem sprawdzić program w akcji.
Zapisanie głównego riff'u zajęło dosłownie chwilę, głównie dzięki temu, że korzystałem już z tabulatur Guitar Pro dawniej, więc orientowałem się jak się wstawia nutki. Nieco większym problemem było zapisanie akordów gitary klasycznej. To co było wręcz odruchem, trudno było rozłożyć na czynniki pierwsze. Nawet gdy udało mi się zapisać wreszcie odpowiedni rytm, brzmiał sztucznie. Na drodze eksperymentów typu "a co robi ten guzik?" znalazłem opcje głośności grania nutek - ustawienie mezzopiano zamiast mezzoforte w kluczowych miejscach sprawiło, że gitara brzmi jak żywa.
Perkusję - o którym to instrumencie nie wiem zbyt wiele - była wyzwaniem. Trochę podpatrywałem przykłady dołączone do programu (brawa dla designerów za łatwy dostęp do nich!), trochę eksperymentowałem, z naciskiem na to pierwsze. Zapewne poszłoby mi lepiej, gdybym wiedział dokładnie co chcę osiągnąć, a nie kierował się "a tu musi być czadowe pudubuduCZSZSZSZ!". Ignorancja boli.

Efekt końcowy jest (imo) całkiem niezły. W parę godzin (z czego większość poszła na perkusję) udało mi się zapisać i "zaaranżować" prosty riff. Jeśli będę chciał dodać melodię wokalu i rozbudować te dwadzieścia kilka taktów do postaci piosenki, nie powinno być z tym większego problemu.

Poniżej wynik wcześniej opisanej pracy:
Strona z mp3

wtorek, 29 czerwca 2010

Automatyczne śledzenie logów

Sesja, sesja, i po sesji. Na jednych zajęciach miałem okazję opiekować się serwerem z zainstalowanym ubuntu, który - między innymi - miał informować o udanych lub nie próbach wejściach do systemu.

W Linuxie stosowne informacje i tak już są zapisywane w logach, a konkretnie w /var/log/auth.log. Tam można zobaczyć dla kogo została otwarta sesja, lub kiedy autentyfikacja się nie powiodła (został podany zły logpass). Mnie interesowało zautomatyzowanie procesu analizowanie tego pliku, więc jak prawdziwy unixowy żółtodziób zacząłem googlać gotowych rozwiązań. Znalazłem skrypt w perlu, który wedle opisu miał robić dokładnie to co chciałem: wykrywał dopisania linii z poszukiwaną frazą, jednak oczywiście praktyka a teoria to dwa różne światy.
Źródła tamtego rozwiązania niestety nie zapisałem, a teraz szybkie wyszukiwania nie pozwoliły mi go odnaleźć. Cóż, teraz wiem jakich słów kluczowych używać, wtedy wpisywałem zapewne różne dziwne rzeczy w biednego wujka Google :)

Tak czy siak, zabrałem się za modyfikację kodu do moich potrzeb. Perla (oczywiście) w ogóle nie znałem i skłamałbym mówiąc, że się to zmieniło, ale mimo to wyprodukowałem poniższy kod:


#!/usr/bin/perl
my $output = 0;
while ( 1 )
{ 
    system('logtail -f /var/log/auth.log | tee -a ./tmpFile ./tmpFile2');
    system('rm ./output');
    system('rm ./output2');
    system('cat ./tmpFile | grep [fF]ailure | wc -l > ./output');
    open(FILE, "<output");
    $output = <FILE>;
    if ($output > 0)
    {
        system('mailx -s "authentication failed" adres@odbiorcy < ./mail.mail');
        system ('/bin/cat /dev/null > ./tmpFile');    
    }
    close FILE;
    
    system('cat ./tmpFile2 | grep Accepted | wc -l > ./output2');
    open(FILE, "<output2");
    $output = <FILE>;
    if ($output > 0)
    {
        system('mailx -s "session opened" adres@odbiorcy < ./mail.mail');
        system ('/bin/cat /dev/null > ./tmpFile2');    
    }
    close FILE;
    sleep 5;
}
Program opiera się na zasadniczo na bashowej komendzie logtail. Skrypt zapisuje ostatnie nowe linie do dwóch plików, a następnie przeszukuje, czy w pierwszym z nich znajduje się słowo "failure" - którego obecność jest praktycznie jednoznaczna z czyimś nieudanym logowaniem. Wynik działania (0, lub znalezione linie) jest zapisywane do pliku. Jeśli w pliku jest coś więcej niż 0, wtedy wysyłamy maila. Dalej analogicznie postępujemy aby wykryć udane logowania. Następnie śpimy pięć sekund i proces się powtarza.

Oczywiście, tworzenie tmpFile i tmpFile2 jest redundantne, wystarczyłoby się ograniczyć do jednego pliku. Taka postać wynika niestety z zastosowanej metody prób i błędów. Tak samo można wątpić, czy konieczne jest zapisywanie wyników grep'a do pliku.

Skrypt wykorzystuje mailx'a, co oznacza, że w systemie musi być skonfigurowana skrzynka pocztowa zdolna do wysyłania maili. Plik mail.mail zawiera treść wysyłanej wiadomości. Przez wysyłanie maili na adres z włączoną usługą powiadamianiem smsem o temacie nowej wiadomości, można łatwo uzyskać powiadomienia na komórkę. (Ja użyłem skrzynki plusnet.pl - usługa kosztowała jednokrotnie 5 złotych).

Skrypt odpalałem przez jednolinijkowy skrypt basowy IDS.sh:
./getauth.pl > /dev/null 2>&1 &

A ponieważ korzystałem z serwera przez ssh i zależało mi, aby skrypt działał po moim wylogowaniu, użyłem narzędzia nohup.

poniedziałek, 16 listopada 2009

CORPORA - polski słownik rozpoznawania mowy

Podczas próby zorientowania się (i napisania) własnego programu rozpoznawania mowy pojawia się pewien zasadniczy problem jeżeli chcemy tego dokonać dla naszego ojczystego języka. Otóż nie ma ogólnodostępnego słownika analogicznego do angielskiego słownika BEEP (dośc powszechnie używanego przynajmniej w przykładach). Po (naprawdę) długich godzinach spędzonych w Internecie okazało się że jest prototyp takiego słownika, który jest rozwijany. Niestety, przeciętny śmiertelnik nie ma dostępu do tego słownika. Zajmuje się nim głównie pracownik naukowy przy Politechnice Poznańskiej - pan Grocholewski.

W Internecie Można znaleźć jeden z jego artykułów (po polsku nawet) odnośnie rozpoznawania mowy i słownika CORPORA. jest to jednak niejako tylko pewien wstęp teoretyczny. Udało mi się uzyskać dostęp do jeszcze dwóch artykułów tego samego autora. Poniżej chciałam napisać, co udało mi się z nich dowedzieć.

Baza danych słów dla polskich difonów

Język Polski jest jednym z nielicznych języków, który nie może się poszczycić posiadaniem takiej bazy. W chwili obecnej rozwijają się jednak dwa projekty:

  1. CORPORA
  2. COPERNICUS - Baza ta zawiera 10 cyfr, 100 liczb, 40 krótkich dialogów zawierających kilka tematycznie powiązanych zdań oraz około 35 dodatkowych zdań. Sygnał mowy jest zdigitalizowany (cyfrowy) z częstotliwością próbkowania 20 kHz i 16 bitową rozdzielczością.

W dalszej części będziemy rozważać jedynie CORPORę.

Projekt CORPORy:

materiał mowy został tak dobrany aby znajdowały się tam polskie litery, cyfry i 200 pierwszych imion wypowiedzianych w izolacji oraz aby zawrzeć minimum 900 najczęściej występujących polskich difonów.

Warunki nagrywania:

Nagrania zostały dokonane w wielu miejscach w Polsce przy tych samych warunkach środowiskowych (mam na myśli komputer i sprzęt). Sygnał został nagrany z częstotliwością próbkowania 16 kHz i 13 bitową rozdzielczością. Sygnał został znormalizowany i tylko 12 starszych bitów brano pod uwagę. Aby zminimalizować ilość błędów proces nagrywania był kontrolowany przez specjalne oprogramowanie TIMREC (jego zadaniem było np podpowiadanie że osoba za cicho mówi). Oprócz tego przedsięwzięcie było nadzorowane przez wykwalifikowanego fonetyka. Łącznie CORPORA zawiera prawie 180.000 polskich difonów.

Segmentacja i etykietowanie:

Zostało zadecydowane aby segmentacja i etykietowane nastąpiły według automatycznej fonetycznej transkrypcji, gdyż ręczny proces jest bardzo żmudny i długotrwały (choć prawdopodobnie bardziej skuteczny). Osobno było etykietowanie dla kobiet, osobno dla mężczyzn. Użyto do tego techniki dynamicznego programowania (program ten nazywał się LABELER ).
Akustyczna analiza sygnału była dokonywana co 5 ms i użyto w tym celu 15 ms okna Hamminga. Każda ramka reprezentowała 100-punktowy rejestr spektrogramu bazujący na 240-punktowym WFTA(Winograd Fourier Transform Algoithm).
Takie badanie uzyskało dość dobre wyniki.


PODSUMOWANIE:

Automatyczne przypisy stworzono na podstawie wybranych nagrań mężczyzn i kobiet a następnie ręcznie przedstawione przez profesjonalnego akustyka. Największym problemem było to, że inaczej fonetycznie brzmi słowo w całości a inaczej podzielone na sylaby. W takich wypadkach etykietowano część słowa niezależnie jak byłaby ona słyszana w całości słowa. Drugim problemem było to, że w przypadku gdy występowały pewne złożenia głosek (Spółgłoski zwarte) spółgłoska z tego złożenia była umieszczana w losowym momencie ciszy.