static void convert_numerative_pron(const char *list[], NJDNode * node1, NJDNode * node2) { int i, j; int type = 0; const char *str = NJDNode_get_string(node1); char buff[MAXBUFLEN]; if (strcmp(str, "*") == 0) return; for (i = 0; list[i] != NULL; i += 2) { if (strcmp(list[i], str) == 0) { type = atoi(list[i + 1]); break; } } if (type == 1) { for (i = 0; njd_set_digit_rule_voiced_sound_symbol_list[i] != NULL; i += 2) { str = NJDNode_get_pron(node2); j = strtopcmp(str, njd_set_digit_rule_voiced_sound_symbol_list[i]); if (j >= 0) { strcpy(buff, njd_set_digit_rule_voiced_sound_symbol_list[i + 1]); strcat(buff, &str[j]); NJDNode_set_pron(node2, buff); break; } } } else if (type == 2) { for (i = 0; njd_set_digit_rule_semivoiced_sound_symbol_list[i] != NULL; i += 2) { str = NJDNode_get_pron(node2); j = strtopcmp(str, njd_set_digit_rule_semivoiced_sound_symbol_list[i]); if (j >= 0) { strcpy(buff, njd_set_digit_rule_semivoiced_sound_symbol_list[i + 1]); strcat(buff, &str[j]); NJDNode_set_pron(node2, buff); break; } } } }
void njd_set_pronunciation(NJD * njd) { NJDNode *node; const char *str; int i, j = 0; int pos; int len; for (node = njd->head; node != NULL; node = node->next) { if (NJDNode_get_mora_size(node) == 0) { NJDNode_set_read(node, NULL); NJDNode_set_pron(node, NULL); if (strcmp(NJDNode_get_pos(node), NJD_SET_PRONUNCIATION_KIGOU) == 0 || strcmp(NJDNode_get_pos_group1(node), NJD_SET_PRONUNCIATION_KAZU) == 0) { /* for symbol */ for (i = 0; njd_set_pronunciation_symbol_list[i] != NULL; i += 2) if (strcmp(NJDNode_get_string(node), njd_set_pronunciation_symbol_list[i]) == 0) { NJDNode_set_read(node, (char *) njd_set_pronunciation_symbol_list[i + 1]); NJDNode_set_pron(node, (char *) njd_set_pronunciation_symbol_list[i + 1]); break; } } else if (strcmp(NJDNode_get_pron(node), "*") == 0) { /* for others */ str = NJDNode_get_string(node); len = strlen(str); for (pos = 0; pos < len;) { for (i = 0, j = 0; njd_set_pronunciation_list[i] != NULL; i += 3) { j = strtopcmp(&str[pos], njd_set_pronunciation_list[i]); if (j > 0) break; } if (j > 0) { pos += j; NJDNode_add_read(node, (char *) njd_set_pronunciation_list[i + 1]); NJDNode_add_pron(node, (char *) njd_set_pronunciation_list[i + 1]); NJDNode_add_mora_size(node, atoi(njd_set_pronunciation_list[i + 2])); } else { pos++; } } } } } NJD_remove_silent_node(njd); for (node = njd->head; node != NULL; node = node->next) { if (node->next != NULL && strcmp(NJDNode_get_pron(node->next), NJD_SET_PRONUNCIATION_U) == 0 && strcmp(NJDNode_get_pos(node->next), NJD_SET_PRONUNCIATION_JODOUSHI) == 0 && (strcmp(NJDNode_get_pos(node), NJD_SET_PRONUNCIATION_DOUSHI) == 0 || strcmp(NJDNode_get_pos(node), NJD_SET_PRONUNCIATION_JODOUSHI) == 0) && NJDNode_get_mora_size(node) > 0) { NJDNode_set_pron(node->next, NJD_SET_PRONUNCIATION_CHOUON); } if (node->next != NULL && strcmp(NJDNode_get_pos(node), NJD_SET_PRONUNCIATION_JODOUSHI) == 0 && strcmp(NJDNode_get_string(node->next), NJD_SET_PRONUNCIATION_QUESTION) == 0) { if (strcmp(NJDNode_get_string(node), NJD_SET_PRONUNCIATION_DESU_STR) == 0) NJDNode_set_pron(node, NJD_SET_PRONUNCIATION_DESU_PRON); else if (strcmp(NJDNode_get_string(node), NJD_SET_PRONUNCIATION_MASU_STR) == 0) NJDNode_set_pron(node, NJD_SET_PRONUNCIATION_MASU_PRON); } } }
void JPCommonLabel_push_word(JPCommonLabel * label, const char *pron, const char *pos, const char *ctype, const char *cform, int acc, int chain_flag) { int i; int find; int is_first_word = 1; if (strcmp(pron, JPCOMMON_MORA_SHORT_PAUSE) == 0) { label->short_pause_flag = 1; return; } /* set emotion flag */ if (strcmp(pron, JPCOMMON_MORA_QUESTION) == 0) { if (label->phoneme_tail != NULL) { if (strcmp(label->phoneme_tail->phoneme, JPCOMMON_PHONEME_SHORT_PAUSE) == 0) { if (label->phoneme_tail->prev->up->up->up->emotion == NULL) label->phoneme_tail->prev->up->up->up->emotion = strdup(JPCOMMON_FLAG_QUESTION); } else { if (label->phoneme_tail->up->up->up->emotion == NULL) label->phoneme_tail->up->up->up->emotion = strdup(JPCOMMON_FLAG_QUESTION); } } else { fprintf(stderr, "WARNING: JPCommonLabel_push_word() in jpcommon_label.c: First mora should not be question flag.\n"); } label->short_pause_flag = 1; return; } /* analysis pron */ while (pron[0] != '\0') { find = strtopcmp(pron, JPCOMMON_MORA_LONG_VOWEL); if (find != -1) { /* for long vowel */ if (label->phoneme_tail != NULL && label->short_pause_flag == 0) { JPCommonLabel_insert_pause(label); label->phoneme_tail->next = (JPCommonLabelPhoneme *) calloc(1, sizeof(JPCommonLabelPhoneme)); label->mora_tail->next = (JPCommonLabelMora *) calloc(1, sizeof(JPCommonLabelMora)); JPCommonLabelPhoneme_initialize(label->phoneme_tail->next, label->phoneme_tail->phoneme, label->phoneme_tail, NULL, label->mora_tail->next); JPCommonLabelMora_initialize(label->mora_tail->next, JPCOMMON_MORA_LONG_VOWEL, label->phoneme_tail->next, label->phoneme_tail->next, label->mora_tail, NULL, label->mora_tail->up); label->phoneme_tail = label->phoneme_tail->next; label->mora_tail = label->mora_tail->next; label->word_tail->tail = label->mora_tail; } else { fprintf(stderr, "WARNING: JPCommonLabel_push_word() in jpcommon_label.c: First mora should not be long vowel symbol.\n"); } pron += find; } else { find = strtopcmp(pron, JPCOMMON_MORA_UNVOICE); if (find != -1) { /* for unvoice */ if (label->phoneme_tail != NULL && is_first_word != 1) JPCommonLabelPhoneme_convert_unvoice(label->phoneme_tail); else fprintf(stderr, "WARNING: JPCommonLabel_push_word() in jpcommon_label.c: First mora should not be unvoice flag.\n"); pron += find; } else { /* for normal word */ for (i = 0; jpcommon_mora_list[i] != NULL; i += 3) { find = strtopcmp(pron, jpcommon_mora_list[i]); if (find != -1) break; } if (find != -1) { if (label->phoneme_tail == NULL) { JPCommonLabel_insert_pause(label); label->phoneme_tail = (JPCommonLabelPhoneme *) calloc(1, sizeof(JPCommonLabelPhoneme)); label->mora_tail = (JPCommonLabelMora *) calloc(1, sizeof(JPCommonLabelMora)); label->word_tail = (JPCommonLabelWord *) calloc(1, sizeof(JPCommonLabelWord)); JPCommonLabelPhoneme_initialize(label->phoneme_tail, jpcommon_mora_list[i + 1], NULL, NULL, label->mora_tail); JPCommonLabelMora_initialize(label->mora_tail, jpcommon_mora_list[i], label->phoneme_tail, label->phoneme_tail, NULL, NULL, label->word_tail); JPCommonLabelWord_initialize(label->word_tail, pron, pos, ctype, cform, label->mora_tail, label->mora_tail, NULL, NULL); label->phoneme_head = label->phoneme_tail; label->mora_head = label->mora_tail; label->word_head = label->word_tail; is_first_word = 0; } else { if (is_first_word == 1) { JPCommonLabel_insert_pause(label); label->phoneme_tail->next = (JPCommonLabelPhoneme *) calloc(1, sizeof(JPCommonLabelPhoneme)); label->mora_tail->next = (JPCommonLabelMora *) calloc(1, sizeof(JPCommonLabelMora)); label->word_tail->next = (JPCommonLabelWord *) calloc(1, sizeof(JPCommonLabelWord)); JPCommonLabelPhoneme_initialize(label->phoneme_tail->next, jpcommon_mora_list[i + 1], label->phoneme_tail, NULL, label->mora_tail->next); JPCommonLabelMora_initialize(label->mora_tail->next, jpcommon_mora_list[i], label->phoneme_tail->next, label->phoneme_tail->next, label->mora_tail, NULL, label->word_tail->next); JPCommonLabelWord_initialize(label->word_tail->next, pron, pos, ctype, cform, label->mora_tail->next, label->mora_tail->next, label->word_tail, NULL); label->phoneme_tail = label->phoneme_tail->next; label->mora_tail = label->mora_tail->next; label->word_tail = label->word_tail->next; is_first_word = 0; } else { JPCommonLabel_insert_pause(label); label->phoneme_tail->next = (JPCommonLabelPhoneme *) calloc(1, sizeof(JPCommonLabelPhoneme)); label->mora_tail->next = (JPCommonLabelMora *) calloc(1, sizeof(JPCommonLabelMora)); JPCommonLabelPhoneme_initialize(label->phoneme_tail->next, jpcommon_mora_list[i + 1], label->phoneme_tail, NULL, label->mora_tail->next); JPCommonLabelMora_initialize(label->mora_tail->next, jpcommon_mora_list[i], label->phoneme_tail->next, label->phoneme_tail->next, label->mora_tail, NULL, label->mora_tail->up); label->phoneme_tail = label->phoneme_tail->next; label->mora_tail = label->mora_tail->next; label->word_tail->tail = label->mora_tail; } } if (jpcommon_mora_list[i + 2] != NULL) { JPCommonLabel_insert_pause(label); label->phoneme_tail->next = (JPCommonLabelPhoneme *) calloc(1, sizeof(JPCommonLabelPhoneme)); JPCommonLabelPhoneme_initialize(label->phoneme_tail->next, jpcommon_mora_list[i + 2], label->phoneme_tail, NULL, label->mora_tail); label->phoneme_tail = label->phoneme_tail->next; label->mora_tail->tail = label->phoneme_tail; } pron += find; } else { fprintf(stderr, "WARNING: JPCommonLabel_push_word() in jpcommon_label.c: %s is wrong mora list.\n", pron); break; } } } } /* check */ if (is_first_word == 1) return; if (label->phoneme_tail == NULL) return; if (strcmp(label->phoneme_tail->phoneme, JPCOMMON_PHONEME_SHORT_PAUSE) == 0) return; /* make accent, phrase */ if (label->word_head == label->word_tail) { /* first word */ label->accent_tail = (JPCommonLabelAccentPhrase *) calloc(1, sizeof(JPCommonLabelAccentPhrase)); label->breath_tail = (JPCommonLabelBreathGroup *) calloc(1, sizeof(JPCommonLabelBreathGroup)); label->word_tail->up = label->accent_tail; JPCommonLabelAccentPhrase_initialize(label->accent_tail, acc, NULL, label->word_tail, label->word_tail, NULL, NULL, label->breath_tail); JPCommonLabelBreathGroup_initialize(label->breath_tail, label->accent_tail, label->accent_tail, NULL, NULL); label->accent_head = label->accent_tail; label->breath_head = label->breath_tail; } else if (chain_flag == 1) { /* common accent phrase and common phrase */ label->word_tail->up = label->accent_tail; label->accent_tail->tail = label->word_tail; } else if (strcmp(label->word_tail->prev->tail->tail->next->phoneme, JPCOMMON_PHONEME_SHORT_PAUSE) != 0) { /* different accent phrase && common phrase */ label->accent_tail->next = (JPCommonLabelAccentPhrase *) calloc(1, sizeof(JPCommonLabelAccentPhrase)); label->word_tail->up = label->accent_tail->next; JPCommonLabelAccentPhrase_initialize(label->accent_tail->next, acc, NULL, label->word_tail, label->word_tail, label->accent_tail, NULL, label->breath_tail); label->breath_tail->tail = label->accent_tail->next; label->accent_tail = label->accent_tail->next; } else { /* different accent phrase && different phrase */ label->accent_tail->next = (JPCommonLabelAccentPhrase *) calloc(1, sizeof(JPCommonLabelAccentPhrase)); label->breath_tail->next = (JPCommonLabelBreathGroup *) calloc(1, sizeof(JPCommonLabelBreathGroup)); label->word_tail->up = label->accent_tail->next; JPCommonLabelAccentPhrase_initialize(label->accent_tail->next, acc, NULL, label->word_tail, label->word_tail, label->accent_tail, NULL, label->breath_tail->next); JPCommonLabelBreathGroup_initialize(label->breath_tail->next, label->accent_tail->next, label->accent_tail->next, label->breath_tail, NULL); label->accent_tail = label->accent_tail->next; label->breath_tail = label->breath_tail->next; } }