diff --git a/README.md b/README.md index fc454d1..1ae74eb 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ # festival +Festival offers a general framework for building speech synthesis systems as well as including examples of various modules. As a whole it offers full text to speech through a number APIs: from shell level, though a Scheme command interpreter, as a C++ library, from Java, and an Emacs interface. Festival is multi-lingual (currently English (British and American), and Spanish) though English is the most advanced. Other groups release new languages for the system. And full tools and documentation for build new voices are available through Carnegie Mellon's FestVox project (http://festvox.org) +The system is written in C++ and uses the Edinburgh Speech Tools Library for low level architecture and has a Scheme (SIOD) based command interpreter for control. Documentation is given in the FSF texinfo format which can generate, a printed manual, info files and HTML. +Festival is free software. Festival and the speech tools are distributed under an X11-type licence allowing unrestricted commercial and non-commercial use alike. + diff --git a/festival-1.96-bettersonamehack.patch b/festival-1.96-bettersonamehack.patch new file mode 100644 index 0000000..f78104a --- /dev/null +++ b/festival-1.96-bettersonamehack.patch @@ -0,0 +1,33 @@ +--- speech_tools/config/rules/library.mak.soname 2001-04-04 07:55:32.000000000 -0400 ++++ speech_tools/config/rules/library.mak 2007-03-16 14:13:59.000000000 -0400 +@@ -103,14 +103,14 @@ + ########################################################################### + + lib%.so : lib%.a +- @echo Make Shared Library $* ++ @echo Make Shared Library $(*F) + @if [ ! -d shared_space ] ; then mkdir shared_space ; else $(RM) -f shared_space/*.o ; fi + @(cd shared_space ; $(AR) x ../$< ) +- @echo Link Shared Library $* +- if [ -n "$(PROJECT_LIBRARY_NEEDS_SYSLIBS_$*)" ] ; then libs='$(JAVA_PROJECT_LIBS)' ; fi ;\ +- $(subst XXX,$@.$(PROJECT_LIBRARY_VERSION_$*),$(MAKE_SHARED_LIB)) shared_space/*.o $(PROJECT_LIBRARY_USES_$*:%=-L. -l%) $$libs ++ @echo Link Shared Library $(*F) ++ if [ -n "$(PROJECT_LIBRARY_NEEDS_SYSLIBS_$(*F))" ] ; then libs='$(JAVA_PROJECT_LIBS)' ; fi ;\ ++ $(subst XXX,$@.$(PROJECT_LIBRARY_VERSION_$(*F)),$(subst YYY,$(@F).$(PROJECT_LIBRARY_VERSION_$(*F)),$(MAKE_SHARED_LIB))) shared_space/*.o $(PROJECT_LIBRARY_USES_$(*F):%=-L. -l%) $$libs + @$(RM) -f shared_space/*.o $@ +- @ln -s $@.$(PROJECT_LIBRARY_VERSION_$*) $@ ++ @ln -s $(@F).$(PROJECT_LIBRARY_VERSION_$(*F)) $@ + + ########################################################################### + ## ## +--- speech_tools/config/compilers/gcc_defaults.mak.soname 2007-03-16 12:43:31.000000000 -0400 ++++ speech_tools/config/compilers/gcc_defaults.mak 2007-03-16 13:30:11.000000000 -0400 +@@ -78,7 +78,7 @@ + SHARED_LINKFLAGS = -fno-shared-data + + ifndef GCC_MAKE_SHARED_LIB +- MAKE_SHARED_LIB = $(CXX) -shared -fno-shared-data -o XXX ++ MAKE_SHARED_LIB = $(CXX) -shared -fno-shared-data -o XXX -Wl,-soname,YYY + else + MAKE_SHARED_LIB = $(GCC_MAKE_SHARED_LIB) + endif diff --git a/festival-1.96-enable_esd_audio.patch b/festival-1.96-enable_esd_audio.patch new file mode 100644 index 0000000..f986d28 --- /dev/null +++ b/festival-1.96-enable_esd_audio.patch @@ -0,0 +1,16 @@ +diff -Nru speech_tools.orig/config/config.in speech_tools/config/config.in +--- speech_tools.orig/config/config.in 2006-07-08 20:06:18.000000000 +0200 ++++ speech_tools/config/config.in 2007-08-01 03:30:11.000000000 +0200 +@@ -80,10 +80,10 @@ + # INCLUDE_MODULES += NAS_AUDIO + + ## Elightenment Sound Demon, for KDE etc. +-# INCLUDE_MODULES += ESD_AUDIO ++INCLUDE_MODULES += ESD_AUDIO + + ## Native audio for your platform (sun, linux, freebsd, irix, macosx, windows) +-INCLUDE_MODULES += NATIVE_AUDIO ++#INCLUDE_MODULES += NATIVE_AUDIO + + ## Special code to run Windows MPLAYER + # INCLUDE_MODULES += MPLAYER_AUDIO diff --git a/festival-1.96-etcsiteinit.patch b/festival-1.96-etcsiteinit.patch new file mode 100644 index 0000000..8e21ace --- /dev/null +++ b/festival-1.96-etcsiteinit.patch @@ -0,0 +1,55 @@ +diff -ur festival.orig/lib/init.scm festival/lib/init.scm +--- festival.orig/lib/init.scm 2004-07-15 19:03:04.000000000 -0400 ++++ festival/lib/init.scm 2007-03-15 11:58:09.000000000 -0400 +@@ -55,6 +55,10 @@ + (if (probe_file (path-append libdir "sitevars.scm")) + (load (path-append libdir "sitevars.scm"))) + ++(if (probe_file "/etc/festival/sitevars.scm") ++ (load "/etc/festival/sitevars.scm")) ++ ++ + ;;; CSTR siod extensions + (require 'cstr) + +@@ -98,7 +102,7 @@ + (t ;; can't find direct support so guess that /dev/audio for 8k ulaw exists + (Parameter.def 'Audio_Method 'sunaudio))) + ;;; If you have an external program to play audio add its definition +-;;; in siteinit.scm ++;;; in ~/.festivalrc or /etc/festival/siteinit.scm + + ;;; The audio spooler doesn't work under Windows so redefine audio_mode + (if (member 'mplayeraudio *modules*) +@@ -135,9 +139,13 @@ + ;;; + ;;; Local site initialization, if the file exists load it + ;;; ++ + (if (probe_file (path-append libdir "siteinit.scm")) + (load (path-append libdir "siteinit.scm"))) + ++(if (probe_file "/etc/festival/siteinit.scm") ++ (load "/etc/festival/siteinit.scm")) ++ + ;;; User initialization, if a user has a personal customization + ;;; file loaded it + (if (probe_file (path-append home-directory ".siodrc")) +diff -ur festival.orig/lib/voices.scm festival/lib/voices.scm +--- festival.orig/lib/voices.scm 2005-05-02 10:20:37.000000000 -0400 ++++ festival/lib/voices.scm 2007-03-15 12:00:19.000000000 -0400 +@@ -45,12 +45,12 @@ + (defvar system-voice-path '( ) + "system-voice-path + Additional directory not near the load path where voices can be +- found, this can be redefined in lib/sitevars.scm if desired.") ++ found, this can be redefined in /etc/festival/sitevars.scm if desired.") + + (defvar system-voice-path-multisyn '( ) + "system-voice-path-multisyn + Additional directory not near the load path where multisyn voices can be +- found, this can be redefined in lib/sitevars.scm if desired.") ++ found, this can be redefined in /etc/festival/sitevars.scm if desired.") + + (defvar voice-path + (remove-duplicates diff --git a/festival-1.96-gcc43.patch b/festival-1.96-gcc43.patch new file mode 100644 index 0000000..17f4c23 --- /dev/null +++ b/festival-1.96-gcc43.patch @@ -0,0 +1,36 @@ +diff -up festival/src/modules/Text/text_modes.cc.gcc43 festival/src/modules/Text/text_modes.cc +--- festival/src/modules/Text/text_modes.cc.gcc43 2008-02-22 21:50:33.000000000 -0500 ++++ festival/src/modules/Text/text_modes.cc 2008-02-22 21:50:41.000000000 -0500 +@@ -59,8 +59,8 @@ static void um_apply_filter(const EST_St + void tts_file_user_mode(LISP filename, LISP params) + { + +- volatile EST_String tmpname = make_tmp_filename(); +- volatile EST_String inname = get_c_string(filename); ++ EST_String tmpname = make_tmp_filename(); ++ EST_String inname = get_c_string(filename); + volatile EST_String filter; + volatile EST_TokenStream ts; + volatile LISP func; +diff -up speech_tools/base_class/EST_TSimpleVector.cc.gcc43 festival/speech_tools/base_class/EST_TSimpleVector.cc +--- speech_tools/base_class/EST_TSimpleVector.cc.gcc43 2006-07-06 08:57:18.000000000 -0400 ++++ speech_tools/base_class/EST_TSimpleVector.cc 2008-02-22 21:43:03.000000000 -0500 +@@ -43,6 +43,7 @@ + #include "EST_TSimpleVector.h" + #include "EST_matrix_support.h" + #include ++#include + #include "EST_cutils.h" + + template void EST_TSimpleVector::copy(const EST_TSimpleVector &a) +diff -up speech_tools/base_class/EST_TSimpleMatrix.cc.gcc43 festival/speech_tools/base_class/EST_TSimpleMatrix.cc +--- speech_tools/base_class/EST_TSimpleMatrix.cc.gcc43 2004-09-30 08:53:35.000000000 -0400 ++++ speech_tools/base_class/EST_TSimpleMatrix.cc 2008-02-22 21:43:03.000000000 -0500 +@@ -44,6 +44,7 @@ + #include "EST_TVector.h" + #include + #include ++#include + #include "EST_cutils.h" + + template diff --git a/festival-1.96-gcc44.patch b/festival-1.96-gcc44.patch new file mode 100644 index 0000000..e6f43e3 --- /dev/null +++ b/festival-1.96-gcc44.patch @@ -0,0 +1,22 @@ +diff -up festival/speech_tools/speech_class/EST_wave_io.cc.gcc44 festival/speech_tools/speech_class/EST_wave_io.cc +--- speech_tools/speech_class/EST_wave_io.cc.gcc44 2009-02-26 17:26:58.672421948 -0500 ++++ speech_tools/speech_class/EST_wave_io.cc 2009-02-26 17:50:02.065661124 -0500 +@@ -68,7 +68,7 @@ static const char *NIST_END_SIG = "end_h + + int nist_get_param_int(const char *hdr, const char *field, int def_val) + { +- char *p; ++ const char *p; + int val; + + if (((p=strstr(hdr,field)) != NULL) && +@@ -84,7 +84,8 @@ int nist_get_param_int(const char *hdr, + + char *nist_get_param_str(const char *hdr, const char *field, const char *def_val) + { +- char *p,*val; ++ const char *p; ++ char *val; + int size; + + if (((p=strstr(hdr,field)) != NULL) && diff --git a/festival-1.96-kludge-etcpath-into-libarch.patch b/festival-1.96-kludge-etcpath-into-libarch.patch new file mode 100644 index 0000000..3b87f54 --- /dev/null +++ b/festival-1.96-kludge-etcpath-into-libarch.patch @@ -0,0 +1,35 @@ +diff -ur festival.orig/speech_tools/main/siod_main.cc festival/speech_tools/main/siod_main.cc +--- speech_tools/main/siod_main.cc 2004-09-30 08:53:36.000000000 -0400 ++++ speech_tools/main/siod_main.cc 2007-03-13 00:49:35.000000000 -0400 +@@ -224,10 +224,10 @@ + cons(flocons(subminor),NIL)))); + + EST_Pathname etcdircommon = est_libdir; +- etcdircommon += "etc"; ++ etcdircommon += "etc/"; + +- EST_Pathname etcdir = etcdircommon; +- etcdir += est_ostype; ++ EST_Pathname etcdir = {{HORRIBLELIBARCHKLUDGE}}; ++ etcdir += "festival/etc/"; + + // Modify my PATH to include these directories + siod_set_lval("etc-path",cons(rintern(etcdir), +diff -ur festival.orig/src/arch/festival/festival.cc festival/src/arch/festival/festival.cc +--- festival.orig/src/arch/festival/festival.cc 2007-03-13 00:41:42.000000000 -0400 ++++ festival/src/arch/festival/festival.cc 2007-03-13 00:47:55.000000000 -0400 +@@ -349,10 +349,10 @@ + proclaim_module("mplayeraudio"); + + // Add etc-dir path and machine specific directory etc/$OSTYPE +- char *etcdir = walloc(char,strlen(festival_libdir)+strlen("etc/")+ +- strlen(FTOSTYPE)+3); +- sprintf(etcdir,"%s/etc/%s/",festival_libdir,FTOSTYPE); +- char *etcdircommon = walloc(char,strlen(festival_libdir)+strlen("etc/")+3); ++ char *etcdir = walloc(char,strlen({{HORRIBLELIBARCHKLUDGE}})+ ++ strlen("etc/festival/")+2); ++ sprintf(etcdir,"%s/festival/etc/",{{HORRIBLELIBARCHKLUDGE}}); ++ char *etcdircommon = walloc(char,strlen(festival_libdir)+strlen("etc/")+2); + sprintf(etcdircommon,"%s/etc/",festival_libdir); + + // Modify my PATH to include these directories diff --git a/festival-1.96-main-shared-build.patch b/festival-1.96-main-shared-build.patch new file mode 100644 index 0000000..092403d --- /dev/null +++ b/festival-1.96-main-shared-build.patch @@ -0,0 +1,37 @@ +--- speech_tools/config/rules/defaults.mak.orig 2007-03-16 12:39:12.000000000 -0400 ++++ speech_tools/config/rules/defaults.mak 2007-03-16 12:39:19.000000000 -0400 +@@ -69,15 +69,21 @@ + MADE_FROM_ABOVE:=$(N) + endif + ++ifneq ($(SHARED),0) ++ LIBTYPE=so ++else ++ LIBTYPE=a ++endif ++ + ifndef PROJECT_LIBDEPS +- PROJECT_LIBDEPS = $(foreach l,$(PROJECT_LIBRARIES),$(PROJECT_LIBRARY_DIR_$(l))/lib$(l).a) ++ PROJECT_LIBDEPS = $(foreach l,$(PROJECT_LIBRARIES),$(PROJECT_LIBRARY_DIR_$(l))/lib$(l).$(LIBTYPE)) + endif + ifndef PROJECT_LIBS + PROJECT_LIBS = $(foreach l,$(PROJECT_LIBRARIES),-L$(PROJECT_LIBRARY_DIR_$(l)) -l$(l)) + endif + + ifndef REQUIRED_LIBDEPS +- REQUIRED_LIBDEPS = $(foreach l,$(REQUIRED_LIBRARIES),$(REQUIRED_LIBRARY_DIR_$(l))/lib$(l).a) ++ REQUIRED_LIBDEPS = $(foreach l,$(REQUIRED_LIBRARIES),$(REQUIRED_LIBRARY_DIR_$(l))/lib$(l).$(LIBTYPE)) + endif + ifndef REQUIRED_LIBS + REQUIRED_LIBS = $(foreach l,$(REQUIRED_LIBRARIES),-L$(REQUIRED_LIBRARY_DIR_$(l)) -l$(l)) +--- festival/config/project.mak.orig 2007-03-16 13:01:40.000000000 -0400 ++++ festival/config/project.mak 2007-03-16 13:02:24.000000000 -0400 +@@ -84,6 +84,8 @@ + PROJECT_LIBRARY_DIR_Festival = $(TOP)/src/lib + PROJECT_DEFAULT_LIBRARY = Festival + ++PROJECT_LIBRARY_VERSION_Festival = $(PROJECT_VERSION).0 ++ + # Libraries used from other projects + + REQUIRED_LIBRARIES = estools estbase eststring diff --git a/festival-1.96-no-shared-data.patch b/festival-1.96-no-shared-data.patch new file mode 100644 index 0000000..b23bee9 --- /dev/null +++ b/festival-1.96-no-shared-data.patch @@ -0,0 +1,20 @@ +diff -up festival/speech_tools/config/compilers/gcc_defaults.mak.no-shared-data festival/speech_tools/config/compilers/gcc_defaults.mak +--- speech_tools/config/compilers/gcc_defaults.mak.no-shared-data 2008-02-22 13:45:50.000000000 -0500 ++++ speech_tools/config/compilers/gcc_defaults.mak 2008-02-22 13:46:24.000000000 -0500 +@@ -73,12 +73,12 @@ PROFILE_gprof_CCFLAGS = -pg + PROFILE_gprof_CXXFLAGS = -pg + PROFILE_gprof_LINKFLAGS = -pg + +-SHARED_CCFLAGS = -fPIC -fno-shared-data +-SHARED_CXXFLAGS = -fPIC -fno-shared-data +-SHARED_LINKFLAGS = -fno-shared-data ++SHARED_CCFLAGS = -fPIC ++SHARED_CXXFLAGS = -fPIC ++SHARED_LINKFLAGS = + + ifndef GCC_MAKE_SHARED_LIB +- MAKE_SHARED_LIB = $(CXX) -shared -fno-shared-data -o XXX -Wl,-soname,YYY ++ MAKE_SHARED_LIB = $(CXX) -shared -o XXX -Wl,-soname,YYY + else + MAKE_SHARED_LIB = $(GCC_MAKE_SHARED_LIB) + endif diff --git a/festival-1.96-speechtools-1.2.96-beta+awb.patch b/festival-1.96-speechtools-1.2.96-beta+awb.patch new file mode 100644 index 0000000..46e5ec4 --- /dev/null +++ b/festival-1.96-speechtools-1.2.96-beta+awb.patch @@ -0,0 +1,1227 @@ +diff -ur festival/speech_tools.old/grammar/ngram/EST_Ngrammar.cc festival/speech_tools/grammar/ngram/EST_Ngrammar.cc +--- speech_tools.old/grammar/ngram/EST_Ngrammar.cc 2004-09-30 08:53:36.000000000 -0400 ++++ speech_tools/grammar/ngram/EST_Ngrammar.cc 2006-12-11 17:36:10.000000000 -0500 +@@ -306,7 +306,7 @@ + // not right - just print out, then recurse through children + // change to use 'backoff_traverse' + +- int k; ++ EST_Litem *k; + double freq; + EST_String name; + for (k=p_pdf.item_start(); +@@ -373,7 +373,7 @@ + { + + // recursively delete this state and all its children +- int k; ++ EST_Litem *k; + double freq; + EST_String name; + for (k=p_pdf.item_start(); +@@ -456,7 +456,8 @@ + + void EST_BackoffNgrammarState::frequency_of_frequencies(EST_DVector &ff) + { +- int k,max=ff.n(); ++ int max=ff.n(); ++ EST_Litem *k; + double freq; + EST_String name; + for (k=p_pdf.item_start(); +@@ -1585,7 +1586,7 @@ + // remove any branches with zero frequency count + + // find children of this state with zero freq and zap them +- int k; ++ EST_Litem *k; + double freq; + EST_String name; + for (k=start_state->pdf_const().item_start(); +@@ -2324,7 +2325,8 @@ + backoff_representation->print_freqs(os,p_order); + else + { +- int i,j,k; ++ int i,j; ++ EST_Litem *k; + EST_IVector window(p_order-1); + + for (i=0; i < p_num_states; i++) +@@ -2665,7 +2667,7 @@ + function(start_state,params); + + // and recurse down the tree +- int k; ++ EST_Litem *k; + double freq; + EST_String name; + for (k=start_state->pdf_const().item_start(); +@@ -2696,7 +2698,7 @@ + { + // and recurse down the tree if we haven't + // reached the level yet +- int k; ++ EST_Litem *k; + double freq; + EST_String name; + +diff -ur festival/speech_tools.old/grammar/ngram/EST_PST.cc festival/speech_tools/grammar/ngram/EST_PST.cc +--- speech_tools.old/grammar/ngram/EST_PST.cc 2004-09-30 08:53:36.000000000 -0400 ++++ speech_tools/grammar/ngram/EST_PST.cc 2006-12-11 17:36:10.000000000 -0500 +@@ -71,7 +71,8 @@ + // Base -- print from pd + EST_String s; + double freq; +- for (int i = pd.item_start(); ++ EST_Litem *i; ++ for (i = pd.item_start(); + !pd.item_end(i); + i=pd.item_next(i)) + { +@@ -98,7 +99,7 @@ + EST_String s; + double prob; + os << get_path() << " :"; +- for (int i = pd.item_start(); !pd.item_end(i) ; i=pd.item_next(i)) ++ for (EST_Litem *i = pd.item_start(); !pd.item_end(i) ; i=pd.item_next(i)) + { + pd.item_prob(i,s,prob); + os << " " << s << " " << prob; +diff -ur festival/speech_tools.old/grammar/ngram/freqsmooth.cc festival/speech_tools/grammar/ngram/freqsmooth.cc +--- speech_tools.old/grammar/ngram/freqsmooth.cc 2004-09-30 08:53:36.000000000 -0400 ++++ speech_tools/grammar/ngram/freqsmooth.cc 2006-12-11 17:36:10.000000000 -0500 +@@ -74,7 +74,8 @@ + EST_Ngrammar &ngram) + { + // Build all the backoff grammars back to uni-grams +- int i,j,k,l; ++ int i,j,l; ++ EST_Litem *k; + + for (i=0; i < ngram.order()-1; i++) + backoff_ngrams[i].init(i+1,EST_Ngrammar::dense, +@@ -110,7 +111,8 @@ + { + // For all ngrams which are too infrequent, adjust their + // frequencies based on their backoff probabilities +- int i,j; ++ int i; ++ EST_Litem *j; + double occurs; + double backoff_prob; + +diff -ur festival/speech_tools.old/grammar/ngram/ngrammar_aux.cc festival/speech_tools/grammar/ngram/ngrammar_aux.cc +--- speech_tools.old/grammar/ngram/ngrammar_aux.cc 2004-09-30 08:53:36.000000000 -0400 ++++ speech_tools/grammar/ngram/ngrammar_aux.cc 2006-12-11 17:36:10.000000000 -0500 +@@ -117,7 +117,7 @@ + + void make_f_of_f(EST_BackoffNgrammarState *s,void *params) + { +- int k; ++ EST_Litem *k; + double freq; + EST_String name; + +@@ -138,7 +138,7 @@ + + void get_max_f(EST_BackoffNgrammarState *s,void *params) + { +- int k; ++ EST_Litem *k; + double freq; + EST_String name; + +@@ -158,7 +158,7 @@ + + void map_f_of_f(EST_BackoffNgrammarState *s,void *params) + { +- int k; ++ EST_Litem *k; + double freq; + EST_String name; + +@@ -184,7 +184,7 @@ + + void zero_small_f(EST_BackoffNgrammarState *s,void *params) + { +- int k; ++ EST_Litem *k; + double freq; + EST_String name; + +@@ -204,7 +204,8 @@ + + void frequency_of_frequencies(EST_DVector &ff, EST_Ngrammar &n,int this_order) + { +- int i,k,size; ++ int i,size; ++ EST_Litem *k; + double max=0.0; + + // if ff has zero size, do complete frequency of frequencies +@@ -302,8 +303,8 @@ + + void map_frequencies(EST_Ngrammar &n, const EST_DVector &map, const int this_order) + { +- int i,k; +- ++ int i; ++ EST_Litem *k; + + switch(n.representation()) + { +diff -ur festival/speech_tools.old/grammar/ngram/ngrammar_io.cc festival/speech_tools/grammar/ngram/ngrammar_io.cc +--- speech_tools.old/grammar/ngram/ngrammar_io.cc 2004-09-30 08:53:36.000000000 -0400 ++++ speech_tools/grammar/ngram/ngrammar_io.cc 2006-12-11 17:36:10.000000000 -0500 +@@ -281,7 +281,8 @@ + load_ngram_cstr_bin(const EST_String filename, EST_Ngrammar &n) + { + EST_TokenStream ts; +- int i,j,k,order; ++ int i,j,order; ++ EST_Litem *k; + int num_entries; + double approx_num_samples = 0.0; + long freq_data_start, freq_data_end; +@@ -407,7 +408,7 @@ + save_ngram_htk_ascii_sub(const EST_String &word, ostream *ost, + EST_Ngrammar &n, double floor) + { +- int k; ++ EST_Litem *k; + EST_String name; + double freq; + EST_StrVector this_ngram(2); // assumes bigram +@@ -734,7 +735,8 @@ + // awb's format + (void)trace; + ostream *ost; +- int i,k; ++ int i; ++ EST_Litem *k; + + if (filename == "-") + ost = &cout; +@@ -831,7 +833,8 @@ + if (n.representation() == EST_Ngrammar::sparse) + return misc_write_error; + +- int i,k; ++ int i; ++ EST_Litem *k; + FILE *ofd; + double lfreq = -1; + double count = -1; +diff -ur festival/speech_tools.old/grammar/wfst/wfst_train.cc festival/speech_tools/grammar/wfst/wfst_train.cc +--- speech_tools.old/grammar/wfst/wfst_train.cc 2005-07-26 18:37:36.000000000 -0400 ++++ speech_tools/grammar/wfst/wfst_train.cc 2006-12-11 17:36:10.000000000 -0500 +@@ -315,7 +315,8 @@ + LISP *ssplits; + gc_protect(&splits); + EST_String sname; +- int b,best_b,i; ++ int b,best_b; ++ EST_Litem *i; + int num_pdfs; + double best_score, score, sfreq; + +@@ -390,7 +391,7 @@ + // Find score of (a+b) vs (all-(a+b)) + EST_DiscreteProbDistribution ab(a); + EST_DiscreteProbDistribution all_but_ab(all); +- int i; ++ EST_Litem *i; + EST_String sname; + double sfreq, score; + for (i=b.item_start(); !b.item_end(i); +@@ -522,7 +523,7 @@ + EST_DiscreteProbDistribution pdf_split(&wfst.in_symbols()); + EST_DiscreteProbDistribution pdf_remain(&wfst.in_symbols()); + int in, tostate, id; +- int i; ++ EST_Litem *i; + double sfreq; + EST_String sname; + +diff -ur festival/speech_tools.old/include/EST_simplestats.h festival/speech_tools/include/EST_simplestats.h +--- speech_tools.old/include/EST_simplestats.h 2004-04-30 12:56:49.000000000 -0400 ++++ speech_tools/include/EST_simplestats.h 2006-12-11 17:36:10.000000000 -0500 +@@ -47,6 +47,8 @@ + #include "EST_TKVL.h" + #include "EST_types.h" + ++typedef size_t int_iter; ++ + /** A class for managing mapping string names to integers and back again, + mainly used for representing alphabets in n-grams and grammars etc. + +@@ -249,7 +251,8 @@ + /// Add this observation, may specify number of occurrences + void cumulate(const EST_String &s,double count=1); + /// Add this observation, i must be with in EST\_Discrete range +- void cumulate(const int i,double count=1); ++ void cumulate(EST_Litem *i,double count=1); ++ void cumulate(int i,double count=1); + /// Return the most probable member of the distribution + const EST_String &most_probable(double *prob = NULL) const; + /** Return the entropy of the distribution +@@ -265,17 +268,18 @@ + /// + double frequency(const int i) const; + /// Used for iterating through members of the distribution +- int item_start() const; ++ EST_Litem *item_start() const; + /// Used for iterating through members of the distribution +- int item_next(int idx) const; ++ EST_Litem *item_next(EST_Litem *idx) const; + /// Used for iterating through members of the distribution +- int item_end(int idx) const; ++ int item_end(EST_Litem *idx) const; ++ + /// During iteration returns name given index +- const EST_String &item_name(int idx) const; ++ const EST_String &item_name(EST_Litem *idx) const; + /// During iteration returns name and frequency given index +- void item_freq(int idx,EST_String &s,double &freq) const; ++ void item_freq(EST_Litem *idx,EST_String &s,double &freq) const; + /// During iteration returns name and probability given index +- void item_prob(int idx,EST_String &s,double &prob) const; ++ void item_prob(EST_Litem *idx,EST_String &s,double &prob) const; + + /// Returns discrete vocabulary of distribution + inline const EST_Discrete *const get_discrete() const { return discrete; }; +@@ -288,11 +292,13 @@ + accordingly. This is used when smoothing frequencies. + */ + void set_frequency(int i,double c); ++ void set_frequency(EST_Litem *i,double c); + + /// Sets the frequency of named item, without modifying {\tt num\_samples}. + void override_frequency(const EST_String &s,double c); + /// Sets the frequency of named item, without modifying {\tt num\_samples}. + void override_frequency(int i,double c); ++ void override_frequency(EST_Litem *i,double c); + + /** Sets the number of samples. Care should be taken on setting this + as it will affect how probabilities are calculated. +diff -ur festival/speech_tools.old/include/EST_Track.h festival/speech_tools/include/EST_Track.h +--- speech_tools.old/include/EST_Track.h 2004-05-29 14:34:40.000000000 -0400 ++++ speech_tools/include/EST_Track.h 2007-02-13 00:12:53.000000000 -0500 +@@ -61,6 +61,7 @@ + tff_htk, + tff_htk_fbank, + tff_htk_mfcc, ++ tff_htk_mfcc_e, + tff_htk_user, + tff_htk_discrete, + tff_xmg, +diff -ur festival/speech_tools.old/include/EST_TSimpleVector.h festival/speech_tools/include/EST_TSimpleVector.h +--- speech_tools.old/include/EST_TSimpleVector.h 2006-07-06 08:57:24.000000000 -0400 ++++ speech_tools/include/EST_TSimpleVector.h 2006-09-27 09:19:35.000000000 -0400 +@@ -60,6 +60,9 @@ + EST_TSimpleVector(const EST_TSimpleVector &v); + /// "size" constructor + EST_TSimpleVector(int n): EST_TVector(n) {}; ++ /// memory constructor ++ EST_TSimpleVector(int n, T* memory, int offset=0, ++ int free_when_destroyed=0): EST_TVector(n,memory) {}; + + /// resize vector + void resize(int n, int set=1); +diff -ur festival/speech_tools.old/include/EST_Wagon.h festival/speech_tools/include/EST_Wagon.h +--- speech_tools.old/include/EST_Wagon.h 2006-08-11 18:39:02.000000000 -0400 ++++ speech_tools/include/EST_Wagon.h 2006-12-02 11:44:48.000000000 -0500 +@@ -239,8 +239,7 @@ + extern EST_FMatrix wgn_DistMatrix; + extern EST_Track wgn_VertexTrack; + extern EST_Track wgn_UnitTrack; +-extern int wgn_VertexTrack_start; +-extern int wgn_VertexTrack_end; ++extern EST_Track wgn_VertexFeats; + + void wgn_load_datadescription(EST_String fname,LISP ignores); + void wgn_load_dataset(WDataSet &ds,EST_String fname); +diff -ur festival/speech_tools.old/lib/siod/siod.scm festival/speech_tools/lib/siod/siod.scm +--- speech_tools.old/lib/siod/siod.scm 2003-03-31 09:28:24.000000000 -0500 ++++ speech_tools/lib/siod/siod.scm 2006-12-11 17:36:10.000000000 -0500 +@@ -209,7 +209,13 @@ + (defun append2 (a b) + (if (null a) + b +- (cons (car a) (append2 (cdr a) b)))) ++ (begin ++ (let ((x (reverse a)) ++ (y b)) ++ (while x ++ (set! y (cons (car x) y)) ++ (set! x (cdr x))) ++ y)))) + + (defun rplacd (a b) + "(replacd A B) +diff -ur festival/speech_tools.old/main/wagon_main.cc festival/speech_tools/main/wagon_main.cc +--- speech_tools.old/main/wagon_main.cc 2006-09-10 17:33:18.000000000 -0400 ++++ speech_tools/main/wagon_main.cc 2006-12-02 14:46:44.000000000 -0500 +@@ -2,7 +2,7 @@ + /* */ + /* Centre for Speech Technology Research */ + /* University of Edinburgh, UK */ +-/* Copyright (c) 1996-2005 */ ++/* Copyright (c) 1996-2006 */ + /* All Rights Reserved. */ + /* */ + /* Permission is hereby granted, free of charge, to use and distribute */ +@@ -39,6 +39,8 @@ + /* */ + /* Added decision list support, Feb 1997 */ + /* */ ++/* Added vector support for Clustergen 2005/2006 */ ++/* */ + /*=======================================================================*/ + #include + #include +@@ -111,6 +113,54 @@ + return 0; + } + ++static int set_Vertex_Feats(EST_Track &wgn_VertexFeats, ++ EST_String &wagon_track_features) ++{ ++ int i,s=0,e; ++ EST_TokenStream ts; ++ ++ for (i=0; i\n"+ + " end (inclusive) channel for vertex indices\n"+ ++ "-track_feats \n"+ ++ " Track features to use, comma separated list\n"+ ++ " with feature numbers and/or ranges, 0 start\n"+ + "-unittrack \n"+ + " track for unit start and length in vertex track\n"+ + "-quiet No questions printed during building\n"+ +@@ -256,36 +311,53 @@ + else if (al.present("-track")) + { + wgn_VertexTrack.load(al.val("-track")); +- wgn_VertexTrack_start = 0; +- wgn_VertexTrack_end = wgn_VertexTrack.num_channels()-1; ++ wgn_VertexFeats.resize(1,wgn_VertexTrack.num_channels()); ++ for (i=0; i wgn_VertexTrack.num_channels())) ++ feats_start = al.ival("-track_start"); ++ if ((feats_start < 0) || ++ (feats_start > wgn_VertexTrack.num_channels())) + { + printf("wagon: track_start invalid: %d out of %d channels\n", +- wgn_VertexTrack_start, ++ feats_start, + wgn_VertexTrack.num_channels()); + exit(-1); + } ++ for (i=0; i wgn_VertexTrack.num_channels())) ++ feats_end = al.ival("-track_end"); ++ if ((feats_end < feats_start) || ++ (feats_end > wgn_VertexTrack.num_channels())) + { + printf("wagon: track_end invalid: %d between start %d out of %d channels\n", +- wgn_VertexTrack_end, +- wgn_VertexTrack_start, ++ feats_end, ++ feats_start, + wgn_VertexTrack.num_channels()); + exit(-1); + } ++ for (i=feats_end+1; i 0.0) ++ // printf("%d ",i); ++ // printf("\n"); + + if (al.present("-unittrack")) + { /* contains two features, a start and length. start indexes */ +diff -ur festival/speech_tools.old/siod/slib_str.cc festival/speech_tools/siod/slib_str.cc +--- speech_tools.old/siod/slib_str.cc 2004-09-30 08:53:36.000000000 -0400 ++++ speech_tools/siod/slib_str.cc 2006-09-27 11:54:29.000000000 -0400 +@@ -268,7 +268,7 @@ + LISP l_matches(LISP atom, LISP regex) + { + // t if printname of atom matches regex, nil otherwise +- EST_String pname = get_c_string(atom); ++ const EST_String pname = get_c_string(atom); + + if (pname.matches(make_regex(get_c_string(regex))) == TRUE) + return truth; +diff -ur festival/speech_tools.old/speech_class/EST_TrackFile.cc festival/speech_tools/speech_class/EST_TrackFile.cc +--- speech_tools.old/speech_class/EST_TrackFile.cc 2006-09-10 16:32:14.000000000 -0400 ++++ speech_tools/speech_class/EST_TrackFile.cc 2007-02-13 00:12:53.000000000 -0500 +@@ -522,7 +522,6 @@ + // } + + if( ascii ){ +- + for (j = 0; j < num_channels; ++j){ + tr.a(i, j) = ts.get().Float(ok); + if (!ok) +@@ -1254,6 +1253,11 @@ + return save_htk_as(filename, tmp, HTK_MFCC); + } + ++EST_write_status EST_TrackFile::save_htk_mfcc_e(const EST_String filename, EST_Track tmp) ++{ ++ return save_htk_as(filename, tmp, HTK_MFCC | HTK_ENERGY); ++} ++ + EST_write_status EST_TrackFile::save_htk_user(const EST_String filename, EST_Track tmp) + { + return save_htk_as(filename, tmp, HTK_USER); +@@ -2097,14 +2101,14 @@ + + EST_String EST_TrackFile::options_supported(void) + { +- EST_String s("Available track file formats:\n"); ++ EST_String s("AvailablE track file formats:\n"); + + for(int n=0; n< EST_TrackFile::map.n() ; n++) + { + const char *nm = EST_TrackFile::map.name(EST_TrackFile::map.token(n)); + const char *d = EST_TrackFile::map.info(EST_TrackFile::map.token(n)).description; + +- s += EST_String::cat(" ", nm, EST_String(" ")*(12-strlen(nm)), d, "\n"); ++ s += EST_String::cat(" ", nm, EST_String(" ")*(13-strlen(nm)), d, "\n"); + } + return s; + } +@@ -2137,6 +2141,9 @@ + {tff_htk_mfcc, { "htk_mfcc" }, + {FALSE, EST_TrackFile::load_htk, EST_TrackFile::save_htk_mfcc, + "htk file (as MFCC)"}}, ++{tff_htk_mfcc_e, { "htk_mfcc_e" }, ++{FALSE, EST_TrackFile::load_htk, EST_TrackFile::save_htk_mfcc_e, ++ "htk file (as MFCC_E)"}}, + {tff_htk_user, { "htk_user" }, + {FALSE, EST_TrackFile::load_htk, EST_TrackFile::save_htk_user, + "htk file (as USER)"}}, +diff -ur festival/speech_tools.old/speech_class/EST_TrackFile.h festival/speech_tools/speech_class/EST_TrackFile.h +--- speech_tools.old/speech_class/EST_TrackFile.h 2004-05-29 14:34:42.000000000 -0400 ++++ speech_tools/speech_class/EST_TrackFile.h 2007-02-13 00:12:53.000000000 -0500 +@@ -111,6 +111,8 @@ + static EST_write_status save_htk_fbank(SaveTrackFileArgs); + static EST_read_status load_htk_fbank(LoadTrackFileArgs); + ++ static EST_write_status save_htk_mfcc_e(SaveTrackFileArgs); ++ + static EST_write_status save_htk_mfcc(SaveTrackFileArgs); + static EST_read_status load_htk_mfcc(LoadTrackFileArgs); + +diff -ur festival/speech_tools.old/speech_class/EST_wave_io.cc festival/speech_tools/speech_class/EST_wave_io.cc +--- speech_tools.old/speech_class/EST_wave_io.cc 2006-01-12 10:37:51.000000000 -0500 ++++ speech_tools/speech_class/EST_wave_io.cc 2007-02-13 00:12:53.000000000 -0500 +@@ -173,7 +173,7 @@ + + current_pos = ts.tell(); + if (ts.fread(header,NIST_HDR_SIZE,1) != 1) +- return misc_read_error; ++ return wrong_format; + + if (strncmp(header,NIST_SIG,sizeof(NIST_SIG)) != 0) + return wrong_format; +diff -ur festival/speech_tools.old/stats/EST_DProbDist.cc festival/speech_tools/stats/EST_DProbDist.cc +--- speech_tools.old/stats/EST_DProbDist.cc 2004-09-30 08:53:36.000000000 -0400 ++++ speech_tools/stats/EST_DProbDist.cc 2006-12-11 17:36:12.000000000 -0500 +@@ -46,6 +46,39 @@ + #include "EST_TKVL.h" + #include "EST_simplestats.h" + ++/* We share ints and pointers for two types of probability distributions */ ++/* The know discrete sets can be indexed by ints which is *much* faster */ ++/* the indices pass around a pointers but the lower part contain ints in */ ++/* the discrete case */ ++/* On 64bit architectures this is a issue so we need have some macros */ ++/* to help us here. */ ++ ++const int est_64to32(void *c) ++{ /* this returns the bottom end of the pointer as an unsigned int */ ++ /* I believe this is a safe way to do it, we check the bits in the */ ++ /* 64 bit int and multiply them out in the 32 bit one */ ++ /* there might be better ways, but I think you'd need to think about */ ++ /* byte order then */ ++ long long l; ++ int d; ++ int i,x; ++ ++ l = (long long)c; ++ ++ for (i=0,d=0,x=1; i<24; i++) ++ { ++ if (l & 1) ++ d += x; ++ l = l >> 1; ++ x += x; ++ } ++ ++ return d; ++} ++/* #define tprob_int(X) ((sizeof(void *) != 8) ? est_64to32(X) : (int)X) */ ++#define tprob_int(X) (est_64to32(X)) ++ ++ + EST_DiscreteProbDistribution::EST_DiscreteProbDistribution(const EST_Discrete *d, + const double n_samples, const EST_DVector &counts) + { +@@ -109,7 +142,13 @@ + icounts.a_no_check(i) = 0; + } + +-void EST_DiscreteProbDistribution::cumulate(const int i,double count) ++void EST_DiscreteProbDistribution::cumulate(EST_Litem *i,double count) ++{ ++ icounts[tprob_int(i)] += count; ++ num_samples += count; ++} ++ ++void EST_DiscreteProbDistribution::cumulate(int i,double count) + { + icounts[i] += count; + num_samples += count; +@@ -257,6 +296,21 @@ + + } + ++void EST_DiscreteProbDistribution::set_frequency(EST_Litem *i,double c) ++{ ++ if (type == tprob_discrete) ++ { ++ num_samples -= icounts[tprob_int(i)]; ++ num_samples += c; ++ icounts[tprob_int(i)] = c; ++ } ++ else ++ { ++ cerr << "ProbDistribution: can't access string type pd with int\n"; ++ } ++ ++} ++ + + void EST_DiscreteProbDistribution::override_frequency(const EST_String &s,double c) + { +@@ -274,6 +328,14 @@ + cerr << "ProbDistribution: can't access string type pd with int\n"; + } + ++void EST_DiscreteProbDistribution::override_frequency(EST_Litem *i,double c) ++{ ++ if (type == tprob_discrete) ++ icounts[tprob_int(i)] = c; ++ else ++ cerr << "ProbDistribution: can't access string type pd with int\n"; ++} ++ + double EST_DiscreteProbDistribution::entropy() const + { + // Returns the entropy of the current distribution +@@ -305,70 +367,70 @@ + } + + // For iterating through members of a probability distribution +-int EST_DiscreteProbDistribution::item_start(void) const ++EST_Litem *EST_DiscreteProbDistribution::item_start(void) const + { + if (type == tprob_discrete) +- return 0; ++ return NULL; + else +- return (int)scounts.list.head(); ++ return scounts.list.head(); + } + +-int EST_DiscreteProbDistribution::item_end(int idx) const ++int EST_DiscreteProbDistribution::item_end(EST_Litem *idx) const + { + if (type == tprob_discrete) +- return (idx >= icounts.length()); ++ return (tprob_int(idx) >= icounts.length()); + else +- return ((EST_Litem *)idx == 0); ++ return (idx == 0); + } + +-int EST_DiscreteProbDistribution::item_next(int idx) const ++EST_Litem *EST_DiscreteProbDistribution::item_next(EST_Litem *idx) const + { + if (type == tprob_discrete) +- return ++idx; ++ return (EST_Litem *)(((unsigned char *)idx)+1); + else +- return (int)next((EST_Litem *)idx); ++ return next(idx); + } + +-const EST_String &EST_DiscreteProbDistribution::item_name(int idx) const ++const EST_String &EST_DiscreteProbDistribution::item_name(EST_Litem *idx) const + { + if (type == tprob_discrete) +- return discrete->name(idx); ++ return discrete->name(tprob_int(idx)); + else +- return scounts.list((EST_Litem *)idx).k; ++ return scounts.list(idx).k; + } + +-void EST_DiscreteProbDistribution::item_freq(int idx,EST_String &s,double &freq) const ++void EST_DiscreteProbDistribution::item_freq(EST_Litem *idx,EST_String &s,double &freq) const + { + if (type == tprob_discrete) + { +- s = discrete->name(idx); +- freq = icounts(idx); ++ s = discrete->name(tprob_int(idx)); ++ freq = icounts(tprob_int(idx)); + } + else + { +- s = scounts.list((EST_Litem *)idx).k; +- freq = scounts.list((EST_Litem *)idx).v; ++ s = scounts.list(idx).k; ++ freq = scounts.list(idx).v; + } + } + +-void EST_DiscreteProbDistribution::item_prob(int idx,EST_String &s,double &prob) const ++void EST_DiscreteProbDistribution::item_prob(EST_Litem *idx,EST_String &s,double &prob) const + { + if (type == tprob_discrete) + { +- prob = probability(idx); +- s = discrete->name(idx); ++ prob = probability(tprob_int(idx)); ++ s = discrete->name(tprob_int(idx)); + } + else + { +- s = scounts.list((EST_Litem *)idx).k; +- prob = (double)scounts.list((EST_Litem *)idx).v/num_samples; ++ s = scounts.list(idx).k; ++ prob = (double)scounts.list(idx).v/num_samples; + } + } + + ostream & operator<<(ostream &s, const EST_DiscreteProbDistribution &pd) + { + // Output best with probabilities +- int i; ++ EST_Litem *i; + double prob; + double sum=0; + EST_String name; +diff -ur festival/speech_tools.old/stats/EST_viterbi.cc festival/speech_tools/stats/EST_viterbi.cc +--- speech_tools.old/stats/EST_viterbi.cc 2006-07-07 17:26:11.000000000 -0400 ++++ speech_tools/stats/EST_viterbi.cc 2006-09-27 09:19:35.000000000 -0400 +@@ -165,7 +165,7 @@ + return (a < b); + } + +-static void init_dynamic_states(EST_VTPoint *p, EST_VTCandidate *cands) ++static int init_dynamic_states(EST_VTPoint *p, EST_VTCandidate *cands) + { + // In a special (hmm maybe not so special), the number of "states" + // is the number of candidates +@@ -175,6 +175,8 @@ + for (i=0, c=cands; c != 0; c=c->next,i++) + c->pos = i; + init_paths_array(p,i); ++ ++ return i; + } + + void EST_Viterbi_Decoder::set_pruning_parameters(float beam, float +diff -ur festival/speech_tools.old/stats/wagon/wagon_aux.cc festival/speech_tools/stats/wagon/wagon_aux.cc +--- speech_tools.old/stats/wagon/wagon_aux.cc 2006-08-20 13:02:39.000000000 -0400 ++++ speech_tools/stats/wagon/wagon_aux.cc 2006-12-12 10:45:19.000000000 -0500 +@@ -422,16 +422,19 @@ + + #if 1 + /* simple distance */ +- for (j=wgn_VertexTrack_start; j<=wgn_VertexTrack_end; j++) ++ for (j=0; j 0.0) + { +- i = members.item(pp); +- b += wgn_VertexTrack.a(i,j); ++ b.reset(); ++ for (pp=members.head(); pp != 0; pp=next(pp)) ++ { ++ i = members.item(pp); ++ b += wgn_VertexTrack.a(i,j); ++ } ++ a += b.stddev(); ++ count = b.samples(); + } +- a += b.stddev(); +- count = b.samples(); + } + #endif + +@@ -440,26 +443,37 @@ + /* worse in listening experiments */ + EST_SuffStats **cs; + int mmm; +- cs = new EST_SuffStats *[wgn_VertexTrack_end+1]; +- for (j=0; j<=wgn_VertexTrack_end; j++) +- cs[j] = new EST_SuffStats[wgn_VertexTrack_end+1]; ++ cs = new EST_SuffStats *[wgn_VertexTrack.num_channels()+1]; ++ for (j=0; j<=wgn_VertexTrack.num_channels(); j++) ++ cs[j] = new EST_SuffStats[wgn_VertexTrack.num_channels()+1]; + /* Find means for diagonal */ +- for (j=wgn_VertexTrack_start; j<=wgn_VertexTrack_end; j++) ++ for (j=0; j 0.0) ++ { + for (pp=members.head(); pp != 0; pp=next(pp)) ++ cs[j][j] += wgn_VertexTrack.a(members.item(pp),j); ++ } ++ } ++ for (j=0; j 0.0) + { +- mmm = members.item(pp); +- cs[i][j] += (wgn_VertexTrack.a(mmm,i)-cs[j][j].mean())* +- (wgn_VertexTrack.a(mmm,j)-cs[j][j].mean()); +- } +- for (j=wgn_VertexTrack_start; j<=wgn_VertexTrack_end; j++) +- for (i=j+1; i 0.0) ++ a += cs[i][j].stddev(); ++ } + count = cs[0][0].samples(); + #endif + +@@ -476,11 +490,12 @@ + for (qq=next(pp); qq != 0; qq=next(qq)) + { + y = members.item(qq); +- for (q=0.0,j=wgn_VertexTrack_start; j<=wgn_VertexTrack_end; j++) +- { +- d = wgn_VertexTrack(x,j)-wgn_VertexTrack(y,j); +- q += d*d; +- } ++ for (q=0.0,j=0; j 0.0) ++ { ++ d = wgn_VertexTrack(x,j)-wgn_VertexTrack(y,j); ++ q += d*d; ++ } + a += sqrt(q); + } + +@@ -562,7 +577,7 @@ + + /* a list of SuffStats on for each point in the trajectory */ + trajectory = new EST_SuffStats *[l]; +- width = wgn_VertexTrack_end+1; ++ width = wgn_VertexTrack.num_channels()+1; + for (j=0; j 0.0) ++ trajectory[ti][j] += wgn_VertexTrack.a(s+ni,j); ++ } + } + } + + /* find sum of sum of stddev for all coefs of all traj points */ + stdss.reset(); + for (ti=0; ti 0.0) ++ stdss += trajectory[ti][j].stddev(); ++ } + + // This is sum of all stddev * samples + score = stdss.mean() * members.length(); +@@ -597,7 +618,7 @@ + /* a list of SuffStats on for each point in the trajectory */ + trajectory = new EST_SuffStats *[l]; + for (j=0; j 0 && ti 0.0) ++ trajectory[ti][j] += wgn_VertexTrack.a(ni,j); + } + ti = l1; /* do it explicitly in case s1l < 1 */ +- for (j=wgn_VertexTrack_start; j<=wgn_VertexTrack_end; j++) +- trajectory[ti][j] += -1; ++ for (j=0; j 0.0) ++ trajectory[ti][j] += -1; + /* Second half */ + s += s1l+1; + for (ti++,n=0.0; s2l > 0 && ti 0.0) ++ trajectory[ti][j] += wgn_VertexTrack.a(ni,j); ++ } ++ for (j=0; j 0.0) ++ trajectory[ti][j] += -2; + } + + /* find sum of sum of stddev for all coefs of all traj points */ +@@ -640,12 +665,14 @@ + stdss.reset(); + m = 1.0/(float)l1; + for (w=0.0,ti=0; ti 0.0) + stdss += trajectory[ti][j].stddev() * w; + m = 1.0/(float)l2; + for (w=1.0,ti++; ti 0.0) ++ stdss += trajectory[ti][j].stddev() * w; + + // This is sum of all stddev * samples + score = stdss.mean() * members.length(); +@@ -824,25 +851,27 @@ + int bestp = 0; + EST_SuffStats *cs; + +- cs = new EST_SuffStats [wgn_VertexTrack_end+1]; ++ cs = new EST_SuffStats [wgn_VertexTrack.num_channels()+1]; + +- for (j=wgn_VertexTrack_start; j<=wgn_VertexTrack_end; j++) +- { +- cs[j].reset(); +- for (p=imp.members.head(); p != 0; p=next(p)) ++ for (j=0; j 0.0) + { +- cs[j] += wgn_VertexTrack.a(imp.members.item(p),j); ++ cs[j].reset(); ++ for (p=imp.members.head(); p != 0; p=next(p)) ++ { ++ cs[j] += wgn_VertexTrack.a(imp.members.item(p),j); ++ } + } +- } + + for (p=imp.members.head(); p != 0; p=next(p)) + { +- for (x=0,j=wgn_VertexTrack_start; j<=wgn_VertexTrack_end; j++) +- { +- d = (wgn_VertexTrack.a(imp.members.item(p),j)-cs[j].mean()) +- /* / b.stddev() */ ; +- x += d*d; +- } ++ for (x=0.0,j=0; j 0.0) ++ { ++ d = (wgn_VertexTrack.a(imp.members.item(p),j)-cs[j].mean()) ++ /* / cs[j].stddev() */ ; ++ x += d*d; ++ } + if (x < best) + { + bestp = imp.members.item(p); +@@ -853,7 +882,12 @@ + { + s << "( "; + s << wgn_VertexTrack.a(bestp,j); +- s << " 0 "; // fake stddev ++ // s << " 0 "; // fake stddev ++ s << " "; ++ if (finite(cs[j].stddev())) ++ s << cs[j].stddev(); ++ else ++ s << "0"; + s << " ) "; + if (j+1get_int_val(wgn_predictee); +- for (j=wgn_VertexTrack_start; j<=wgn_VertexTrack_end; j++) +- { +- b.reset(); +- for (pp=leaf->get_impurity().members.head(); pp != 0; pp=next(pp)) ++ for (j=0; j 0.0) + { +- i = leaf->get_impurity().members.item(pp); +- b += wgn_VertexTrack.a(i,j); ++ b.reset(); ++ for (pp=leaf->get_impurity().members.head(); pp != 0; pp=next(pp)) ++ { ++ i = leaf->get_impurity().members.item(pp); ++ b += wgn_VertexTrack.a(i,j); ++ } ++ predict = b.mean(); ++ actual = wgn_VertexTrack.a(pos,j); ++ if (wgn_count_field == -1) ++ count = 1.0; ++ else ++ count = dataset(p)->get_flt_val(wgn_count_field); ++ x.cumulate(predict,count); ++ y.cumulate(actual,count); ++ /* Normalized the error by the standard deviation */ ++ if (b.stddev() == 0) ++ error = predict-actual; ++ else ++ error = (predict-actual)/b.stddev(); ++ error = predict-actual; /* awb_debug */ ++ se.cumulate((error*error),count); ++ e.cumulate(fabs(error),count); ++ xx.cumulate(predict*predict,count); ++ yy.cumulate(actual*actual,count); ++ xy.cumulate(predict*actual,count); + } +- predict = b.mean(); +- actual = wgn_VertexTrack.a(pos,j); +- if (wgn_count_field == -1) +- count = 1.0; +- else +- count = dataset(p)->get_flt_val(wgn_count_field); +- x.cumulate(predict,count); +- y.cumulate(actual,count); +- /* Normalized the error by the standard deviation */ +- if (b.stddev() == 0) +- error = predict-actual; +- else +- error = (predict-actual)/b.stddev(); +- error = predict-actual; /* awb_debug */ +- se.cumulate((error*error),count); +- e.cumulate(fabs(error),count); +- xx.cumulate(predict*predict,count); +- yy.cumulate(actual*actual,count); +- xy.cumulate(predict*actual,count); +- } + } + + // Pearson's product moment correlation coefficient +@@ -437,34 +437,35 @@ + { + leaf = tree.predict_node((*dataset(p))); + pos = dataset(p)->get_int_val(wgn_predictee); +- for (j=wgn_VertexTrack_start; j<=wgn_VertexTrack_end; j++) +- { +- b.reset(); +- for (pp=leaf->get_impurity().members.head(); pp != 0; pp=next(pp)) ++ for (j=0; j 0.0) + { +- i = leaf->get_impurity().members.item(pp); +- b += wgn_VertexTrack.a(i,j); ++ b.reset(); ++ for (pp=leaf->get_impurity().members.head(); pp != 0; pp=next(pp)) ++ { ++ i = leaf->get_impurity().members.item(pp); ++ b += wgn_VertexTrack.a(i,j); ++ } ++ predict = b.mean(); ++ actual = wgn_VertexTrack.a(pos,j); ++ if (wgn_count_field == -1) ++ count = 1.0; ++ else ++ count = dataset(p)->get_flt_val(wgn_count_field); ++ x.cumulate(predict,count); ++ y.cumulate(actual,count); ++ /* Normalized the error by the standard deviation */ ++ if (b.stddev() == 0) ++ error = predict-actual; ++ else ++ error = (predict-actual)/b.stddev(); ++ error = predict-actual; /* awb_debug */ ++ se.cumulate((error*error),count); ++ e.cumulate(fabs(error),count); ++ xx.cumulate(predict*predict,count); ++ yy.cumulate(actual*actual,count); ++ xy.cumulate(predict*actual,count); + } +- predict = b.mean(); +- actual = wgn_VertexTrack.a(pos,j); +- if (wgn_count_field == -1) +- count = 1.0; +- else +- count = dataset(p)->get_flt_val(wgn_count_field); +- x.cumulate(predict,count); +- y.cumulate(actual,count); +- /* Normalized the error by the standard deviation */ +- if (b.stddev() == 0) +- error = predict-actual; +- else +- error = (predict-actual)/b.stddev(); +- error = predict-actual; /* awb_debug */ +- se.cumulate((error*error),count); +- e.cumulate(fabs(error),count); +- xx.cumulate(predict*predict,count); +- yy.cumulate(actual*actual,count); +- xy.cumulate(predict*actual,count); +- } + } + + // Pearson's product moment correlation coefficient +diff -ur festival/speech_tools.old/.time-stamp festival/speech_tools/.time-stamp +--- speech_tools.old/.time-stamp 2006-09-27 10:59:11.000000000 -0400 ++++ speech_tools/.time-stamp 2007-03-14 11:18:07.000000000 -0400 +@@ -1,2 +1,2 @@ + speech_tools 1.2.96 +-Wed Sep 27 10:59:11 EDT 2006 ++Wed Mar 14 11:18:07 EDT 2007 diff --git a/festival-1.96-speechtools-linklibswithotherlibs.patch b/festival-1.96-speechtools-linklibswithotherlibs.patch new file mode 100644 index 0000000..3b3ae91 --- /dev/null +++ b/festival-1.96-speechtools-linklibswithotherlibs.patch @@ -0,0 +1,14 @@ +--- speech_tools/config/project.mak.orig 2007-03-13 15:27:53.000000000 -0400 ++++ speech_tools/config/project.mak 2007-03-13 15:29:12.000000000 -0400 +@@ -99,8 +99,9 @@ + PROJECT_LIBRARY_DIR_eststring = $(TOP)/lib + PROJECT_LIBRARY_DIR_estjava = $(TOP)/lib + +-PROJECT_LIBRARY_USES_estbase = eststring +- ++PROJECT_LIBRARY_USES_estbase = eststring m ++PROJECT_LIBRARY_USES_estools = estbase m ncurses ++PROJECT_LIBRARY_USES_eststring = m + PROJECT_LIBRARY_USES_estjava = estbase eststring + + PROJECT_LIBRARY_VERSION_estools = $(PROJECT_VERSION).1 diff --git a/festival-1.96-speechtools-ohjeezcxxisnotgcc.patch b/festival-1.96-speechtools-ohjeezcxxisnotgcc.patch new file mode 100644 index 0000000..8732858 --- /dev/null +++ b/festival-1.96-speechtools-ohjeezcxxisnotgcc.patch @@ -0,0 +1,13 @@ +--- speech_tools/config/compilers/gcc_defaults.mak.orig 2007-03-13 16:28:39.000000000 -0400 ++++ speech_tools/config/compilers/gcc_defaults.mak 2007-03-13 16:28:59.000000000 -0400 +@@ -39,10 +39,7 @@ + ########################################################################### + + CC=gcc +-CXX=gcc +-ifeq ($(OSTYPE),Darwin) + CXX=g++ +-endif + + COMPILER_DESC=FSF gcc + COMPILER_VERSION_COMMAND=$(CXX) -v 2>&1 | tail -1 | sed -e 's/^....//' diff --git a/festival-2.1-OGIresLPC-gcc-4.7.patch b/festival-2.1-OGIresLPC-gcc-4.7.patch new file mode 100644 index 0000000..be6869b --- /dev/null +++ b/festival-2.1-OGIresLPC-gcc-4.7.patch @@ -0,0 +1,360 @@ +diff -ru festival-2.1/festival/src/modules/OGIcommon/OGIcommon.cc festival-2.1.buono/festival/src/modules/OGIcommon/OGIcommon.cc +--- festival-2.1/festival/src/modules/OGIcommon/OGIcommon.cc 2006-12-05 23:38:01.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIcommon/OGIcommon.cc 2012-07-17 13:44:54.871361181 +0200 +@@ -111,7 +111,7 @@ + + // loop through items + int n=0; +- for (i0=r->first(); i0 != 0; i0=next(i0)) { ++ for (i0=r->first(); i0 != 0; i0=i0->next()) { + names.append(i0->name()); + y[n] = i0->F("end"); + n++; +diff -ru festival-2.1/festival/src/modules/OGIcommon/OGIduration.cc festival-2.1.buono/festival/src/modules/OGIcommon/OGIduration.cc +--- festival-2.1/festival/src/modules/OGIcommon/OGIduration.cc 2006-12-05 23:38:01.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIcommon/OGIduration.cc 2012-07-17 13:46:24.807426415 +0200 +@@ -36,7 +36,7 @@ + // Loop thru segments + for (useg=u->relation("Segment")->head(), sseg=u->relation("SrcSeg")->head(); + ((useg!=0) && (sseg!=0)); +- useg=next(useg), sseg=next(sseg)) { ++ useg=useg->next(), sseg=sseg->next()) { + + + +@@ -81,7 +81,7 @@ + // Loop thru segments + for (useg=u->relation("Segment")->head(), sseg=u->relation("SrcSeg")->head(); + ((useg!=0) && (sseg!=0)); +- useg=next(useg), sseg=next(sseg)) { ++ useg=useg->next(), sseg=sseg->next()) { + + if (sseg->name() != useg->name()) + sseg->set_name(useg->name()); +diff -ru festival-2.1/festival/src/modules/OGIcommon/OGI_file.cc festival-2.1.buono/festival/src/modules/OGIcommon/OGI_file.cc +--- festival-2.1/festival/src/modules/OGIcommon/OGI_file.cc 2006-12-05 23:38:01.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIcommon/OGI_file.cc 2012-07-17 13:44:21.807704834 +0200 +@@ -181,7 +181,7 @@ + size_t fps = ftell(fp); + + fprintf(fp, "KVL %d ", kvl.length()); +- for (l=kvl.head(); l!=0; l=next(l)){ ++ for (l=kvl.head(); l!=0; l=l->next()){ + fprintf(fp, "%s %s ", kvl.key(l).str(), kvl.val(l).str()); + } + fprintf(fp, "%s ", ENDKEY.str()); +diff -ru festival-2.1/festival/src/modules/OGIcommon/OGIgain.cc festival-2.1.buono/festival/src/modules/OGIcommon/OGIgain.cc +--- festival-2.1/festival/src/modules/OGIcommon/OGIgain.cc 2006-12-05 23:38:01.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIcommon/OGIgain.cc 2012-07-17 13:46:56.624095722 +0200 +@@ -49,7 +49,7 @@ + + // remove any in region where we will insert + p_gitem = NULL; +- for (gitem=grel->head(); gitem!=0; gitem=next(gitem)){ ++ for (gitem=grel->head(); gitem!=0; gitem=gitem->next()){ + if (p_gitem){ + p_gitem->unref_all(); + } +@@ -63,7 +63,7 @@ + } + + p_gitem = NULL; +- for (gitem=grel->head(); gitem!=0; gitem=next(gitem)){ ++ for (gitem=grel->head(); gitem!=0; gitem=gitem->next()){ + if (gitem->F("pos") >= B){ + break; + } +@@ -130,7 +130,7 @@ + float B = ffeature(seg, "start"); + float E = ffeature(seg, "end"); + +- for (gitem=u->relation("Gain")->head(); gitem!=0; gitem=next(gitem)){ ++ for (gitem=u->relation("Gain")->head(); gitem!=0; gitem=gitem->next()){ + if (gitem->f_present("pos")){ + if (gitem->F("pos") >= B) { + if (gitem->F("pos") <= E){ +diff -ru festival-2.1/festival/src/modules/OGIcommon/OGI_WaveChunk.cc festival-2.1.buono/festival/src/modules/OGIcommon/OGI_WaveChunk.cc +--- festival-2.1/festival/src/modules/OGIcommon/OGI_WaveChunk.cc 2006-12-05 23:38:01.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIcommon/OGI_WaveChunk.cc 2012-07-17 13:45:45.779832055 +0200 +@@ -22,7 +22,7 @@ + int OGI_WaveChunk::which_chunk(int samp){ + int out=-1; + EST_Litem *s; +- for (s=true_samp.head(); s!=0; s=next(s)){ ++ for (s=true_samp.head(); s!=0; s=s->next()){ + if (true_samp(s) > samp) + break; + out++; +@@ -132,22 +132,22 @@ + + NchunkV = true_samp.length(); + true_sampV = walloc(int, true_samp.length()); +- for (k=0,s=true_samp.head(); s!=0; s=next(s)){ ++ for (k=0,s=true_samp.head(); s!=0; s=s->next()){ + true_sampV[k++] = true_samp(s); + } + + startV = walloc(int, start.length()); +- for (k=0,s=start.head(); s!=0; s=next(s)){ ++ for (k=0,s=start.head(); s!=0; s=s->next()){ + startV[k++] = start(s); + } + + endV = walloc(int, end.length()); +- for (k=0,s=end.head(); s!=0; s=next(s)){ ++ for (k=0,s=end.head(); s!=0; s=s->next()){ + endV[k++] = end(s); + } + + offsetV = walloc(int, offset.length()); +- for (k=0,s=offset.head(); s!=0; s=next(s)){ ++ for (k=0,s=offset.head(); s!=0; s=s->next()){ + offsetV[k++] = offset(s); + } + done_setup_get = TRUE; +diff -ru festival-2.1/festival/src/modules/OGIdbase/OGIresLPC_db.cc festival-2.1.buono/festival/src/modules/OGIdbase/OGIresLPC_db.cc +--- festival-2.1/festival/src/modules/OGIdbase/OGIresLPC_db.cc 2006-12-05 23:38:05.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIdbase/OGIresLPC_db.cc 2012-07-17 13:48:38.261039341 +0200 +@@ -77,7 +77,7 @@ + + void OGIresLPC_db::free_all_units(void){ + EST_Litem *p; +- for (p = loaded_units.head(); p != 0; p = next(p)){ ++ for (p = loaded_units.head(); p != 0; p = p->next()){ + free_unit(loaded_units(p)); + } + loaded_units.clear(); +diff -ru festival-2.1/festival/src/modules/OGIdbase/OGIunitsel_diphone.cc festival-2.1.buono/festival/src/modules/OGIdbase/OGIunitsel_diphone.cc +--- festival-2.1/festival/src/modules/OGIdbase/OGIunitsel_diphone.cc 2006-12-05 23:38:05.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIdbase/OGIunitsel_diphone.cc 2012-07-17 13:48:12.474307360 +0200 +@@ -40,9 +40,9 @@ + EST_Relation *dbSeg_rel = u->relation("dbUnit"); + + /// loop through Segment items +- for (lseg=u->relation("Segment")->head(); lseg!=0; lseg=next(lseg)) { ++ for (lseg=u->relation("Segment")->head(); lseg!=0; lseg=lseg->next()) { + +- rseg = next(lseg); ++ rseg = lseg->next(); + if (rseg != 0){ + + // Left phone name +diff -ru festival-2.1/festival/src/modules/OGIresLPC/pmark_analysis.cc festival-2.1.buono/festival/src/modules/OGIresLPC/pmark_analysis.cc +--- festival-2.1/festival/src/modules/OGIresLPC/pmark_analysis.cc 2006-12-05 23:38:17.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIresLPC/pmark_analysis.cc 2012-07-17 13:53:35.315701699 +0200 +@@ -250,7 +250,7 @@ + EST_IList pmlist; + EST_Litem *p; + Track2IList(pmarks, (float) sp.sample_rate(), pmlist); +- for (p = pmlist.head(); p != 0; p = next(p)){ ++ for (p = pmlist.head(); p != 0; p = p->next()){ + if ((pmlist(p) < 0) || pmlist(p) > sp.length()) + p = pmlist.remove(p); + } +@@ -615,7 +615,7 @@ + static void purge_pm_list(EST_IList &pm, EST_IList &rmlist){ + // in pm, remove INDICES listed in rmlist + EST_Litem *p; +- for (p=rmlist.tail(); p != 0; p = prev(p)){ ++ for (p=rmlist.tail(); p != 0; p = p->prev()){ + pm.remove_nth(rmlist(p)); + } + } +diff -ru festival-2.1/festival/src/modules/OGIresLPC/resLPC_concat.cc festival-2.1.buono/festival/src/modules/OGIresLPC/resLPC_concat.cc +--- festival-2.1/festival/src/modules/OGIresLPC/resLPC_concat.cc 2006-12-05 23:38:17.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIresLPC/resLPC_concat.cc 2012-07-17 13:49:23.748566558 +0200 +@@ -84,7 +84,7 @@ + + // Loop through the units to get size of WaveChunk -- pre-alloc + int appx_wave_size = 0; // samples +- for (newUnit=u->relation("dbUnit")->head(); newUnit != 0; newUnit=next(newUnit)){ ++ for (newUnit=u->relation("dbUnit")->head(); newUnit != 0; newUnit=newUnit->next()){ + indx = newUnit->f("db_indx"); + appx_wave_size += udb->load_unit_udata(indx); // returns size + appx_wave_size += T0_max; // possible extra zero samples needed around each +@@ -93,7 +93,7 @@ + + + // Loop through the units +- for (newUnit=u->relation("dbUnit")->head(); newUnit != 0; newUnit=next(newUnit)){ ++ for (newUnit=u->relation("dbUnit")->head(); newUnit != 0; newUnit=newUnit->next()){ + // Items in the dbUnit relation have the following features: + // - "db_indx" into dbase + // - "isNatNbL" - is the prev unit this unit's natural neighbor? +@@ -145,7 +145,7 @@ + + // mark voiced joins + EST_Litem *p; +- for (p = vjoin_list.head(); p != 0; p = next(p)){ ++ for (p = vjoin_list.head(); p != 0; p = p->next()){ + srcdata->pm.a(vjoin_list(p), "v/uv") = _V_; + } + +diff -ru festival-2.1/festival/src/modules/OGIresLPC/resLPC_dump.cc festival-2.1.buono/festival/src/modules/OGIresLPC/resLPC_dump.cc +--- festival-2.1/festival/src/modules/OGIresLPC/resLPC_dump.cc 2006-12-05 23:38:17.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIresLPC/resLPC_dump.cc 2012-07-17 13:49:51.766275351 +0200 +@@ -176,9 +176,9 @@ + // Loop thru SrcSeg, record 1st pmark of each segment + dbunit=u->relation("dbUnit")->head(); + names.append(EST_String(dbunit->name())); +- dbunit = next(dbunit); // skip 1st one ++ dbunit = dbunit->next(); // skip 1st one + +- for ( ; dbunit!=0; dbunit=next(dbunit)){ ++ for ( ; dbunit!=0; dbunit=dbunit->next()){ + + // pmarks + srcpmR = dbunit->I("lpcpm"); +diff -ru festival-2.1/festival/src/modules/OGIresLPC/resLPC_mod.cc festival-2.1.buono/festival/src/modules/OGIresLPC/resLPC_mod.cc +--- festival-2.1/festival/src/modules/OGIresLPC/resLPC_mod.cc 2006-12-05 23:38:17.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIresLPC/resLPC_mod.cc 2012-07-17 13:51:30.175997155 +0200 +@@ -166,7 +166,7 @@ + EST_Item *lastseg = u->relation("Segment")->tail(); + + // Loop thru segments +- for (useg=u->relation("Segment")->head(); useg != 0; useg=next(useg)) { ++ for (useg=u->relation("Segment")->head(); useg != 0; useg=useg->next()) { + + if (ph_is_silence(useg->name())){ + +@@ -180,7 +180,7 @@ + incr = ffeature(useg,"segment_duration").Float()/5.0; + GtargL = seg_gain_target(u, useg, 1); + if (GtargL == 1.0) +- GtargL = seg_gain_target(u, next(useg), 0); ++ GtargL = seg_gain_target(u, useg->next(), 0); + OGIgain_targ(u, 0.0, firstseg->F("end"), + 0.0, GtargL, + incr,"sin"); +@@ -194,7 +194,7 @@ + incr = ffeature(useg,"segment_duration").Float()/5.0; + GtargR = seg_gain_target(u, useg, 0); + if (GtargR == 1.0) +- GtargR = seg_gain_target(u, prev(useg), 1); ++ GtargR = seg_gain_target(u, useg->prev(), 1); + OGIgain_targ(u,ffeature(lastseg,"start").Float(),lastseg->F("end"), + GtargR, 0.0, + incr,"sin"); +@@ -212,11 +212,11 @@ + incr = ffeature(useg,"segment_duration").Float()/5.0; + GtargL = seg_gain_target(u, useg, 1); + if (GtargL == 1.0) +- GtargL = seg_gain_target(u, prev(useg), 1); ++ GtargL = seg_gain_target(u, useg->prev(), 1); + + GtargR = seg_gain_target(u, useg, 0); + if (GtargR == 1.0) +- GtargR = seg_gain_target(u, next(useg), 0); ++ GtargR = seg_gain_target(u, useg->next(), 0); + + OGIgain_targ(u,ffeature(useg,"start").Float(), mid, + GtargL, 0.0, +@@ -285,7 +285,7 @@ + EST_Item *sseg; + + // Loop thru SrcSeg, record 1st pmark of each segment +- for (sseg=u->relation("SrcSeg")->head(); sseg!=0; sseg=next(sseg)){ ++ for (sseg=u->relation("SrcSeg")->head(); sseg!=0; sseg=sseg->next()){ + + src_end += sseg->F("dur"); + +@@ -365,7 +365,7 @@ + // last one in the first unit + Lph = parent(as(daughtern(dbUnit),"SrcSeg")); + +- for (dbUnit=next(dbUnit); dbUnit != 0; dbUnit=next(dbUnit)){ ++ for (dbUnit=dbUnit->next(); dbUnit != 0; dbUnit=dbUnit->next()){ + // first phone in this unit + Rph = parent(as(daughter1(dbUnit),"SrcSeg")); + +@@ -384,17 +384,17 @@ + M = dbUnit->I("lpcpm"); + + // begin point: limit to begin of unit and begin of segment the join is in +- B = max(prev(dbUnit)->I("lpcpm"), M - smoothlen); ++ B = max(dbUnit->prev()->I("lpcpm"), M - smoothlen); + B = max(B, Lph->I("lpcpm")); + + // end point: limit to end of unit and end of segment the join is in +- if (next(dbUnit)) +- nextpm = next(dbUnit)->I("lpcpm"); ++ if (dbUnit->next()) ++ nextpm = dbUnit->next()->I("lpcpm"); + else + nextpm = srclpc.num_frames(); + E = min(nextpm, M + smoothlen); +- if (next(Rph)) +- E = min(E, next(Rph)->I("lpcpm")-1); ++ if (Rph->next()) ++ E = min(E, Rph->next()->I("lpcpm")-1); + + // do smoothing + if (doMatch) +@@ -459,7 +459,7 @@ + Gtarg.begin_append(utt_targ->length()); + + // loop through targets +- for (targ=utt_targ->first(); targ != 0; targ=next(targ)) { ++ for (targ=utt_targ->first(); targ != 0; targ=targ->next()) { + if (targ->f_present("pos")) + Gtarg.append(targ->F("pos"), targ->F("gain")); + } +diff -ru festival-2.1/festival/src/modules/OGIresLPC/resLPC_pmark.cc festival-2.1.buono/festival/src/modules/OGIresLPC/resLPC_pmark.cc +--- festival-2.1/festival/src/modules/OGIresLPC/resLPC_pmark.cc 2006-12-05 23:38:17.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIresLPC/resLPC_pmark.cc 2012-07-17 13:53:12.769935094 +0200 +@@ -114,13 +114,13 @@ + To_UV_sec, pm, Nexc, Fs, label_vuv); + + for (b=Bvsect.tail(),e=Evsect.tail(); +- ((b!=0)||(e!=0)); b=prev(b),e=prev(e)){ ++ ((b!=0)||(e!=0)); b=b->prev(),e=e->prev()){ + + make_Vsection(Bvsect(b), Evsect(e), pm, label_vuv); + + // make next UNVOICED section +- if (prev(e)){ +- insert_UVsection(Bvsect, Evsect, Evsect(prev(e)), Bvsect(b), ++ if (e->prev()){ ++ insert_UVsection(Bvsect, Evsect, Evsect(e->prev()), Bvsect(b), + To_UV_sec, pm, Nexc, Fs, label_vuv); + } + } +@@ -190,7 +190,7 @@ + + // update V/UV information to reflect added pmarks + for (b=Bvsect.head(),e=Evsect.head(); +- ((b!=0)||(e!=0)); b=next(b),e=next(e)){ ++ ((b!=0)||(e!=0)); b=b->next(),e=e->next()){ + + if (Bvsect(b) >= UVsectE){ + Bvsect(b) += tvect.Nelem()-Nstrays; +diff -ru festival-2.1/festival/src/modules/OGIresLPC/resLPC_resyn.cc festival-2.1.buono/festival/src/modules/OGIresLPC/resLPC_resyn.cc +--- festival-2.1/festival/src/modules/OGIresLPC/resLPC_resyn.cc 2006-12-05 23:38:17.000000000 +0100 ++++ festival-2.1.buono/festival/src/modules/OGIresLPC/resLPC_resyn.cc 2012-07-17 13:52:18.790493893 +0200 +@@ -88,7 +88,7 @@ + EST_Item *sseg; + + // set "end" of srcseg from input "dur" +- for (sseg=u->relation("SrcSeg")->head(); sseg!=0; sseg=next(sseg)){ ++ for (sseg=u->relation("SrcSeg")->head(); sseg!=0; sseg=sseg->next()){ + src_end += sseg->F("dur"); + sseg->set("end", src_end); + } +@@ -96,7 +96,7 @@ + // readjust: start from end of wave and shrink segs that are + // beyond the end + float next_end = wavend; +- for (sseg=u->relation("SrcSeg")->tail(); sseg!=u->relation("SrcSeg")->head(); sseg=prev(sseg)){ ++ for (sseg=u->relation("SrcSeg")->tail(); sseg!=u->relation("SrcSeg")->head(); sseg=sseg->prev()){ + if (sseg->F("end") > next_end){ + sseg->set("end", next_end); + next_end -= 0.001; +@@ -107,7 +107,7 @@ + + // re-set "dur" + float prev_end=0.0; +- for (sseg=u->relation("SrcSeg")->head(); sseg != 0; sseg=next(sseg)){ ++ for (sseg=u->relation("SrcSeg")->head(); sseg != 0; sseg=sseg->next()){ + sseg->set("dur", sseg->F("end")-prev_end); + prev_end = sseg->F("end"); + } diff --git a/festival.spec b/festival.spec new file mode 100644 index 0000000..5c6746a --- /dev/null +++ b/festival.spec @@ -0,0 +1,265 @@ +Name: festival +Version: 2.1 +Release: 2mamba +Summary: A general framework for building speech synthesis systems +Group: System/Multimedia +Vendor: openmamba +Distribution: openmamba +Packager: Silvan Calarco +URL: http://www.cstr.ed.ac.uk/projects/festival/ +Source: http://festvox.org/packed/festival/latest/festival-%{version}-release.tar.gz +Source1: http://www.cstr.ed.ac.uk/downloads/festival/latest/speech_tools-%{version}-release.tar.gz +Source2: http://festvox.org/packed/festival/latest/festlex_CMU.tar.gz +Source3: http://festvox.org/packed/festival/latest/festlex_OALD.tar.gz +Source4: http://festvox.org/packed/festival/latest/festlex_POSLEX.tar.gz +Source5: http://festvox.org/packed/festival/latest/festvox_kallpc16k.tar.gz +Source6: http://festvox.org/packed/festival/latest/festvox_kedlpc8k.tar.gz +Source7: http://festvox.org/packed/festival/latest/festvox_kedlpc16k.tar.gz +Source8: http://switch.dl.sourceforge.net/sourceforge/it-festival/Italian-FESTIVAL.zip +Source9: http://festvox.org/packed/festival/latest/festvox_cmu_us_awb_arctic_hts.tar.gz +Source10: http://festvox.org/packed/festival/latest/festvox_cmu_us_bdl_arctic_hts.tar.gz +Source11: http://festvox.org/packed/festival/latest/festvox_cmu_us_jmk_arctic_hts.tar.gz +Source12: http://festvox.org/packed/festival/latest/festvox_cmu_us_slt_arctic_hts.tar.gz +Source13: http://festvox.org/packed/festival/latest/festvox_cstr_us_awb_arctic_multisyn-1.0.tar.gz +Source14: http://festvox.org/packed/festival/latest/festvox_cstr_us_jmk_arctic_multisyn-1.0.tar.gz +Source15: http://festvox.org/packed/festival/latest/festvox_us1.tar.gz +Source16: http://festvox.org/packed/festival/latest/festvox_us2.tar.gz +Source17: http://festvox.org/packed/festival/latest/festvox_us3.tar.gz +Source18: http://www2.pd.istc.cnr.it/FESTIVAL/ogi/OGIresLPC-2.2.tar.gz +Patch0: festival-1.96-enable_esd_audio.patch +Patch1: festival-1.96-gcc43.patch +Patch2: festival-1.96-gcc44.patch +Patch3: festival-1.96-etcsiteinit.patch +Patch4: festival-1.96-main-shared-build.patch +Patch5: festival-1.96-kludge-etcpath-into-libarch.patch +Patch6: festival-1.96-speechtools-ohjeezcxxisnotgcc.patch +Patch7: festival-1.96-bettersonamehack.patch +Patch8: festival-1.96-no-shared-data.patch +Patch9: festival-1.96-speechtools-linklibswithotherlibs.patch +Patch10: festival-1.96-speechtools-1.2.96-beta+awb.patch +Patch11: speech_tools-2.1-gcc-4.7.patch +Patch12: %{name}-2.1-OGIresLPC-gcc-4.7.patch +License: MIT +## AUTOBUILDREQ-BEGIN +BuildRequires: glibc-devel +BuildRequires: libalsa-devel +BuildRequires: libgcc +BuildRequires: libncurses-devel +BuildRequires: libstdc++6-devel +## AUTOBUILDREQ-END +BuildRequires: libesound-devel >= 0.2.36 +Requires: festivalvoice +Requires: festival-voice-en = %{version} +Requires(post):%{__install_info} +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +%description +Festival offers a general framework for building speech synthesis systems as well as including examples of various modules. As a whole it offers full text to speech through a number APIs: from shell level, though a Scheme command interpreter, as a C++ library, from Java, and an Emacs interface. Festival is multi-lingual (currently English (British and American), and Spanish) though English is the most advanced. Other groups release new languages for the system. And full tools and documentation for build new voices are available through Carnegie Mellon's FestVox project (http://festvox.org) +The system is written in C++ and uses the Edinburgh Speech Tools Library for low level architecture and has a Scheme (SIOD) based command interpreter for control. Documentation is given in the FSF texinfo format which can generate, a printed manual, info files and HTML. +Festival is free software. Festival and the speech tools are distributed under an X11-type licence allowing unrestricted commercial and non-commercial use alike. + +%package voice-us +Summary: American English language voice files for festival +Group: System/Multimedia +Requires: %{name} = %{version}-%{release} +Provides: festivalvoice + +%description voice-us +American English language voice files for festival. + +%package voice-en +Summary: English language voice files for festival +Group: System/Multimedia +Requires: %{name} = %{version}-%{release} +Provides: festivalvoice + +%description voice-en +English language voice files for festival. + +%package voice-it +Summary: Italian language voice files for festival +Group: System/Multimedia +Requires: %{name} = %{version}-%{release} +Provides: festivalvoice + +%description voice-it +English language voice files for festival. + +%prep +#% setup -q -n %{name} +#-D -T +#:<< __EOF +%setup -q -c -a0 -a1 -a2 -a3 -a4 -a5 -a6 -a7 -a8 -a9 -a10 -a11 -a12 -a13 -a14 -a15 -a16 -a17 -a18 +unzip italian_scm.zip +unzip lex_ifd.zip +unzip lp_diphone.zip +unzip lp_mbrola_unix.zip +unzip lp_ogi_diphone.zip +unzip pc_diphone.zip +unzip pc_mbrola_unix.zip +unzip pc_ogi_diphone.zip + +#%patch1 -p0 +#%patch2 -p0 +%patch3 -p0 +#%patch4 -p0 +#%patch5 -p0 +%patch6 -p0 +#%patch7 -p0 +#%patch8 -p0 +#%patch9 -p0 +#%patch10 -p0 +cd speech_tools +%patch11 -p1 +cd .. +%patch12 -p1 + +echo "ALSO_INCLUDE += OGIcommon OGIeffect OGIinsert OGIdbase" >> festival/config/config.in +# FIXME: patched to build but main final link fails with this module +# OGIresLPC + +%build +#:<< __EOF +cd speech_tools +%configure +%make -j1 +# libs="-L$(pwd)/lib" +# CFLAGS="$RPM_OPT_FLAGS -fPIC -fno-strict-aliasing" \ +# CXXFLAGS="$RPM_OPT_FLAGS -fPIC -fno-strict-aliasing" + +cd ../festival +#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/src/lib +%configure +%make -j1 FTLIBDIR=%{_datadir}/festival/lib +# CFLAGS="$RPM_OPT_FLAGS -fPIC -fno-strict-aliasing" \ +# CXXFLAGS="$RPM_OPT_FLAGS -fPIC -fno-strict-aliasing" + +%install +[ "%{buildroot}" != / ] && rm -rf "%{buildroot}" +cd speech_tools +#make INSTALLED_LIB=%{buildroot}%{_libdir} make_installed_lib_shared +#install lib/libestools.so* %{buildroot}%{_libdir} +make INSTALLED_BIN=%{buildroot}%{_libexecdir}/speech-tools make_installed_bin_static +#cd include +#for d in $( find . -type d | grep -v win32 ); do +# make -w -C $d INCDIR=%{buildroot}%{_includedir}/speech_tools/$d install_incs +#done +cd .. + +cd festival +make INSTALLED_BIN=%{buildroot}%{_bindir} make_installed_bin_static + +# remove builddir inserted in some scripts +sed -i "s|%{_builddir}/%{name}-%{version}/%{name}|%{_prefix}|" \ + bin/text2wave examples/saytime + +install -D -m0755 bin/text2wave %{buildroot}%{_bindir} +install -D -m0755 examples/saytime %{buildroot}%{_bindir} + +#install -D -m0755 festival/src/main/festival %{buildroot}%{_bindir}/festival +#install -D -m0755 festival/src/main/festival_client %{buildroot}%{_bindir}/festival_client +#cp src/lib/libFestival.so* %{buildroot}%{_libdir} + +install -d %{buildroot}%{_datadir}/festival %{buildroot}%{_sysconfdir}/festival %{buildroot}%{_mandir}/man1 +cp -a lib %{buildroot}%{_datadir}/festival/ +mv %{buildroot}%{_datadir}/festival/lib/siteinit.scm %{buildroot}%{_sysconfdir}/festival/ +cp -a doc/*.1 %{buildroot}%{_mandir}/man1 + +#mkdir -p %{buildroot}%{_includedir}/festival +#cp -a src/include/* %{buildroot}%{_includedir}/festival + +rm -rf %{buildroot}%{_datadir}/festival/lib/voices-multisyn/english +rm -f %{buildroot}%{_datadir}/festival/lib/Makefile +rm -f %{buildroot}%{_datadir}/festival/lib/multisyn/Makefile +rm -f %{buildroot}%{_datadir}/festival/lib/etc/Makefile + +%clean +[ "%{buildroot}" != / ] && rm -rf "%{buildroot}" + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%files +%defattr(-,root,root) +%dir %{_sysconfdir}/festival +%config(noreplace) %{_sysconfdir}/festival/*.scm +%{_bindir}/festival +%{_bindir}/festival_client +%{_bindir}/festival_server +%{_bindir}/festival_server_control +%{_bindir}/saytime +%{_bindir}/text2wave +%{_libexecdir}/speech-tools/* +#%dir %{_includedir}/festival +#%{_includedir}/festival/* +#%dir %{_includedir}/speech_tools +#%{_includedir}/speech_tools/* +#%{_libdir}/libFestival.so +#%{_libdir}/libFestival.so.* +#%{_libdir}/libestbase.a +#%{_libdir}/libestbase.so +#%{_libdir}/libestbase.so.* +#%{_libdir}/libestools.a +#%{_libdir}/libestools.so +#%{_libdir}/libestools.so.* +#%{_libdir}/libeststring.a +#%{_libdir}/libeststring.so +#%{_libdir}/libeststring.so.* + +%{_datadir}/festival/lib/*.dtd +%{_datadir}/festival/lib/VCLocalRules +%{_datadir}/festival/lib/dicts/cmu/* +%{_datadir}/festival/lib/dicts/oald/* +%{_datadir}/festival/lib/dicts/wsj.wp39.* +%{_datadir}/festival/lib/dicts/COPYING.poslex +%{_datadir}/festival/lib/multisyn/*.scm +%{_datadir}/festival/lib/sable-latin.ent +%{_datadir}/festival/lib/scfg_wsj_wp20.gram +%{_datadir}/festival/lib/*.ngrambin +%{_datadir}/festival/lib/speech.properties +%{_datadir}/festival/lib/etc/unknown_Linux/* +%{_datadir}/festival/lib/etc/unknown_Linux/.made +%{_datadir}/festival/lib/etc/email_filter +%{_datadir}/festival/lib/festival.el + +%dir %{_datadir}/festival +%{_datadir}/festival/lib/*.scm +%doc festival/COPYING festival/NEWS festival/README + +%{_mandir}/man1/festival.1* +%{_mandir}/man1/festival_client.1* + +%files voice-us +%defattr(-,root,root) +%dir %{_datadir}/festival/lib/voices/us +%{_datadir}/festival/lib/voices/us/* + +%files voice-en +%defattr(-,root,root) +%dir %{_datadir}/festival/lib/voices/english +%{_datadir}/festival/lib/voices/english/* + +%files voice-it +%defattr(-,root,root) +%dir %{_datadir}/festival/lib/voices/italian +%{_datadir}/festival/lib/voices/italian/* +%{_datadir}/festival/lib/italian_scm/* +%{_datadir}/festival/lib/dicts/ifd* + +%changelog +* Wed Jul 17 2013 Silvan Calarco 2.1-2mamba +- text2wave,saytime: fix %_builddir references in scripts + +* Tue Jul 17 2012 Silvan Calarco 2.1-1mamba +- update to 2.1 + +* Mon Sep 21 2009 Silvan Calarco 1.96-2mamba +- added patches for build with gcc 4.4 +- added festvox_cmu_us_* and festvox_cstr_us_* packages +- added patch and moved configuration files to /etc/festival +- removed esd patch +- added patch for shared library build + +* Wed Aug 01 2007 Silvan Calarco 1.96-1mamba +- package created by autospec diff --git a/speech_tools-2.1-gcc-4.7.patch b/speech_tools-2.1-gcc-4.7.patch new file mode 100644 index 0000000..239becc --- /dev/null +++ b/speech_tools-2.1-gcc-4.7.patch @@ -0,0 +1,82 @@ +diff -Nru speech-tools-2.1~release/debian/patches/ftbfs_gcc4.7.diff speech-tools-2.1~release/debian/patches/ftbfs_gcc4.7.diff +--- a/base_class/EST_TSimpleMatrix.cc ++++ b/base_class/EST_TSimpleMatrix.cc +@@ -44,6 +44,7 @@ + #include "EST_TVector.h" + #include + #include ++#include + #include "EST_cutils.h" + + template +@@ -98,7 +99,7 @@ void EST_TSimpleMatrix::resize(int ne + { + int copy_r = Lof(this->num_rows(), new_rows); + +- just_resize(new_rows, new_cols, &old_vals); ++ this->just_resize(new_rows, new_cols, &old_vals); + + for (q=0; q<(copy_r*new_cols*sizeof(T)); q++) /* memcpy */ + ((char *)this->p_memory)[q] = ((char *)old_vals)[q]; +@@ -127,9 +128,9 @@ void EST_TSimpleMatrix::resize(int ne + int copy_r = Lof(this->num_rows(), new_rows); + int copy_c = Lof(this->num_columns(), new_cols); + +- just_resize(new_rows, new_cols, &old_vals); ++ this->just_resize(new_rows, new_cols, &old_vals); + +- set_values(old_vals, ++ this->set_values(old_vals, + old_row_step, old_column_step, + 0, copy_r, + 0, copy_c); +--- a/base_class/EST_TSimpleVector.cc ++++ b/base_class/EST_TSimpleVector.cc +@@ -43,6 +43,7 @@ + #include "EST_TSimpleVector.h" + #include "EST_matrix_support.h" + #include ++#include + #include "EST_cutils.h" + + template void EST_TSimpleVector::copy(const EST_TSimpleVector &a) +@@ -70,7 +71,7 @@ template void EST_TSimpleVector + int old_offset = this->p_offset; + unsigned int q; + +- just_resize(newn, &old_vals); ++ this->just_resize(newn, &old_vals); + + if (set && old_vals) + { +--- a/include/EST_TIterator.h ++++ b/include/EST_TIterator.h +@@ -209,7 +209,7 @@ public: + + /// Create an iterator ready to run over the given container. + EST_TStructIterator(const Container &over) +- { begin(over); } ++ { this->begin(over); } + + const Entry *operator ->() const + {return &this->current();} +@@ -289,7 +289,7 @@ public: + + /// Create an iterator ready to run over the given container. + EST_TRwStructIterator(Container &over) +- { begin(over); } ++ { this->begin(over); } + + Entry *operator ->() const + {return &this->current();} +--- a/include/EST_TNamedEnum.h ++++ b/include/EST_TNamedEnum.h +@@ -130,7 +130,7 @@ public: + {this->initialise((const void *)defs); }; + EST_TNamedEnumI(EST_TValuedEnumDefinition defs[], ENUM (*conv)(const char *)) + {this->initialise((const void *)defs, conv); }; +- const char *name(ENUM tok, int n=0) const {return value(tok,n); }; ++ const char *name(ENUM tok, int n=0) const {return this->value(tok,n); }; + + }; +