mirror of
https://github.com/rhasspy/espeak-ng.git
synced 2026-10-31 05:35:35 +00:00
Implementation for issue #155
This commit is contained in:
@@ -660,9 +660,25 @@ const char *GetTranslatedPhonemeString(int phoneme_mode)
|
||||
|
||||
static int IsLetterGroup(Translator *tr, char *word, int group, int pre)
|
||||
{
|
||||
// match the word against a list of utf-8 strings
|
||||
char *p;
|
||||
char *w;
|
||||
/* match the word against a list of utf-8 strings
|
||||
* How this works:
|
||||
* +-+
|
||||
* |c|<-(tr->letterGroups[group])
|
||||
* |0|
|
||||
* *p->|c|<-len+ +-+
|
||||
* |s|<----+ |a|<-(Actual word to be tested)
|
||||
* |0| *word-> |t|<-*w=word-len+1 (for pre-rule)
|
||||
* |~| |a|<-*w=word (for post-rule)
|
||||
* |7| |s|
|
||||
* +-+ +-+
|
||||
*
|
||||
* 7=RULE_GROUP_EN
|
||||
* 0=null terminator
|
||||
* pre==1 — pre-rule
|
||||
* pre==0 — post-rule
|
||||
*/
|
||||
char *p; // group counter
|
||||
char *w; // word counter
|
||||
int len = 0;
|
||||
|
||||
p = tr->letterGroups[group];
|
||||
@@ -675,18 +691,34 @@ static int IsLetterGroup(Translator *tr, char *word, int group, int pre)
|
||||
w = word - len + 1;
|
||||
} else
|
||||
w = word;
|
||||
|
||||
// If no character is allowed in group
|
||||
// at the start (for pre-rule) or end (post-rule)
|
||||
// of the checked letter in the word, return OK
|
||||
if (*p == '~' && *w == ' ') // word end checked because of comment below
|
||||
return 1;
|
||||
/* TODO need to investigate why word end mark _ doesn't work properly
|
||||
* for post rule somewhere in MatchRule() function. or E.g.:
|
||||
*
|
||||
* .L01 ~ b c
|
||||
* .group a
|
||||
* _L01) a i // this works
|
||||
* a (L01_ u // this doesn't work
|
||||
*/
|
||||
|
||||
while ((*p == *w) && (*w != 0)) {
|
||||
w++;
|
||||
p++;
|
||||
}
|
||||
if (*p == 0) {
|
||||
if (*p == 0) { // matched some of group strings
|
||||
if (pre)
|
||||
return len;
|
||||
return w-word; // matched a complete string
|
||||
else
|
||||
return w - word;
|
||||
}
|
||||
|
||||
while (*p++ != 0) // skip to end of string
|
||||
;
|
||||
while (*p++ != 0) // if string of current group didn't match
|
||||
; // skip till to the end of string
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user