📄 s2_semi_mgau.c
字号:
/* * 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 + -