kevinwang676's picture
Upload 403 files
c06b7e2
raw
history blame
No virus
7.91 kB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; ;;
;;; Centre for Speech Technology Research ;;
;;; University of Edinburgh, UK ;;
;;; Copyright (c) 1998 ;;
;;; 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. ;;
;;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Functions specific to supporting a trained LTS rules
;;;
(define (lts_rules_predict word feats)
(let ((dcword (downcase word))
(syls) (phones))
(if (string-matches dcword "[a-z]*")
(begin
(set! phones
(cdr (reverse (cdr (reverse (lts_predict dcword))))))
(set! phones (add_lex_stress word feats phones))
(set! syls (lex.syllabify.phstress phones))
;; (set! syls (add_lex_stress word syls))
)
(set! syls nil))
(format t "word %l phones %l\n" word syls)
(list word nil syls)))
;(define (add_lex_stress word syls)
; (cond
; ((> (length syls) 1)
; (set-car! (cdr (nth (- (length syls) 2) syls)) 1))
; ((word-is-content word english_guess_pos)
; (set-car! (cdr (car syls)) 1)))
; syls)
(define (word-is-content word guess_pos)
(cond
((null guess_pos)
t)
((member_string word (cdr (car guess_pos)))
nil)
(t
(word-is-content word (cdr guess_pos)))))
(defvar lts_pos nil)
(define (lts_predict word rules)
"(lts_predict word rules)
Return list of phones related to word using CART trees."
(let ((utt (make_let_utt (enworden (wordexplode word)))))
(predict_phones utt rules)
(cdr (reverse (cdr (reverse ;; remove #'s
(mapcar
(lambda (p) (intern (item.name p)))
(utt.relation.items utt 'PHONE))))))
)
)
(define (wordexplode lets)
(if (consp lets)
lets
(symbolexplode lets)))
(define (make_let_utt letters)
"(make_let_utt letters)
Build an utterances from th4ese letters."
(let ((utt (Utterance Text "")))
(utt.relation.create utt 'LTS)
(utt.relation.create utt 'LETTER)
(utt.relation.create utt 'PHONE)
;; Create letter stream
(mapcar
(lambda (l)
(let ((lsi (utt.relation.append utt 'LETTER)))
(item.set_feat lsi "pos" lts_pos)
(item.set_name lsi l)))
letters)
utt))
(define (predict_phones utt rules)
"(predict_phones utt)
Predict phones using CART."
(add_new_phone utt (utt.relation.first utt 'LETTER) '#)
(mapcar
(lambda (lsi)
(let ((tree (car (cdr (assoc_string (item.name lsi) rules)))))
(if (not tree)
(format t "failed to find tree for %s\n" (item.name lsi))
(let ((p (wagon_predict lsi tree)))
; (format t "predict %s %s\n" (item.name lsi) p)
(cond
((string-matches p ".*-.*-.*-.*") ; a quad one
(add_new_phone utt lsi (string-before p "-"))
(add_new_phone utt lsi (string-before (string-after p "-") "-"))
(add_new_phone utt lsi (string-before (string-after (string-after p "-") "-") "-"))
(add_new_phone utt lsi (string-after (string-after (string-after p "-") "-") "-")))
((string-matches p ".*-.*-.*") ; a triple one
(add_new_phone utt lsi (string-before p "-"))
(add_new_phone utt lsi (string-before (string-after p "-") "-"))
(add_new_phone utt lsi (string-after (string-after p "-") "-")))
((string-matches p ".*-.*");; a double one
(add_new_phone utt lsi (string-before p "-"))
(add_new_phone utt lsi (string-after p "-")))
(t
(add_new_phone utt lsi p)))))))
(reverse (cdr (reverse (cdr (utt.relation.items utt 'LETTER))))))
(add_new_phone utt (utt.relation.last utt 'LETTER) '#)
utt)
(define (add_new_phone utt lsi p)
"(add_new_phone utt lsi p)
Add new phone linking to letter, ignoreing it if its _epsilon_."
(if (not (equal? p '_epsilon_))
(let ((psi (utt.relation.append utt 'PHONE)))
(item.set_name psi p)
(item.relation.append_daughter
(utt.relation.append utt 'LTS lsi)
'LTS psi)
)))
(define (enworden lets)
(cons '# (reverse (cons '# (reverse lets)))))
;;; Lexical stress assignment
;;;
(define (add_lex_stress word pos phones tree)
"(add_lex_stress word syls)
Predict lexical stress by decision tree."
(let ((utt (Utterance Text ""))
(si)
(nphones))
(utt.relation.create utt 'Letter)
(set! si (utt.relation.append utt 'Letter))
(item.set_feat si 'pos pos)
(item.set_feat si 'numsyls (count_syls phones))
(item.set_feat si 'sylpos 1)
(set! nphones (add_lex_stress_syl phones si tree))
; (format t "%l\n" phones)
; (format t "%l\n" nphones)
nphones))
(define (count_syls phones)
(cond
((null phones) 0)
((string-matches (car phones) "[aeiou@].*")
(+ 1 (count_syls (cdr phones))))
(t (count_syls (cdr phones)))))
(define (add_lex_stress_syl phones si tree)
"(add_lex_stress_syl phones si tree)
Add lexical stressing."
(cond
((null phones) nil)
((string-matches (car phones) "[aeiou@].*")
(item.set_feat si 'phone (car phones))
(item.set_feat si 'name (car phones))
(item.set_feat si 'num2end
(- (+ 1 (item.feat si 'numsyls))
(item.feat si 'sylpos)))
(set! stress (wagon_predict si tree))
(item.set_feat si 'sylpos
(+ 1 (item.feat si 'sylpos)))
(cons
(if (not (string-equal stress "0"))
(string-append (car phones) stress)
(car phones))
(add_lex_stress_syl (cdr phones) si tree)))
(t
(cons
(car phones)
(add_lex_stress_syl (cdr phones) si tree)))))
;;; Morphological analysis
;(define (wfst_stemmer)
; (wfst.load 'stemmer "/home/awb/projects/morpho/engstemmer.wfst")
; (wfst.load 'stemmerL "/home/awb/projects/morpho/engstemmerL.wfst")
; t)
;(define (stem word)
; (wfst.transduce 'stemmer (enworden (symbolexplode word))))
;(define (stemL word)
; (wfst.transduce 'stemmerL (enworden (symbolexplode word))))
(provide 'lts)