Spaces:
Runtime error
Runtime error
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;;; ;; | |
;;; 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) | |