diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-04-06 01:15:50 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-04-06 01:15:50 +0000 |
commit | 5f1367dd74a624f13c6961d727c1f19ee61b536b (patch) | |
tree | aeab6cb7a6097b1ac4817f9d87a43211cd86e096 /apps/app_speech_utils.c | |
parent | d30e10b717c97c48f41c6ef4dfed5b6ec08cd0af (diff) |
Merged revisions 60361 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r60361 | file | 2007-04-05 22:14:00 -0300 (Thu, 05 Apr 2007) | 2 lines
Add support for returning different types of results (ie: NBest).
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@60362 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_speech_utils.c')
-rw-r--r-- | apps/app_speech_utils.c | 67 |
1 files changed, 52 insertions, 15 deletions
diff --git a/apps/app_speech_utils.c b/apps/app_speech_utils.c index cf8964ebd..4517bbb3b 100644 --- a/apps/app_speech_utils.c +++ b/apps/app_speech_utils.c @@ -126,19 +126,28 @@ static struct ast_speech *find_speech(struct ast_channel *chan) return speech; } -/* Helper function to find a specific speech recognition result by number */ -static struct ast_speech_result *find_result(struct ast_speech_result *results, int num) +/* Helper function to find a specific speech recognition result by number and nbest alternative */ +static struct ast_speech_result *find_result(struct ast_speech_result *results, char *result_num) { - struct ast_speech_result *result = NULL; - int i = 0; + struct ast_speech_result *result = results; + char *tmp = NULL; + int nbest_num = 0, wanted_num = 0, i = 0; + + if ((tmp = strchr(result_num, '/'))) { + *tmp++ = '\0'; + nbest_num = atoi(result_num); + wanted_num = atoi(tmp); + } else { + wanted_num = atoi(result_num); + } - result = results; - while (result) { - if (i == num) + do { + if (result->nbest_num != nbest_num) + continue; + if (i == wanted_num) break; i++; - result = result->next; - } + } while ((result = result->next)); return result; } @@ -151,7 +160,7 @@ static int speech_score(struct ast_channel *chan, const char *cmd, char *data, struct ast_speech *speech = find_speech(chan); char tmp[128] = ""; - if (data == NULL || speech == NULL || !(result = find_result(speech->results, atoi(data)))) + if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) return -1; snprintf(tmp, sizeof(tmp), "%d", result->score); @@ -164,7 +173,7 @@ static int speech_score(struct ast_channel *chan, const char *cmd, char *data, static struct ast_custom_function speech_score_function = { .name = "SPEECH_SCORE", .synopsis = "Gets the confidence score of a result.", - .syntax = "SPEECH_SCORE(result number)", + .syntax = "SPEECH_SCORE([nbest number/]result number)", .desc = "Gets the confidence score of a result.\n", .read = speech_score, @@ -178,7 +187,7 @@ static int speech_text(struct ast_channel *chan, const char *cmd, char *data, struct ast_speech_result *result = NULL; struct ast_speech *speech = find_speech(chan); - if (data == NULL || speech == NULL || !(result = find_result(speech->results, atoi(data)))) + if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) return -1; if (result->text != NULL) @@ -190,7 +199,7 @@ static int speech_text(struct ast_channel *chan, const char *cmd, char *data, static struct ast_custom_function speech_text_function = { .name = "SPEECH_TEXT", .synopsis = "Gets the recognized text of a result.", - .syntax = "SPEECH_TEXT(result number)", + .syntax = "SPEECH_TEXT([nbest number/]result number)", .desc = "Gets the recognized text of a result.\n", .read = speech_text, @@ -204,7 +213,7 @@ static int speech_grammar(struct ast_channel *chan, const char *cmd, char *data, struct ast_speech_result *result = NULL; struct ast_speech *speech = find_speech(chan); - if (data == NULL || speech == NULL || !(result = find_result(speech->results, atoi(data)))) + if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) return -1; if (result->grammar != NULL) @@ -216,7 +225,7 @@ static int speech_grammar(struct ast_channel *chan, const char *cmd, char *data, static struct ast_custom_function speech_grammar_function = { .name = "SPEECH_GRAMMAR", .synopsis = "Gets the matched grammar of a result if available.", - .syntax = "SPEECH_GRAMMAR(result number)", + .syntax = "SPEECH_GRAMMAR([nbest number/]result number)", .desc = "Gets the matched grammar of a result if available.\n", .read = speech_grammar, @@ -246,6 +255,32 @@ static struct ast_custom_function speech_engine_function = { .write = speech_engine_write, }; +/*! \brief SPEECH_RESULTS_TYPE() Dialplan Function */ +static int speech_results_type_write(struct ast_channel *chan, const char *cmd, char *data, const char *value) +{ + struct ast_speech *speech = find_speech(chan); + + if (data == NULL || speech == NULL) + return -1; + + if (!strcasecmp(value, "normal")) + ast_speech_change_results_type(speech, AST_SPEECH_RESULTS_TYPE_NORMAL); + else if (!strcasecmp(value, "nbest")) + ast_speech_change_results_type(speech, AST_SPEECH_RESULTS_TYPE_NBEST); + + return 0; +} + +static struct ast_custom_function speech_results_type_function = { + .name = "SPEECH_RESULTS_TYPE", + .synopsis = "Sets the type of results that will be returned.", + .syntax = "SPEECH_RESULTS_TYPE()=results type", + .desc = + "Sets the type of results that will be returned. Valid options are normal or nbest.", + .read = NULL, + .write = speech_results_type_write, +}; + /*! \brief SPEECH() Dialplan Function */ static int speech_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) @@ -779,6 +814,7 @@ static int unload_module(void) res |= ast_custom_function_unregister(&speech_text_function); res |= ast_custom_function_unregister(&speech_grammar_function); res |= ast_custom_function_unregister(&speech_engine_function); + res |= ast_custom_function_unregister(&speech_results_type_function); ast_module_user_hangup_all(); @@ -803,6 +839,7 @@ static int load_module(void) res |= ast_custom_function_register(&speech_text_function); res |= ast_custom_function_register(&speech_grammar_function); res |= ast_custom_function_register(&speech_engine_function); + res |= ast_custom_function_register(&speech_results_type_function); return res; } |