Gostai Urbi — Syntezator mowy
Transkrypt
Gostai Urbi — Syntezator mowy
Politechnika Wrocławska Wydział Elektroniki Sterowniki Robotów Projekt — raport końcowy Gostai Urbi — Syntezator mowy Autor: Natalia Czop 171602 AiR (ARR) Opiekun projektu: mgr inż. Jan Kędzierski Wrocław, 10 czerwca 2011 Spis treści 1 Temat projektu 1.1 Wybór syntezatora . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 Flite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.2 Festival . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 3 2 Gostai Urbi — zapoznanie się ze środowiskiem pracy 3 3 Tworzenie Uobject’u 3.1 Pierwszy UObject . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 UFesti — Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 UObject z wykorzystaniem repozytorium Linux’a . . . . . 3.2.1.1 Korzystanie z UFesti . . . . . . . . . . . . . . . . 3.2.1.2 Struktura modułu . . . . . . . . . . . . . . . . . 3.2.1.3 Praca równoległa i szeregowa . . . . . . . . . . . 3.2.1.4 Jak rozwijać . . . . . . . . . . . . . . . . . . . . 3.2.2 UObject bazujący jedynie na plikach źródłowych Festival’a 3.2.2.1 C++ i makefile . . . . . . . . . . . . . . . . . . . 3.2.2.2 Ufesti . . . . . . . . . . . . . . . . . . . . . . . . 3.3 UFesti — Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Instalacja Festival’a — cygwin . . . . . . . . . . . . . . . . 3.3.2 URBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.3 Visual Studio 2008 . . . . . . . . . . . . . . . . . . . . . . 3.3.4 UFesti 2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 4 5 5 8 9 9 9 10 10 11 11 11 11 4 Podsumowanie 12 5 Dodatek A — przydatne linki 13 6 Dodatek B — spis dołączonych katalogów i plików (struktura plików) 14 1 1 Temat projektu Celem projektu było stworzenie UObjectu syntezatora mowy dedykowanego dla Gostai Urbi. Pierwszym zadaniem było stworzenie syntezatora mowy, lub wybranie istiejącego już kodu, który mógłby być następnie wykorzystany do stworzenia modułu Urbi. Za najlepsze rozwiązanie uznano wykorzystanie już istniejącego kodu źródłowego projektu udostępnionego na prawach licencji GPL. 1.1 Wybór syntezatora Wybierając syntezator kierowano się dwoma kryteriami — wagą kodu oraz językiem programowania. Aby utworzyć UObject zgodny ze standardami Urbi musi być on zaimplementowany obiektowo, np. zgodnie ze składnią języka C++. 1.1.1 Flite Flite (Festival-lite) to mały, szybki silnik syntezy run-time opracowany na CMU (Carnegie Mellon University). Określenie mały użyte jest w porównaniu z silnikiem syntezy Festival, co pokazuje tabela 1. Flite to alternatywa Festivala dedykowana dla core code USEnglish lexicon diphone runtime Flite 60kB 100kB 600kB 1.8MB ¡1MB Festival 2.6MB ?? 5MB 2.1MB 16-20MB Tablica 1: Flite a Festival małych maszyn i/lub dużych serwerów. Kod napisany jest całkowicie w C co wpływa na wielkość i szybkość dzialania silnika, oraz pozwala na przenoszalność kodu. Udostępnia “skalowalny” głos. Twórcy slinika piszą, iż projekt jest w pierwszej fazie badań przed dopuszczeniem go go jako wolne oprogramowanie dla zainteresowanych użytkowników. Z tego też względu część kodu należy przystosować do własnych potrzeb, jak na przykład szybkość zegara decydującego o szybkości “wypowiadanych” przez syntezator słów. Dzięki mechanizmowi extern C kod napisany w C powinien być przez kompilator C++ rozpoznawany jako poprawny i adaptowany do działania. Po pobraniu wszystkich pakietów Flite i zapoznaniu się ze strukturą oraz hierachią kodu skonfigurowano i skompilowano pliki celem uzyskania bibliotek, które po dołączeniu do własnego programu pozwoliłyby na wykorzystanie funkcji syntezatora. Nastepnie usunięto zbędne pliki, pozostawiając jedynie te, które muszą zostać bezpośrednio dołączone do głównej aplikacji, aby mógła ona poprawnie współpracować z Flite. Po napisaniu prostego programu przystąpiono do sprawdzenia czy można z niego stworzyć UObject. Listing 1: f #i n c l u d e ” f l i t e . h” register cmu us kal (); i n t main ( i n t argc , c h a r ∗∗ argv ) 2 { c s t v o i c e ∗v ; i f ( a r g c != 2 ) { e x i t ( −1); } flite init (); v = r e g i s t e r c m u u s k a l (NULL ) ; f l i t e f i l e t o s p e e c h ( argv [ 1 ] , v , ” p l a y ” ) ; } Niestety okazało się, iż nawet najprostszy program korzystający z Flite nie chce współpracować z Urbi. Pomimo mechanizmu extern C umake − shared pozwalający na stworzenie UObjectu wykrył błędy stwierdzające, iż część poleceń oraz deklaracji stałych jest błędna. W związku z tym przystąpiono do przeniesienia kodu z języka C do języka C + +. Takie działanie nie zakończyło się jednak sukcesem z powodu braku dokładnej znajomości kodu i celu działania poszczególnych funkcji. 1.1.2 Festival Festival to również projekt CMU. Jak pokazano powyżej jego waga jest o wiele większa od wagi Flite jednakże kod napisany jest w C++ dzięki czemu znika problem przystosowania kodu do właściwej postaci. Początkowe działania były takie, jak przy postępowaniu z kodem Flite. Po konfiguracji i kompilacji pakietów zbędne pliki zostały usunięte. Utworzono cztery archiwa ar (libestbase.a, libestools.a, libeststring.a, libFestival.a) dołączone następnie w etapie kompilacji własnego kodu. 2 Gostai Urbi — zapoznanie się ze środowiskiem pracy Platforma Urbi zapewnia użytkownikom język programowania robotów ukierunkowany na równoległe zarządzanie zdarzeniami, stworzenie modułu zgodnego z jej wymogami pozwoliłoby na wykorzystanie go do różnych robotów, bez konieczności znajomości przez użytkownika dokładnej specyfikacji użytego kodu. Urbi dostarcza obszerny i dokładny opis jak korzystać z udostępnionych narzędzi, przydatne informacje można również znaleźć na http://forum.gostai.com/. 3 Tworzenie Uobject’u Platforma Gostai Urbi zapewnia przenoszalność swoich modułów między systemami różnego rodzaju. Dlatego też podjęto próbę zrealizowania projektu przy użyciu systemu Linux (Ubuntu 10.10) jak i Windows (Windows 7 64x). 3.1 Pierwszy UObject Na podstawie dokumentacji i przedstawionego w niej opisu tworzenia UObject’ów stworzono pierwszy własny UObject. Obiekt ten udało się utworzyć za pomocą umake−shared, następnie poleceniem urbi − launch − −startf esti − − − −interactive załadowano obiekt do Urbi i przetestowano jego działanie. 3 Listing 2: f var f = UFesti . new ( ) ; [00010205] UFesti 0xffffffffb770c118 f . Sayy ( ) ; Sayy [ 0 0 0 1 7 1 5 8 ] 0 efektem działania programu było ’wypowiedzenie’ przez niego zadanego zdania jakim było ’hello world’. Tak zaimplementowany UObject wymaga by na korzystającym z niego komputerze był zainstalowany Festival. Stworzony UObject nazwano UFesti. 3.2 UFesti — Linux Obiekt znajduje się w katalogu festi.uob. Sposób komilacji i uruchamiania opisano w pliku README. Dostarczony obiekt pozwala na stworzenie UObjectu inicjującego Festival’a, oraz wygłaszającego zadany tekst poprzez użycie funkcji Say Text. Kilka modułów tego samego typu, lub kilka funkcji z jednego modułu może działać szeregowo (separatory ; oraz |), problemem jest jednak działanie równoległe (separatory & i ,). Komunikat błędu mówi: “SIOD1 ERROR: the currently assigned stack limit has been exceded”. Błąd ten wynika ze sposobu implementacji syntezatora mowy. Zgodnie z dokumentacją Festival nie może działać wielowątkowo. W trakcie realizacji projektu uznano sprawdzono dwie metody tworzenia UObjectu • korzystając z inicjalizacji Festival’a poprzez pliki utworzone przy jego instalacji z repozytorium – to rozwiązanie działa – pliki wymagane do tworzenia własnego obiektu mają wagę około 30MB • korzystając ze skompilowanych źródeł i plików inicjalizacji w lokalnych katalogach – waga lokalnych katalogów wynosi ok 170MB – program napisany w C++ działa – UObject jest tworzony ale nie działa pod URBI 3.2.1 UObject z wykorzystaniem repozytorium Linux’a 1. Pobierz pliki z repozytorum (w ten sposób uzyskasz poprawnie umiejscowiony plik .init oraz głos dla syntezatora): • przy użyciu Menadżera Pakietów — zaznacz do instalacji F estival, F estival − dev oraz f estvox − kallpc8k; • wpisując z konsoli sudo apt − get install F estival 2. folder festi.uob możesz umieścić w dowolnym miejscu pod warunkiem, że masz ustawione globalnie ścieżki do urbi (jeśli nie masz, możesz zrobić to lokalnie poleceniem export P AT H =”{sciezka do urbi} : $P AT H” 3. umieść dostarczone biblioteki (libFestival.a, libestbase.a, libeststring.a, libestools.a) w katalogu /urbi-root/lib/lib2 1 Czym jest SIOD: http://www.cstr.ed.ac.uk/projects/Festival/manual/Festival 8.html. Jeżeli na Twoim komputerze nie znajduje się taki katalog znaczy to, iż zapewne nie zainstalowaleś jeszcze Gostai URBI — w tym celu pobierz źródła ze strony http://www.gostai.com/download/urbi 2 7 bin/ i postępuj zgodnie z instrukcją instalacji. Zarówno instalacja jak i obsługa Gostai URBI została szeroko opisana w udostępnionym manualu i nie powinna sprawić żadnemu użytkownikowi problemów. Źródła są też dostępne na stronie http://www.gostai.com/downloads/urbi-sdk/. 2 4 4. oprócz folderu festi.uob dostarczony został skompilowany za pomocą umake−shared UObject f esti.so (+f esti.la) - jego generowanie odbywa się poprzez wpisanie w konsoli umake − shared f esti.uob −o f esti −I./f esti.uob/F estival/src/include −I. /f esti.uob/speech tools/include −lF estival −lestbase −lestools −leststring −lesd −lcurses −lm znajdując się w katalogu nadrzędnym do festi.uob. 3.2.1.1 Korzystanie z UFesti 1. załaduj obiekt do URBI, np komendą LoadM odule(”U F esti”); przy URBI uruchomionym w trybie interaktywnym; albo poprzez uruchomienie URBI poleceniem urbi − launch − − start f esti −− −−interactive; 2. utwórz zmienną var f esti = U F esti.new(); 3. dostępne funkcje: • f esti.Initialize() — inicjalizacja Festival’a • f esti.Sayy() — wypowiedzenie przez moduł słowa Hello (funkcja wprowadzona w ramach testowania obiektu) • f esti.Say T ext(”english tekst”) — wywołanie postaci f esti.Say T ext(”robot”); spowoduje wypowiedzenie przez moduł słowa robot. 3.2.1.2 Struktura modułu Poniżej przedstawiono pliki potrzebne do utworzenia UObjectu. Listing 3: festi.hh #i f n d e f FESTI FESTI HH #d e f i n e FESTI FESTI HH #i n c l u d e <c s t d l i b > #i n c l u d e <c s t d i o > #i n c l u d e ” . / f e s t i v a l / s r c / i n c l u d e / f e s t i v a l . h” #i n c l u d e <u r b i / u o b j e c t . hh> class Festi { public : Festi () ; }; #e n d i f Listing 4: festi.cpp #i n c l u d e < l i b p o r t / f o r e a c h . hh> #i n c l u d e ” f e s t i . hh” Festi : : Festi () { } Listing festi.hh oraz festi.cpp przedstawiają klasę w czystym C++, zawierającą jedynie konstruktor. Celem korzystania z Festival’a musimy dołączyć plik nagłówkowy Festival.h: Listing 5: include 1 #i n c l u d e ” . / f e s t i v a l / s r c / i n c l u d e / f e s t i v a l . h” 5 Aby móc zbindować klasę z URBI dołączamy do festi.hh delaracje UObject’ów: Listing 6: include 2 #i n c l u d e <u r b i / u o b j e c t . hh> oraz do festi.cpp nakładkę do Boost.Foreach3 Listing 7: include 3 #i n c l u d e < l i b p o r t / f o r e a c h . hh> Następnie można już zbindować właściwy obiekt (przez bindowanie w URBI rozumiane jest użycie UObject API do deklaracji obiektów w świecie URBI, część lub wszystkie atrybuty i metody danej klasy są deklarowane w URBI). Ufesti.hh zawiera prototyp klasy UFesti, ufesti.cpp zaś jej rozwinięcie. Listing 8: ufesti.hh #i f n d e f FESTI UFESTI HH #d e f i n e FESTI UFESTI HH // / I n c l u d e t h e UObject d e c l a r a t i o n s . # i n c l u d e <u r b i / u o b j e c t . hh> // / We wrap f a c t o r i e s . #i n c l u d e ” f e s t i . hh” #i n c l u d e <i o s t r e a m > #i n c l u d e <c s t r i n g > c l a s s UFesti : p u b l i c u r b i : : UObject { public : // / C++ c o n s t r u c t o r // / \param name name g i v e n t o t h e i n s t a n c e . U F e s t i ( c o n s t s t d : : s t r i n g& name ) ; // / Urbi c o n s t r u c t o r . // / \ r e t u r n 0 on s u c c e s s . int init () ; // / f e s t i v a l i n i t i a l i z a t i o n int I n i t i a l i z e () ; // / method f o r t e s t s i n t Sayy ( ) ; // / method f o r s a y i n g g i v e n t e x t i n t Say Text ( c o n s t c h a r ∗ t e x t ) ; private : // / The a c t u a l f e s t i , wrapped i n t h i s UObject . Festi ∗ f e s t i ; }; #e n d i f Listing 9: ufesti.cpp #i n c l u d e ” u f e s t i . hh” UStart ( U F e s t i ) ; U F e s t i : : U F e s t i ( c o n s t s t d : : s t r i n g& name ) : u r b i : : UObject ( name ) , f e s t i (0) 3 Boost.Foreach to konstruktor dla C++ zwalniający użytkownika z obługi iterowania dla pętli; zobacz tu. 6 { // R e g i s t e r t h e Urbi c o n s t r u c t o r . // p a r t o f t h e C++ c o n s t r u c t o r . UBindFunction ( UFesti , i n i t ) ; This i s t h e o n l y mandatory } int UFesti : : i n i t ( ) { // / b i n d i n g f u n c t i o n s UBindFunction ( UFesti , I n i t i a l i z e ) ; UBindThreadedFunctionRename ( UFesti , I n i t i a l i z e , ” t h r e a d e d S a y T e x t ” , u r b i : : LOCK NONE) ; UBindFunction ( UFesti , Sayy ) ; UBindThreadedFunctionRename ( UFesti , Sayy , ” t h r e a d e d S a y y ” , u r b i : : LOCK NONE) ; UBindFunction ( UFesti , Say Text ) ; UBindThreadedFunctionRename ( UFesti , Say Text , ” t h r e a d e d S a y T e x t ” , u r b i : : LOCK NONE) ; f e s t i = new F e s t i ( ) ; // S u c c e s s . return 0; } int UFesti : : I n i t i a l i z e ( ) { i n t h e a p s i z e = 5 1 0 0 0 0 0 0 ; // / d e f a u l t scheme heap s i z e was 210000 i n t l o a d i n i t f i l e s = 1 ; // / we want t h e f e s t i v a l i n i t f i l e s l o a d e d f e s t i v a l i n i t i a l i z e ( l o a d i n i t f i l e s , heap size ) ; // / s e t t i n g v o i c e − e n g l i s h male festival eval command (”( voice kal diphone )”) ; return 1; } int U F e s t i : : Sayy ( ) { // / c o n s t t e x t f o r s a y i n g c o n s t EST String t e k s t=” h e l l o ” ; // / s a y t e x t festival say text ( tekst ) ; return 0; } int U F e s t i : : Say Text ( c o n s t c h a r ∗ t e x t ) { // / c o n s t t e x t f o r s a y i n g , EST String i s f e s t i v a l ’ s t y p e c o n s t EST String t e k s t = ( c o n s t EST String ) t e x t ; // / s a y t e x t festival say text ( tekst ) ; return 1; } W przedstawionym module zbindowanie metod odbyło się poprzez użycie U BindF unction4 . Jest to jak najbardziej poprawny sposób bindowania funkcji, użyto jednakże również U BindT hreadedF unctionRename z opcją urbi :: LOCK N ON E. Służy ona do wywoływania metody w osobnym wątku i zabezpieczeniu jej przed ewentualnym ”upadkiem”, dostępne są następujące opcje: • LOCK NONE — brak blokad (zamków); • LOCK FUNCTION — równoległe wykonywanie jest ograniczone do jednej instancji zbindowanej metody, kolejne składowane są w kolejce; • LOCK FUNCTION DROP — działa podobnie jak LOCK FUNCTION, z tym, że kolejne operacje są odrzucane zamiast składowania w kolejce w przypadku gdy jedna z nich już działa; 4 Bindowanie zmiennych odbywa się poprzez UBindVar 7 • LOCK FUNCTION KEEP ONE — działa podobnie jak LOCK FUNCTION, kolejka jest limitowana do jednej operacji, reszta jest odrzucana; • LOCK INSTANCE — równoległe wykonywanie jest ograniczone do jednej zbindowanej metody dla każdej instancji obiektu; • LOCK CLASS — równoległe wykonywanie jest ograniczone do jednej zbindowanej metody dla całej klasy; • LOCK MODULE — równoległe wykonywanie jest ograniczone do jednej zbindowanej funkcji dla całego modułu (obiektu). 3.2.1.3 Praca równoległa i szeregowa Zaletą URBI jest możliwość pracy zorientowanej zdarzeniowo zarówno równolegle jak i szeregowo. W rozdziale 3.2 wspomniano, iż Festival nie jest przystosowany do pracy wielowątkowej. W tabeli 2 przedstawiono testy użycia UFesti dla działania zarówno równoległego, jak i szeregowego. | ; 1+3; f.Sayy(); [00062739] 4 [00062739] 0 1+3 | f.Sayy(); [00252490] 0 1+3 & f.Sayy(); [00073036] 4 [00073037] 0 good good or SIOD error — wrong f.Sayy() & 1+3; f.Sayy() | 1+3; [00265902] 4 f.Sayy(), 1+3; SIOD ERROR: the currently right or SIOD error — wrong good good f.Sayy(); f.Sayy(); [00206483] 0 [00208901] 0 1+3, f.Sayy(); [00494555] 0 good good f.Sayy(); 1+3; [00096435] 0 [00098858] 4 , & assigned stack limit has been exceded [00523694] 4 f.Sayy() | f.Sayy(); [00321326] 0 good x2 f.Sayy() & f.Sayy(); wrong f.Sayy(), f.Sayy(); SIOD ERROR: the currently SIOD ERROR: the currently assigned stack limit has been assigned stack limit has been exceded exceded good x2 [00572562] 0 good and wrong good and wrong Tablica 2: Praca równoległa i szeregowa. Oznaczenia: good — jedna metoda Sayy() zadziałała poprawnie, good x2 — dwie metody Sayy() zadziałały poprawnie, wrong — metoda Sayy() nie zadziałała poprawnie. Przedstawione testy pokazują, iż bezpieczne jest używanie UObjectu opartego o syntezator mowy Festival w szeregowej realizacji zdarzeń. Praca równoległa wymagająca wielowątkowości nie działa poprawnie, chociaż dla operatora & zdarzała się poprawna obsługa 8 zdarzeń, nie udało się jednak określić co warunkuje tę poprawność (zapewne wpływ ma obciążenie serwerów URBI w danej chwili). 3.2.1.4 Jak rozwijać Dalszy rozwój obiektu powinien bazować na funkcjach dostarczonych przez Festival’a (najlepiej jest przeanalizować plik F estival main.cc) takich jak wybór głosu (języka, tonacji) lub zapisywanie i odczytywanie tekstów z plików wave. 3.2.2 UObject bazujący jedynie na plikach źródłowych Festival’a Do UObjectu korzystającego z repozytorium Linuxa dołączono folder festi.uob, do UOBjectu bazującego jedynie na plikach źródłowych Festival’a dołączono je wszystkie, ale można je również pobrać ze stron: • http://www.cstr.ed.ac.uk/downloads/Festival/ • http://festvox.org/packed/Festival/ • http://www.speech.cs.cmu.edu/Festival/cstr/Festival/ Musisz pobrać co najmniej: • Festival-x.x-release.tar.gz; • festlex CMU.tar.gz; • festlex POSLEX.tar.gz; • festvox kallpc16k.tar.gz; • Speech tools-x.x-release.tar.gz5 , gdzie x.x to wersja pakietów, np.: 2.1. Po pobraniu rozpakuj pobrane archiwa poleceniem tar xf z lub użyj do tego menadżera archiwów. Kolejnym krokiem jest wykonanie konfiguracji pakietów i ich kompilacja. Szczegółowe informacje znajdują się na stronie manuala. Postępowanie w ogólnym przypadku wygląda następująco: Listing 10: configure & make >cp s p e e c h t o o l s / >./ c o n f i g u r e >make >cd . . / f e s t i v a l / >./ c o n f i g u r e >make W ten sposób utworzone zostaną wszystkie biblioteki potrzebne do korzystania z Festival’a. 3.2.2.1 C++ i makefile Po wykonaniu działań z paragrafu 3.2.2 z pakietami wersji 2.1 wszystkie biblioteki zbudowały się bez żadnych błędów i ostrzeżeń, jednakże po próbie dołączenia ich do własnego programu okazało się, że część fukcji i odwołań w libestools nie jest poprawnie zbudowana6 podobna sytuacja wystąpiła z pakietem 2.0. Dlatego zamiast umieszczać utworzony program na zewnątrz źródeł Festival’a umieszczono go w katalogu /F estival/src/main w zastępstwie pliku F estival main.cc, zaś program wykonywalny utworzono za pomocą M akef ile0 a znajdującego się w katalogu /F estival/. 5 speech tools — http://festvox.org/docs/speech tools-1.2.0/. http://festvox.org/docs/ 6 Log kompilacji znajduje się w pliku error.txt. 9 Więcej dokumentów — Listing 11: main.cc #i n c l u d e <c s t d l i b > #i n c l u d e <i o s t r e a m > #i n c l u d e ” f e s t i v a l . h” #i n c l u d e ”EST . h” i n t main ( i n t { EST Wave int heap int l o a d a r g c , c h a r ∗∗ a r g v ) wave ; s i z e = 2 1 0 0 0 0 ; // d e f a u l t scheme heap s i z e i n i t f i l e s = 1 ; // we want t h e f e s t i v a l i n i t f i l e s loaded f e s t i v a l i n i t i a l i z e ( l o a d i n i t f i l e s , heap size ) ; festival eval command (”( voice kal diphone )”) ; // Say some t e x t ; f e s t i v a l s a y t e x t ( ” h e l l o world ” ) ; return 0; } 3.2.2.2 Ufesti Z powodu niemożności właściwego podlinkowania bibliotek próba stworzenia UObjectu również nie zakończyła się sukcesem. Celem zapoznania się z mechanizmem implementacji UObjectu z wykorzystaniem plików źródłowych Festival’a proszę zapoznać się z raportem z projektu ze Sterowników Robotów 2010/2011 Piotra Basińskiego (projekt realiowany równolegle, ale niezależnie). 3.3 UFesti — Windows Działanie pod systemem Windows jest zdecydowanie bardziej skomplikowane. Instalacja URBI nie sprawia problemów — graficzny kreator instalacji prowadzi użytkownika przez jej wszystkie etapy. Problem ponownie związany jest z samym Festivalem, sami twórcy tego syntezatora nie polecają używania go pod platformami Windows, chyba że użytkownik wykazuje się dużą znajomością języka C++. Instalacja syntezatora nie sprawiła żadnych problemów, wygenerowano również biblioteki *.dll potrzebne do tworzenia własnych programów korzystających z Festival’a. Po utworzeniu tego typu programu testowego kompilacja odbyła się bez przeszkód — jednakże w trakcie linkowania bibliotek ujawniły się 103 błędy wynikające z predefnicji kilku metod zawartych w bibliotekach Festival’a w bibliotekach domyślnie inkludowanych przez Visual Studio 2008. Po zignorowaniu bibliotek domyślnych pojawiło się aż 7295 błędów uniemożliwiających dalszą pracę. Test ten przeprowadzono na bazie źródeł z Festival’a 2.1. Do projektu dołączyć należy cztery bibliteki libFestival.dll, libestbase.dll, libestools.dll oraz libeststring.dll. Pierwsza z nich wydaje się być dobrze utworzona (postepowanie przeprowadzono według instrukcji ze strony: http://www.eguidedog.net/doc build win Festival.php), trzy kolejne jednak nie (mimo utworzenia ich w wyniku instrukcji z tej samej, podanej wyżej strony). Udostępnione przez prowadzącego biblioteki z wersji 2.0 nie wykazują takich problemów, niestety nie jest znane strona ich pochodzenia (nie są bliblioteki zbudowane na komputerze lokalnym lecz pobrane z internetu, a strona ich pochodzenia, nie jest niestety znana). Sam UObject również nie działa. W związku z tym projekt kontynuowano bazując na wersji 2.1 Festival’a. Po konsultacji mail’owej z Panem Cameron’em Wong’iem, odpowiedzialnym za stronę http://www.eguidedog.net/ uzyskano poprawnie wygenerowane biblioteki *.dll (dołączone w materiałach do projektu), nadal jednak przy ich linkowaniu pojawiają się błędy. 10 Mimo niepowodzenia projektu na bazie systemu Windows poniższe rozdziały raportu przedstawiają pozyskane dane i przeprowadzone działania, które być może pomogą w kolejnych próbach rozwiązania problemów z Festival’em pod systemem Windows. 3.3.1 Instalacja Festival’a — cygwin Do przeprowadzenia instalacji Festival’a na systemie Windows potrzebne są: • cygwin z gcc<=4.5 (+jeśli nie jest zaznaczone domyślnie nmake, cmake, make) • Visual Studio 2008 (2008, ponieważ z tą wersją zintegrowany jest UObject Wizard dla URBI 2.77 ) • pakiety Festival’a. Potrzebne informacje, jak i źródła znajdziesz na następujących stronach: • cygwin — http://www.cygwin.com/ • konfiguracja cygwin — http://www.macraigor.com/full gnu.htm • wymagania — http://www.cstr.ed.ac.uk/projects/Festival/download.html • instalacja — http://www.eguidedog.net/doc build win Festival.php 3.3.2 URBI Aby zainstalować na swojej jednostce komputerowej URBI należy pobrać plik *.exe ze strony http://www.gostai.com/download/ i postępować zgodnie z instrukcjami instalatora. 3.3.3 Visual Studio 2008 W momencie gdy na naszym komputerze znajduje się Visual Studio 2008 (lub 2010 zależnie od tego, jaką wersję wymaga URBI), kreator instalacji zapyta czy zainstalować UObject Wizard dla Visual Studio — należy tę opcję zatwierdzić, gdyż ułatwia to późniejsze tworzenie UObjectów. Po uruchomieniu programu wybieramy: F ile − N ew P roject i z listy szablonów uobject (patrz rysunek 1). 3.3.4 UFesti 2.1 Po zainstalowaniu Festival’a wygenerowane zostały biblioteki *.dll, które miały zostać podlinkowane do UObjectu i pozwolić na jego poprawne działanie, jak opisano to w rozdziale 3.3 próba ta nie powiodła się, ale zapoznano się ze sposobem tworzenia UObjectów pod systemem Windows. Po utworzeniu nowego projektu za pomocą kreatora UObjectów otrzymujemy pusty szablon naszego modułu, na podstawie którego można rozwijać własny obiekt. Listing 12: uobject.cpp #i n c l u d e <u r b i / u o b j e c t . hh> c l a s s MyUObject : p u b l i c u r b i : : UObject { public : MyUObject ( c o n s t s t d : : s t r i n g& s t r ) ; 7 W momencie rozpoczęcia projektu wersja 2.7 była najbardziej aktualną, w chwili jego kończenia pojawiła się wersja 2.8. 11 Rysunek 1: Kreator UObject w Visual Studio int init () ; }; MyUObject : : MyUObject ( c o n s t s t d : : s t r i n g& s ) : u r b i : : UObject ( s ) { UBindFunction ( MyUObject , i n i t ) ; }; i n t MyUObject : : i n i t ( ) { return 0; }; UStart ( MyUObject ) ; Dodatkowe foldery include ustawiamy we właściwościach obiektu w zakładce Conf iguration P roperties − CC + + − General − Additional Include Directories 8 , w zakładce Conf iguration P roperties − Linker − General − Additional Library Directories podajemy ścieżkę do folderu zawierającego linkowane bibliteki (np. libFestival.dll)9 , zaś ich nazwy podajemy w zakładce Conf iguration P roperties − Linker − Input − Additional Dependencies10 4 Podsumowanie Projekt nie zakończył się pełnym sukcesem — utworzono działający moduł URBI dedykowany dla systemu LINUX, działanie to nie powiodło się jednak dla obiektu dedykowanego dla systemu Windows. Mimo doświadczonych niepowodzeń projekt ten był okazją do po8 Domyślnie (ma on pozostać) powinien być również dodany folder $P AT H : \Gostai Engine Runtime\2.7.1\include 9 Domyślnie (mają one pozostać) $P AT H : \Gostai Engine Runtime\2.7.1\bin oraz $P AT H : \Gostai Engine Runtime\2.7.1\bin\gostai\engine 10 Domyślnie (mają one pozostać) — dla wersji Release libjpeg4urbi − vc90.lib, libport − vc90.lib, libsched − vc90.lib, libuobject − vc90.lib, liburbi − vc90.lib. 12 Rysunek 2: Okno właściwości obiektu znanania wielu nowych programów (flite, Festival, cygwin, Visual Studio) jak i platformy URBI oraz poszerzenia swojej wiedzy programistycznej (biblioteki *.so, *.dll oraz *.a). 5 Dodatek A — przydatne linki Poniżej przedstawiam pełne adresy stron internetowych z których korzystałam w realizacji projektu: • http://forum.gostai.com/ • http://www.cstr.ed.ac.uk/projects/Festival/manual/Festival 8.html • http://www.gostai.com/download/urbi 2 7 bin/ • http://www.gostai.com/downloads/urbi-sdk/2.x/doc/urbi-sdk.htmldir/installation.html • http://www.gostai.com/downloads/urbi-sdk/2.x/doc/urbi-sdk.htmldir/ • http://www.gostai.com/downloads/urbi-sdk/ • http://boost-sandbox.sourceforge.net/libs/foreach/doc/html/ • http://www.cstr.ed.ac.uk/downloads/Festival/ • http://festvox.org/packed/Festival/ • http://www.speech.cs.cmu.edu/Festival/cstr/Festival/ • http://festvox.org/docs/speech tools-1.2.0/ • http://festvox.org/docs/ • http://www.cstr.ed.ac.uk/projects/Festival/manual/Festival 6.html. • http://www.eguidedog.net/doc build win Festival.php) • http://www.eguidedog.net/ 13 • http://www.cygwin.com/ • http://www.macraigor.com/full gnu.htm • http://www.cstr.ed.ac.uk/projects/Festival/download.html • http://www.eguidedog.net/doc build win Festival.php • http://www.gostai.com/download/ 6 Dodatek B — spis dołączonych katalogów i plików (struktura plików) Pliki umieszczono w katalogu nadrzędnym Festival urbi. • Linux – first linux ∗ festi.uob · ufesti.cpp · ufesti.hh · festi.cpp · festi.hh · Festival — zawiera źródła Festival’a potrzebne do kompilacji UObjectu · speech tools — zawiera źródła speech tools potrzebne do kompilacji UObjectu ∗ lib (zawiera biblioteki które należy umieścić w katalogu urbi − root/lib/lib ∗ festi.so (gotowy obiekt, który można załadować do URBI ∗ festi.la ∗ u make.sh — zawiera komendę dla umake − shared – second linux ∗ synteza1 — pliki Festival’a 2.1 i program w C++ wykorzystujący Festival ∗ synteza2 — pliki Festival’a 2.0 ∗ synteza3 — pliki Festival’a 1.95 • Windows – lib ∗ lib 2 1 n — biblioteki utworzone w wyniku prób uruchomienia UFesti na systemie Windows 7 x64; wersja 2.1 ∗ lib 2 1 w — biblioteki dostarczone prze Pana Cameron’a Wong’a; wersja 2.1 ∗ lib 2 0 — biblioteki dostarczone przez prowadzącego; wersja 1.95 – uobject.cc — szkielet uobjectu generowany przez Visual Studio 2008 14