ljy266987
add lfs
12bfd03
raw
history blame
7.99 kB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;
;;; 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. <slow> or <slow 0.6> 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)