aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/app_speech_utils.c67
-rw-r--r--include/asterisk/speech.h13
-rw-r--r--res/res_speech.c13
3 files changed, 78 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;
}
diff --git a/include/asterisk/speech.h b/include/asterisk/speech.h
index 0f1af151f..09d08ddb1 100644
--- a/include/asterisk/speech.h
+++ b/include/asterisk/speech.h
@@ -37,6 +37,11 @@ extern "C" {
#define AST_SPEECH_STATE_WAIT 2 /* Wait for results to become available */
#define AST_SPEECH_STATE_DONE 3 /* Processing is done */
+enum ast_speech_results_type {
+ AST_SPEECH_RESULTS_TYPE_NORMAL = 0,
+ AST_SPEECH_RESULTS_TYPE_NBEST,
+};
+
/* Speech structure */
struct ast_speech {
/*! Structure lock */
@@ -53,6 +58,8 @@ struct ast_speech {
void *data;
/*! Cached results */
struct ast_speech_result *results;
+ /*! Type of results we want */
+ enum ast_speech_results_type results_type;
/*! Pointer to the engine used by this speech structure */
struct ast_speech_engine *engine;
};
@@ -79,6 +86,8 @@ struct ast_speech_engine {
int (*start)(struct ast_speech *speech);
/*! Change an engine specific setting */
int (*change)(struct ast_speech *speech, char *name, const char *value);
+ /*! Change the type of results we want back */
+ int (*change_results_type)(struct ast_speech *speech, enum ast_speech_results_type results_type);
/*! Try to get results */
struct ast_speech_result *(*get)(struct ast_speech *speech);
/*! Accepted formats by the engine */
@@ -92,6 +101,8 @@ struct ast_speech_result {
char *text;
/*! Result score */
int score;
+ /*! NBest Alternative number if in NBest results type */
+ int nbest_num;
/*! Matched grammar */
char *grammar;
/*! List information */
@@ -120,6 +131,8 @@ int ast_speech_destroy(struct ast_speech *speech);
int ast_speech_write(struct ast_speech *speech, void *data, int len);
/*! \brief Change an engine specific attribute */
int ast_speech_change(struct ast_speech *speech, char *name, const char *value);
+/*! \brief Change the type of results we want */
+int ast_speech_change_results_type(struct ast_speech *speech, enum ast_speech_results_type results_type);
/*! \brief Change state of a speech structure */
int ast_speech_change_state(struct ast_speech *speech, int state);
/*! \brief Register a speech recognition engine */
diff --git a/res/res_speech.c b/res/res_speech.c
index f06638a5d..419c6086e 100644
--- a/res/res_speech.c
+++ b/res/res_speech.c
@@ -293,6 +293,19 @@ int ast_speech_change_state(struct ast_speech *speech, int state)
return res;
}
+/*! \brief Change the type of results we want */
+int ast_speech_change_results_type(struct ast_speech *speech, enum ast_speech_results_type results_type)
+{
+ int res = 0;
+
+ speech->results_type = results_type;
+
+ if (speech->engine->change_results_type)
+ res = speech->engine->change_results_type(speech, results_type);
+
+ return res;
+}
+
/*! \brief Register a speech recognition engine */
int ast_speech_register(struct ast_speech_engine *engine)
{