static char *__VOICENAME___unit_name(cst_item *s) { const char *name; /* This *is* long enough as long as you don't change external things */ char cname[30]; name = flite_ffeature_string(s,"name"); /* Comment this out if you have more complex unit names */ #if 1 if (1 == 1) return cst_strdup(name); else #endif if (cst_streq("+",flite_ffeature_string(s,"ph_vc"))) { cst_sprintf(cname,"%s_%s_%s",name, flite_ffeature_string(s,"R:SylStructure.parent.stress"), __VOICENAME___nextvoicing(s)); } else { cst_sprintf(cname,"%s_%s",name, __VOICENAME___nextvoicing(s)); } return cst_strdup(cname); }
static int lex_uncompress_word(char *ucword,int max_size, int p,const cst_lexicon *l) { int i,j=0,length; unsigned char *cword; if (l->entry_hufftable == 0) /* can have "compressed" lexicons without compression */ cst_sprintf(ucword,"%s",&l->data[p]); else { cword = &l->data[p]; for (i=0,j=0; cword[i]; i++) { length = cst_strlen(l->entry_hufftable[cword[i]]); if (j+length+1<max_size) { memmove(ucword+j,l->entry_hufftable[cword[i]],length); j += length; } else break; } ucword[j] = '\0'; } return j; }
int in_lex(const cst_lexicon *l, const char *word, const char *pos, const cst_features *feats) { /* return TRUE is its in the lexicon */ int r = FALSE, i; char *wp; wp = cst_alloc(char,cst_strlen(word)+2); cst_sprintf(wp,"%c%s",(pos ? pos[0] : '0'),word); for (i=0; l->addenda && l->addenda[i]; i++) { if (((wp[0] == '0') || (wp[0] == l->addenda[i][0][0])) && (cst_streq(wp+1,l->addenda[i][0]+1))) { r = TRUE; break; } } if (!r && (lex_lookup_bsearch(l,wp) >= 0)) r = TRUE; cst_free(wp); return r; }
bard_window *bard_make_help_window(bard_reader *br) { bard_window *hw; int indent = 10; char *bhs; hw = bard_window_new("help", br->display->screen_width-(2*indent), br->display->screen_height-(2*indent), br->display->screen->format); hw->x_offset = indent; hw->y_offset = indent; hw->font_name = cst_strdup(get_param_string(br->config,"-font",BARD_DEFAULT_FONT)); hw->font_size = get_param_int(br->config,"-help_font_size", get_param_int(br->config,"-font_size", BARD_DEFAULT_FONT_SIZE)); /* We assume we can open this font, as if we couldn't when initializing */ /* the display window, we'd have failed by now */ hw->font = bard_window_open_font(hw->font_name,hw->font_size); hw->background_color = bard_color_get(br->colors, get_param_string(br->config,"-help_background_color","cornsilk")); hw->foreground_color = bard_color_get(br->colors, get_param_string(br->config,"-help_foreground_color","steelblue")); hw->highlight_color = bard_color_get(br->colors, get_param_string(br->config,"-help_highlight_color","blue")); hw->tm=10; hw->bm=10; hw->tlm=10; hw->trm=10; bhs = cst_alloc(char,cst_strlen(bard_help_string)+ cst_strlen(BARD_PROJECT_VERSION)+ cst_strlen(BARD_PROJECT_STATE)+ cst_strlen(BARD_PROJECT_DATE)+1); cst_sprintf(bhs,bard_help_string,BARD_PROJECT_VERSION, BARD_PROJECT_STATE, BARD_PROJECT_DATE); hw->ts = ts_open_string(bhs, cst_ts_default_whitespacesymbols, "", cst_ts_default_prepunctuationsymbols, cst_ts_default_postpunctuationsymbols); hw->ts_mode = "literal"; cst_free(bhs); hw->update = bard_window_help_update; /* Put something on the screen */ bard_window_display_from_pos(hw,0); return hw; }
static int cst_utf8_as_hex(const char *in,char *out) { int o; o = cst_utf8_ord_string(in); if ((o > 96) && (o < 123)) { cst_sprintf(out,"let_%c",(unsigned char)o); } else if ((o > 64) && (o < 91)) { /* Map uppercase to lowercase */ cst_sprintf(out,"let_%c",(unsigned char)o+32); } else cst_sprintf(out,"u%04Xp",o); return o; }
cst_val *lex_lookup(const cst_lexicon *l, const char *word, const char *pos, const cst_features *feats) { int index; int p; const char *q; char *wp; cst_val *phones = 0; int found = FALSE; wp = cst_alloc(char,cst_strlen(word)+2); cst_sprintf(wp,"%c%s",(pos ? pos[0] : '0'),word); if (l->addenda) phones = lex_lookup_addenda(wp,l,&found); if (!found) { index = lex_lookup_bsearch(l,wp); if (index >= 0) { if (l->phone_hufftable) { for (p=index-2; l->data[p]; p--) for (q=l->phone_hufftable[l->data[p]]; *q; q++) phones = cons_val(string_val(l->phone_table[(unsigned char)*q]), phones); } else /* no compression -- should we still support this ? */ { for (p=index-2; l->data[p]; p--) phones = cons_val(string_val(l->phone_table[l->data[p]]), phones); } phones = val_reverse(phones); } else if (l->lts_function) { phones = (l->lts_function)(l,word,"",feats); } else if (l->lts_rule_set) { phones = lts_apply(word, "", /* more features if we had them */ l->lts_rule_set); } } cst_free(wp); return phones; }
static int cmulex_onset_bigram(const cst_val *rest) { char x[10]; int i; cst_sprintf(x,"%s%s",val_string(val_car(rest)), val_string(val_car(val_cdr(rest)))); for (i=0; cmulex_onset_bigrams[i]; i++) if (cst_streq(x,cmulex_onset_bigrams[i])) return TRUE; return FALSE; }
cst_utterance *flowm_print_relation_callback(cst_utterance *u) { /* Say the details of a named relation for display */ char rst[FL_MAX_MSG_CHARS]; const char *name; const char *relname; cst_item *item; char *space; space = ""; relname = get_param_string(u->features,"print_info_relation", NULL); cst_sprintf(rst,"%s: ",relname); if (!relname) { mbstowcs(fl_tts_msg,"",FL_MAX_MSG_CHARS); return u; } for (item=relation_head(utt_relation(u,relname)); item; item=item_next(item)) { name = item_feat_string(item,"name"); if (cst_strlen(name)+1+4 < FL_MAX_MSG_CHARS) cst_sprintf(rst,"%s%s%s",rst,space,name); else if (cst_strlen(rst)+4 < FL_MAX_MSG_CHARS) cst_sprintf(rst,"%s ...",rst); else break; space = " "; } mbstowcs(fl_tts_msg,rst,FL_MAX_MSG_CHARS); return u; }
cst_string *cst_implode(const cst_val *sl) { const cst_val *v; int l=0; char *s; for (v=sl; v; v=val_cdr(v)) { if (val_stringp(val_car(v))) l += cst_strlen(val_string(val_car(v))); } s = cst_alloc(cst_string,l+1); for (v=sl; v; v=val_cdr(v)) { if (val_stringp(val_car(v))) cst_sprintf(s,"%s%s",s,val_string(val_car(v))); } return s; }
cst_file cst_url_open(const char *url) { /* Always opens it for reading */ cst_tokenstream *urlts; const cst_string *protocol; int port; cst_string *host; int fd; char *url_request; char *path; cst_file ofd; int state,n; char c; urlts = ts_open_string(url, "", ":/", "", ""); protocol = ts_get(urlts); if (cst_streq(protocol,"http")) { #ifdef CST_NO_SOCKETS ts_close(urlts); return NULL; #else if (!cst_streq(ts_get(urlts),":") || !cst_streq(ts_get(urlts),"/") || !cst_streq(ts_get(urlts),"/")) { ts_close(urlts); return NULL; } host = cst_strdup(ts_get(urlts)); if (cst_streq(ts_get(urlts),":")) port = (int)cst_atof(ts_get(urlts)); else port = 80; /* Open port to web server */ fd = cst_socket_open(host,port); if (fd < 0) { cst_free(host); ts_close(urlts); return NULL; } url_request = cst_alloc(char,cst_strlen(url)+17); cst_sprintf(url_request,"GET %s HTTP/1.2\n\n",url); n = write(fd,url_request,cst_strlen(url_request)); cst_free(url_request); /* Skip http header -- until \n\n */ state=0; while (state != 4) { n=read(fd,&c,1); if (n == 0) { /* eof or link gone down */ cst_free(host); ts_close(urlts); return NULL; } if ((state == 0) && (c == '\r')) state=1; else if ((state == 1) && (c == '\n')) state=2; else if ((state == 2) && (c == '\r')) state=3; else if ((state == 3) && (c == '\n')) state=4; /* Not sure you can get no CRs in the stream */ else if ((state == 0) && (c == '\n')) state=2; else if ((state == 2) && (c == '\n')) state=4; else state = 0; } ofd = fdopen(fd,"rb"); ts_close(urlts); cst_free(host); return ofd; #endif }
cst_val *lts_apply(const char *word,const char *feats,const cst_lts_rules *r) { int pos, index, i; cst_val *phones=0; cst_lts_letter *fval_buff; cst_lts_letter *full_buff; cst_lts_phone phone; char *left, *right, *p; char hash; char zeros[8]; /* For feature vals for each letter */ fval_buff = cst_alloc(cst_lts_letter, (r->context_window_size*2)+ r->context_extra_feats); /* Buffer with added contexts */ full_buff = cst_alloc(cst_lts_letter, (r->context_window_size*2)+ cst_strlen(word)+1); /* TBD assumes single POS feat */ if (r->letter_table) { for (i=0; i<8; i++) zeros[i] = 2; cst_sprintf((char *)full_buff, "%.*s%c%s%c%.*s", r->context_window_size-1, zeros, 1, word, 1, r->context_window_size-1, zeros); hash = 1; } else { /* Assumes l_letter is a char and context < 8 */ cst_sprintf((char *)full_buff, "%.*s#%s#%.*s", r->context_window_size-1, "00000000", word, r->context_window_size-1, "00000000"); hash = '#'; } /* Do the prediction backwards so we don't need to reverse the answer */ for (pos = r->context_window_size + cst_strlen(word) - 1; full_buff[pos] != hash; pos--) { /* Fill the features buffer for the predictor */ cst_sprintf((char *)fval_buff, "%.*s%.*s%s", r->context_window_size, full_buff+pos-r->context_window_size, r->context_window_size, full_buff+pos+1, feats); if ((!r->letter_table && ((full_buff[pos] < 'a') || (full_buff[pos] > 'z')))) { #ifdef EXCESSIVELY_CHATTY cst_errmsg("lts:skipping unknown char \"%c\"\n", full_buff[pos]); #endif continue; } if (r->letter_table) index = full_buff[pos] - 3; else index = (full_buff[pos]-'a')%26; phone = apply_model(fval_buff, r->letter_index[index], r->models); /* delete epsilons and split dual-phones */ if (cst_streq("epsilon",r->phone_table[phone])) continue; else if ((p=strchr(r->phone_table[phone],'-')) != NULL) { left = cst_substr(r->phone_table[phone],0, cst_strlen(r->phone_table[phone])-cst_strlen(p)); right = cst_substr(r->phone_table[phone], (cst_strlen(r->phone_table[phone])-cst_strlen(p))+1, (cst_strlen(p)-1)); phones = cons_val(string_val(left), cons_val(string_val(right),phones)); cst_free(left); cst_free(right); } else phones = cons_val(string_val(r->phone_table[phone]),phones); } cst_free(full_buff); cst_free(fval_buff); return phones; }
/* - regprop - printable representation of opcode */ static char * regprop(char *op) { char *p=NULL; static char buf[50]; (void) strcpy(buf, ":"); switch (OP(op)) { case BOL: p = "BOL"; break; case EOL: p = "EOL"; break; case ANY: p = "ANY"; break; case ANYOF: p = "ANYOF"; break; case ANYBUT: p = "ANYBUT"; break; case BRANCH: p = "BRANCH"; break; case EXACTLY: p = "EXACTLY"; break; case NOTHING: p = "NOTHING"; break; case BACK: p = "BACK"; break; case END: p = "END"; break; case OPEN+1: case OPEN+2: case OPEN+3: case OPEN+4: case OPEN+5: case OPEN+6: case OPEN+7: case OPEN+8: case OPEN+9: cst_sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN); p = NULL; break; case CLOSE+1: case CLOSE+2: case CLOSE+3: case CLOSE+4: case CLOSE+5: case CLOSE+6: case CLOSE+7: case CLOSE+8: case CLOSE+9: cst_sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE); p = NULL; break; case STAR: p = "STAR"; break; case PLUS: p = "PLUS"; break; case WORDA: p = "WORDA"; break; case WORDZ: p = "WORDZ"; break; default: FAIL("corrupted opcode"); break; } if (p != NULL) (void) strcat(buf, p); return(buf); }
cst_utterance *flowm_utt_callback(cst_utterance *u) { char rst[FL_MAX_MSG_CHARS]; const char *tok; cst_item *item; char *space; int extend_length; /* In order to stop the synthesizer if the STOP button is pressed */ /* This stops the synthesis of the next utterance */ if ((flowm_play_status == FLOWM_PLAY) || (flowm_play_status == FLOWM_SKIP)) { if (TTSWindow) { rst[0] = '\0'; space = ""; for (item=relation_head(utt_relation(u,"Token")); item; item=item_next(item)) { tok = item_feat_string(item,"name"); if (cst_streq("",space)) /* Only do this on the first token/word */ flowm_file_pos = item_feat_int(item,"file_pos"); extend_length = cst_strlen(rst) + 1 + cst_strlen(item_feat_string(item,"prepunctuation"))+ cst_strlen(item_feat_string(item,"punc")); if (cst_strlen(tok)+extend_length+4 < FL_MAX_MSG_CHARS) cst_sprintf(rst,"%s%s%s%s%s",rst,space, item_feat_string(item,"prepunctuation"), tok, item_feat_string(item,"punc")); else { if (cst_strlen(rst)+4 < FL_MAX_MSG_CHARS) cst_sprintf(rst,"%s ...",rst); break; } space = " "; } if (flowm_file_pos > flowm_prev_utt_pos[flowm_utt_pos_pos]) { if ((flowm_utt_pos_pos+1) >= FLOWM_NUM_UTT_POS) { /* Filled it up, so move it down */ memmove(flowm_prev_utt_pos,&flowm_prev_utt_pos[1], sizeof(int)*(FLOWM_NUM_UTT_POS-10)); flowm_utt_pos_pos = (FLOWM_NUM_UTT_POS-10); } flowm_utt_pos_pos++; flowm_prev_utt_pos[flowm_utt_pos_pos] = flowm_file_pos; } /* Send text to TTSWindow */ mbstowcs(fl_tts_msg,rst,FL_MAX_MSG_CHARS); SetDlgItemText(TTSWindow, FL_SYNTHTEXT, fl_tts_msg); /* Update file pos percentage in FilePos window */ cst_sprintf(rst,"%2.3f",flowm_find_file_percentage()); mbstowcs(fl_fp_msg,rst,FL_MAX_MSG_CHARS); SetDlgItemText(TTSWindow, FL_FILEPOS, fl_fp_msg); SystemIdleTimerReset(); /* keep alive while synthesizing */ if (flowm_play_status == FLOWM_SKIP) flowm_play_status = FLOWM_PLAY; } return u; } else { delete_utterance(u); return 0; } }