static const char* setSentenceType(const SItem *phrase, SMap *puncMap, s_erc *error) { S_CLR_ERR(error); const char* result = NULL; /* types: "decl, "excl", "interrog" */ /* stop at sentence's last token */ const SItem *wordFromCurrentPhrase = SItemPathToItem(phrase, "daughtern", error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SItemPathToItem\" failed")) return NULL; SItem *wordAsToken = SItemAs(wordFromCurrentPhrase, "Token", error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SItemAs\" failed")) return NULL; SItem *tokenItem = SItemParent(wordAsToken, error); tokenItem = SItemNext(tokenItem, error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SItemNext\" failed")) return NULL; const char *punctStr = SItemGetName(tokenItem, error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SItemGetName\" failed")) return NULL; s_bool found= SMapObjectPresent(puncMap, punctStr, error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SMapObjectPresent\" failed")) return NULL; result = punctStr; if( found == TRUE) { result = SMapGetString ( puncMap, punctStr, error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SMapGetString\" failed")) return NULL; } else { result = NULL; } return result; }
static const char* read_token(void* data, int n, int* error) { s_erc tmperror; SItem** nodeList = data; const char* name = SItemGetName(nodeList[n], &tmperror); if (S_CHK_ERR(&tmperror, S_CONTERR, "read_token", "Call to \"SItemGetName\" failed")) *error = 1; return name; }
static s_bool segment_is_pause(const SItem *item, s_erc *error) { const SVoice *voice; const SPhoneset *phoneset; s_bool is_pause; S_CLR_ERR(error); voice = SItemVoice(item, error); if (S_CHK_ERR(error, S_CONTERR, "segment_is_pause", "Call to \"SItemVoice\" failed")) return FALSE; if (voice == NULL) { S_CTX_ERR(error, S_FAILURE, "segment_is_pause", "Item voice is NULL, voice is required to get phoneset"); return FALSE; } phoneset = S_PHONESET(SVoiceGetData(voice, "phoneset", error)); if (S_CHK_ERR(error, S_CONTERR, "segment_is_pause", "Call to \"SVoiceGetData\" failed")) return FALSE; if (phoneset == NULL) { S_CTX_ERR(error, S_FAILURE, "segment_is_pause", "Phoneset is NULL, phoneset is required to get silence phone"); return FALSE; } is_pause = S_PHONESET_CALL(phoneset, phone_has_feature)(phoneset, SItemGetName(item, error), "pause", error); if (S_CHK_ERR(error, S_CONTERR, "segment_is_pause", "Call to \"phone_has_feature/SItemGetName\" failed")) return FALSE; return is_pause; }
/* setSentenceType should be made out of two parts: * 1) the first section searchs for the last punctuation element of the sentence * -> if it is a '.' --> set "decl" type (where should I set this feature value?) * -> if it is a '!' --> set "excl" type (where should I set this feature value?) * -> if it is a '?' --> set "interrog" type (where should I set this feature value?) * 2) if the first part decides for "interrog" type, there should be other controls * to establish the sentence's complete type * */ static char* setSentenceType(const SItem *phrase, SMap *prosSymbols, s_erc *error) { S_CLR_ERR(error); char* result = "decl"; /* types: "decl, "excl", "interrog" */ /* stop at sentence's last token */ const SItem *wordFromCurrentPhrase = SItemPathToItem(phrase, "daughter", error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SItemPathToItem\" failed")) return NULL; SItem *wordAsToken = SItemAs(wordFromCurrentPhrase, "Token", error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SItemAs\" failed")) return NULL; SItem *tokenItem = SItemParent(wordAsToken, error); SItem *firstTokenItem = tokenItem; s_bool isPunct = SItemFeatureIsPresent(tokenItem, "IsPunctuation", error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SItemFeatureIsPresent\" failed")) return NULL; s_bool isFinalPunct = FALSE; while (isFinalPunct == FALSE) { isPunct = SItemFeatureIsPresent(tokenItem, "IsPunctuation", error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SItemFeatureIsPresent\" failed")) return NULL; if (isPunct) { const char *punctStr = SItemGetName(tokenItem, error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SItemGetName\" failed")) return NULL; if (s_strcmp(punctStr, ".", error) == 0) { isFinalPunct = TRUE; result = "decl"; } else if (s_strcmp(punctStr, "!", error) == 0) { isFinalPunct = TRUE; result = "excl"; } else if (s_strcmp(punctStr, "?", error) == 0) { isFinalPunct = TRUE; const char *posValueStr = NULL; char *posValueStr_filtered = NULL; s_bool currPosInCurrList; s_bool have_symbols = FALSE; SMap* valueMap = NULL; have_symbols = SMapObjectPresent(prosSymbols, "firstPosInQuestionW", error); if (S_CHK_ERR(error, S_CONTERR, "SetSentenceType", "Call to \"SMapObjectPresent\" failed")) goto quit_error; if (have_symbols) { valueMap = S_CAST(SMapGetObject(prosSymbols, "firstPosInQuestionW", error), SMap, error); if (S_CHK_ERR(error, S_CONTERR, "SetSentenceType", "Call to \"SMapGetObject\" failed")) goto quit_error; } else goto quit_error; posValueStr = SItemGetString(firstTokenItem, "POS", error); if (S_CHK_ERR(error, S_CONTERR, "SetSentenceType", "Call to \"SItemGetString\" failed")) goto quit_error; /* filter the current POS tag, remember to free the memory * pointed to by 'posValueStr_filtered' pointer */ posValueStr_filtered = filterPosTag(posValueStr, error); if (S_CHK_ERR(error, S_CONTERR, "SetSentenceType", "Call to \"filterPosTag\" failed")) goto quit_error; currPosInCurrList = searchStringMap(valueMap, posValueStr_filtered, error); if (currPosInCurrList == TRUE) { result = "interrogW"; } else { result = "interrog"; } quit_error: if (posValueStr_filtered) { S_FREE(posValueStr_filtered); } break; } } tokenItem = SItemNext(tokenItem, error); if (S_CHK_ERR(error, S_CONTERR, "setSentenceType", "Call to \"SItemNext\" failed")) return NULL; if(tokenItem == NULL) { isFinalPunct = TRUE; } } return result; }
static void Run(const SUttProcessor *self, SUtterance *utt, s_erc *error) { SG2P *g2p = NULL; SLexicon *lexicon = NULL; SAddendum *addendum = NULL; SSyllabification *syllab = NULL; const SRelation *wordRel; SRelation *syllableRel = NULL; SRelation *sylStructRel = NULL; SRelation *segmentRel = NULL; SItem *wordItem; char *downcase_word; SList *phones; s_bool syllabified; SList *syllablesPhones; SItem *sylStructureWordItem; SItem *syllableItem; SItem *sylStructSylItem; SItem *segmentItem; SIterator *sylItr = NULL; SIterator *phoneItr = NULL; const SObject *phone; s_bool is_present; S_CLR_ERR(error); s_get_lexical_objects(self, utt, &g2p, &lexicon, &addendum, &syllab, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"s_get_lexical_objects\" failed")) goto quit_error; /* we require the word relation */ is_present = SUtteranceRelationIsPresent(utt, "Word", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceRelationIsPresent\" failed")) goto quit_error; if (!is_present) { S_CTX_ERR(error, S_FAILURE, "Run", "Failed to find 'Word' relation in utterance"); goto quit_error; } wordRel = SUtteranceGetRelation(utt, "Word", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceGetRelation\" failed")) goto quit_error; /* create relations */ syllableRel = SUtteranceNewRelation(utt, "Syllable", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceNewRelation\" failed")) goto quit_error; sylStructRel = SUtteranceNewRelation(utt, "SylStructure", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceNewRelation\" failed")) goto quit_error; segmentRel = SUtteranceNewRelation(utt, "Segment", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceNewRelation\" failed")) goto quit_error; /* start at the first item in the word relation, cast away * const, we want to add daughter items. * iterate over the word relation and fill in the * phones and the associated structure. */ wordItem = (SItem*)SRelationHead(wordRel, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SRelationHead\" failed")) goto quit_error; while (wordItem != NULL) { /* get word and downcase it */ downcase_word = s_strlwr(s_strdup(SItemGetName(wordItem, error), error), error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Failed to down-case word item")) goto quit_error; if (downcase_word == NULL || s_strcmp(downcase_word, "", error) == 0) goto continue_cycle; phones = NULL; syllabified = FALSE; /* get phone sequence for word */ if (addendum != NULL) { phones = S_ADDENDUM_CALL(addendum, get_word)(addendum, downcase_word, NULL, &syllabified, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to method \"get_word\" (SAddendum) failed")) goto quit_error; } if ((phones == NULL) && (lexicon != NULL)) { phones = S_LEXICON_CALL(lexicon, get_word)(lexicon, downcase_word, NULL, &syllabified, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to method \"get_word\" (SLexicon) failed")) goto quit_error; } if ((phones == NULL) && (g2p != NULL)) { phones = S_G2P_CALL(g2p, apply)(g2p, downcase_word, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to method \"apply\" (SG2P) failed")) goto quit_error; } if (phones == NULL) { S_CTX_ERR(error, S_FAILURE, "Run", "Failed to get phone sequence for word '%s'", downcase_word); S_FREE(downcase_word); continue; } S_FREE(downcase_word); /* syllabify phone sequence */ if (syllabified == FALSE) { if (syllab != NULL) { syllablesPhones = S_SYLLABIFICATION_CALL(syllab, syllabify)(syllab, wordItem, phones, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to method \"syllabify\" failed")) goto quit_error; S_DELETE(phones, "Run", error); } else { syllablesPhones = S_LIST(S_NEW(SListList, error)); if (S_CHK_ERR(error, S_CONTERR, "Run", "Failed to create new 'SList' object")) goto quit_error; SListAppend(syllablesPhones, S_OBJECT(phones), error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SListAppend\" failed")) goto quit_error; } } else syllablesPhones = (SList*)phones; /* create new syllable structure word item, shares content * with word item. */ sylStructureWordItem = SRelationAppend(sylStructRel, wordItem, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SRelationAppend\" failed")) goto quit_error; /* iterate over syllables */ sylItr = S_ITERATOR_GET(syllablesPhones, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"S_ITERATOR_GET\" failed")) goto quit_error; while (sylItr != NULL) { /* new item in syllable relation */ syllableItem = SRelationAppend(syllableRel, NULL, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SRelationAppend\" failed")) goto quit_error; SItemSetName(syllableItem, "syl", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemSetName\" failed")) goto quit_error; /* daughter of above item, but in SylStructure */ sylStructSylItem = SItemAddDaughter(sylStructureWordItem, syllableItem, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemAddDaughter\" failed")) goto quit_error; /* iterate over phones and add segments */ phoneItr = S_ITERATOR_GET((SList*)SIteratorObject(sylItr, error), error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"S_ITERATOR_GET/SIteratorObject\" failed")) goto quit_error; while (phoneItr != NULL) { phone = SIteratorObject(phoneItr, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SIteratorObject\" failed")) goto quit_error; segmentItem = SRelationAppend(segmentRel, NULL, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SRelationAppend\" failed")) goto quit_error; SItemSetName(segmentItem, SObjectGetString(phone, error), error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemSetName/SObjectGetString\" failed")) goto quit_error; SItemAddDaughter(sylStructSylItem, segmentItem, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemAddDaughter\" failed")) goto quit_error; phoneItr = SIteratorNext(phoneItr); } sylItr = SIteratorNext(sylItr); } S_DELETE(syllablesPhones, "Run", error); continue_cycle: wordItem = SItemNext(wordItem, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemNext\" failed")) goto quit_error; } /* here all is OK */ return; /* error clean-up code */ quit_error: if (syllableRel != NULL) { SUtteranceDelRelation(utt, "Syllable", error); S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceDelRelation\" failed"); } if (sylStructRel != NULL) { SUtteranceDelRelation(utt, "SylStructure", error); S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceDelRelation\" failed"); } if (segmentRel != NULL) { SUtteranceDelRelation(utt, "Segment", error); S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceDelRelation\" failed"); } if (sylItr != NULL) S_DELETE(sylItr, "Run", error); if (phoneItr != NULL) S_DELETE(phoneItr, "Run", error); self = NULL; }
static SObject *Run(const SFeatProcessor *self, const SItem *item, s_erc *error) { SObject *extractedFeat = NULL; const SVoice *voice; const SPhoneset *phoneset; const char *feature; const char *begin; const char *token; s_bool feature_value; S_CLR_ERR(error); if (item == NULL) return NULL; voice = SItemVoice(item, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemVoice\" failed")) return NULL; if (voice == NULL) { S_CTX_ERR(error, S_FAILURE, "Run", "Item voice is NULL, voice is required to get phoneset"); return NULL; } phoneset = S_PHONESET(SVoiceGetData(voice, "phoneset", error)); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SVoiceGetData\" failed")) return NULL; if (phoneset == NULL) { S_CTX_ERR(error, S_FAILURE, "Run", "Phoneset is NULL, phoneset is required to get phone feature"); return NULL; } token = SItemGetString(item, "_phoneset_feature", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemGetString\" failed")) return NULL; /* get part of token (actual feature), after _ */ begin = s_strchr(token, '_', error); if (S_CHK_ERR(error, S_CONTERR, "SItemPath", "Call to \"s_strchr\" failed")) return NULL; if (begin != NULL) { feature = begin + 1; } else { /* no feature */ return NULL; } feature_value = S_PHONESET_CALL(phoneset, phone_has_feature)(phoneset, SItemGetName(item, error), feature, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"phone_has_feature/SItemGetName\" failed")) return NULL; if (feature_value == TRUE) { extractedFeat = SObjectSetInt(1, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SObjectSetInt\" failed")) return NULL; } else { extractedFeat = SObjectSetInt(0, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SObjectSetInt\" failed")) return NULL; } return extractedFeat; return NULL; S_UNUSED(self); }
static SObject *Run(const SFeatProcessor *self, const SItem *item, s_erc *error) { SObject *extractedFeat = NULL; const SItem *itemInSylStructRel; const SItem *segment; const SPhoneset *phoneset; s_bool multilingual = FALSE; S_CLR_ERR(error); if (item == NULL) return NULL; /* get the phoneset */ phoneset = _get_phoneset(item, &multilingual, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"_get_phoneset\" failed")) return NULL; itemInSylStructRel = SItemAs(item, "SylStructure", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemAs\" failed")) goto quit_error; segment = SItemDaughter(itemInSylStructRel, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemDaughter\" failed")) goto quit_error; while (segment != NULL) { s_bool is_vowel; const char *item_name; item_name = SItemGetName(segment, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemGetName\" failed")) goto quit_error; if (item_name == NULL) continue; is_vowel = S_PHONESET_CALL(phoneset, phone_has_feature)(phoneset, item_name, "vowel", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"phone_has_feature\" failed")) goto quit_error; if (is_vowel) { if (multilingual) { extractedFeat = SItemPathToFeatProc(segment, "segment_name_multilingual", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemPathToFeatProc\" failed")) goto quit_error; } else { extractedFeat = SObjectSetString(item_name, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SObjectSetString\" failed")) goto quit_error; } return extractedFeat; } segment = SItemNext(segment, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemNext\" failed")) goto quit_error; } /* did not find a vowel */ extractedFeat = SObjectSetString("novowel", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SObjectSetString\" failed")) goto quit_error; /* all OK here */ return extractedFeat; /* error cleanup */ quit_error: if (extractedFeat != NULL) S_DELETE(extractedFeat, "Run", error); return NULL; S_UNUSED(self); }
static void Run(const SUttProcessor *self, SUtterance *utt, s_erc *error) { const SRelation *wordRel; SItem *wordItem; const SItem *tokenItem; s_bool is_present; const char *end_punc; SRelation *phraseRelation = NULL; SItem *phraseItem = NULL; const char *post_punc; SRelation *sentenceRelation = NULL; SItem *sentenceItem = NULL; S_CLR_ERR(error); /* we require the word relation */ is_present = SUtteranceRelationIsPresent(utt, "Word", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceRelationIsPresent\" failed")) goto quit_error; if (!is_present) { S_CTX_ERR(error, S_FAILURE, "Run", "Failed to find 'Word' relation in utterance"); goto quit_error; } wordRel = SUtteranceGetRelation(utt, "Word", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceGetRelation\" failed")) goto quit_error; /* get phrasing symbols */ s_get_phrasing_symbols(self, &end_punc, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"s_get_phrasing_symbols\" failed")) goto quit_error; /* create Phrase relation */ phraseRelation = SUtteranceNewRelation(utt, "Phrase", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceNewRelation\" failed")) goto quit_error; /* create Sentence relation */ sentenceRelation = SUtteranceNewRelation(utt, "Sentence", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceNewRelation\" failed")) goto quit_error; /* start at the first item in the word relation, cast away * const, we want to add daughter items */ wordItem = (SItem*)SRelationHead(wordRel, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SRelationHead\" failed")) goto quit_error; while (wordItem != NULL) { SItem *lastWordInToken; SItem *wordAsToken; if (phraseItem == NULL) { /* if phrase item is NULL, create a new phrase item (NULL * shared content) that is appended to phrase * relation. Will happen in first pass. */ sentenceItem = SRelationAppend(sentenceRelation, NULL, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SRelationAppend\" failed")) goto quit_error; /* Added on top a sentence item, for now is one on one with the phrase item * */ phraseItem = SRelationAppend(phraseRelation, NULL, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SRelationAppend\" failed")) goto quit_error; /* add an item name, NB, no break */ SItemSetString(phraseItem, "name", "NB", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemSetString\" failed")) goto quit_error; SItemAddDaughter(sentenceItem, phraseItem, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemAddDaughter\" failed")) goto quit_error; } /* Create a daughter item for the phrase item. Shared content * is the word item. */ SItemAddDaughter(phraseItem, wordItem, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemAddDaughter\" failed")) goto quit_error; /* get word as in Token relation */ wordAsToken = SItemAs(wordItem, "Token", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Failed to get word item's as in Token relation")) goto quit_error; /* * get word's token which is the parent of wordAsToken. */ tokenItem = SItemParent(wordAsToken, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Failed to get word item's token item")) goto quit_error; /* get last word in token */ lastWordInToken = SItemLastDaughter(tokenItem, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Failed to get last daughter of token item")) goto quit_error; /* check if the next token is punctuation */ is_present = FALSE; tokenItem = SItemNext(tokenItem, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemNext\" failed")) goto quit_error; if (tokenItem != NULL) { is_present = SItemFeatureIsPresent(tokenItem, "IsPunctuation", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemFeatureIsPresent\" failed")) goto quit_error; if (is_present) { sint32 value = SItemGetInt(tokenItem, "IsPunctuation", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemGetInt\" failed")) goto quit_error; is_present = (value > 0); } } if ((is_present) && (wordAsToken == lastWordInToken)) { char *ptr; post_punc = SItemGetName(tokenItem, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemGetName\" failed")) goto quit_error; /* check if it is in the end_punc list */ ptr = s_strpbrk(post_punc, end_punc, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"s_strpbrk\" failed")) goto quit_error; if (ptr != NULL) { /* add a phrase break */ SItemSetString(phraseItem, "name", "BB", error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemSetString\" failed")) goto quit_error; /* set to NULL so that a new phrase item is created */ phraseItem = NULL; } } wordItem = SItemNext(wordItem, error); if (S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SItemNext\" failed")) goto quit_error; } /* here all is OK */ return; /* error clean-up code */ quit_error: if (phraseRelation != NULL) { SUtteranceDelRelation(utt, "Phrase", error); S_CHK_ERR(error, S_CONTERR, "Run", "Call to \"SUtteranceDelRelation\" failed"); } }
static crfsuite_instance_t* create_phrase_instance ( SItem* phrase, crfsuite_dictionary_t* attrs, crfsuite_dictionary_t* labels, s_erc *error) { crfsuite_instance_t * result = malloc ( sizeof(crfsuite_instance_t) ); int i = 0; int L = labels->num(labels); const SItem* itrItem = NULL; const SItem* itrItemNext = NULL; const SItem* finishItem = NULL; const char* lbl[] = {"num", "sym", "cap", "p1", "p2", "p3", "s1", "s2", "s3", "P1", "P2", "P3", "P4", "S1", "S2", "S3", "S4", "S5", "S6", "w" }; const int words_length = 19; const char* words[19] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; int position = 0; int lbl_counter = 0; char buffer[8192]; crfsuite_instance_init ( result ); itrItemNext = SItemPathToItem (phrase, "daughter.R:Token.parent", error); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"SItemPathToItem\" failed")) return NULL; finishItem = SItemPathToItem (phrase, "n.daughter.R:Token.parent", error); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"SItemPathToItem\" failed")) return NULL; int counter = 0; while ( itrItemNext != finishItem && itrItemNext != NULL && counter < 9) { words[counter] = SItemGetName(itrItemNext, error); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"SItemGetName\" failed")) return NULL; counter++; itrItemNext = SItemNext(itrItemNext, error); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"SItemNext\" failed")) return NULL; } itrItem = SItemPathToItem (phrase, "daughter.R:Token.parent", error); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"SItemPathToItem\" failed")) return NULL; while ( itrItem != finishItem && itrItem != NULL) { /* Extraction of the features for each token */ const char *tokenName = SItemGetName (itrItem, error); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"SItemGetName\" failed")) return NULL; lbl_counter = 0; /* Extraction of label's ID */ int tokenID = labels->to_id(labels, "UNK"); int attribute_id; /* If unknown the set the 0 labels (unknown) */ if (tokenID < 0) tokenID = L; crfsuite_item_t itemToken; crfsuite_attribute_t attribute; crfsuite_item_init(&itemToken); const char *feat = NULL; s_bool found = FALSE; /* if token contains numbers */ found = hasNumber (tokenName, error); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"hasNumber\" failed")) return NULL; sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], 0, found? "Y" : "N"); lbl_counter++; attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); /* if token contains symbols */ found = hasSymbol (tokenName, error); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"hasSymbol\" failed")) return NULL; sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], 0, found? "Y" : "N"); lbl_counter++; attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); /* if token contains Capitals */ found = hasCapital (tokenName, error); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"hasCapital\" failed")) return NULL; sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], 0, found? "Y" : "N"); lbl_counter++; attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); /* Prefixes of 1 to 3 chars of token */ i = 1; while ( i < 4 ) { feat = getFirstChars ( tokenName, i, error ); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"getFirstChars\" failed")) return NULL; if ( feat == NULL ) feat = "__nil__"; sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], 0, feat); lbl_counter++; attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); i += 1; } /* Suffixes of 1 to 3 chars of token */ i = 1; while ( i < 4 ) { feat = getLastChars ( tokenName, i, error ); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"getLastChars\" failed")) return NULL; if ( feat == NULL ) feat = "__nil__"; sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], 0, feat); lbl_counter++; attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); i += 1; } /* Prefixes of 1 to 4 chars of token without duplicates adjacent */ i = 1; while ( i < 5 ) { feat = getFirstChars ( removeDoubles(tokenName, error), i, error ); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"removeDoubles\" failed")) return NULL; if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"getFirstChars\" failed")) return NULL; if ( feat == NULL ) feat = "__nil__"; sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], 0, feat); lbl_counter++; attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); i += 1; } /* Suffixes of 1 to 6 chars of token without duplicates adjacent */ i = 1; while ( i < 7 ) { feat = getLastChars ( removeDoubles(tokenName, error), i, error ); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"removeDoubles\" failed")) return NULL; if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"getFirstChars\" failed")) return NULL; if ( feat == NULL ) feat = "__nil__"; sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], 0, feat); lbl_counter++; attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); i += 1; } /* Words features */ sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], 0, words[(position+0+words_length)%words_length]); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); const char *tmp = words[(position-1+words_length)%words_length]; if(tmp!=NULL) { sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], -1, tmp); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); } tmp = words[(position+1+words_length)%words_length]; if(tmp!=NULL) { sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], 1, tmp); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); } tmp = words[(position-2+words_length)%words_length]; if(tmp!=NULL) { sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], -2, tmp); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); } tmp = words[(position+2+words_length)%words_length]; if(tmp!=NULL) { sprintf(buffer, "%s[%d]=%s", lbl[lbl_counter], 2, tmp); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); } const char * tmp1 = NULL; i = 0; while ( i < 4 ) { tmp = words[(position-2+i+words_length)%words_length]; tmp1 = words[(position-1+i+words_length)%words_length]; if( tmp!=NULL && tmp1 != NULL ) { sprintf(buffer, "%s[%d]|%s[%d]=%s|%s", lbl[lbl_counter], -2+i, lbl[lbl_counter], -1+i, tmp, tmp1 ); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); } i++; } const char * tmp2 = NULL; i = 0; while ( i < 3 ) { tmp = words[(position-2+i+words_length)%words_length]; tmp1 = words[(position-1+i+words_length)%words_length]; tmp2 = words[(position+0+i+words_length)%words_length]; if( tmp!=NULL && tmp1 != NULL && tmp2 != NULL ) { sprintf(buffer, "%s[%d]|%s[%d]|%s[%d]=%s|%s|%s", lbl[lbl_counter], -2+i, lbl[lbl_counter], -1+i, lbl[lbl_counter], +0+i, tmp, tmp1, tmp2 ); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); } i++; } const char * tmp3 = NULL; i = 0; while ( i < 2 ) { tmp = words[(position-2+i+words_length)%words_length]; tmp1 = words[(position-1+i+words_length)%words_length]; tmp2 = words[(position+0+i+words_length)%words_length]; tmp3 = words[(position+1+i+words_length)%words_length]; if( tmp!=NULL && tmp1 != NULL && tmp2 != NULL && tmp3 != NULL ) { sprintf(buffer, "%s[%d]|%s[%d]|%s[%d]|%s[%d]=%s|%s|%s|%s", lbl[lbl_counter], -2+i, lbl[lbl_counter], -1+i, lbl[lbl_counter], +0+i, lbl[lbl_counter], +1+i, tmp, tmp1, tmp2, tmp3 ); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); } i++; } tmp = words[(position-2+words_length)%words_length]; tmp1 = words[(position-1+words_length)%words_length]; tmp2 = words[(position+0+words_length)%words_length]; tmp3 = words[(position+1+words_length)%words_length]; const char * tmp4 = words[(position+2+words_length)%words_length]; if( tmp!=NULL && tmp1 != NULL && tmp2 != NULL && tmp3 != NULL && tmp4 != NULL ) { sprintf(buffer, "%s[%d]|%s[%d]|%s[%d]|%s[%d]|%s[%d]=%s|%s|%s|%s|%s", lbl[lbl_counter], -2, lbl[lbl_counter], -1, lbl[lbl_counter], +0, lbl[lbl_counter], +1, lbl[lbl_counter], +2, tmp, tmp1, tmp2, tmp3, tmp4 ); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); } tmp = words[(position+0+words_length)%words_length]; i = 1; while ( i < 10 ) { tmp1 = words[(position-i+words_length)%words_length]; if ( tmp1 != NULL ) { sprintf(buffer, "%s[%d]|%s[%d]=%s|%s", lbl[lbl_counter], 0, lbl[lbl_counter], 0-i, tmp, tmp1 ); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); } i++; } i = 1; while ( i < 10 ) { tmp1 = words[(position+i+words_length)%words_length]; if ( tmp1 != NULL ) { sprintf(buffer, "%s[%d]|%s[%d]=%s|%s", lbl[lbl_counter], 0, lbl[lbl_counter], 0+i, tmp, tmp1 ); attribute_id = attrs->to_id (attrs,buffer); crfsuite_attribute_set (&attribute, attribute_id, 1.0); crfsuite_item_append_attribute(&itemToken, &attribute); } i++; } /* Update words array */ position++; if ( itrItemNext != NULL ) { words[position+9] = SItemGetName (itrItemNext, error); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"SItemNext\" failed")) return NULL; itrItemNext = SItemNext ( itrItemNext, error ); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"SItemNext\" failed")) return NULL; } else words[position+9] = NULL; itrItem = SItemNext ( itrItem, error ); if (S_CHK_ERR(error, S_CONTERR, "create_phrase_instance", "Call to \"SItemNext\" failed")) return NULL; crfsuite_instance_append(result, &itemToken, tokenID); crfsuite_item_finish(&itemToken); } return result; }
/* p1^p2-p3+p4=p5@ * * p1 the phoneme identity before the previous phoneme * p2 the previous phoneme identity * p3 the current phoneme identity * p4 the next phoneme identity * p5 the phoneme after the next phoneme identity */ static char *create_phone_context(const SItem *item, s_erc *error) { char *p_context; char p1[MAX_PHONE_NAME_LENGTH] = ""; char p2[MAX_PHONE_NAME_LENGTH] = ""; char p3[MAX_PHONE_NAME_LENGTH] = ""; char p4[MAX_PHONE_NAME_LENGTH] = ""; char p5[MAX_PHONE_NAME_LENGTH] = ""; const SObject *featPath; const char *tmp; S_CLR_ERR(error); /* p1 = p.p.name */ featPath = SItemPathToFeature(item, "p.p.name", error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"SItemPathToFeature\" failed")) return NULL; if (featPath != NULL) { s_strcpy(p1, SObjectGetString(featPath, error), error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_strcpy/SObjectGetString\" failed")) return NULL; } else { s_strcpy(p1, none_string, error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_strcpy\" failed")) return NULL; } /* p2 = p.name */ featPath = SItemPathToFeature(item, "p.name", error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"SItemPathToFeature\" failed")) return NULL; if (featPath != NULL) { s_strcpy(p2, SObjectGetString(featPath, error), error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_strcpy/SObjectGetString\" failed")) return NULL; } else { s_strcpy(p2, none_string, error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_strcpy\" failed")) return NULL; } /* p3 = name */ tmp = SItemGetName(item, error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"SItemGetName\" failed")) return NULL; if (tmp != NULL) { s_strcpy(p3, tmp, error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_strcpy\" failed")) return NULL; } else { s_strcpy(p3, none_string, error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_strcpy\" failed")) return NULL; } /* p4 = n.name */ featPath = SItemPathToFeature(item, "n.name", error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"SItemPathToFeature\" failed")) return NULL; if (featPath != NULL) { s_strcpy(p4, SObjectGetString(featPath, error), error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_strcpy/SObjectGetString\" failed")) return NULL; } else { s_strcpy(p4, none_string, error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_strcpy\" failed")) return NULL; } /* p5 = n.n.name */ featPath = SItemPathToFeature(item, "n.n.name", error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"SItemPathToFeature\" failed")) return NULL; if (featPath != NULL) { s_strcpy(p5, SObjectGetString(featPath, error), error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_strcpy/SObjectGetString\" failed")) return NULL; } else { s_strcpy(p5, none_string, error); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_strcpy\" failed")) return NULL; } s_asprintf(&p_context, error, "%s^%s-%s+%s=%s@", p1, p2, p3, p4, p5); if (S_CHK_ERR(error, S_CONTERR, "create_phone_context", "Call to \"s_asprintf\" failed")) return NULL; return p_context; }
static int write_relation(SDatasource *ds, const SRelation *rel, int num_tiers, float end_time, s_erc *error) { const char *relname; const SItem *head = NULL; const char *tier_header = "\titem [%d]:\n\t\tclass = \"IntervalTier\"\n\t\tname = \"%s\"\n"; const char *tier_start_end = "\t\txmin = 0\n\t\txmax = %f\n"; const char *tier_intervals = "\t\tintervals: size = %d\n"; const char *tier_item = " \t\tintervals [%d]:\n\t\t\txmin = %f\n\t\t\txmax = %f\n\t\t\ttext = \"%s\"\n"; char *buff; size_t str_size; float prev_end = 0.0; const SItem *itr; float item_start = 0.0; float item_end = 0.0; const char *item_name = NULL; SList *info; size_t l_size; int counter; SIterator *litr; S_CLR_ERR(error); if (rel == NULL) return num_tiers; num_tiers += 1; relname = SRelationName(rel, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SRelationName\" failed")) return 0; head = SRelationHead(rel, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SRelationHead\" failed")) return 0; /* tier header */ s_asprintf(&buff, error, tier_header, num_tiers, relname); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_asprintf\" failed")) return 0; str_size = s_strsize(buff, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_strsize\" failed")) { S_FREE(buff); return 0; } SDatasourceWrite(ds, buff, sizeof(char), str_size, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SDatasourceWrite\" failed")) { S_FREE(buff); return 0; } S_FREE(buff); /* start time and end time (always 0 and utt end) */ s_asprintf(&buff, error, tier_start_end, end_time); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_asprintf\" failed")) return 0; str_size = s_strsize(buff, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_strsize\" failed")) { S_FREE(buff); return 0; } SDatasourceWrite(ds, buff, sizeof(char), str_size, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SDatasourceWrite\" failed")) { S_FREE(buff); return 0; } S_FREE(buff); info = S_LIST(S_NEW(SListList, error)); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Failed to create new list for info cache")) return 0; prev_end = 0.0; itr = head; while (itr != NULL) { item_start = get_start(itr, relname, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"get_start\" failed")) { S_DELETE(info, "write_relation", error); return 0; } item_end = get_end(itr, relname, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"get_end\" failed")) { S_DELETE(info, "write_relation", error); return 0; } if (!s_float_equal(item_start, prev_end)) { /* prepend extra "SIL" */ add_info(info, prev_end, item_start, "SIL", error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"add_info\" failed")) { S_DELETE(info, "write_relation", error); return 0; } } item_name = SItemGetName(itr, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SItemGetName\" failed")) { S_DELETE(info, "write_relation", error); return 0; } add_info(info, item_start, item_end, item_name, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"add_info\" failed")) { S_DELETE(info, "write_relation", error); return 0; } prev_end = item_end; itr = SItemNext(itr, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SItemNext\" failed")) { S_DELETE(info, "write_relation", error); return 0; } } if (!s_float_equal(item_end, end_time)) { add_info(info, item_end, end_time, "SIL", error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"add_info\" failed")) { S_DELETE(info, "write_relation", error); return 0; } } l_size = SListSize(info, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SListSize\" failed")) { S_DELETE(info, "write_relation", error); return 0; } /* tier intervals */ s_asprintf(&buff, error, tier_intervals, l_size); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_asprintf\" failed")) { S_DELETE(info, "write_relation", error); return 0; } str_size = s_strsize(buff, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_strsize\" failed")) { S_FREE(buff); S_DELETE(info, "write_relation", error); return 0; } SDatasourceWrite(ds, buff, sizeof(char), str_size, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SDatasourceWrite\" failed")) { S_FREE(buff); S_DELETE(info, "write_relation", error); return 0; } S_FREE(buff); litr = S_ITERATOR_GET(info, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"S_ITERATOR_GET\" failed")) { S_DELETE(info, "write_relation", error); return 0; } for (counter = 1; litr != NULL; litr = SIteratorNext(litr), counter++) { SList *itemList; SObject *tmp; char *name; itemList = S_LIST(SIteratorObject(litr, error)); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SIteratorObject\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); return 0; } tmp = SListPop(itemList, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SIteratorObject\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); return 0; } item_name = SObjectGetString(tmp, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SObjectGetString\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_DELETE(tmp, "write_relation", error); return 0; } name = s_strdup(item_name, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_strdup\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_DELETE(tmp, "write_relation", error); return 0; } S_DELETE(tmp, "write_relation", error); tmp = SListPop(itemList, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SIteratorObject\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_FREE(name); return 0; } item_end = SObjectGetFloat(tmp, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SObjectGetFloat\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_DELETE(tmp, "write_relation", error); S_FREE(name); return 0; } S_DELETE(tmp, "write_relation", error); tmp = SListPop(itemList, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SIteratorObject\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_FREE(name); return 0; } item_start = SObjectGetFloat(tmp, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SObjectGetFloat\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_DELETE(tmp, "write_relation", error); S_FREE(name); return 0; } S_DELETE(tmp, "write_relation", error); /* tier item */ s_asprintf(&buff, error, tier_item, counter, item_start, item_end, name); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_asprintf\" failed")) { S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_FREE(name); return 0; } str_size = s_strsize(buff, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"s_strsize\" failed")) { S_FREE(buff); S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_FREE(name); return 0; } SDatasourceWrite(ds, buff, sizeof(char), str_size, error); if (S_CHK_ERR(error, S_CONTERR, "write_relation", "Call to \"SDatasourceWrite\" failed")) { S_FREE(buff); S_DELETE(info, "write_relation", error); S_DELETE(litr, "write_relation", error); S_FREE(name); return 0; } S_FREE(buff); S_FREE(name); } S_DELETE(info, "write_relation", error); return num_tiers; }
static void s_compute_phonetic_features (SItem* word, s_erc *error ) { SItem *syllable; SItem * phone; char* position_in_syllable_string = NULL; /* Extract Phoneset from Voice*/ const SVoice* voice = SItemVoice (word, error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"SItemGetVoice\" failed")) return; const SPhoneset* phoneset = (SPhoneset*)SVoiceGetData(voice, "phoneset", error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"SVoiceGetData\" failed")) return; SItem *wordAsSylStructure = SItemAs(word, "SylStructure", error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_stresses", "Call to \"SItemAs\" failed")) return; syllable = SItemDaughter(wordAsSylStructure, error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_stresses", "Call to \"SItemDaughter\" failed")) return; while (syllable != NULL) { phone = SItemDaughter(syllable, error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"SItemDaughter\" failed")) return; s_bool nucleusFound = FALSE; while (phone != NULL) { const char* phone_value = SItemGetName(phone, error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"SItemGetName\" failed")) return; s_bool isVowel = S_PHONESET_CALL(phoneset, phone_has_feature) (phoneset, phone_value, "vowel", error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"phone_has_feature\" failed")) return; if( isVowel ) { nucleusFound = TRUE; position_in_syllable_string = "nucleus"; } else { if( nucleusFound == TRUE ) position_in_syllable_string = "coda"; else position_in_syllable_string = "onset"; } SItemSetString ( phone, "syllablepart", position_in_syllable_string, error ); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"SItemSetString\" failed")) return; s_bool hasLong = S_PHONESET_CALL(phoneset, phone_has_feature) (phoneset, phone_value, "duration_long", error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"phone_has_feature\" failed")) return; s_bool hasShort = S_PHONESET_CALL(phoneset, phone_has_feature) (phoneset, phone_value, "duration_short", error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"phone_has_feature\" failed")) return; const char * feat = NULL; if( hasLong ) { feat = "+"; } else if( hasShort ) { feat = "-"; } if(feat != NULL) { SItemSetString ( phone, "duration", feat, error ); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"SItemSetString\" failed")) return; } phone = SItemNext ( phone, error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"SItemNext\" failed")) return; } syllable = SItemNext (syllable, error); if (S_CHK_ERR(error, S_CONTERR, "s_compute_phonetic_features", "Call to \"SItemNext\" failed")) return; } }