mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 20:20:07 +00:00
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: https://origsvn.digium.com/svn/asterisk/trunk@60362 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -126,19 +126,28 @@ static struct ast_speech *find_speech(struct ast_channel *chan)
|
|||||||
return speech;
|
return speech;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helper function to find a specific speech recognition result by number */
|
/* 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, int num)
|
static struct ast_speech_result *find_result(struct ast_speech_result *results, char *result_num)
|
||||||
{
|
{
|
||||||
struct ast_speech_result *result = NULL;
|
struct ast_speech_result *result = results;
|
||||||
int i = 0;
|
char *tmp = NULL;
|
||||||
|
int nbest_num = 0, wanted_num = 0, i = 0;
|
||||||
|
|
||||||
result = results;
|
if ((tmp = strchr(result_num, '/'))) {
|
||||||
while (result) {
|
*tmp++ = '\0';
|
||||||
if (i == num)
|
nbest_num = atoi(result_num);
|
||||||
|
wanted_num = atoi(tmp);
|
||||||
|
} else {
|
||||||
|
wanted_num = atoi(result_num);
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (result->nbest_num != nbest_num)
|
||||||
|
continue;
|
||||||
|
if (i == wanted_num)
|
||||||
break;
|
break;
|
||||||
i++;
|
i++;
|
||||||
result = result->next;
|
} while ((result = result->next));
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
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);
|
struct ast_speech *speech = find_speech(chan);
|
||||||
char tmp[128] = "";
|
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;
|
return -1;
|
||||||
|
|
||||||
snprintf(tmp, sizeof(tmp), "%d", result->score);
|
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 = {
|
static struct ast_custom_function speech_score_function = {
|
||||||
.name = "SPEECH_SCORE",
|
.name = "SPEECH_SCORE",
|
||||||
.synopsis = "Gets the confidence score of a result.",
|
.synopsis = "Gets the confidence score of a result.",
|
||||||
.syntax = "SPEECH_SCORE(result number)",
|
.syntax = "SPEECH_SCORE([nbest number/]result number)",
|
||||||
.desc =
|
.desc =
|
||||||
"Gets the confidence score of a result.\n",
|
"Gets the confidence score of a result.\n",
|
||||||
.read = speech_score,
|
.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_result *result = NULL;
|
||||||
struct ast_speech *speech = find_speech(chan);
|
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;
|
return -1;
|
||||||
|
|
||||||
if (result->text != NULL)
|
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 = {
|
static struct ast_custom_function speech_text_function = {
|
||||||
.name = "SPEECH_TEXT",
|
.name = "SPEECH_TEXT",
|
||||||
.synopsis = "Gets the recognized text of a result.",
|
.synopsis = "Gets the recognized text of a result.",
|
||||||
.syntax = "SPEECH_TEXT(result number)",
|
.syntax = "SPEECH_TEXT([nbest number/]result number)",
|
||||||
.desc =
|
.desc =
|
||||||
"Gets the recognized text of a result.\n",
|
"Gets the recognized text of a result.\n",
|
||||||
.read = speech_text,
|
.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_result *result = NULL;
|
||||||
struct ast_speech *speech = find_speech(chan);
|
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;
|
return -1;
|
||||||
|
|
||||||
if (result->grammar != NULL)
|
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 = {
|
static struct ast_custom_function speech_grammar_function = {
|
||||||
.name = "SPEECH_GRAMMAR",
|
.name = "SPEECH_GRAMMAR",
|
||||||
.synopsis = "Gets the matched grammar of a result if available.",
|
.synopsis = "Gets the matched grammar of a result if available.",
|
||||||
.syntax = "SPEECH_GRAMMAR(result number)",
|
.syntax = "SPEECH_GRAMMAR([nbest number/]result number)",
|
||||||
.desc =
|
.desc =
|
||||||
"Gets the matched grammar of a result if available.\n",
|
"Gets the matched grammar of a result if available.\n",
|
||||||
.read = speech_grammar,
|
.read = speech_grammar,
|
||||||
@@ -246,6 +255,32 @@ static struct ast_custom_function speech_engine_function = {
|
|||||||
.write = speech_engine_write,
|
.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 */
|
/*! \brief SPEECH() Dialplan Function */
|
||||||
static int speech_read(struct ast_channel *chan, const char *cmd, char *data,
|
static int speech_read(struct ast_channel *chan, const char *cmd, char *data,
|
||||||
char *buf, size_t len)
|
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_text_function);
|
||||||
res |= ast_custom_function_unregister(&speech_grammar_function);
|
res |= ast_custom_function_unregister(&speech_grammar_function);
|
||||||
res |= ast_custom_function_unregister(&speech_engine_function);
|
res |= ast_custom_function_unregister(&speech_engine_function);
|
||||||
|
res |= ast_custom_function_unregister(&speech_results_type_function);
|
||||||
|
|
||||||
ast_module_user_hangup_all();
|
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_text_function);
|
||||||
res |= ast_custom_function_register(&speech_grammar_function);
|
res |= ast_custom_function_register(&speech_grammar_function);
|
||||||
res |= ast_custom_function_register(&speech_engine_function);
|
res |= ast_custom_function_register(&speech_engine_function);
|
||||||
|
res |= ast_custom_function_register(&speech_results_type_function);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@@ -37,6 +37,11 @@ extern "C" {
|
|||||||
#define AST_SPEECH_STATE_WAIT 2 /* Wait for results to become available */
|
#define AST_SPEECH_STATE_WAIT 2 /* Wait for results to become available */
|
||||||
#define AST_SPEECH_STATE_DONE 3 /* Processing is done */
|
#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 */
|
/* Speech structure */
|
||||||
struct ast_speech {
|
struct ast_speech {
|
||||||
/*! Structure lock */
|
/*! Structure lock */
|
||||||
@@ -53,6 +58,8 @@ struct ast_speech {
|
|||||||
void *data;
|
void *data;
|
||||||
/*! Cached results */
|
/*! Cached results */
|
||||||
struct ast_speech_result *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 */
|
/*! Pointer to the engine used by this speech structure */
|
||||||
struct ast_speech_engine *engine;
|
struct ast_speech_engine *engine;
|
||||||
};
|
};
|
||||||
@@ -79,6 +86,8 @@ struct ast_speech_engine {
|
|||||||
int (*start)(struct ast_speech *speech);
|
int (*start)(struct ast_speech *speech);
|
||||||
/*! Change an engine specific setting */
|
/*! Change an engine specific setting */
|
||||||
int (*change)(struct ast_speech *speech, char *name, const char *value);
|
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 */
|
/*! Try to get results */
|
||||||
struct ast_speech_result *(*get)(struct ast_speech *speech);
|
struct ast_speech_result *(*get)(struct ast_speech *speech);
|
||||||
/*! Accepted formats by the engine */
|
/*! Accepted formats by the engine */
|
||||||
@@ -92,6 +101,8 @@ struct ast_speech_result {
|
|||||||
char *text;
|
char *text;
|
||||||
/*! Result score */
|
/*! Result score */
|
||||||
int score;
|
int score;
|
||||||
|
/*! NBest Alternative number if in NBest results type */
|
||||||
|
int nbest_num;
|
||||||
/*! Matched grammar */
|
/*! Matched grammar */
|
||||||
char *grammar;
|
char *grammar;
|
||||||
/*! List information */
|
/*! 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);
|
int ast_speech_write(struct ast_speech *speech, void *data, int len);
|
||||||
/*! \brief Change an engine specific attribute */
|
/*! \brief Change an engine specific attribute */
|
||||||
int ast_speech_change(struct ast_speech *speech, char *name, const char *value);
|
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 */
|
/*! \brief Change state of a speech structure */
|
||||||
int ast_speech_change_state(struct ast_speech *speech, int state);
|
int ast_speech_change_state(struct ast_speech *speech, int state);
|
||||||
/*! \brief Register a speech recognition engine */
|
/*! \brief Register a speech recognition engine */
|
||||||
|
@@ -293,6 +293,19 @@ int ast_speech_change_state(struct ast_speech *speech, int state)
|
|||||||
return res;
|
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 */
|
/*! \brief Register a speech recognition engine */
|
||||||
int ast_speech_register(struct ast_speech_engine *engine)
|
int ast_speech_register(struct ast_speech_engine *engine)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user