| #include "config.h" | #include "config.h" | ||||
| #include <errno.h> | #include <errno.h> | ||||
| #include <stdint.h> | |||||
| #include <string.h> | |||||
| #include <espeak-ng/espeak_ng.h> | #include <espeak-ng/espeak_ng.h> | ||||
| #include <espeak-ng/speak_lib.h> | #include <espeak-ng/speak_lib.h> | ||||
| #include "phoneme.h" | #include "phoneme.h" | ||||
| #include "speech.h" | |||||
| #include "error.h" | #include "error.h" | ||||
| #define FEATURE(a, b, c) ((a << 16) | (b << 8) | (c)) | |||||
| // See docs/phonemes.md for the list of supported features. | // See docs/phonemes.md for the list of supported features. | ||||
| enum feature_t { | enum feature_t { | ||||
| // invalid phoneme feature name | // invalid phoneme feature name | ||||
| inv, // Not in docs/phonemes.md. This is used to signal an unknown feature name. | inv, // Not in docs/phonemes.md. This is used to signal an unknown feature name. | ||||
| // manner of articulation | // manner of articulation | ||||
| nas, | |||||
| stp, | |||||
| afr, | |||||
| frc, | |||||
| flp, | |||||
| trl, | |||||
| apr, | |||||
| clk, | |||||
| ejc, | |||||
| imp, | |||||
| vwl, | |||||
| lat, | |||||
| sib, | |||||
| nas = FEATURE('n', 'a', 's'), | |||||
| stp = FEATURE('s', 't', 'p'), | |||||
| afr = FEATURE('a', 'f', 'r'), | |||||
| frc = FEATURE('f', 'r', 'c'), | |||||
| flp = FEATURE('f', 'l', 'p'), | |||||
| trl = FEATURE('t', 'r', 'l'), | |||||
| apr = FEATURE('a', 'p', 'r'), | |||||
| clk = FEATURE('c', 'l', 'k'), | |||||
| ejc = FEATURE('e', 'j', 'c'), | |||||
| imp = FEATURE('i', 'm', 'p'), | |||||
| vwl = FEATURE('v', 'w', 'l'), | |||||
| lat = FEATURE('l', 'a', 't'), | |||||
| sib = FEATURE('s', 'i', 'b'), | |||||
| }; | }; | ||||
| static MNEM_TAB features[] = { | |||||
| // manner of articulation | |||||
| { "nas", nas }, | |||||
| { "stp", stp }, | |||||
| { "frc", frc }, | |||||
| { "afr", afr }, | |||||
| { "flp", flp }, | |||||
| { "trl", trl }, | |||||
| { "apr", apr }, | |||||
| { "clk", clk }, | |||||
| { "ejc", ejc }, | |||||
| { "imp", imp }, | |||||
| { "vwl", vwl }, | |||||
| { "lat", lat }, | |||||
| { "sib", sib }, | |||||
| // invalid phoneme feature | |||||
| { NULL, inv }, | |||||
| }; | |||||
| uint32_t lookup_feature(const char *feature) { | |||||
| if (strlen(feature) != 3) | |||||
| return inv; | |||||
| return FEATURE(feature[0], feature[1], feature[2]); | |||||
| } | |||||
| espeak_ng_STATUS | espeak_ng_STATUS | ||||
| phoneme_add_feature(PHONEME_TAB *phoneme, | phoneme_add_feature(PHONEME_TAB *phoneme, | ||||
| { | { | ||||
| if (!phoneme || !feature) return EINVAL; | if (!phoneme || !feature) return EINVAL; | ||||
| switch (LookupMnem(features, feature)) | |||||
| switch (lookup_feature(feature)) | |||||
| { | { | ||||
| // manner of articulation | // manner of articulation | ||||
| case nas: | case nas: |