;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;; ;;; 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)