ljy266987
add lfs
12bfd03
raw
history blame
4.71 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. ;;
;;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Support for MBROLA as an external module.
;;;
;;; You might want to set this in your sitevars.scm
(defvar mbrola_progname "/cstr/external/mbrola/mbrola"
"mbrola_progname
The program name for mbrola.")
(defvar mbrola_database "fr1"
"mbrola_database
The name of the MBROLA database to usde during MBROLA Synthesis.")
(define (MBROLA_Synth utt)
"(MBROLA_Synth UTT)
Synthesize using MBROLA as external module. Basically dump the info
from this utterance. Call MBROLA and reload the waveform into utt.
[see MBROLA]"
(let ((filename (make_tmp_filename))
)
(save_segments_mbrola utt filename)
(system (string-append mbrola_progname " "
mbrola_database " "
filename " "
filename ".au"))
(utt.import.wave utt (string-append filename ".au"))
(apply_hooks after_synth_hooks utt)
(delete-file filename)
(delete-file (string-append filename ".au"))
utt))
(define (save_segments_mbrola utt filename)
"(save_segments_mbrola UTT FILENAME)
Save segment information in MBROLA format in filename. The format is
phone duration (ms) [% position F0 target]*. [see MBROLA]"
(let ((fd (fopen filename "w")))
(mapcar
(lambda (segment)
(save_seg_mbrola_entry
(item.feat segment 'name)
(item.feat segment 'segment_start)
(item.feat segment 'segment_duration)
(mapcar
(lambda (targ_item)
(list
(item.feat targ_item "pos")
(item.feat targ_item "f0")))
(item.relation.daughters segment 'Target)) ;; list of targets
fd))
(utt.relation.items utt 'Segment))
(fclose fd)))
(define (save_seg_mbrola_entry name start dur targs fd)
"(save_seg_mbrola_entry ENTRY NAME START DUR TARGS FD)
Entry contains, (name duration num_targs start 1st_targ_pos 1st_targ_val)."
(format fd "%s %d " name (nint (* dur 1000)))
(if targs ;; if there are any targets
(mapcar
(lambda (targ) ;; targ_pos and targ_val
(let ((targ_pos (car targ))
(targ_val (car (cdr targ))))
(format fd "%d %d "
(nint (* 100 (/ (- targ_pos start) dur))) ;; % pos of target
(nint (parse-number targ_val))) ;; target value
))
targs))
(terpri fd)
(terpri fd)
)
(provide 'mbrola)