Festival Speech Synthesis System: - Speech Resource Pages
Festival Speech Synthesis System: - Speech Resource Pages
Festival Speech Synthesis System: - Speech Resource Pages
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
We save the above definitions in a file `spanish_el.scm'. Now we can declare the new voice to <strong>Festival</strong>. See<br />
section 24.3 Defining a new voice, for a description of methods for adding new voices. For testing purposes we can<br />
explciitly load the file `spanish_el.scm'<br />
The voice is now available for use in festival.<br />
festival> (voice_spanish_el)<br />
spanish_el<br />
festival> (SayText "hola amigos")<br />
<br />
As you can see adding a new voice is not very difficult. Of course there is quite a lot more than the above to add a<br />
high quality robust voice to <strong>Festival</strong>. But as we can see many of the basic tools that we wish to use already exist. The<br />
main difference between the above voice and the English voices already in <strong>Festival</strong> are that their models are better<br />
trained from databases. This produces, in general, better results, but the concepts behind them are basically the same.<br />
All of those trainable methods may be parameterized with data for new voices.<br />
As <strong>Festival</strong> develops, more modules will be added with better support for training new voices so in the end we hope<br />
that adding in high quality new voices is actually as simple as (or indeed simpler than) the above description.<br />
[ < ] [ > ] [ > ] [Top] [Contents] [Index] [ ? ]<br />
24.2.9 Resetting globals<br />
Because the version of Scheme used in <strong>Festival</strong> only has a single flat name space it is unfortunately too easy for<br />
voices to set some global which accidentally affects all other voices selected after it. Because of this problem we<br />
have introduced a convention to try to minimise the possibility of this becoming a problem. Each voice function<br />
defined should always call voice_reset at the start. This will reset any globals and also call a tidy up function<br />
provided by the previous voice function.<br />
Likewise in your new voice function you should provide a tidy up function to reset any non-standard global variables<br />
you set. The function current_voice_reset will be called by voice_reset. If the value of<br />
current_voice_reset is nil then it is not called. voice_reset sets current_voice_reset to nil,<br />
after calling it.<br />
For example suppose some new voice requires the audio device to be directed to a different machine. In this example<br />
we make the giant's voice go through the netaudio machine big_speakers while the standard voice go through<br />
small_speakers.<br />
Although we can easily select the machine big_speakers as out when our voice_giant is called, we also<br />
need to set it back when the next voice is selected, and don't want to have to modify every other voice defined in the<br />
system. Let us first define two functions to selection the audio output.<br />
(define (select_big)<br />
(set! giant_previous_audio (getenv "AUDIOSERVER"))<br />
(setenv "AUDIOSERVER" "big_speakers"))<br />
(define (select_normal)<br />
(setenv "AUDIOSERVER" giant_previous_audio))<br />
Note we save the previous value of AUDIOSERVER rather than simply assuming it was small_speakers.<br />
Our definition of voice_giant definition of voice_giant will look something like