diff options
Diffstat (limited to 'lib/voices/spanish/el_diphone/festvox/spanlex.scm')
-rw-r--r-- | lib/voices/spanish/el_diphone/festvox/spanlex.scm | 757 |
1 files changed, 757 insertions, 0 deletions
diff --git a/lib/voices/spanish/el_diphone/festvox/spanlex.scm b/lib/voices/spanish/el_diphone/festvox/spanlex.scm new file mode 100644 index 0000000..2a653ee --- /dev/null +++ b/lib/voices/spanish/el_diphone/festvox/spanlex.scm @@ -0,0 +1,757 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; ;; +;;; Centre for Speech Technology Research ;; +;;; University of Edinburgh, UK ;; +;;; Copyright (c) 1996,1997 ;; +;;; All Rights Reserved. ;; +;;; ;; +;;; Permission is hereby granted, free of charge, to use and distribute ;; +;;; this software and its documentation without restriction, including ;; +;;; without limitation the rights to use, copy, modify, merge, publish, ;; +;;; distribute, sublicense, and/or sell copies of this work, and to ;; +;;; permit persons to whom this work is furnished to do so, subject to ;; +;;; the following conditions: ;; +;;; 1. The code must retain the above copyright notice, this list of ;; +;;; conditions and the following disclaimer. ;; +;;; 2. Any modifications must be clearly marked as such. ;; +;;; 3. Original authors' names are not deleted. ;; +;;; 4. The authors' names are not used to endorse or promote products ;; +;;; derived from this software without specific prior written ;; +;;; permission. ;; +;;; ;; +;;; THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK ;; +;;; DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ;; +;;; ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT ;; +;;; SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE ;; +;;; FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ;; +;;; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN ;; +;;; AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ;; +;;; ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF ;; +;;; THIS SOFTWARE. ;; +;;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Authors: Alistair Conkie, Borja Etxebarria and Alan W Black +;;; +;;; letter to sounds rules and functions to produce stressed syllabified +;;; pronunciations for Spanish words +;;; There is some history in one set of the LTS rules back to +;;; Rob van Gerwen, University of Nijmegen. +;;; + +;;; Lexicon +(lex.create "spanish") +(lex.set.phoneset "spanish") +(lex.set.lts.method 'spanish_lts) +(lex.set.lts.ruleset 'spanish) + +;;; This which just have to be in the lexicon +;(lex.add.entry '("a" nn (((a) 0)))) +(lex.add.entry '("b" nn (((b e) 0)))) +(lex.add.entry '("c" nn (((th e) 0)))) +(lex.add.entry '("d" nn (((d e) 0)))) +;(lex.add.entry '("e" nn (((e) 0)))) +(lex.add.entry '("f" nn (((e1) 1)((f e) 0)))) +(lex.add.entry '("g" nn (((g e) 0)))) +(lex.add.entry '("h" nn (((a1) 1)((ch e) 0)))) +;(lex.add.entry '("i" nn (((i) 0)))) +(lex.add.entry '("j" nn (((x o1) 1)((t a) 0)))) +(lex.add.entry '("k" nn (((k a) 0)))) +(lex.add.entry '("l" nn (((e1) 1)((l e) 0)))) +(lex.add.entry '("m" nn (((e1) 1)((m e) 0)))) +(lex.add.entry '("n" nn (((e1) 1)((n e) 0)))) +(lex.add.entry '("~n" nn (((e1) 1)((ny e) 0)))) +(lex.add.entry '("ñ" nn (((e1) 1)((ny e) 0)))) +;(lex.add.entry '("o" nn (((o) 0)))) +(lex.add.entry '("p" nn (((p e) 0)))) +(lex.add.entry '("q" nn (((k u) 0)))) +(lex.add.entry '("r" nn (((e1) 1)((rr e) 0)))) +(lex.add.entry '("s" nn (((e1) 1) ((s e) 0)))) +(lex.add.entry '("t" nn (((t e) 0)))) +;(lex.add.entry '("u" nn (((u) 0)))) +(lex.add.entry '("v" nn (((u1) 1)((b e) 0)))) +(lex.add.entry '("w" nn (((u) 0) ((b e) 0) ((d o1) 1) ((b l e) 0)))) +(lex.add.entry '("x" nn (((e1) 1)((k i s) 0)))) +;(lex.add.entry '("y" nn (((i) 0)((g r i e1) 1))((g a) 0))) ;; doubt: stres +(lex.add.entry '("z" nn (((th e1) 1)((t a) 0)))) +;(lex.add.entry '("á" nn (((a) 0)))) +;(lex.add.entry '("é" nn (((e) 0)))) +;(lex.add.entry '("í" nn (((i) 0)))) +;(lex.add.entry '("ó" nn (((o) 0)))) +;(lex.add.entry '("ú" nn (((u) 0)))) +;(lex.add.entry '("ü" nn (((u) 0)))) +(lex.add.entry + '("*" n (((a s) 0) ((t e) 0) ((r i1 s) 1) ((k o) 0)))) +(lex.add.entry + '("%" n (((p o r) 0) ((th i e1 n) 1) ((t o) 0)))) +(lex.add.entry + '("&" n (((a1 m) 1) ((p e r) 0) ((s a n) 0)))) +(lex.add.entry + '("$" n (((d o1) 1) ((l a r) 0)))) +(lex.add.entry + '("#" n (((a l) 0) ((m u a) 0) ((d i1) 1) ((ll a) 0)))) +(lex.add.entry + '("@" n (((a) 0) ((rr o1) 1) ((b a) 0)))) +(lex.add.entry + '("+" n (((m a s) 0)) ((pos "K7%" "OA%" "T-%")))) +(lex.add.entry + '("^" n (((k a1) 1) ((r e t) 0)) ((pos "K6$")))) +(lex.add.entry + '("~" n (((t i1 l) 1) ((d e) 0)) ((pos "K6$")))) +(lex.add.entry + '("=" n (((i) 0) ((g u a1 l) 1)))) +(lex.add.entry + '("/" n (((e1 n ) 1) ((t r e) 0)))) ;; $$$division, etc. +(lex.add.entry + '("\\" n (((b a1) 1) ((rr a) 1)))) +(lex.add.entry + '("_" n (((s u b) 0) ((rr a) 0) ((ll a1) 1) ((d o) 0)) )) +(lex.add.entry + '("|" n (((b a1) 1) ((rr a) 0)))) +(lex.add.entry + '(">" n ((( m a ) 0) ((ll o1 r) 1) ((k e) 0)))) +(lex.add.entry + '("<" n ((( m e ) 0) ((n o1 r) 1) ((k e) 0)))) +(lex.add.entry + '("[" n ((( a) 0) ((b r i1 r) 1) ((k o r) 0)((ch e1) 1)((t e) 0)))) +(lex.add.entry + '("]" n (((th e) 0) ((rr a1 r) 1) ((k o r) 0)((ch e1) 1)((t e) 0)))) +(lex.add.entry + '(" " n (((e s) 0)((p a1) 1)((th i o) 0)))) +(lex.add.entry + '("\t" n (((t a1 b) 1)))) +(lex.add.entry + '("\n" n (((n u e1) 1) ((b a) 0)((l i) 1) ((n e a) 0)))) + +(lex.add.entry '("." punc nil)) +(lex.add.entry '("." nn (((p u1 n) 1) ((t o) 0)))) +(lex.add.entry '("'" punc nil)) +(lex.add.entry '(":" punc nil)) +(lex.add.entry '(";" punc nil)) +(lex.add.entry '("," punc nil)) +(lex.add.entry '("," nn (((k o1) 1) ((m a) 0)))) +(lex.add.entry '("-" punc nil)) +(lex.add.entry '("\"" punc nil)) +(lex.add.entry '("`" punc nil)) +(lex.add.entry '("?" punc nil)) +(lex.add.entry '("!" punc nil)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Down cases with accents +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(lts.ruleset + spanish_downcase + ( ) + ( + ( [ a ] = a ) + ( [ e ] = e ) + ( [ i ] = i ) + ( [ o ] = o ) + ( [ u ] = u ) + ( [ á ] = á ) + ( [ é ] = é ) + ( [ í ] = í ) + ( [ ó ] = ó ) + ( [ ú ] = ú ) + ( [ ü ] = ü ) + ( [ b ] = b ) + ( [ c ] = c ) + ( [ "ç" ] = s ) + ( [ d ] = d ) + ( [ f ] = f ) + ( [ g ] = g ) + ( [ h ] = h ) + ( [ j ] = j ) + ( [ k ] = k ) + ( [ l ] = l ) + ( [ m ] = m ) + ( [ n ] = n ) + ( [ ñ ] = ñ ) + ( [ p ] = p ) + ( [ q ] = q ) + ( [ r ] = r ) + ( [ s ] = s ) + ( [ t ] = t ) + ( [ v ] = v ) + ( [ w ] = w ) + ( [ x ] = x ) + ( [ y ] = y ) + ( [ z ] = z ) + ( [ "\'" ] = "\'" ) + ( [ : ] = : ) + ( [ ~ ] = ~ ) + ( [ "\"" ] = "\"" ) + ( [ A ] = a ) + ( [ E ] = e ) + ( [ I ] = i ) + ( [ O ] = o ) + ( [ U ] = u ) + ( [ Á ] = á ) + ( [ É ] = é ) + ( [ Í ] = í ) + ( [ Ó ] = ó ) + ( [ Ú ] = ú ) + ( [ Ü ] = ü ) + ( [ B ] = b ) + ( [ C ] = c ) + ( [ "Ç" ] = s ) + ( [ D ] = d ) + ( [ F ] = f ) + ( [ G ] = g ) + ( [ H ] = h ) + ( [ J ] = j ) + ( [ K ] = k ) + ( [ L ] = l ) + ( [ M ] = m ) + ( [ N ] = n ) + ( [ Ñ ] = ñ ) + ( [ P ] = p ) + ( [ Q ] = q ) + ( [ R ] = r ) + ( [ S ] = s ) + ( [ T ] = t ) + ( [ V ] = v ) + ( [ W ] = w ) + ( [ X ] = x ) + ( [ Y ] = y ) + ( [ Z ] = z ) +)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Main letter to sound rules +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; borja: some rules updated or deleted. +; Rules for directly accented vowels, are typed using +; the sun character set and codepage ISO 8859/1 Latin 1. This +; matches the one on Linux and Windows for our purposes, so +; almost everybody happy. +; Umlaut (dieresis) management. I have considered +; three diferent ways to include the umlaut for spanish in +; festival, using <:> or <">. example: ping:uino ping"uino, +; and of course, directly typing the weird thing (ü). +; Accented vowels can be typed both directly (á) or as a +; quote preceding the plain vowel ('a). example: cami'on camión + +(lts.ruleset +; Name of rule set + spanish +; Sets used in the rules +( + (LNS l n s ) + (DNSR d n s r ) + (EI e i é í) ; note that accented vowels are included in this set + (AEIOUt á é í ó ú ) + (V a e i o u ) + (C b c d f g h j k l m n ñ ~ p q r s t v w x y z ) +) +; Rules +( + + ; these weird rule, to break dipthongs at end of words like atribuid atribuido,... + ( "'" V* C* u [ i ] DNSR # = i ) + ( AEIOUt V* C* u [ i ] DNSR # = i ) ;; $$$ ~n and so, what will do? + ( u [ i ] DNSR # = i1 ) + ( "'" V* C* u [ i ] d V # = i ) + ( AEIOUt V* C* u [ i ] d V # = i ) + ( u [ i ] d AEIOUt # = i ) ;; not sure about these two + ( u [ i ] d V # = i1 ) ;; + + + ( [ a ] = a ) + ( [ e ] = e ) + ( [ i ] = i ) + ( [ o ] = o ) + ( [ u ] = u ) + ( [ "'" a ] = a1 ) + ( [ "'" e ] = e1 ) + ( [ "'" i ] = i1 ) + ( [ "'" o ] = o1 ) + ( [ "'" u ] = u1 ) + ( [ á ] = a1 ) + ( [ é ] = e1 ) + ( [ í ] = i1 ) + ( [ ó ] = o1 ) + ( [ ú ] = u1 ) + ( [ ":" u ] = u ) ; umlaut (u dieresis) (should not happen, only with g, and already removed) + ( [ "\"" u ] = u ) + ( [ ü ] = u ) + + ( [ b ] = b ) + ( [ v ] = b ) + ( [ c ] "'" EI = th ) + ( [ c ] EI = th ) + ( [ c h ] = ch ) + ( [ c ] = k ) + ( [ d ] = d ) + ( [ f ] = f ) + ( [ g ] "'" EI = x ) + ( [ g ] EI = x ) + ( [ g u ] "'" EI = g ) + ( [ g u ] EI = g ) + + ( [ g ":" u ] EI = g u ) ; umlaut (u dieresis) + ( [ g ":" u ] "'" EI = g u ) + ( [ g "\"" u ] EI = g u ) + ( [ g "\"" u ] "'" EI = g u ) + ( [ g ü ] EI = g u ) + ( [ g ü ] "'" EI = g u ) + + ( [ g ] = g ) + ( [ h ] = ) + ( [ j ] = x ) + ( [ k ] = k ) + ( [ l l ] # = l ) + ( [ l l ] = ll ) + ( [ l ] = l ) + ( [ m ] = m ) + ( [ "~" n ] = ny ) + ( [ ñ ] = ny ) + ( [ n ] = n ) + ( [ p ] = p ) + ( [ p h ] = f ) ;; to speak a bit of greek. + ( [ q u ] a = k u ) ;; no castillian word uses this, but it would be pronounced this way in greek and foreign words (aquarium, quo, etc) + ( [ q u ] = k ) + ( [ q ] = k ) ;; should't happend, but if you type it... + ( [ r r ] = rr ) + ( # [ r ] = rr ) + ( LNS [ r ] = rr ) + ( [ r ] = r ) + ( [ s ] = s ) + ( # [ s ] C = e s ) + ( # [ s ] "'" C = e s ) + ( # [ s ] ":" C = e s ) + ( # [ s ] "\"" C = e s ) + ( [ t ] = t ) + ( [ w ] = u ) + ( [ x ] = k s ) + + ( [ y ] # = i ) + ( [ y ] C = i ) + ( [ y ] "'" C = i ) + ( [ y ] ":" C = i ) + ( [ y ] "\"" C = i ) + ( [ y ] = ll ) + + ( [ z ] = th ) + + ; quotes are used for vowel accents in foreign keyboards (i.e. cami'on). + ; remove those that were not before a vowel. same with other signs. + ( [ "'" ] = ) + ( [ ":" ] = ) + ( [ "\"" ] = ) + ( [ "~" ] = ) +)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Spanish sylabification by rewrite rules +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(lts.ruleset + spanish_syl + ( (V a1 i1 u1 e1 o1 a i u e o ) + (IUT i1 u1 ) + (C b ch d f g x k l ll m n ny p r rr s t th ) + ) + ;; Rules will add - at syllable boundary + ( + ;; valid CC groups + ( V C * [ b l ] V = - b l ) + ( V C * [ b r ] V = - b r ) + ( V C * [ k l ] V = - k l ) + ( V C * [ k r ] V = - k r ) + ( V C * [ k s ] V = - k s ) ; for words with "x" + ( V C * [ d r ] V = - d r ) + ( V C * [ f l ] V = - f l ) + ( V C * [ f r ] V = - f r ) + ( V C * [ g l ] V = - g l ) + ( V C * [ g r ] V = - g r ) + ( V C * [ p l ] V = - p l ) + ( V C * [ p r ] V = - p r ) + ( V C * [ t l ] V = - t l ) + ( V C * [ t r ] V = - t r ) + + ;; triptongs + ( [ i a i ] = i a i ) + ( [ i a u ] = i a u ) + ( [ u a i ] = u a i ) + ( [ u a u ] = u a u ) + ( [ i e i ] = i e i ) + ( [ i e u ] = i e u ) + ( [ u e i ] = u e i ) + ( [ u e u ] = u e u ) + ( [ i o i ] = i o i ) + ( [ i o u ] = i o u ) + ( [ u o i ] = u o i ) + ( [ u o u ] = u o u ) + ( [ i a1 i ] = i a1 i ) + ( [ i a1 u ] = i a1 u ) + ( [ u a1 i ] = u a1 i ) + ( [ u a1 u ] = u a1 u ) + ( [ i e1 i ] = i e1 i ) + ( [ i e1 u ] = i e1 u ) + ( [ u e1 i ] = u e1 i ) + ( [ u e1 u ] = u e1 u ) + ( [ i o1 i ] = i o1 i ) + ( [ i o1 u ] = i o1 u ) + ( [ u o1 i ] = u o1 i ) + ( [ u o1 u ] = u o1 u ) + + ;; break invalid triptongs + ( IUT [ i a ] = - i a ) + ( IUT [ i e ] = - i e ) + ( IUT [ i o ] = - i o ) + ( IUT [ u a ] = - u a ) + ( IUT [ u e ] = - u e ) + ( IUT [ u o ] = - u o ) + ( IUT [ a i ] = - a i ) + ( IUT [ e i ] = - e i ) + ( IUT [ o i ] = - o i ) + ( IUT [ a u ] = - a u ) + ( IUT [ e u ] = - e u ) + ( IUT [ o u ] = - o u ) + ( IUT [ i u ] = - i u ) + ( IUT [ u i ] = - u i ) + ( IUT [ i a1 ] = - i a1 ) + ( IUT [ i e1 ] = - i e1 ) + ( IUT [ i o1 ] = - i o1 ) + ( IUT [ u a1 ] = - u a1 ) + ( IUT [ u e1 ] = - u e1 ) + ( IUT [ u o1 ] = - u o1 ) + ( IUT [ a1 i ] = - a1 i ) + ( IUT [ e1 i ] = - e1 i ) + ( IUT [ o1 i ] = - o1 i ) + ( IUT [ a1 u ] = - a1 u ) + ( IUT [ e1 u ] = - e1 u ) + ( IUT [ o1 u ] = - o1 u ) + ( IUT [ i u1 ] = - i u1 ) + ( IUT [ u i1 ] = - u i1 ) + + ;; diptongs + ( [ i a ] = i a ) + ( [ i e ] = i e ) + ( [ i o ] = i o ) + ( [ u a ] = u a ) + ( [ u e ] = u e ) + ( [ u o ] = u o ) + ( [ a i ] = a i ) + ( [ e i ] = e i ) + ( [ o i ] = o i ) + ( [ a u ] = a u ) + ( [ e u ] = e u ) + ( [ o u ] = o u ) + ( [ i u ] = i u ) + ( [ u i ] = u i ) + ( [ i a1 ] = i a1 ) + ( [ i e1 ] = i e1 ) + ( [ i o1 ] = i o1 ) + ( [ u a1 ] = u a1 ) + ( [ u e1 ] = u e1 ) + ( [ u o1 ] = u o1 ) + ( [ a1 i ] = a1 i ) + ( [ e1 i ] = e1 i ) + ( [ o1 i ] = o1 i ) + ( [ a1 u ] = a1 u ) + ( [ e1 u ] = e1 u ) + ( [ o1 u ] = o1 u ) + ( [ u1 i ] = u1 i ) + ( [ i1 u ] = i1 u ) + + ;; Vowels preceeded by vowels are syllable breaks + ;; triptongs and diptongs are dealt with above + ( V [ a ] = - a ) + ( V [ i ] = - i ) + ( V [ u ] = - u ) + ( V [ e ] = - e ) + ( V [ o ] = - o ) + ( V [ a1 ] = - a1 ) + ( V [ e1 ] = - e1 ) + ( V [ i1 ] = - i1 ) + ( V [ o1 ] = - o1 ) + ( V [ u1 ] = - u1 ) + + ;; If any consonant is followed by a vowel and there is a vowel + ;; before it, its a syl break + ;; the consonant cluster are dealt with above + ( V C * [ b ] V = - b ) + ( V C * [ ch ] V = - ch ) + ( V C * [ d ] V = - d ) + ( V C * [ f ] V = - f ) + ( V C * [ g ] V = - g ) + ( V C * [ x ] V = - x ) + ( V C * [ k ] V = - k ) + ( V C * [ l ] V = - l ) + ( V C * [ ll ] V = - ll ) + ( V C * [ m ] V = - m ) + ( V C * [ n ] V = - n ) + ( V C * [ ny ] V = - ny ) + ( V C * [ p ] V = - p ) + ( V C * [ r ] V = - r ) + ( V C * [ rr ] V = - rr ) + ( V C * [ s ] V = - s ) + ( V C * [ t ] V = - t ) + ( V C * [ th ] V = - th ) + + ;; Catch all consonants on their own (at end of word) + ;; and vowels not preceded by vowels are just written as it + ( [ b ] = b ) + ( [ ch ] = ch ) + ( [ d ] = d ) + ( [ f ] = f ) + ( [ g ] = g ) + ( [ x ] = x ) + ( [ k ] = k ) + ( [ l ] = l ) + ( [ ll ] = ll ) + ( [ m ] = m ) + ( [ n ] = n ) + ( [ ny ] = ny ) + ( [ p ] = p ) + ( [ r ] = r ) + ( [ rr ] = rr ) + ( [ s ] = s ) + ( [ t ] = t ) + ( [ th ] = th ) + ( [ a ] = a ) + ( [ i ] = i ) + ( [ u ] = u ) + ( [ e ] = e ) + ( [ o ] = o ) + ( [ a1 ] = a1 ) + ( [ i1 ] = i1 ) + ( [ u1 ] = u1 ) + ( [ e1 ] = e1 ) + ( [ o1 ] = o1 ) + ) +) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Stress assignment in unstress words by rewrite rules +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(lts.ruleset + ;; Assign stress to a vowel when non-exists + spanish.stress + ( + (UV a i u e o) + (V a1 i1 u1 e1 o1 a i u e o) + (V1 a1 i1 u1 e1 o1) + (VNS n s a i u e o) + (C b ch d f g j k l ll m n ny p r rr s t th x ) + (VC b ch d f g j k l ll m n ny p r rr s t th x a1 i1 u1 e1 o1 a i u e o) + (ANY b ch d f g j k l ll m n ny p r rr s t th x - a1 i1 u1 e1 o1 a i u e o) + (notNS b ch d f g j k l ll m ny p r rr t th x ) + (iu i u ) + (aeo a e o) + ) + ( + ;; consonants to themselves + ( [ b ] = b ) + ( [ d ] = d ) + ( [ ch ] = ch ) + ( [ f ] = f ) + ( [ g ] = g ) + ( [ j ] = j ) + ( [ k ] = k ) + ( [ l ] = l ) + ( [ ll ] = ll ) + ( [ m ] = m ) + ( [ n ] = n ) + ( [ ny ] = ny ) + ( [ p ] = p ) + ( [ r ] = r ) + ( [ rr ] = rr ) + ( [ s ] = s ) + ( [ t ] = t ) + ( [ th ] = th ) + ( [ x ] = x ) + ( [ - ] = - ) + ;; stressed vowels to themselves + ( [ a1 ] = a1 ) + ( [ i1 ] = i1 ) + ( [ u1 ] = u1 ) + ( [ e1 ] = e1 ) + ( [ o1 ] = o1 ) + + ( V1 ANY * [ a ] = a ) + ( V1 ANY * [ e ] = e ) + ( V1 ANY * [ i ] = i ) + ( V1 ANY * [ o ] = o ) + ( V1 ANY * [ u ] = u ) + ( [ a ] ANY * V1 = a ) + ( [ e ] ANY * V1 = e ) + ( [ i ] ANY * V1 = i ) + ( [ o ] ANY * V1 = o ) + ( [ u ] ANY * V1 = u ) + + ;; We'll only get here when the vowel is in an unstressed word + ;; two more syllables so don't worry about it yet + ( [ a ] VC * - VC * - = a ) + ( [ e ] VC * - VC * - = e ) + ( [ i ] VC * - VC * - = i ) + ( [ o ] VC * - VC * - = o ) + ( [ u ] VC * - VC * - = u ) + + ( [ a ] ANY * - VC * aeo i # = a ) + ( [ e ] ANY * - VC * aeo i # = e ) + ( [ i ] ANY * - VC * aeo i # = i ) + ( [ o ] ANY * - VC * aeo i # = o ) + ( [ u ] ANY * - VC * aeo i # = u ) + + ( [ a ] VC * - VC * VNS # = a1 ) + ( [ e ] VC * - VC * VNS # = e1 ) + ( [ o ] VC * - VC * VNS # = o1 ) + ( [ i ] aeo C * - VC * VNS # = i ) + ( [ u ] aeo C * - VC * VNS # = u ) + ( aeo [ i ] C * - VC * VNS # = i ) + ( aeo [ u ] C * - VC * VNS # = u ) + ( [ u ] C * - VC * VNS # = u1 ) + ( [ i ] C * - VC * VNS # = i1 ) + + ( [ a ] i # = a1 ) + ( [ e ] i # = e1 ) + ( [ o ] i # = o1 ) + + ;; stress on previous syllable + ( - VC * [ a ] VC * VNS # = a ) + ( - VC * [ e ] VC * VNS # = e ) + ( - VC * [ i ] VC * VNS # = i ) + ( - VC * [ o ] VC * VNS # = o ) + ( - VC * [ u ] VC * VNS # = u ) + ( - VC * [ a ] # = a ) + ( - VC * [ e ] # = e ) + ( - VC * [ i ] # = i ) + ( - VC * [ o ] # = o ) + ( - VC * [ u ] # = u ) + + ;; stress on final syllable + ( [ a ] VC * # = a1 ) + ( [ e ] VC * # = e1 ) + ( [ o ] VC * # = o1 ) + ( aeo [ i ] VC * # = i ) + ( aeo [ u ] VC * # = u ) + ( [ i ] aeo VC * # = i ) + ( [ u ] aeo VC * # = u ) + ( [ i ] VC * # = i1 ) + ( [ u ] VC * # = u1 ) + + ( [ a ] = a ) + ( [ e ] = e ) + ( [ i ] = i ) + ( [ o ] = o ) + ( [ u ] = u ) + +)) + +(lts.ruleset + ;; reduce i and u in diphthongs to u0 i0 + spanish_weak_vowels + ( + (aeo a e o a1 e1 o1 i1 u1 ) + ) + ( + ;; consonants to themselves + ( [ b ] = b ) + ( [ d ] = d ) + ( [ ch ] = ch ) + ( [ f ] = f ) + ( [ g ] = g ) + ( [ j ] = j ) + ( [ k ] = k ) + ( [ l ] = l ) + ( [ ll ] = ll ) + ( [ m ] = m ) + ( [ n ] = n ) + ( [ ny ] = ny ) + ( [ p ] = p ) + ( [ r ] = r ) + ( [ rr ] = rr ) + ( [ s ] = s ) + ( [ t ] = t ) + ( [ th ] = th ) + ( [ x ] = x ) + ( [ - ] = - ) + ;; stressed vowels to themselves + ( [ a1 ] = a1 ) + ( [ i1 ] = i1 ) + ( [ u1 ] = u1 ) + ( [ e1 ] = e1 ) + ( [ o1 ] = o1 ) + + ( aeo [ i ] = i0 ) + ( [ i ] aeo = i0 ) + ( aeo [ u ] = u0 ) + ( [ u ] aeo = u0 ) + + ( [ a ] = a ) + ( [ i ] = i ) + ( [ u ] = u ) + ( [ e ] = e ) + ( [ o ] = o ) +)) + +;;; +;;; Function to turn word into lexical entry for Spanish +;;; +;;; First uses lts to get phoneme string then assigns stress if +;;; there is no stress and then uses a third set of rules to +;;; mark syllable boundaries, finally converting that list +;;; to the bracket structure festival requires +;;; + +(define (spanish_lts word features) + "(spanish_lts WORD FEATURES) +Using various letter to sound rules build a Spanish pronunciation of +WORD." + (let (phones syl stresssyl dword weakened) + (if (lts.in.alphabet word 'spanish_downcase) + (set! dword (spanish_downcase word)) + (set! dword (spanish_downcase "equis"))) + (set! phones (lts.apply dword 'spanish)) + (set! syl (lts.apply phones 'spanish_syl)) + (if (spanish_is_a_content_word + (apply string-append dword) + spanish_guess_pos) + (set! stresssyl (lts.apply syl 'spanish.stress)) + (set! stresssyl syl)) ;; function words leave as is + (set! weakened (lts.apply stresssyl 'spanish_weak_vowels)) + (list word + nil + (spanish_tosyl_brackets weakened)))) + +(define (spanish_is_a_content_word word poslist) + "(spanish_is_a_content_word WORD POSLIST) +Check explicit list of function words and return t if this is not +listed." + (cond + ((null poslist) + t) + ((member_string word (cdr (car poslist))) + nil) + (t + (spanish_is_a_content_word word (cdr poslist))))) + +(define (spanish_downcase word) + "(spanish_downcase WORD) +Downs case word by letter to sound rules becuase or accented form +this can't use the builtin downcase function." + (lts.apply word 'spanish_downcase)) + +(define (spanish_tosyl_brackets phones) + "(spanish_tosyl_brackets phones) +Takes a list of phones containing - as syllable boundary. Construct the +Festival bracket structure." + (let ((syl nil) (syls nil) (p phones) (stress 0)) + (while p + (set! syl nil) + (set! stress 0) + (while (and p (not (eq? '- (car p)))) + (set! syl (cons (car p) syl)) + (if (string-matches (car p) ".*1") + (set! stress 1)) + (set! p (cdr p))) + (set! p (cdr p)) ;; skip the syllable separator + (set! syls (cons (list (reverse syl) stress) syls))) + (reverse syls))) + +(provide 'spanlex) + |