summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-01-22 00:13:42 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2009-01-22 00:13:42 -0800
commit21208dbbe2608ae45b8c4a50d83e353880dc491f (patch)
treed22a79be5bc9aa110dd0051e55a8613a80e777b4
parent14c27f8650c090a4bab4ab4156f335c762ab228a (diff)
downloadsrec-21208dbbe2608ae45b8c4a50d83e353880dc491f.tar.gz
auto import from //branches/cupcake/...@127436
-rw-r--r--srec/clib/log_add.h4
-rw-r--r--srec/clib/swimodel.c159
-rw-r--r--srec/clib/voc_read.c83
-rw-r--r--srec/crec/c47mulsp.c16
-rw-r--r--srec/crec/get_fram.c2
-rw-r--r--srec/crec/srec.c27
-rw-r--r--srec/include/c42mul.h4
-rw-r--r--srec/include/hmmlib.h7
-rw-r--r--srec/include/simapi.h6
-rw-r--r--srec/include/srec.h4
-rw-r--r--srec/include/swimodel.h53
-rw-r--r--tools/grxmlcompile/grph.h17
12 files changed, 167 insertions, 215 deletions
diff --git a/srec/clib/log_add.h b/srec/clib/log_add.h
index 9f59cff..bcd64de 100644
--- a/srec/clib/log_add.h
+++ b/srec/clib/log_add.h
@@ -20,9 +20,9 @@
#ifndef _inl_log_add_
#define _inl_log_add_
-static PINLINE prdata log_increment_inline(prdata ival, logadd_table_info *logtab);
+static PINLINE prdata log_increment_inline(prdata ival, const logadd_table_info *logtab);
-static PINLINE prdata log_increment_inline(prdata ival, logadd_table_info *logtab)
+static PINLINE prdata log_increment_inline(prdata ival, const logadd_table_info *logtab)
/*
** To add two numbers stored as their natural logarithms
** A more efficient implementation is to use lookup tables.
diff --git a/srec/clib/swimodel.c b/srec/clib/swimodel.c
index 8d1711c..2ea194c 100644
--- a/srec/clib/swimodel.c
+++ b/srec/clib/swimodel.c
@@ -11,7 +11,7 @@
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
@@ -32,37 +32,9 @@
#include "log_add.h"
#include "swimodel.h"
-/* const float root_pi_over_2= (float)1.2533141; */
-const prdata max_log = (prdata) MAX_LOG;
#define MTAG NULL
-/*--------------------------------------------------------------*
- * *
- * *
- * *
- *--------------------------------------------------------------*/
-
-costdata DURATION_PENALTY_UNIT = 1;
-int NUM_FRAMES_PER_VALID_FRAME = 0;
-/* this is just for debugging, able to turn duration model off */
-
-void check_duration_penalty()
-{
- char *p = getenv("DUR_PR");
- if (p)
- {
- DURATION_PENALTY_UNIT = (costdata) atoi(p);
- }
-#ifdef SREC_ENGINE_VERBOSE_LOGGING
- PLogMessage("DUR_PR %d\n", DURATION_PENALTY_UNIT);
-#endif
-}
-
-void duration_penalty_set_frames_per_valid_frame(int n)
-{
- NUM_FRAMES_PER_VALID_FRAME = n;
-}
/*--------------------------------------------------------------*
* *
@@ -75,7 +47,7 @@ void duration_penalty_set_frames_per_valid_frame(int n)
look roughly like normal distributions centered at the average state
durations */
-char loop_cost_table [128][6] = {
+const char loop_cost_table [128][6] = {
{0,0,0,0,0,0},
{13,15,16,16,16,16},
{12,13,14,14,14,14},
@@ -211,7 +183,7 @@ char loop_cost_table [128][6] = {
look roughly like normal distributions centered at the average state
durations */
-char trans_cost_table [128][6] = {
+const char trans_cost_table [128][6] = {
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
@@ -355,88 +327,84 @@ static short load_short(PFile* fp)
return v;
}
-SWIModel* load_swimodel(char *filename)
+const SWIModel* load_swimodel(const char *filename)
{
- featdata *mean_ptr;
- wtdata *weight_ptr;
int i;
- PFile* fp = NULL;
- short* num_pdfs_in_model;
- int num_allocated;
- SWIModel *swimodel;
- int ni;
-
- fp = pfopen ( filename, L("rb") );
-/* CHKLOG(rc, PFileSystemCreatePFile(filename, ESR_TRUE, &fp));
- CHKLOG(rc, PFileOpen(fp, L("rb")));*/
-
- if ( fp == NULL )
- goto CLEANUP;
+ SWIModel *swimodel = NULL;
+ const void* file = NULL;
#ifdef SREC_ENGINE_VERBOSE_LOGGING
PLogMessage("load_swimodel: loaded %s", filename);
#endif
swimodel = (SWIModel*) CALLOC(1, sizeof(SWIModel), "clib.models.base");
- num_allocated = sizeof(SWIModel);
- swimodel->num_hmmstates = load_short(fp);
- swimodel->num_dims = load_short(fp);
- swimodel->num_pdfs = load_short(fp);
-
- swimodel->hmmstates = (SWIhmmState*) CALLOC(swimodel->num_hmmstates, sizeof(SWIhmmState), "clib.models.states");
- num_allocated += swimodel->num_hmmstates * sizeof(SWIhmmState);
-
- swimodel->allmeans = (featdata*) CALLOC(swimodel->num_pdfs * swimodel->num_dims, sizeof(featdata), "clib.models.means");
- num_allocated += swimodel->num_pdfs * swimodel->num_dims * sizeof(featdata);
- swimodel->allweights = (wtdata*) CALLOC(swimodel->num_pdfs, sizeof(wtdata), "clib.models.weights");
- num_allocated += swimodel->num_pdfs * sizeof(featdata);
- swimodel->avg_state_durations = (featdata*) CALLOC(swimodel->num_hmmstates, sizeof(featdata), "clib.models.durs");
-
- num_pdfs_in_model = (short*) MALLOC(sizeof(short) * swimodel->num_hmmstates, MTAG);
- ni = pfread(num_pdfs_in_model, sizeof(short), swimodel->num_hmmstates, fp);
- ASSERT(ni == swimodel->num_hmmstates);
- ni = pfread(swimodel->allmeans, sizeof(featdata), swimodel->num_dims * swimodel->num_pdfs, fp);
- ASSERT(ni == swimodel->num_pdfs*swimodel->num_dims);
- ni = pfread(swimodel->allweights, sizeof(wtdata), swimodel->num_pdfs, fp);
- ASSERT(ni == swimodel->num_pdfs);
- ni = pfread(swimodel->avg_state_durations, sizeof(featdata), swimodel->num_hmmstates, fp);
- ASSERT(ni == swimodel->num_hmmstates);
+
+ if (mmap_zip(filename, &swimodel->mmap_zip_data, &swimodel->mmap_zip_size)) {
+ PLogError("load_swimodel: mmap_zip failed for %s\n", filename);
+ goto CLEANUP;
+ }
+ file = swimodel->mmap_zip_data;
+
+ swimodel->num_hmmstates = *(const short*)file;
+ file += sizeof(short);
+ swimodel->num_dims = *(const short*)file;
+ file += sizeof(short);
+ swimodel->num_pdfs = *(const short*)file;
+ file += sizeof(short);
+
+ SWIhmmState* hmmstates = (SWIhmmState*) CALLOC(swimodel->num_hmmstates, sizeof(SWIhmmState), "clib.models.states");
+ swimodel->hmmstates = hmmstates;
+
+ const short* num_pdfs_in_model = (const short*)file;
+ file += sizeof(short) * swimodel->num_hmmstates;
+
+ swimodel->allmeans = (const featdata*)file;
+ file += sizeof(featdata) * swimodel->num_pdfs * swimodel->num_dims;
+
+ swimodel->allweights = (const wtdata*)file;
+ file += sizeof(wtdata) * swimodel->num_pdfs;
+
+ swimodel->avg_state_durations = (const featdata*)file;
+ file += sizeof(featdata) * swimodel->num_hmmstates;
+
+ if (file > swimodel->mmap_zip_data + swimodel->mmap_zip_size) {
+ PLogError("load_swimodel: not enough data in %s", filename);
+ goto CLEANUP;
+ }
#ifdef SREC_ENGINE_VERBOSE_LOGGING
- PLogMessage("loaded models %s num_hmmstates %d num_dims %d num_pdfs %d allocated %d bytes weights[0] %d\n",
- filename, swimodel->num_hmmstates, swimodel->num_dims, swimodel->num_pdfs, num_allocated,
+ PLogMessage("loaded models %s num_hmmstates %d num_dims %d num_pdfs %d weights[0] %d\n",
+ filename, swimodel->num_hmmstates, swimodel->num_dims, swimodel->num_pdfs,
*swimodel->allweights);
#endif
- mean_ptr = swimodel->allmeans;
- weight_ptr = swimodel->allweights;
+ const featdata* mean_ptr = swimodel->allmeans;
+ const wtdata* weight_ptr = swimodel->allweights;
for (i = 0;i < swimodel->num_hmmstates;i++)
{
- swimodel->hmmstates[i].num_pdfs = num_pdfs_in_model[i];
- swimodel->hmmstates[i].means = mean_ptr;
- swimodel->hmmstates[i].weights = weight_ptr;
+ hmmstates[i].num_pdfs = num_pdfs_in_model[i];
+ hmmstates[i].means = mean_ptr;
+ hmmstates[i].weights = weight_ptr;
mean_ptr += swimodel->num_dims * num_pdfs_in_model[i];
weight_ptr += num_pdfs_in_model[i];
}
- FREE(num_pdfs_in_model);
- num_pdfs_in_model = NULL;
- pfclose(fp);
+
return swimodel;
+
CLEANUP:
- if (fp != NULL)
- pfclose ( fp );
+ free_swimodel(swimodel);
return NULL;
}
-void free_swimodel(SWIModel* swimodel)
+void free_swimodel(const SWIModel* swimodel)
{
- FREE(swimodel->hmmstates);
- FREE(swimodel->allmeans);
- FREE(swimodel->allweights);
- FREE(swimodel->avg_state_durations);
- FREE(swimodel);
+ if (!swimodel) return;
+ if (swimodel->mmap_zip_data) munmap_zip(swimodel->mmap_zip_data, swimodel->mmap_zip_size);
+ FREE((void*)swimodel->hmmstates);
+ FREE((void*)swimodel);
}
-static PINLINE prdata Gaussian_Grand_Density_Swimodel(preprocessed *data, featdata *means)
+
+static PINLINE prdata Gaussian_Grand_Density_Swimodel(const preprocessed *data, const featdata *means)
/*
** Observation probability function of a Gaussian pdf
** with diagonal covariance matrix.
@@ -444,8 +412,8 @@ static PINLINE prdata Gaussian_Grand_Density_Swimodel(preprocessed *data, featda
{
prdata pval;
prdata diff;
- imeldata *dvec;
- imeldata *dend;
+ const imeldata *dvec;
+ const imeldata *dend;
int count;
dvec = data->seq + data->use_from; /* Move to starting feature element */
@@ -463,8 +431,8 @@ static PINLINE prdata Gaussian_Grand_Density_Swimodel(preprocessed *data, featda
return (pval);
}
-scodata mixture_diagonal_gaussian_swimodel(preprocessed *prep,
- SWIhmmState *spd, short num_dims)
+scodata mixture_diagonal_gaussian_swimodel(const preprocessed *prep,
+ const SWIhmmState *spd, short num_dims)
/*
** Observation probability function
*/
@@ -473,13 +441,14 @@ scodata mixture_diagonal_gaussian_swimodel(preprocessed *prep,
prdata pval, gval;
prdata dval;
- featdata *meanptr;
- wtdata *weightptr;
+ const featdata *meanptr;
+ const wtdata *weightptr;
ASSERT(prep);
ASSERT(spd);
- pval = -max_log;
+ pval = -(prdata) MAX_LOG;
+
meanptr = spd->means;
weightptr = spd->weights;
diff --git a/srec/clib/voc_read.c b/srec/clib/voc_read.c
index 549b93b..70ddff3 100644
--- a/srec/clib/voc_read.c
+++ b/srec/clib/voc_read.c
@@ -11,7 +11,7 @@
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
@@ -58,14 +58,9 @@ extern "C"
static const char voc_read[] = "$Id: voc_read.c,v 1.14.6.18 2008/03/05 21:18:44 dahan Exp $";
-#define SORTED_WORD_LIST 1
-#define MAX_PRON_LEN 255
#define cr_or_nl(ch) ((ch) == '\n' || (ch) == '\r')
-static int mmap_zip(const char* fname, void** buf, size_t* size);
-static int munmap_zip(void* buf, size_t size);
-
#ifndef _RTT
@@ -82,8 +77,6 @@ int read_word_transcription(const LCHAR* basename, vocab_info* voc, ESR_Locale*
char token[256];
ASSERT(voc);
-
- //PLogError("read_word_transcription hello\n");
if (basename == NULL || strlen(basename) == 0) {
PLogError("Error: invalid arg to read_word_transcription()\n");
@@ -94,16 +87,16 @@ int read_word_transcription(const LCHAR* basename, vocab_info* voc, ESR_Locale*
PLogError("read_word_transcription: mmap_zip failed for %s\n", basename);
goto CLEANUP;
}
-
+
/* this assumption eliminates simplifies bounds checking when parsing */
if (!cr_or_nl(voc->ok_file_data[voc->ok_file_data_length - 1])) {
PLogError(L("read_word_transcription: last character in %s not newline\n"), basename);
goto CLEANUP;
}
-
+
/* set up point to walk the data */
ok = voc->ok_file_data;
-
+
/* verify the header */
i = 0;
while (*ok != '=') {
@@ -126,13 +119,13 @@ int read_word_transcription(const LCHAR* basename, vocab_info* voc, ESR_Locale*
token[i] = 0;
ok++;
CHKLOG(rc, ESR_str2locale(token, locale));
-
+
/* set up first and last entries */
voc->first_entry = strchr(voc->ok_file_data, '\n') + 1;
voc->last_entry = voc->ok_file_data + voc->ok_file_data_length - 2;
while (*voc->last_entry != '\n') voc->last_entry--; /* header forces termination */
voc->last_entry++;
-
+
/* determine if there are any upper case entries */
voc->hasUpper = 1;
while (ok < voc->ok_file_data + voc->ok_file_data_length) {
@@ -149,15 +142,13 @@ int read_word_transcription(const LCHAR* basename, vocab_info* voc, ESR_Locale*
while (*ok++ != '\n') ;
}
- //PLogError("read_word_transcription goodbye %d", voc->hasUpper);
-
return 0;
-
+
CLEANUP:
delete_word_transcription(voc);
PLogError(L("read_word_transcription: failed to read '%s'"), basename);
-
+
return -1;
}
#endif
@@ -178,10 +169,10 @@ int get_prons(const vocab_info* voc, const char* label, char* prons, int prons_l
const char* high;
//PLogError(L("get_prons '%s'"), label);
-
+
/* dictionaries are usually lower case, so do this for speed */
if (!voc->hasUpper && 'A' <= *label && *label <= 'Z') return 0;
-
+
/* binary search to find matching entry */
low = voc->first_entry;
high = voc->last_entry;
@@ -189,14 +180,14 @@ int get_prons(const vocab_info* voc, const char* label, char* prons, int prons_l
/* pick a point in the middle and align to next entry */
middle = low + ((high - low) >> 1) - 1;
while (*middle++ != '\n') ;
-
+
/* compare 'label' to 'middle' */
int diff = kompare(label, middle);
if (diff == 0) break;
-
+
/* nothing found */
if (low == high) return 0;
-
+
/* 'middle' aligned to 'high', so move 'high' down */
if (middle == high) {
high -= 2;
@@ -204,31 +195,31 @@ int get_prons(const vocab_info* voc, const char* label, char* prons, int prons_l
high++;
continue;
}
-
+
if (diff > 0) low = middle;
else high = middle;
}
-
+
/* back up to find the first entry equal to 'label' */
low = middle;
while (voc->first_entry < low) {
- char* lo;
+ const char* lo;
for (lo = low - 2; *lo != '\n'; lo--) ;
lo++;
if (kompare(label, lo)) break;
low = lo;
}
-
+
/* move forward to the last entry equal to 'label' */
high = middle;
while (high < voc->last_entry) {
- char* hi;
+ const char* hi;
for (hi = high; *hi != '\n'; hi++) ;
hi++;
if (kompare(label, hi)) break;
high = hi;
}
-
+
/* loop over all the entries */
num_prons = 0;
while (low <= high) {
@@ -237,7 +228,7 @@ int get_prons(const vocab_info* voc, const char* label, char* prons, int prons_l
/* skip the whitespace */
while (*low == ' ') low++;
-
+
/* copy the pron */
while (*low != '\n') {
if (--prons_len <= 2) return -1;
@@ -248,7 +239,7 @@ int get_prons(const vocab_info* voc, const char* label, char* prons, int prons_l
num_prons++;
}
*prons++ = 0;
-
+
return num_prons;
}
@@ -277,7 +268,7 @@ static size_t inflateSize(size_t size) {
return size + size / 1000 + 1;
}
-static int mmap_zip(const char* fname, void** buf, size_t* size) {
+int mmap_zip(const char* fname, void** buf, size_t* size) {
int fd = -1;
struct stat statbuf;
zipfile_t zf = 0;
@@ -285,57 +276,57 @@ static int mmap_zip(const char* fname, void** buf, size_t* size) {
char entryname[FILENAME_MAX];
size_t size2 = 0;
void* buf2 = 0;
-
+
/* open data file, determine size, map it, and close fd */
fd = open(fname, O_RDONLY);
if (fd < 0) goto FAILED;
-
+
/* determine length */
if (fstat(fd, &statbuf) < 0) goto FAILED;
-
+
/* mmap it */
*size = statbuf.st_size;
*buf = mmap(0, inflateSize(statbuf.st_size), PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
if (*buf == MAP_FAILED) goto FAILED;
-
+
/* close fd, since we can */
close(fd);
fd = -1;
-
+
/* if not a zip file, we are done! */
if (!endeql(fname, ".zip")) return 0;
-
+
/* set up zipfiler */
zf = init_zipfile(*buf, *size);
if (!zf) goto FAILED;
-
+
/* get entry */
strcpy(entryname, strrchr(fname, '/') ? strrchr(fname, '/') + 1 : fname);
entryname[strlen(entryname) - strlen(".zip")] = 0;
ze = lookup_zipentry(zf, entryname);
if (!ze) goto FAILED;
-
+
/* mmap anon memory to hold unzipped entry */
size2 = get_zipentry_size(ze);
buf2 = mmap(0, inflateSize(size2), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
if (buf2 == (void*)-1) goto FAILED;
-
+
/* unzip entry */
if (decompress_zipentry(ze, buf2, size2)) goto FAILED;
-
+
/* release unzipper */
release_zipfile(zf);
zf = 0;
-
+
/* release mmapped file */
munmap(*buf, inflateSize(*size));
-
+
/* set return values */
*buf = buf2;
*size = size2;
-
+
return 0;
-
+
FAILED:
if (fd != -1) close(fd);
if (zf) release_zipfile(zf);
@@ -346,7 +337,7 @@ FAILED:
return -1;
}
-static int munmap_zip(void* buf, size_t size) {
+int munmap_zip(void* buf, size_t size) {
return munmap(buf, inflateSize(size));
}
diff --git a/srec/crec/c47mulsp.c b/srec/crec/c47mulsp.c
index 084d70b..051db39 100644
--- a/srec/crec/c47mulsp.c
+++ b/srec/crec/c47mulsp.c
@@ -11,7 +11,7 @@
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
@@ -27,7 +27,7 @@
#include "srec_context.h"
#include "srec.h"
-int add_acoustic_model_for_recognition(multi_srec* recm, SWIModel* model)
+int add_acoustic_model_for_recognition(multi_srec* recm, const SWIModel* model)
{
if (recm->num_swimodels >= MAX_ACOUSTIC_MODELS)
{
@@ -39,7 +39,7 @@ int add_acoustic_model_for_recognition(multi_srec* recm, SWIModel* model)
log_report("Error: too few recognizers allocated\n");
return 0;
}
-
+
if (recm->rec[0].num_model_slots_allocated < model->num_hmmstates)
{
PLogError("recognizer max_model_states %d, acoustic model num states %d, set CREC.Recognizer.max_model_states higher\n",
@@ -47,10 +47,10 @@ int add_acoustic_model_for_recognition(multi_srec* recm, SWIModel* model)
model->num_hmmstates);
return 0;
}
-
+
recm->swimodel[ recm->num_swimodels] = model;
recm->num_swimodels++;
-
+
recm->num_activated_recs++;
return 1;
}
@@ -90,11 +90,11 @@ void end_recognition(multi_srec *recm)
int activate_grammar_for_recognition(multi_srec* recm, srec_context* grammar, const char* rule)
{
- srec_context* context = (srec_context*)grammar;
-
+ srec_context* context = grammar;
+
context->max_searchable_nodes = recm->max_fsm_nodes;
context->max_searchable_arcs = recm->max_fsm_arcs;
-
+
if (context->max_searchable_nodes < context->num_nodes || context->max_searchable_arcs < context->num_arcs)
{
PLogError(L("Error: context switch failed due to search limitations [arcs max=%d, actual=%d], [nodes max=%d, actual=%d]\n"),
diff --git a/srec/crec/get_fram.c b/srec/crec/get_fram.c
index 557f449..d92ab1b 100644
--- a/srec/crec/get_fram.c
+++ b/srec/crec/get_fram.c
@@ -35,8 +35,6 @@
#define DEBUG 0
#define FUDGE_FACTOR 1.2f
-extern const prdata max_log;
-
const float root_pi_over_2 = (float) 1.2533141;
static const char get_fram[] = "$Id: get_fram.c,v 1.7.6.13 2007/10/15 18:06:24 dahan Exp $";
diff --git a/srec/crec/srec.c b/srec/crec/srec.c
index 9d4bdce..e9e9037 100644
--- a/srec/crec/srec.c
+++ b/srec/crec/srec.c
@@ -321,7 +321,7 @@ static asr_uint16_t best_uint16(asr_uint16_t* p, int n)
for (;--n > 0;p++) if (rv > *p) rv = *p;
return rv;
}
-static int compute_model_scores(costdata *current_model_scores, SWIModel *acoustic_models,
+static int compute_model_scores(costdata *current_model_scores, const SWIModel *acoustic_models,
pattern_info *pattern, frameID current_search_frame)
{
int i;
@@ -329,13 +329,10 @@ static int compute_model_scores(costdata *current_model_scores, SWIModel *acoust
for (i = 0; i < acoustic_models->num_hmmstates; i++)
{
- SWIhmmState *hmmstate = &acoustic_models->hmmstates[i];
-
- scodata score;
-
if (current_model_scores[i] == DO_COMPUTE_MODEL)
{
- score = mixture_diagonal_gaussian_swimodel(pattern->prep, hmmstate, acoustic_models->num_dims);
+ scodata score = mixture_diagonal_gaussian_swimodel(pattern->prep,
+ &acoustic_models->hmmstates[i], acoustic_models->num_dims);
ASSERT(score <= 0 && "model score out of range");
current_model_scores[i] = (costdata) - score;
@@ -349,7 +346,7 @@ static int compute_model_scores(costdata *current_model_scores, SWIModel *acoust
/*precompute all needed models to be used by next frame of search*/
-static int find_which_models_to_compute(srec *rec, SWIModel *acoustic_models)
+static int find_which_models_to_compute(srec *rec, const SWIModel *acoustic_models)
{
int i;
modelID model_index;
@@ -1017,7 +1014,7 @@ static int do_epsilon_updates(srec *rec, costdata prune_delta,
new_ftoken->next_token_index = current_ftoken->next_token_index;
current_ftoken->next_token_index = new_ftoken_index;
rec->best_token_for_node[ fsm_arc->to_node] = new_ftoken_index;
- /* new_ftoken->aword_backtrace must be null, alts here were
+ /* new_ftoken->aword_backtrace must be null, alts here were
processed and dropped in srec_process_word_boundary_nbest() */
if(new_ftoken->aword_backtrace != AWTNULL) {
PLogError( ("Error: internal search error near %s %d\n"), __FILE__, __LINE__);
@@ -1052,9 +1049,9 @@ static int do_epsilon_updates(srec *rec, costdata prune_delta,
new_ftoken->word_backtrace = current_ftoken->word_backtrace;
new_ftoken->word = word_with_wtw;
/* here we are giving up the path and alternatives that existed at
- this node, which is not great! The new (better) top choice
- coming in and it's alternatives are propagated instead.
- TODO: merge the alternative lists and the previous top choice
+ this node, which is not great! The new (better) top choice
+ coming in and it's alternatives are propagated instead.
+ TODO: merge the alternative lists and the previous top choice
*/
if(new_ftoken->aword_backtrace!=AWTNULL)
free_altword_token_batch( rec, new_ftoken->aword_backtrace);
@@ -1996,7 +1993,7 @@ void srec_terminate(srec* rec)
*/
void srec_viterbi_part1(srec *rec,
- SWIModel *acoustic_models,
+ const SWIModel *acoustic_models,
pattern_info *pattern,
costdata silence_model_cost);
@@ -2038,8 +2035,8 @@ int multi_srec_viterbi(multi_srec *recm,
{
srec* rec1 = &recm->rec[0];
srec* rec2 = &recm->rec[1];
- SWIModel* acoustic_models1 = recm->swimodel[0];
- SWIModel* acoustic_models2 = recm->swimodel[1];
+ const SWIModel* acoustic_models1 = recm->swimodel[0];
+ const SWIModel* acoustic_models2 = recm->swimodel[1];
costdata diff;
costdata current_best_cost;
@@ -2163,7 +2160,7 @@ int multi_srec_viterbi(multi_srec *recm,
void srec_viterbi_part1(srec *rec,
- SWIModel *acoustic_models,
+ const SWIModel *acoustic_models,
pattern_info *pattern,
costdata silence_model_cost)
{
diff --git a/srec/include/c42mul.h b/srec/include/c42mul.h
index fefcd6e..7029abe 100644
--- a/srec/include/c42mul.h
+++ b/srec/include/c42mul.h
@@ -11,7 +11,7 @@
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
@@ -61,7 +61,7 @@ extern "C"
utterance_info *utt);
void begin_recognition(multi_srec *rec, int begin_syn_node);
void end_recognition(multi_srec *rec);
- int add_acoustic_model_for_recognition(multi_srec* rec, SWIModel* swimodel);
+ int add_acoustic_model_for_recognition(multi_srec* rec, const SWIModel* swimodel);
int clear_acoustic_models_for_recognition(multi_srec* rec);
void free_recognition(multi_srec *rec);
diff --git a/srec/include/hmmlib.h b/srec/include/hmmlib.h
index 83f2bab..23d5d1f 100644
--- a/srec/include/hmmlib.h
+++ b/srec/include/hmmlib.h
@@ -11,7 +11,7 @@
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
@@ -32,5 +32,8 @@ static const char hmmlib_h[] = "$Id: hmmlib.h,v 1.4.6.8 2008/01/21 20:30:05 daha
int read_word_transcription(const LCHAR* basename, vocab_info* voc, ESR_Locale* locale);
void delete_word_transcription(vocab_info* voc);
int get_prons(const vocab_info* voc, const char* label, char* prons, int prons_len);
-
+
+int mmap_zip(const char* fname, void** buf, size_t* size);
+int munmap_zip(void* buf, size_t size);
+
#endif /* _h_hmmlib_ */
diff --git a/srec/include/simapi.h b/srec/include/simapi.h
index 6a8d62f..423db4e 100644
--- a/srec/include/simapi.h
+++ b/srec/include/simapi.h
@@ -115,7 +115,7 @@ typedef struct
int use_dim;
int partial_distance_calc_dim;
prdata imelda_scale;
- SWIModel *swimodel; /* owning pointer to compact acoustic models */
+ const SWIModel *swimodel; /* owning pointer to compact acoustic models */
}
CA_Acoustic;
@@ -1461,7 +1461,7 @@ typedef struct
* Returns int
*
************************************************************************
- * tells whether a syntax is to be used for voice-enrollment
+ * tells whether a syntax is to be used for voice-enrollment
************************************************************************
*/
@@ -2794,7 +2794,7 @@ void CA_UnloadRecognitionModels (CA_Recog *hRecog);
void CA_FreeConfidenceScorer(CA_ConfidenceScorer *hConfidenceScorer);
-
+
int CA_LoadConfidenceScorer(CA_ConfidenceScorer* hConfidenceScorer);
/**
*
diff --git a/srec/include/srec.h b/srec/include/srec.h
index 7569a73..ee124d1 100644
--- a/srec/include/srec.h
+++ b/srec/include/srec.h
@@ -277,7 +277,7 @@ struct srec_t
arcID max_fsm_arcs; /* see multi_srec below */
asr_int16_t srec_ended;
AstarStack *astar_stack; /* for backwards word search */
- featdata* avg_state_durations; /* average state durations (from AMs) */
+ const featdata* avg_state_durations; /* average state durations (from AMs) */
srec_eos_detector_state eosd_state;
};
@@ -311,7 +311,7 @@ typedef struct
/* non owning pointer to compact acoustic models */
asr_int32_t num_swimodels;
- SWIModel *swimodel[MAX_ACOUSTIC_MODELS];
+ const SWIModel *swimodel[MAX_ACOUSTIC_MODELS];
EOSrc eos_status;
}
multi_srec;
diff --git a/srec/include/swimodel.h b/srec/include/swimodel.h
index e06ddc2..906f0a1 100644
--- a/srec/include/swimodel.h
+++ b/srec/include/swimodel.h
@@ -11,7 +11,7 @@
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
@@ -25,8 +25,6 @@
#include "srec_sizes.h"
#include "PortExport.h"
-#define MAXduration 255
-#define DURATION_MODEL_OFF 0 /* off for one particular pel */
/**
* @todo document
@@ -36,9 +34,9 @@ typedef struct
short num_pdfs; /* number of pdfs for this state */
/* featdata avg_durn; average state duration, belongs here but stored
elsewhere to avoid paging back to memory of acoustic models, c54!! */
- featdata *means; /* pointer to block of means for the set
+ const featdata *means; /* pointer to block of means for the set
of pdfs (points into the allmeans array)*/
- wtdata *weights; /*pointer to weights*/
+ const wtdata *weights; /*pointer to weights*/
}
SWIhmmState;
@@ -47,18 +45,15 @@ SWIhmmState;
*/
typedef struct
{
- void* mem_image; /* if set, contains a pointer to one chunk of memory which contains
- the entire models. This allows us to read and write the models
- in one shot. The function setup_model_pointers_from_image sets up
- the pointers in these structures*/
- int image_size;
+ void* mmap_zip_data; /* mmap file in one chunk */
+ size_t mmap_zip_size; /* size of above */
modelID num_hmmstates; /* number of hmm states ~ 800 */
short num_dims; /* feature vector dimensions ~ 36 or 28 */
modelID num_pdfs; /* total number of pdfs ~ 4800 */
- SWIhmmState *hmmstates; /* size num_hmmstates ~ 800*/
- featdata *allmeans; /* size num_dims*num_pdfs ~ 36*4800 */
- wtdata *allweights; /* size num_pdfs ~ 4800 */
- featdata *avg_state_durations; /* average duration of this acoustic model state */
+ const SWIhmmState *hmmstates; /* size num_hmmstates ~ 800*/
+ const featdata *allmeans; /* size num_dims*num_pdfs ~ 36*4800 */
+ const wtdata *allweights; /* size num_pdfs ~ 4800 */
+ const featdata *avg_state_durations; /* average duration of this acoustic model state */
}
SWIModel;
@@ -68,24 +63,24 @@ extern "C"
#endif
/* SpeechWorks compact acoustic models */
-SWIModel *load_swimodel(char *filename);
-void free_swimodel(SWIModel* swimodel);
-scodata mixture_diagonal_gaussian_swimodel(preprocessed *prep, SWIhmmState *spd, short num_dims);
-
- extern char loop_cost_table [128][6];
- extern char trans_cost_table [128][6];
+const SWIModel *load_swimodel(const char *filename);
+void free_swimodel(const SWIModel* swimodel);
+scodata mixture_diagonal_gaussian_swimodel(const preprocessed *prep, const SWIhmmState *spd, short num_dims);
+
+extern const char loop_cost_table [128][6];
+extern const char trans_cost_table [128][6];
#ifdef __cplusplus
}
#endif
-/* the looping cost for the new duration model. In this new duration model,
+/* the looping cost for the new duration model. In this new duration model,
the looping probability is multiplied by a sigmoid function having the
- following form: sigm(-scale(duration_so_far-offset)) so that the looping
- cost increases as the duration_so_far increases and encouraging to
- stay within a given state for a duration approx. equal to the average state
- duration. The looping cost values are implemented as a lookup table.*/
+ following form: sigm(-scale(duration_so_far-offset)) so that the looping
+ cost increases as the duration_so_far increases and encouraging to
+ stay within a given state for a duration approx. equal to the average state
+ duration. The looping cost values are implemented as a lookup table.*/
static PINLINE costdata duration_penalty_loop(frameID average_duration, frameID duration_so_far)
{
@@ -95,10 +90,10 @@ static PINLINE costdata duration_penalty_loop(frameID average_duration, frameID
}
/* the transition cost for the new duration model. In this new duration model,
- the transition probability is multiplied by a sigmoid function having the
- following form: sigm(scale(duration_so_far-offset)) so that the transition
- cost decreases as the duration_so_far increases thus encouraging to leave
- a given state when the duration exceeds the average state duration. The transition
+ the transition probability is multiplied by a sigmoid function having the
+ following form: sigm(scale(duration_so_far-offset)) so that the transition
+ cost decreases as the duration_so_far increases thus encouraging to leave
+ a given state when the duration exceeds the average state duration. The transition
cost values are implemented as a lookup table*/
static PINLINE costdata duration_penalty_depart(frameID average_duration, frameID duration_so_far)
diff --git a/tools/grxmlcompile/grph.h b/tools/grxmlcompile/grph.h
index 5478728..a66f1d2 100644
--- a/tools/grxmlcompile/grph.h
+++ b/tools/grxmlcompile/grph.h
@@ -23,22 +23,21 @@
class Graph
{
public:
- Graph (char *name)
+ Graph (const char *name)
{
int count= strlen(name);
title= new char [count+1];
strcpy (title, name);
numSubGraph= 0;
- return;
+ subGraph= 0;
+ subIndex= 0;
};
~Graph()
{
- delete [] subGraph;
- delete [] subIndex;
- if (title) {
- delete [] title;
- }
+ delete [] subGraph;
+ delete [] subIndex;
+ delete [] title;
}
int addSubGraph (SubGraph *subGraph);
@@ -60,12 +59,12 @@ public:
void ExpandRules (SubGraph *subg);
+private:
+
int numSubGraph;
SubGraph **subGraph;
int *subIndex;
-private:
-
int getSubGraphIndex (int subId);
char *title;