;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;;; ;; | |
;;; Centre for Speech Technology Research ;; | |
;;; University of Edinburgh, UK ;; | |
;;; Copyright (c) 2003, 2004 ;; | |
;;; 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. ;; | |
;;; ;; | |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;;; | |
;;; Multisyn Pause module (Rob Clark and Korin Richmond) | |
;;; | |
;;; | |
(defvar BB_Pause "B_300") | |
(defvar B_Pause "B_150") | |
(defvar mB_Pause "B_150") ; shouldn't be used | |
(define (MultiSyn_Pauses utt) | |
"(MultiSyn_Pauses UTT) | |
Predict pause insertion in a Multisyn unit selection utterance structure." | |
(let ((words (utt.relation.items utt 'Word)) lastword tpname) | |
(if words | |
(begin | |
(insert_initial_pause utt) ;; always have a start pause | |
(set! lastword (car (last words))) | |
(mapcar | |
(lambda (w) | |
(let ((pbreak (item.feat w "pbreak")) | |
(emph (item.feat w "R:Token.parent.EMPH"))) | |
(cond | |
((string-equal pbreak "BB") | |
(unitselection_pause_insert w BB_Pause)) | |
((string-equal pbreak "mB") | |
(unitselection_pause_insert w mB_Pause)) | |
((string-equal pbreak "B") | |
(unitselection_pause_insert w B_Pause))))) | |
words) | |
;; The embarassing bit. Remove any words labelled as punc or fpunc | |
(mapcar | |
(lambda (w) | |
(let ((pos (item.feat w "pos"))) | |
(if (or (string-equal "punc" pos) | |
(string-equal "fpunc" pos)) | |
(let ((pbreak (item.feat w "pbreak")) | |
(wp (item.relation w 'Phrase))) | |
(if (and (string-matches pbreak "BB?") | |
(item.relation.prev w 'Word)) | |
(item.set_feat | |
(item.relation.prev w 'Word) "pbreak" pbreak)) | |
(item.relation.remove w 'Word) | |
;; can't refer to w as we've just deleted it | |
(item.relation.remove wp 'Phrase))))) | |
words))) | |
;(utt.relation.print utt 'Word) | |
;(utt.relation.print utt 'Segment) | |
utt)) | |
(define (unitselection_pause_insert word pause) | |
"(pause_insert word pause) | |
Insert segments needed for a pause." | |
(let ((silence (car (cadr (car (PhoneSet.description '(silences)))))) | |
(seg (item.relation (find_last_seg word) 'Segment)) | |
pause_item) | |
;(format stderr " inserting pause after: %s.\n" (item.name seg)) | |
;(format stderr " Inserting pause\n") | |
; if next seg is not silence insert one. | |
(if (or (not (item.next seg)) | |
(not (string-equal (item.name (item.next seg)) silence))) | |
(item.insert seg (list silence) 'after)) | |
; insert pause after that if not the end. | |
(if (item.next (item.next seg)) | |
(begin | |
(set! pause_item (item.insert (item.next seg) (list pause) 'after)) | |
;if next seg after that is not silence add one. | |
(if (not (string-equal (item.name (item.next pause_item)) silence)) | |
(item.insert pause_item (list silence) 'after)))))) | |
(provide 'multisyn_pauses) | |