phoneme.h
5.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*
* Copyright (C) 2005 to 2010 by Jonathan Duddington
* email: jonsd@users.sourceforge.net
* Copyright (C) 2015 Reece H. Dunn
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see: <http://www.gnu.org/licenses/>.
*/
#ifdef __cplusplus
extern "C"
{
#endif
// phoneme types
#define phPAUSE 0
#define phSTRESS 1
#define phVOWEL 2
#define phLIQUID 3
#define phSTOP 4
#define phVSTOP 5
#define phFRICATIVE 6
#define phVFRICATIVE 7
#define phNASAL 8
#define phVIRTUAL 9
#define phDELETED 14
#define phINVALID 15
// phoneme properties
// bits 16-19 give place of articulation
#define phARTICULATION 0xf0000
#define phWAVE 0x01
#define phUNSTRESSED 0x02
#define phFORTIS 0x08
#define phVOICED 0x10
#define phSIBILANT 0x20
#define phNOLINK 0x40
#define phTRILL 0x80
#define phVOWEL2 0x100 // liquid that is considered a vowel
#define phPALATAL 0x200
#define phSINGLE_INSTN 0x1000 // this phoneme has a single instruction program, with an implicit Return
#define phDONTLIST 0x2000 // don't list in dict_phonemes
#define phBRKAFTER 0x4000 // [*] add a post-pause
#define phNONSYLLABIC 0x100000 // don't count this vowel as a syllable when finding the stress position
#define phLONG 0x200000
#define phLENGTHENSTOP 0x400000 // make the pre-pause slightly longer
#define phRHOTIC 0x800000 // bit 23
#define phNOPAUSE 0x1000000
#define phPREVOICE 0x2000000 // for voiced stops
#define phFLAG1 0x10000000
#define phFLAG2 0x20000000
#define phFLAG3 0x40000000
#define phLOCAL 0x80000000 // used during compilation
// fixed phoneme code numbers, these can be used from the program code
#define phonCONTROL 1
#define phonSTRESS_U 2
#define phonSTRESS_D 3
#define phonSTRESS_2 4
#define phonSTRESS_3 5
#define phonSTRESS_P 6
#define phonSTRESS_P2 7 // priority stress within a word
#define phonSTRESS_PREV 8
#define phonPAUSE 9
#define phonPAUSE_SHORT 10
#define phonPAUSE_NOLINK 11
#define phonLENGTHEN 12
#define phonSCHWA 13
#define phonSCHWA_SHORT 14
#define phonEND_WORD 15
#define phonDEFAULTTONE 17
#define phonCAPITAL 18
#define phonGLOTTALSTOP 19
#define phonSYLLABIC 20
#define phonSWITCH 21
#define phonX1 22 // a language specific action
#define phonPAUSE_VSHORT 23
#define phonPAUSE_LONG 24
#define phonT_REDUCED 25
#define phonSTRESS_TONIC 26
#define phonPAUSE_CLAUSE 27
#define phonVOWELTYPES 28 // 28 to 33
extern const unsigned char pause_phonemes[8]; // 0, vshort, short, pause, long, glottalstop
// place of articulation
#define phPLACE 0xf0000
#define phPLACE_blb 0x10000
#define phPLACE_pla 0x60000
#define N_PHONEME_TABS 150 // number of phoneme tables
#define N_PHONEME_TAB 256 // max phonemes in a phoneme table
#define N_PHONEME_TAB_NAME 32 // must be multiple of 4
// main table of phonemes, index by phoneme number (1-254)
typedef struct {
unsigned int mnemonic; // Up to 4 characters. The first char is in the l.s.byte
unsigned int phflags; // bits 16-19 place of articulation
unsigned short program; // index into phondata file
unsigned char code; // the phoneme number
unsigned char type; // phVOWEL, phPAUSE, phSTOP etc
unsigned char start_type;
unsigned char end_type;
unsigned char std_length; // for vowels, in mS/2; for phSTRESS phonemes, this is the stress/tone type
unsigned char length_mod; // a length_mod group number, used to access length_mod_tab
} PHONEME_TAB;
// Several phoneme tables may be loaded into memory. phoneme_tab points to
// one for the current voice
extern int n_phoneme_tab;
extern int current_phoneme_table;
extern PHONEME_TAB *phoneme_tab[N_PHONEME_TAB];
extern unsigned char phoneme_tab_flags[N_PHONEME_TAB]; // bit 0: not inherited
typedef struct {
char name[N_PHONEME_TAB_NAME];
PHONEME_TAB *phoneme_tab_ptr;
int n_phonemes;
int includes; // also include the phonemes from this other phoneme table
int equivalence_tables; // lists of equivalent phonemes to match other languages, byte index into phondata
} PHONEME_TAB_LIST;
// table of phonemes to be replaced with different phonemes, for the current voice
#define N_REPLACE_PHONEMES 60
typedef struct {
unsigned char old_ph;
unsigned char new_ph;
char type; // 0=always replace, 1=only at end of word
} REPLACE_PHONEMES;
extern int n_replace_phonemes;
extern REPLACE_PHONEMES replace_phonemes[N_REPLACE_PHONEMES];
// Table of phoneme programs and lengths. Used by MakeVowelLists
typedef struct {
unsigned int addr;
unsigned int length;
} PHONEME_PROG_LOG;
#define PH(c1, c2) (c2<<8)+c1 // combine two characters into an integer for phoneme name
#define PH3(c1, c2, c3) (c3<<16)+(c2<<8)+c1
#define PhonemeCode2(c1, c2) PhonemeCode((c2<<8)+c1)
int LookupPhonemeString(const char *string);
int PhonemeCode(unsigned int mnem);
const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme);
void DecodePhonemes(const char *inptr, char *outptr);
extern const char *WordToString(unsigned int word);
extern PHONEME_TAB_LIST phoneme_tab_list[N_PHONEME_TABS];
extern int phoneme_tab_number;
#ifdef __cplusplus
}
#endif