104 lines
4.6 KiB
Scheme
104 lines
4.6 KiB
Scheme
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;; ;;
|
|
;;; 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)
|