kb_main.c

来自「WinCE平台上的语音识别程序」· C语言 代码 · 共 597 行 · 第 1/2 页

C
597
字号
                if (strcmp(str, "}") != 0)                    E_FATAL("Unexpected EOF(%s)\n", lm_ctl_filename);                if (fscanf(ctlfp, "%s", str) != 1)                    str[0] = '\0';            }        }        else            str[0] = '\0';        /* Fill in dictionary word id information for each LMclass word */        for (cl = lmclass_firstclass(lmclass_set);             lmclass_isclass(cl);             cl = lmclass_nextclass(lmclass_set, cl)) {            kb_init_lmclass_dictwid(cl);        }        /* At this point if str[0] != '\0', we have an LM filename */        n_lmclass = lmclass_get_nclass(lmclass_set);        lmclass = ckd_calloc(n_lmclass, sizeof(lmclass_t));        /* Read in one LM at a time */        while (str[0] != '\0') {            strcpy(lmfile, str);            if (fscanf(ctlfp, "%s", lmname) != 1)                E_FATAL("LMname missing after LMFileName '%s'\n",                        lmfile);            n_lmclass_used = 0;            if (fscanf(ctlfp, "%s", str) == 1) {                if (strcmp(str, "{") == 0) {                    /* LM uses classes; read their names */                    while ((fscanf(ctlfp, "%s", str) == 1) &&                           (strcmp(str, "}") != 0)) {                        if (n_lmclass_used >= n_lmclass)                            E_FATAL                                ("Too many LM classes specified for '%s'\n",                                 lmfile);                        lmclass[n_lmclass_used] =                            lmclass_get_lmclass(lmclass_set, str);                        if (!                            (lmclass_isclass(lmclass[n_lmclass_used])))                            E_FATAL("LM class '%s' not found\n", str);                        n_lmclass_used++;                    }                    if (strcmp(str, "}") != 0)                        E_FATAL("Unexpected EOF(%s)\n",                                lm_ctl_filename);                    if (fscanf(ctlfp, "%s", str) != 1)                        str[0] = '\0';                }            }            else                str[0] = '\0';            if (n_lmclass_used > 0)                lm_read_clm(lmfile, lmname,                            cmd_ln_float32("-lw"),                            cmd_ln_float32("-uw"),                            cmd_ln_float32("-wip"),                            lmclass, n_lmclass_used);            else                lm_read(lmfile, lmname,                        cmd_ln_float32("-lw"),                        cmd_ln_float32("-uw"),                        cmd_ln_float32("-wip"));        }        fclose(ctlfp);    }    /* Read "base" LM file, if specified */    if (lm_file_name) {        lmSetStartSym(lm_start_sym);        lmSetEndSym(lm_end_sym);        lm_read(lm_file_name, "",                cmd_ln_float32("-lw"),                cmd_ln_float32("-uw"),                cmd_ln_float32("-wip"));        /* Make initial OOV list known to this base LM */        lm_init_oov();    }}static voiddict_init(void){    char *fdictfn = NULL;    E_INFO("Reading dict file [%s]\n", cmd_ln_str("-dict"));    word_dict = dict_new();    /* Look for noise word dictionary in the HMM directory if not given */    if (cmd_ln_str("-hmm") && !cmd_ln_str("-fdict")) {        FILE *tmp;        fdictfn = string_join(hmmdir, "/noisedict", NULL);        if ((tmp = fopen(fdictfn, "r")) == NULL) {            ckd_free(fdictfn);            fdictfn = NULL;        }        else {            fclose(tmp);        }    }    if (dict_read(word_dict, cmd_ln_str("-dict"),                  (fdictfn != NULL) ? fdictfn : cmd_ln_str("-fdict"),                  !cmd_ln_boolean("-usewdphones"))) {        ckd_free(fdictfn);        E_FATAL("Failed to read dictionaries\n");    }    ckd_free(fdictfn);}static voidphonetp_init(int32 num_ci_phones){    int i, j, n, logp;    float32 p, uptp;    float32 pip = cmd_ln_float32("-pip");    float32 ptplw = cmd_ln_float32("-ptplw");    float32 uptpwt = cmd_ln_float32("-uptpwt");    phonetp =        (int32 **) ckd_calloc_2d(num_ci_phones, num_ci_phones,                                 sizeof(int32));    if (cmd_ln_str("-phonetp")) {        /* Load phone transition counts file */        phonetp_load_file(cmd_ln_str("-phonetp"), phonetp);    }    else {        /* No transition probs file specified; use uniform probs */        for (i = 0; i < num_ci_phones; i++) {            for (j = 0; j < num_ci_phones; j++) {                phonetp[i][j] = 1;            }        }    }    /* Convert counts to probs; smooth; convert to LOG-probs; apply lw/pip */    for (i = 0; i < num_ci_phones; i++) {        n = 0;        for (j = 0; j < num_ci_phones; j++)            n += phonetp[i][j];        assert(n >= 0);        if (n == 0) {           /* No data here, use uniform probs */            p = 1.0 / (float32) num_ci_phones;            p *= pip;           /* Phone insertion penalty */            logp = (int32) (LOG(p) * ptplw);            for (j = 0; j < num_ci_phones; j++)                phonetp[i][j] = logp;        }        else {            uptp = 1.0 / (float32) num_ci_phones;       /* Uniform prob trans prob */            for (j = 0; j < num_ci_phones; j++) {                p = ((float32) phonetp[i][j] / (float32) n);                p = ((1.0 - uptpwt) * p) + (uptpwt * uptp);     /* Smooth */                p *= pip;       /* Phone insertion penalty */                phonetp[i][j] = (int32) (LOG(p) * ptplw);            }        }    }}voidkb_init(void){    int32 num_phones, num_ci_phones;    /* Get acoustic model filenames */    if ((hmmdir = cmd_ln_str("-hmm")) != NULL) {        FILE *tmp;        mdeffn = string_join(hmmdir, "/mdef", NULL);        meanfn = string_join(hmmdir, "/means", NULL);        varfn = string_join(hmmdir, "/variances", NULL);        mixwfn = string_join(hmmdir, "/mixture_weights", NULL);        tmatfn = string_join(hmmdir, "/transition_matrices", NULL);        /* These ones are optional, so make sure they exist. */        sendumpfn = string_join(hmmdir, "/sendump", NULL);        if ((tmp = fopen(sendumpfn, "rb")) == NULL) {            ckd_free(sendumpfn);            sendumpfn = NULL;        }        else {            fclose(tmp);        }        kdtreefn = string_join(hmmdir, "/kdtrees", NULL);        if ((tmp = fopen(kdtreefn, "rb")) == NULL) {            ckd_free(kdtreefn);            kdtreefn = NULL;        }        else {            fclose(tmp);        }    }    /* Allow overrides from the command line */    if (cmd_ln_str("-mdef")) {        ckd_free(mdeffn);        mdeffn = cmd_ln_str("-mdef");    }    if (cmd_ln_str("-mean")) {        ckd_free(meanfn);        meanfn = cmd_ln_str("-mean");    }    if (cmd_ln_str("-var")) {        ckd_free(varfn);        varfn = cmd_ln_str("-var");    }    if (cmd_ln_str("-mixw")) {        ckd_free(mixwfn);        mixwfn = cmd_ln_str("-mixw");    }    if (cmd_ln_str("-tmat")) {        ckd_free(tmatfn);        tmatfn = cmd_ln_str("-tmat");    }    if (cmd_ln_str("-sendump")) {        ckd_free(sendumpfn);        sendumpfn = cmd_ln_str("-sendump");    }    if (cmd_ln_str("-kdtree")) {        ckd_free(kdtreefn);        kdtreefn = cmd_ln_str("-kdtree");    }    /* Read model definition. */    if (mdeffn == NULL)        E_FATAL("Must specify -mdeffn or -hmm\n");    if ((mdef = bin_mdef_read(mdeffn)) == NULL)        E_FATAL("Failed to read model definition from %s\n", mdeffn);    num_ci_phones = bin_mdef_n_ciphone(mdef);    num_phones = bin_mdef_n_phone(mdef);    dict_init();    lm_init();    /* Read acoustic model files. */    if ((meanfn == NULL)        || (varfn == NULL)        || (tmatfn == NULL))        E_FATAL("No mean/var/tmat files specified\n");    /* Read transition matrices. */    tmat = tmat_init(tmatfn, cmd_ln_float32("-tmatfloor"), TRUE);    /* Read the acoustic models. */    E_INFO("Initializing SCGMM computation module\n");    semi_mgau = s2_semi_mgau_init(meanfn,                                  varfn,                                  cmd_ln_float32("-varfloor"),                                  mixwfn,                                  cmd_ln_float32("-mixwfloor"),                                  cmd_ln_int32("-topn"));    if (kdtreefn)        s2_semi_mgau_load_kdtree(semi_mgau,                                 kdtreefn,                                 cmd_ln_int32("-kdmaxdepth"),                                 cmd_ln_int32("-kdmaxbbi"));    semi_mgau->ds_ratio = cmd_ln_int32("-dsratio");    /*     * Create phone transition logprobs matrix     */    phonetp_init(num_ci_phones);}char *kb_get_senprob_dump_file(void){    return sendumpfn;}int32kb_get_word_id(char const *word){    return (dict_to_id(word_dict, word));}char *kb_get_word_str(int32 wid){    return (word_dict->dict_list[wid]->word);}int32kb_dict_maxsize(void){    return (hash_table_size(word_dict->dict));}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?