;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;; ;;; 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. ;; ;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; An example tts text mode for reading OGI's CSLU toolkit mark up ;;; ;;; Note not all tokens do something in festival but all are removed ;;; from the actual text ;;; (defvar ogimarkup_eou_tree '((n.name matches "<.*") ((1)) ((n.whitespace matches ".*\n.*\n\\(.\\|\n\\)*") ;; A significant break (2 nls) ((1)) ((punc in ("?" ":" "!")) ((1)) ((punc is ".") ;; This is to distinguish abbreviations vs periods ;; These are heuristics ((name matches "\\(.*\\..*\\|[A-Z][A-Za-z]?[A-Za-z]?\\|etc\\)") ;; an abbreviation ((n.whitespace is " ") ((0)) ;; if abbrev single space isn't enough for break ((n.name matches "[A-Z].*") ((1)) ((0)))) ((n.whitespace is " ") ;; if it doesn't look like an abbreviation ((n.name matches "[A-Z].*") ;; single space and non-cap is no break ((1)) ((0))) ((1)))) ((0))))))) (define (ogimarkup_init_func) "Called on starting ogimarkup text mode." (set! ogimarkup_in_tag nil) (set! ogimarkup_tagtokens "") (set! ogimarkup_previous_t2w_func token_to_words) (set! english_token_to_words ogimarkup_token_to_words) (set! token_to_words ogimarkup_token_to_words) (set! ogimarkup_previous_eou_tree eou_tree) (set! eou_tree ogimarkup_eou_tree)) (define (ogimarkup_exit_func) "Called on exit ogimarkup text mode." (Parameter.set 'Duration_Stretch 1.0) (set! token_to_words ogimarkup_previous_t2w_func) (set! english_token_to_words ogimarkup_previous_t2w_func) (set! eou_tree ogimarkup_previous_eou_tree)) (define (ogimarkup_token_to_words token name) "(ogimarkup_token_to_words token name) OGI markup specific token to word rules. Tags may have optional argument e.g. or which means the tag may be over a number of tokens." (let (tag (arg nil) (rval nil)) (cond ((string-matches name "<.*") (set! ogimarkup_tagtokens "") (set! tag (string-after name "<")) (if (string-matches tag ".*>$") (set! tag (string-before tag ">")) (if (string-matches (set! arg (item.feat token "n.name")) ".*>$") (set! arg (string-before arg ">")))) (set! ogimarkup_in_tag tag) (cond ((string-equal tag "slow") (Parameter.set 'Duration_Stretch 1.3)) ((string-equal tag "SLOW") (Parameter.set 'Duration_Stretch 2.0)) ((string-equal tag "normal") (Parameter.set 'Duration_Stretch 1.0)) ((string-matches tag "FAST") (Parameter.set 'Duration_Stretch 0.5)) ((string-matches tag "fast") (Parameter.set 'Duration_Stretch 0.8)) ((string-matches tag"spell") ;; This ain't really right as we'll get an utterance break here (set! rval (symbolexplode arg))) ((string-matches tag "phone") ;; This ain't really right as we'll get an utterance break here (item.set_feat token "token_pos" "digits") ;; canonical phone number (set! rval (ogimarkup_previous_t2w_func token arg))) ((string-matches tag "male") (if (and (member 'OGIresLPC *modules*) (symbol-bound? 'voice_aec_diphone)) (voice_aec_diphone) (voice_kal_diphone))) ((string-matches tag "Male") (if (and (member 'OGIresLPC *modules*) (symbol-bound? 'voice_mwm_diphone)) (voice_mwm_diphone) (voice_cmu_us_rms_cg))) ((string-matches tag "MALE") (if (and (member 'OGIresLPC *modules*) (symbol-bound? 'voice_jph_diphone)) (voice_jph_diphone) (voice_rab_diphone))) ((string-matches tag "FT") t) ;; do nothing until the end of this tag ((string-matches (downcase tag) "female") ;; only one female voice so map female Female FEMALE to it (if (and (member 'OGIresLPC *modules*) (symbol-bound? 'voice_tll_diphone)) (voice_tll_diphone) (voice_cmu_us_slt_arctic_hts)))) (if (string-matches name ".*>$") (set! ogimarkup_in_tag nil)) rval ;; mostly nil ) ((string-matches name ".*>$") (set! ogimarkup_tagtokens (string-append ogimarkup_tagtokens (ogimarkup_get_token_string token t))) ;; delete final > (if (string-equal ogimarkup_in_tag "FT") (ogimarkup_festival_eval ogimarkup_tagtokens)) (set! ogimarkup_in_tag nil) ;; end of tag nil) (ogimarkup_in_tag (set! ogimarkup_tagtokens (string-append ogimarkup_tagtokens (ogimarkup_get_token_string token nil))) nil) ;; still in tag (t ;; for all other cases (ogimarkup_previous_t2w_func token name))))) (set! tts_text_modes (cons (list 'ogimarkup ;; mode name (list ;; ogimarkup mode params (list 'init_func ogimarkup_init_func) (list 'exit_func ogimarkup_exit_func))) tts_text_modes)) (define (ogimarkup_get_token_string token delend) "(ogimarkup_get_token_string TOKEN DELEND) return string for token including whitespace and punctuation. If DELEND is true remove > from the name." (string-append (item.feat token "whitespace") (item.feat token "prepunctuation") (if delend (string-before (item.feat token "name") ">") (item.feat token "name")) (if (string-equal "0" (item.feat token "punc")) "" (item.feat token "punc")))) (define (ogimarkup_festival_eval tagtokens) "(ogimarkup_festival_eval TAGTOKENS Take a string of the tokens within the tag and read an s-expression from it and then evaluate it." (let ((com "") (command nil)) (set! command (read-from-string tagtokens)) (eval command))) (provide 'ogimarkup-mode)