Gdy działa już przykład czas najwyższy stworzyć coś własnego. Bazując na książce udostępnionej na głównej stronie o htk chciałabym opisać kolejne kroki. Zwłaszcza, że w języku polskim trudno cokolwiek znaleźć na ten temat. Przykład który tu opisuję to głosowy interfejs do wybierania numeru.
Więcej...
Aby cokolwiek zrobić najpierw trzeba przygotować dane. Będą nam one potrzebne do nauczenia programu oraz do testowania.
1. Gramatyka.
W celu opisania gramatyki należy się posłużyć notacją BNF:
$digit = ONE | TWO | THREE | FOUR | FIVE | SIX | SEVEN | EIGHT | NINE | OH | ZERO;
$name = [ JOOP ] JANSEN | [ JULIAN ] ODELL | [ DAVE ] OLLASON | [ PHIL ] WOODLAND |[ STEVE ] YOUNG;
( SENT-START ( DIAL <$digit> | (PHONE|CALL) $name) SENT-END )
Gdzie | oznacza alternatywy (OR), nawiasy [] - opcjonalne przedmioty, () - jeden lub więcej powtórzeń.
Aby jednak nasz system rozumiał wyraźnie nasz słowa należy się posłużyć notacją SLF. Jednak dla wygody użytkownika została stworzona specjalny mechanizm, który tłumaczy z BNF na SLF. W tym celu należy napisać HParse gram wdnet.
2. Słownik.
Na początek należy stworzyć posortowaną listę słów/zdań potrzebnych do systemu. Przykładowe poniższe ponumerowane zdania pochodzą z bazy TIMIT:
S0001 ONE VALIDATED ACTS OF SCHOOL DISTRICTS
S0002 TWO OTHER CASES ALSO WERE UNDER ADVISEMENT
S0003 BOTH FIGURES WOULD GO HIGHER IN LATER YEARS
Te zdania mogłyby już zostać przez nas użyty do listy treningowej (wlist od word list), ale wpierw jeszcze trzeba pozamieniać spacje na nowe linie. W tym celu można użyć funkcji prompts2wlist z katalogu HTKTutorial.
Sam słownik może być zbudowany za pomocą standardowego źródła HDMan. W tym przykładzie będzie użyty angielski słownik wymowy BEEP. Zostanie on zaadoptowany bez żadnych modyfikacji poza tym, że krótkie pauzy (sp od short-pause) zostaną dodane po każdej wymowie oraz wszelkie akcenty zostaną usunięte. Jeśli słownik będzie zawierał ciszę to wtedy zostanie połączone sp z sil (od silent) i będzie pojedynczy znak sil. Te zmiany mogą być dokonane przy wykorzystaniu HDMan oraz wykorzystaniu ewentualnych skryptów edytujących zawierających często następujące trzy linijki:
AS sp
RS cmu
MP sil sil sp.
(cmu oznacza poziom akcentu).
Następująca komenda utworzy nam słownik nazwany dict przez wyszukiwanie wymowy ze słownika beep i names wszystkich wyrazów znajdujących się w wlist:
HDMan -m -w wlist -n monophones1 -l dlog dict beep names
-l dlog to różne statystyki tworzenia słownika. W szczególności pokazuje cy nie brakuje jakiś słów. W przykładzie nasze zestawy treningowe nazywają się monophones1. Zwyczajowy format wejścia każdego słownika wygląda następująco:
WORD [outsym] p1 p2 p3 ....
które oznacza, że słowo WORD jest wymawiana jako sekwencja p1 p2 p3... . Nazwa w nawiasach [] (outsym w naszym przypadku) oznacza string, który znajdzie się na wyjściu w przypadku rozpoznaniu tego słowa. Gdy wyrazu nie będzie wewnątrz [] wtedy nic nie będzie na wyjściu. Jeśli nawias zostanie pominięty to string na wyjściu będzie jak słowo. Oto kilka przykładów:
A ah sp
A ax sp
A ey sp
CALL k ao l sp
DIAL d ay ax l sp
EIGHT ey t sp
PHONE f ow n sp
SENT-END [] sil
SENT-START [] sil
SEVEN s eh v n sp
TO t ax sp
TO t uw sp
ZERO z ia r ow sp
1 komentarz:
Będzie dalsza część czy porzucone?
Prześlij komentarz