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