Statistics
| Branch: | Tag: | Revision:

hlrc / server / src / MouthConfig.cpp @ 13362ced

History | View | Annotate | Download (8.351 KB)

1 0c286af0 Simon Schulz
/*
2
* This file is part of hlrc_server
3
*
4
* Copyright(c) sschulz <AT> techfak.uni-bielefeld.de
5
* http://opensource.cit-ec.de/projects/hlrc_server
6
*
7
* This file may be licensed under the terms of the
8
* GNU General Public License Version 3 (the ``GPL''),
9
* or (at your option) any later version.
10
*
11
* Software distributed under the License is distributed
12
* on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
13
* express or implied. See the GPL for the specific language
14
* governing rights and limitations.
15
*
16
* You should have received a copy of the GPL along with this
17
* program. If not, go to http://www.gnu.org/licenses/gpl.html
18
* or write to the Free Software Foundation, Inc.,
19
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
*
21
* The development of this software was supported by the
22
* Excellence Cluster EXC 277 Cognitive Interaction Technology.
23
* The Excellence Cluster EXC 277 is a grant of the Deutsche
24
* Forschungsgemeinschaft (DFG) in the context of the German
25
* Excellence Initiative.
26
*
27
*/
28
29
#include "MouthConfig.h"
30
using namespace std;
31
32
MouthConfig::MouthConfig(){
33
    init_by_symbol("");
34
}
35
36
MouthConfig::MouthConfig(string symbol){
37
    init_by_symbol(symbol);
38
}
39
40
41
MouthConfig::~MouthConfig(){
42
}
43
44
void MouthConfig::init_by_symbol(string symbol){
45
    //default is no change:
46
    for(int i=0; i<2; i++){
47
        opening[i] = 0.0;
48
        override[i] = 0.0;
49
    }
50
51
    //default?
52
    if (symbol.length() == 0){
53
        return;
54
    }
55
56
    //see http://www.phon.ucl.ac.uk/home/sampa/german.htm
57
    if (symbol.length() ==1){
58
        //single digit phonemes:
59
        unsigned char sc = symbol.c_str()[0];
60
        switch(sc){
61
            default:
62
                printf("> ignoring unknown phoneme '%c'\n",sc);
63
                break;
64
65
            case('_'): //pause
66
                break;
67
68
            case('T'): //en: _th_in
69
            case('D'): //en: _th_is
70
                //as we dont have a tongue, only open the mouth slighly
71
                override[CENTER] = true;
72
                opening[CENTER] = 4.0;
73
                break;
74
75
            case('u'): //en: l_o_se
76
                 override[CENTER] = true;
77
                 opening[CENTER]  = 13.0;
78
79
            case('e'): //en: r_ai_se
80
                 override[CENTER] = true;
81
                 opening[CENTER]  = 5.0;
82
                    break;
83
84
            case('V'): //en: c_u_t
85
                 override[CENTER] = true;
86
                 opening[CENTER]  = 3.0;
87
                 break;
88
89
            case('{'): //en: p_a_t
90
                 //open mouth
91
                 override[CENTER] = true;
92
                 opening[CENTER]  = 12.0;
93
                 break;
94
95
            case('w'): //en: _w_asp
96
                //mouth nearly closed:
97
                override[CENTER] = true;
98
                opening[CENTER] = 4.0;
99
                break;
100
101
            case('p'): //Pein + en: _p_in
102
            case('b'): //Bein
103
                //close mouth at the center:
104
                override[CENTER] = true;
105
                break;
106
107
            case('t'): //Teich
108
            case('d'): //Deich
109
            case('k'): //Kunst
110
            case('g'): //Gunst
111
                //open mouth at the center
112
                override[CENTER] = true;
113
                opening[CENTER]  = 11.0;
114
                break;
115
116
            case('?'): //global stop?! ignore
117
                break;
118
119
            case('f'): //fast
120
            case('v'): //was
121
            case('@'): // unstressed "schwa" vowel is
122
                override[CENTER] = true;
123
                opening[CENTER] = 4.0;
124
                break;
125
126
            case('z'): //Tasse
127
            case('s'): //Tasse
128
            case('Z'): //Genie
129
            case('C'): //Ich
130
            case('j'): //Jahr
131
            case('x'): //Buch
132
            case('h'): //Hand
133
                override[CENTER] = true;
134
                opening[CENTER] = 7.0;
135
                break;
136
137
            case('S'): //waschen
138
            case('O'): //Trotz
139
            case('9'): //plötzlich
140
                override[CENTER] = true;
141
                opening[CENTER] = 11.0;
142
                break;
143
144
            case('m'): //mein
145
                override[CENTER] = true;
146
                break;
147
148
            case('n'): //nein
149
            case('N'): //Ding
150
            case('l'): //leim
151
            case('R'): //Reim
152
            case('r'): //en: wrong
153
            case('I'): //Sitz
154
            case('i'): //en: _ea_se
155
            case('E'): //gesetz
156
            case('a'): //Satz
157
            case('U'): //Schutz
158
            case('Y'): //hübsch
159
                override[CENTER] = true;
160
                opening[CENTER] = 7.0;
161
                break;
162
163
            case('o'): //en: n_o_se
164
            case('Q'): //gb: p_o_t
165
            case('A'): //english o
166
                override[CENTER] = true;
167
                opening[CENTER]  = 13.0;
168
                break;
169
            //r:
170
            case('6'): //besser
171
                override[CENTER] = true;
172
                opening[CENTER] = 3.0;
173
                break;
174
175
        }
176
    }else if (symbol.length() == 2){
177
        if (symbol == "pf"){ //Pfahl
178
            override[CENTER] = true;
179
        }else if(symbol == "ts"){ //Zahl
180
            override[CENTER] = true;
181
            opening[CENTER]  = 11.0;
182
        }else if(symbol == "tS"){ //deutsch
183
            override[CENTER] = true;
184
            opening[CENTER]  = 10.5;
185
        }else if(symbol == "dZ"){ //Dschungel
186
            override[CENTER] = true;
187
            opening[CENTER]  = 11.0;
188
        }else if (
189
                (symbol == "OI") || //en: n_oi_se
190
                (symbol == "@`") || //en: c_o_rner
191
                (symbol == "@U") || //gb: n_o_se
192
                (symbol == "o:") || //rot
193
                (symbol == "O:") || //gb: c_au_se
194
                (symbol == "U@") || //gb: c_u_res
195
                (symbol == "u:") || //Blut
196
                (symbol == "y:") || //süß
197
                (symbol == "2:") || //blöd
198
                (symbol == "aU")    //Haus
199
                  ){
200
            override[CENTER] = true;
201
            opening[CENTER]  = 13.0;
202
        }else if (
203
                (symbol == "i:") || //Lied
204
                (symbol == "I@") || //gb: f_ea_rs
205
                (symbol == "e:") || //Beet
206
                (symbol == "E:") || //spät
207
                (symbol == "a:") || //Tat
208
                (symbol == "A:")    //gb: st_a_rs
209
                  ){
210
            override[CENTER] = true;
211
            opening[CENTER]  = 9.0;
212
        }else if (
213
                  (symbol == "aI")|| //Eis
214
                  (symbol == "eI")   //gb: r_ai_se
215
                  ){
216
            override[CENTER] = true;
217
            opening[CENTER]  = 5.0;
218
        }else if(
219
                 (symbol == "OY") || //Kreuz
220
                 (symbol == "3:") || //gb: f_ur_s
221
                 (symbol == "3`")    //en: f_ur_s
222
                 ){
223
            override[CENTER] = true;
224
            opening[CENTER]  = 5.0;
225
        }else if (
226
                  (symbol == "I6") || //Wirt
227
                  (symbol == "Y6") || //Türke
228
                  (symbol == "E6") || //Berg
229
                  (symbol == "96") || //Wörter
230
                  (symbol == "a6") || //hart
231
                  (symbol == "U6") || //kurz
232
                  (symbol == "e@") || //gb: st_ai_rs
233
                  (symbol == "O6") //dort
234
                  ){
235
            override[CENTER] = true;
236
            opening[CENTER]  = 5.0;
237
        }
238
    }else if (symbol.length() == 3){
239
        if(
240
                (symbol == "i:6") || //Tier
241
                (symbol == "y:6") || //Tür
242
                (symbol == "e:6") || //schwer
243
                (symbol == "E:6") || //Bär
244
                (symbol == "2:6") || //Föhr
245
                (symbol == "a:6") || //Haar
246
                (symbol == "u:6") || //Kur
247
                (symbol == "o:6")    //Ohr
248
                ){
249
            override[CENTER] = true;
250
            opening[CENTER]  = 5.0;
251
        }else{
252
            printf("> invalid phoneme '%s' unhandled\n",symbol.c_str());
253
        }
254
    }else{
255
        printf("> invalid phoneme length, phoneme '%s' unhandled\n",symbol.c_str());
256
    }
257
258
259
}
260
261
262
void MouthConfig::apply_on_mouth_state(humotion::MouthState *m){
263
    if (override[LEFT]){
264
        m->opening_left = opening[LEFT];
265
    }else{
266
        m->opening_left += opening[LEFT];
267
    }
268
269
    if (override[CENTER]){
270
        m->opening_center = opening[CENTER];
271
    }else{
272
        m->opening_center += opening[CENTER];
273
    }
274
275
    if (override[RIGHT]){
276
        m->opening_right = opening[RIGHT];
277
    }else{
278
        m->opening_right += opening[RIGHT];
279
    }
280
}