upstream version 1.2.2
[debian/freetts] / de / dfki / lt / freetts / mbrola / ParametersToMbrolaConverter.java
1 /**
2  * Copyright 2002 DFKI GmbH.
3  * All Rights Reserved.  Use is subject to license terms.
4  *
5  * See the file "license.terms" for information on usage and
6  * redistribution of this file, and for a DISCLAIMER OF ALL
7  * WARRANTIES.
8  */
9
10 package de.dfki.lt.freetts.mbrola;
11
12 import com.sun.speech.freetts.Item;
13 import com.sun.speech.freetts.ProcessException;
14 import com.sun.speech.freetts.Relation;
15 import com.sun.speech.freetts.Utterance;
16 import com.sun.speech.freetts.UtteranceProcessor;
17
18 /**
19  * Utterance processor converting phoneme timing and f0-time targets
20  * into MBROLA format.
21  */
22 public class ParametersToMbrolaConverter implements UtteranceProcessor {
23
24     /**
25      * Convert phoneme timing and f0-time targets
26      * into MBROLA format. The results are saved in the Segment relations,
27      * as features <code>"mbr_dur"</code> (int-valued) and
28      * <code>"mbr_targets"</code> (String-valued). MBROLA-converted targets
29      * are saved in the Segment relation because in MBROLA input, targets
30      * are represented as properties of the segments during which they occur.
31      *
32      * @param  utterance  the utterance to process
33      *
34      * @throws ProcessException if an error occurs while
35      *         processing of the utterance
36      */
37     public void processUtterance(Utterance utterance) throws ProcessException {
38         Relation segmentRelation = utterance.getRelation(Relation.SEGMENT);
39         Relation targetRelation = utterance.getRelation(Relation.TARGET);
40
41         Item segment = segmentRelation.getHead();
42         Item target = null;
43         if (targetRelation != null) target = targetRelation.getHead();
44         float prevEnd = 0f;
45         while (segment != null) {
46             // String name = segment.getFeatures().getString("name");
47             // Accumulated duration of all segments in the utterance,
48             // in seconds:
49             float end = segment.getFeatures().getFloat("end");
50             // Individual duration of segment, in milliseconds:
51             int dur = (int) ((end - prevEnd) * 1000);
52             StringBuffer targetStringBuffer = new StringBuffer();
53             while (target != null &&
54                    target.getFeatures().getFloat("pos") <= end) {
55                 float pos = target.getFeatures().getFloat("pos");
56                 // time axis as percentage of segment duration:
57                 int percentage = ((int) ((pos - prevEnd) * 1000)) * 100 / dur;
58                 // f0 as an integer:
59                 int f0 = (int) target.getFeatures().getFloat("f0");
60                 targetStringBuffer.append(" ");
61                 targetStringBuffer.append(percentage);
62                 targetStringBuffer.append(" ");
63                 targetStringBuffer.append(f0);
64                 target = target.getNext();
65             }
66             // System.err.println(name + " " + dur + targetStringBuffer);
67             segment.getFeatures().setInt("mbr_dur", dur);
68             segment.getFeatures().setString("mbr_targets",
69                                             targetStringBuffer.toString().trim());
70             prevEnd = end;
71             segment = segment.getNext();
72         }
73     }
74
75     public String toString() {
76         return "ParametersToMbrolaConverter";
77     }
78 }