⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s2_semi_mgau.c

📁 WinCE平台上的语音识别程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Like get_scores4, but uses OPDF_8B with FAST8B: *     LogProb(feature f, codeword c, senone s) = *         OPDF_8B[f]->prob[c][s] * Also, uses true 8-bit probs, so addition in logspace is an easy lookup. */static int32get_scores4_8b(s2_semi_mgau_t * s){    register int32 j, n, k;    int32 tmp1, tmp2;    unsigned char *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3;    int32 w0, w1, w2, w3;       /* weights */    memset(senone_scores, 0, s->CdWdPDFMod * sizeof(*senone_scores));    for (j = 0; j < s->n_feat; j++) {        /* ptrs to senone prob ids */        pid_cw0 = s->OPDF_8B[j][s->f[j][0].codeword];        pid_cw1 = s->OPDF_8B[j][s->f[j][1].codeword];        pid_cw2 = s->OPDF_8B[j][s->f[j][2].codeword];        pid_cw3 = s->OPDF_8B[j][s->f[j][3].codeword];        w0 = s->f[j][0].val.score;        w1 = s->f[j][1].val.score;        w2 = s->f[j][2].val.score;        w3 = s->f[j][3].val.score;        /* Floor w0..w3 to 256<<10 - 162k */        if (w3 < -99000)            w3 = -99000;        if (w2 < -99000)            w2 = -99000;        if (w1 < -99000)            w1 = -99000;        if (w0 < -99000)            w0 = -99000;        /* Condition should never be TRUE */        /* Quantize */        w3 = (511 - w3) >> 10;        w2 = (511 - w2) >> 10;        w1 = (511 - w1) >> 10;        w0 = (511 - w0) >> 10;        for (k = 0; k < n_senone_active; k++) {	    n = senone_active[k];            tmp1 = pid_cw0[n] + w0;            tmp2 = pid_cw1[n] + w1;            tmp1 = LOG_ADD(tmp1, tmp2);            tmp2 = pid_cw2[n] + w2;            tmp1 = LOG_ADD(tmp1, tmp2);            tmp2 = pid_cw3[n] + w3;            tmp1 = LOG_ADD(tmp1, tmp2);            senone_scores[n] -= tmp1 << 10;        }    }    return 0;}static int32get_scores4_8b_all(s2_semi_mgau_t * s){    register int32 j, k;    int32 tmp1, tmp2;    unsigned char *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3;    int32 w0, w1, w2, w3;       /* weights */    n_senone_active = s->CdWdPDFMod;    memset(senone_scores, 0, s->CdWdPDFMod * sizeof(*senone_scores));    for (j = 0; j < s->n_feat; j++) {        /* ptrs to senone prob ids */        pid_cw0 = s->OPDF_8B[j][s->f[j][0].codeword];        pid_cw1 = s->OPDF_8B[j][s->f[j][1].codeword];        pid_cw2 = s->OPDF_8B[j][s->f[j][2].codeword];        pid_cw3 = s->OPDF_8B[j][s->f[j][3].codeword];        w0 = s->f[j][0].val.score;        w1 = s->f[j][1].val.score;        w2 = s->f[j][2].val.score;        w3 = s->f[j][3].val.score;        /* Floor w0..w3 to 256<<10 - 162k */        if (w3 < -99000)            w3 = -99000;        if (w2 < -99000)            w2 = -99000;        if (w1 < -99000)            w1 = -99000;        if (w0 < -99000)            w0 = -99000;        /* Condition should never be TRUE */        /* Quantize */        w3 = (511 - w3) >> 10;        w2 = (511 - w2) >> 10;        w1 = (511 - w1) >> 10;        w0 = (511 - w0) >> 10;        for (k = 0; k < s->CdWdPDFMod; k++) {            tmp1 = pid_cw0[k] + w0;            tmp2 = pid_cw1[k] + w1;            tmp1 = LOG_ADD(tmp1, tmp2);            tmp2 = pid_cw2[k] + w2;            tmp1 = LOG_ADD(tmp1, tmp2);            tmp2 = pid_cw3[k] + w3;            tmp1 = LOG_ADD(tmp1, tmp2);            senone_scores[k] -= tmp1 << 10;        }    }    return 0;}static int32get_scores2_8b(s2_semi_mgau_t * s){    register int32 n, k;    int32 tmp1, tmp2;    unsigned char *pid_cw00, *pid_cw10, *pid_cw01, *pid_cw11,        *pid_cw02, *pid_cw12, *pid_cw03, *pid_cw13;    int32 w00, w10, w01, w11, w02, w12, w03, w13;    memset(senone_scores, 0, s->CdWdPDFMod * sizeof(*senone_scores));    /* ptrs to senone prob ids */    pid_cw00 = s->OPDF_8B[0][s->f[0][0].codeword];    pid_cw10 = s->OPDF_8B[0][s->f[0][1].codeword];    pid_cw01 = s->OPDF_8B[1][s->f[1][0].codeword];    pid_cw11 = s->OPDF_8B[1][s->f[1][1].codeword];    pid_cw02 = s->OPDF_8B[2][s->f[2][0].codeword];    pid_cw12 = s->OPDF_8B[2][s->f[2][1].codeword];    pid_cw03 = s->OPDF_8B[3][s->f[3][0].codeword];    pid_cw13 = s->OPDF_8B[3][s->f[3][1].codeword];    w00 = s->f[0][0].val.score;    w10 = s->f[0][1].val.score;    w01 = s->f[1][0].val.score;    w11 = s->f[1][1].val.score;    w02 = s->f[2][0].val.score;    w12 = s->f[2][1].val.score;    w03 = s->f[3][0].val.score;    w13 = s->f[3][1].val.score;    /* Floor w0..w3 to 256<<10 - 162k */    /* Condition should never be TRUE */    if (w10 < -99000)        w10 = -99000;    if (w00 < -99000)        w00 = -99000;    if (w11 < -99000)        w11 = -99000;    if (w01 < -99000)        w01 = -99000;    if (w12 < -99000)        w12 = -99000;    if (w02 < -99000)        w02 = -99000;    if (w13 < -99000)        w13 = -99000;    if (w03 < -99000)        w03 = -99000;    /* Quantize */    w10 = (511 - w10) >> 10;    w00 = (511 - w00) >> 10;    w11 = (511 - w11) >> 10;    w01 = (511 - w01) >> 10;    w12 = (511 - w12) >> 10;    w02 = (511 - w02) >> 10;    w13 = (511 - w13) >> 10;    w03 = (511 - w03) >> 10;    for (k = 0; k < n_senone_active; k++) {	n = senone_active[k];        tmp1 = pid_cw00[n] + w00;        tmp2 = pid_cw10[n] + w10;        tmp1 = LOG_ADD(tmp1, tmp2);        senone_scores[n] -= tmp1 << 10;        tmp1 = pid_cw01[n] + w01;        tmp2 = pid_cw11[n] + w11;        tmp1 = LOG_ADD(tmp1, tmp2);        senone_scores[n] -= tmp1 << 10;        tmp1 = pid_cw02[n] + w02;        tmp2 = pid_cw12[n] + w12;        tmp1 = LOG_ADD(tmp1, tmp2);        senone_scores[n] -= tmp1 << 10;        tmp1 = pid_cw03[n] + w03;        tmp2 = pid_cw13[n] + w13;        tmp1 = LOG_ADD(tmp1, tmp2);        senone_scores[n] -= tmp1 << 10;    }    return 0;}static int32get_scores2_8b_all(s2_semi_mgau_t * s){    register int32 n;    int32 tmp1, tmp2;    unsigned char *pid_cw00, *pid_cw10, *pid_cw01, *pid_cw11,        *pid_cw02, *pid_cw12, *pid_cw03, *pid_cw13;    int32 w00, w10, w01, w11, w02, w12, w03, w13;    n_senone_active = s->CdWdPDFMod;    memset(senone_scores, 0, s->CdWdPDFMod * sizeof(*senone_scores));    /* ptrs to senone prob ids */    pid_cw00 = s->OPDF_8B[0][s->f[0][0].codeword];    pid_cw10 = s->OPDF_8B[0][s->f[0][1].codeword];    pid_cw01 = s->OPDF_8B[1][s->f[1][0].codeword];    pid_cw11 = s->OPDF_8B[1][s->f[1][1].codeword];    pid_cw02 = s->OPDF_8B[2][s->f[2][0].codeword];    pid_cw12 = s->OPDF_8B[2][s->f[2][1].codeword];    pid_cw03 = s->OPDF_8B[3][s->f[3][0].codeword];    pid_cw13 = s->OPDF_8B[3][s->f[3][1].codeword];    w00 = s->f[0][0].val.score;    w10 = s->f[0][1].val.score;    w01 = s->f[1][0].val.score;    w11 = s->f[1][1].val.score;    w02 = s->f[2][0].val.score;    w12 = s->f[2][1].val.score;    w03 = s->f[3][0].val.score;    w13 = s->f[3][1].val.score;    /* Floor w0..w3 to 256<<10 - 162k */    /* Condition should never be TRUE */    if (w10 < -99000)        w10 = -99000;    if (w00 < -99000)        w00 = -99000;    if (w11 < -99000)        w11 = -99000;    if (w01 < -99000)        w01 = -99000;    if (w12 < -99000)        w12 = -99000;    if (w02 < -99000)        w02 = -99000;    if (w13 < -99000)        w13 = -99000;    if (w03 < -99000)        w03 = -99000;    /* Quantize */    w10 = (511 - w10) >> 10;    w00 = (511 - w00) >> 10;    w11 = (511 - w11) >> 10;    w01 = (511 - w01) >> 10;    w12 = (511 - w12) >> 10;    w02 = (511 - w02) >> 10;    w13 = (511 - w13) >> 10;    w03 = (511 - w03) >> 10;    for (n = 0; n < s->CdWdPDFMod; n++) {        tmp1 = pid_cw00[n] + w00;        tmp2 = pid_cw10[n] + w10;        tmp1 = LOG_ADD(tmp1, tmp2);        senone_scores[n] -= tmp1 << 10;        tmp1 = pid_cw01[n] + w01;        tmp2 = pid_cw11[n] + w11;        tmp1 = LOG_ADD(tmp1, tmp2);        senone_scores[n] -= tmp1 << 10;        tmp1 = pid_cw02[n] + w02;        tmp2 = pid_cw12[n] + w12;        tmp1 = LOG_ADD(tmp1, tmp2);        senone_scores[n] -= tmp1 << 10;        tmp1 = pid_cw03[n] + w03;        tmp2 = pid_cw13[n] + w13;        tmp1 = LOG_ADD(tmp1, tmp2);        senone_scores[n] -= tmp1 << 10;    }    return 0;}static int32get_scores1_8b(s2_semi_mgau_t * s){    int32 j, k;    unsigned char *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3;    /* Ptrs to senone prob values for the top codeword of all codebooks */    pid_cw0 = s->OPDF_8B[0][s->f[0][0].codeword];    pid_cw1 = s->OPDF_8B[1][s->f[1][0].codeword];    pid_cw2 = s->OPDF_8B[2][s->f[2][0].codeword];    pid_cw3 = s->OPDF_8B[3][s->f[3][0].codeword];    for (k = 0; k < n_senone_active; k++) {        j = senone_active[k];        /* ** HACK!! ** <<10 hardwired!! */        senone_scores[j] =            -((pid_cw0[j] + pid_cw1[j] + pid_cw2[j] + pid_cw3[j]) << 10);    }    return 0;}static int32get_scores1_8b_all(s2_semi_mgau_t * s){    int32 j;    unsigned char *pid_cw0, *pid_cw1, *pid_cw2, *pid_cw3;    int *senscr = senone_scores;    n_senone_active = s->CdWdPDFMod;    /* Ptrs to senone prob values for the top codeword of all codebooks */    pid_cw0 = s->OPDF_8B[0][s->f[0][0].codeword];    pid_cw1 = s->OPDF_8B[1][s->f[1][0].codeword];    pid_cw2 = s->OPDF_8B[2][s->f[2][0].codeword];    pid_cw3 = s->OPDF_8B[3][s->f[3][0].codeword];    for (j = 0; j < s->CdWdPDFMod; j++) {        /* ** HACK!! ** <<10 hardwired!! */	*senscr++ =            -((pid_cw0[j] + pid_cw1[j] + pid_cw2[j] + pid_cw3[j]) << 10);    }    return 0;}int32s2_semi_mgau_load_kdtree(s2_semi_mgau_t * s, const char *kdtree_path,                         uint32 maxdepth, int32 maxbbi){    if (read_kd_trees(kdtree_path, &s->kdtrees, &s->n_kdtrees,                      maxdepth, maxbbi) == -1)        E_FATAL("Failed to read kd-trees from %s\n", kdtree_path);    if (s->n_kdtrees != s->n_feat)        E_FATAL("Number of kd-trees != %d\n", s->n_feat);    s->kd_maxdepth = maxdepth;    s->kd_maxbbi = maxbbi;    return 0;}static int32load_senone_dists_8bits(s2_semi_mgau_t *s, char const *file){    FILE *fp;    char line[1000];    int32 i, n;    int32 use_mmap, do_swap;    size_t filesize, offset;    int n_clust = 256;          /* Number of clusters (if zero, we are just using                                 * 8-bit quantized weights) */    int r = s->n_density;    int c = bin_mdef_n_sen(mdef);    use_mmap = cmd_ln_boolean("-mmap");    if ((fp = fopen(file, "rb")) == NULL)        return -1;    E_INFO("Loading senones from dump file %s\n", file);    /* Read title size, title */    fread(&n, sizeof(int32), 1, fp);    /* This is extremely bogus */    do_swap = 0;    if (n < 1 || n > 999) {        SWAP_INT32(&n);        if (n < 1 || n > 999) {            E_FATAL("Title length %x in dump file %s out of range\n", n, file);        }        do_swap = 1;    }    if (do_swap && use_mmap) {        E_ERROR("Dump file is byte-swapped, cannot use memory-mapping\n");        use_mmap = 0;    }    if (fread(line, sizeof(char), n, fp) != n)        E_FATAL("Cannot read title\n");    if (line[n - 1] != '\0')        E_FATAL("Bad title in dump file\n");    E_INFO("%s\n", line);    /* Read header size, header */    fread(&n, 1, sizeof(n), fp);    if (do_swap) SWAP_INT32(&n);    if (fread(line, sizeof(char), n, fp) != n)        E_FATAL("Cannot read header\n");    if (line[n - 1] != '\0')        E_FATAL("Bad header in dump file\n");    /* Read other header strings until string length = 0 */    for (;;) {        fread(&n, 1, sizeof(n), fp);        if (do_swap) SWAP_INT32(&n);        if (n == 0)            break;        if (fread(line, sizeof(char), n, fp) != n)            E_FATAL("Cannot read header\n");        /* Look for a cluster count, if present */        if (!strncmp(line, "cluster_count ", strlen("cluster_count "))) {            n_clust = atoi(line + strlen("cluster_count "));        }    }    /* Read #codewords, #pdfs */    fread(&r, 1, sizeof(r), fp);    if (do_swap) SWAP_INT32(&r);    fread(&c, 1, sizeof(c), fp);    if (do_swap) SWAP_INT32(&c);    if (n_clust) {	E_ERROR ("Dump file is incompatible with PocketSphinx\n");	fclose(fp);	return -1;    }    if (use_mmap) {            E_INFO("Using memory-mapped I/O for senones\n");    }    /* Verify alignment constraints for using mmap() */    if ((c & 3) != 0) {        /* This will cause us to run very slowly, so don't do it. */        E_ERROR            ("Number of PDFs (%d) not padded to multiple of 4, will not use mmap()\n",             c);        use_mmap = 0;    }    offset = ftell(fp);    fseek(fp, 0, SEEK_END);    filesize = ftell(fp);    fseek(fp, offset, SEEK_SET);    if ((offset & 3) != 0) {        E_ERROR            ("PDFs are not aligned to 4-byte boundary in file, will not use mmap()\n");        use_mmap = 0;    }    /* Allocate memory for pdfs */    if (use_mmap) {        s->OPDF_8B = ckd_calloc(s->n_feat + 1, sizeof(unsigned char**));        for (i = 0; i < s->n_feat; i++) {            /* Pointers into the mmap()ed 2d array */	    s->OPDF_8B[i] =                 (unsigned char **) ckd_calloc(r, sizeof(unsigned char *));

⌨️ 快捷键说明

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