Speech Recognition Utility Applications. More...
#include "asterisk.h"#include "asterisk/file.h"#include "asterisk/channel.h"#include "asterisk/pbx.h"#include "asterisk/module.h"#include "asterisk/lock.h"#include "asterisk/app.h"#include "asterisk/speech.h"
Go to the source code of this file.
Enumerations | |
| enum | { SB_OPT_NOANSWER = (1 << 0) } |
Functions | |
| static void | __reg_module (void) |
| static void | __unreg_module (void) |
| ASTERISK_FILE_VERSION (__FILE__,"$Revision: 264336 $") | |
| static void | destroy_callback (void *data) |
| Helper function used by datastores to destroy the speech structure upon hangup. | |
| static struct ast_speech_result * | find_result (struct ast_speech_result *results, char *result_num) |
| static struct ast_speech * | find_speech (struct ast_channel *chan) |
| Helper function used to find the speech structure attached to a channel. | |
| static int | load_module (void) |
| static int | speech_activate (struct ast_channel *chan, void *data) |
| SpeechActivateGrammar(Grammar Name) Dialplan Application. | |
| static int | speech_background (struct ast_channel *chan, void *data) |
| SpeechBackground(Sound File,Timeout) Dialplan Application. | |
| static int | speech_create (struct ast_channel *chan, void *data) |
| SpeechCreate() Dialplan Application. | |
| static int | speech_deactivate (struct ast_channel *chan, void *data) |
| SpeechDeactivateGrammar(Grammar Name) Dialplan Application. | |
| static int | speech_destroy (struct ast_channel *chan, void *data) |
| SpeechDestroy() Dialplan Application. | |
| static int | speech_engine_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
| SPEECH_ENGINE() Dialplan Function. | |
| static int | speech_grammar (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| SPEECH_GRAMMAR() Dialplan Function. | |
| static int | speech_load (struct ast_channel *chan, void *vdata) |
| SpeechLoadGrammar(Grammar Name,Path) Dialplan Application. | |
| static int | speech_processing_sound (struct ast_channel *chan, void *data) |
| SpeechProcessingSound(Sound File) Dialplan Application. | |
| static int | speech_read (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| SPEECH() Dialplan Function. | |
| static int | speech_results_type_write (struct ast_channel *chan, const char *cmd, char *data, const char *value) |
| SPEECH_RESULTS_TYPE() Dialplan Function. | |
| static int | speech_score (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| SPEECH_SCORE() Dialplan Function. | |
| static int | speech_start (struct ast_channel *chan, void *data) |
| SpeechStart() Dialplan Application. | |
| static int | speech_streamfile (struct ast_channel *chan, const char *filename, const char *preflang) |
| Helper function used by speech_background to playback a soundfile. | |
| static int | speech_text (struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len) |
| SPEECH_TEXT() Dialplan Function. | |
| static int | speech_unload (struct ast_channel *chan, void *data) |
| SpeechUnloadGrammar(Grammar Name) Dialplan Application. | |
| static int | unload_module (void) |
Variables | |
| static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Dialplan Speech Applications" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
| static struct ast_module_info * | ast_module_info = &__mod_info |
| static struct ast_app_option | speech_background_options [128] = { [ 'n' ] = { .flag = SB_OPT_NOANSWER }, } |
| static struct ast_datastore_info | speech_datastore |
| Static structure for datastore information. | |
| static struct ast_custom_function | speech_engine_function |
| static struct ast_custom_function | speech_function |
| static struct ast_custom_function | speech_grammar_function |
| static struct ast_custom_function | speech_results_type_function |
| static struct ast_custom_function | speech_score_function |
| static struct ast_custom_function | speech_text_function |
Speech Recognition Utility Applications.
Definition in file app_speech_utils.c.
| anonymous enum |
Definition at line 630 of file app_speech_utils.c.
{
SB_OPT_NOANSWER = (1 << 0),
};
| static void __reg_module | ( | void | ) | [static] |
Definition at line 958 of file app_speech_utils.c.
| static void __unreg_module | ( | void | ) | [static] |
Definition at line 958 of file app_speech_utils.c.
| ASTERISK_FILE_VERSION | ( | __FILE__ | , |
| "$Revision: 264336 $" | |||
| ) |
| static void destroy_callback | ( | void * | data | ) | [static] |
Helper function used by datastores to destroy the speech structure upon hangup.
Definition at line 249 of file app_speech_utils.c.
References ast_speech_destroy().
{
struct ast_speech *speech = (struct ast_speech*)data;
if (speech == NULL) {
return;
}
/* Deallocate now */
ast_speech_destroy(speech);
return;
}
| static struct ast_speech_result* find_result | ( | struct ast_speech_result * | results, |
| char * | result_num | ||
| ) | [static, read] |
Definition at line 285 of file app_speech_utils.c.
References AST_LIST_NEXT, ast_speech_result::list, and ast_speech_result::nbest_num.
Referenced by speech_grammar(), speech_score(), and speech_text().
{
struct ast_speech_result *result = results;
char *tmp = NULL;
int nbest_num = 0, wanted_num = 0, i = 0;
if (!result) {
return NULL;
}
if ((tmp = strchr(result_num, '/'))) {
*tmp++ = '\0';
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;
i++;
} while ((result = AST_LIST_NEXT(result, list)));
return result;
}
| static struct ast_speech* find_speech | ( | struct ast_channel * | chan | ) | [static, read] |
Helper function used to find the speech structure attached to a channel.
Definition at line 270 of file app_speech_utils.c.
References ast_channel_datastore_find(), and ast_datastore::data.
Referenced by speech_activate(), speech_background(), speech_deactivate(), speech_destroy(), speech_engine_write(), speech_grammar(), speech_load(), speech_processing_sound(), speech_read(), speech_results_type_write(), speech_score(), speech_start(), speech_text(), and speech_unload().
{
struct ast_speech *speech = NULL;
struct ast_datastore *datastore = NULL;
datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL);
if (datastore == NULL) {
return NULL;
}
speech = datastore->data;
return speech;
}
| static int load_module | ( | void | ) | [static] |
Definition at line 935 of file app_speech_utils.c.
References ast_custom_function_register, ast_register_application_xml, speech_activate(), speech_background(), speech_create(), speech_deactivate(), speech_destroy(), speech_load(), speech_processing_sound(), speech_start(), and speech_unload().
{
int res = 0;
res = ast_register_application_xml("SpeechCreate", speech_create);
res |= ast_register_application_xml("SpeechLoadGrammar", speech_load);
res |= ast_register_application_xml("SpeechUnloadGrammar", speech_unload);
res |= ast_register_application_xml("SpeechActivateGrammar", speech_activate);
res |= ast_register_application_xml("SpeechDeactivateGrammar", speech_deactivate);
res |= ast_register_application_xml("SpeechStart", speech_start);
res |= ast_register_application_xml("SpeechBackground", speech_background);
res |= ast_register_application_xml("SpeechDestroy", speech_destroy);
res |= ast_register_application_xml("SpeechProcessingSound", speech_processing_sound);
res |= ast_custom_function_register(&speech_function);
res |= ast_custom_function_register(&speech_score_function);
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;
}
| static int speech_activate | ( | struct ast_channel * | chan, |
| void * | data | ||
| ) | [static] |
SpeechActivateGrammar(Grammar Name) Dialplan Application.
Definition at line 567 of file app_speech_utils.c.
References ast_speech_grammar_activate(), and find_speech().
Referenced by load_module().
{
int res = 0;
struct ast_speech *speech = find_speech(chan);
if (speech == NULL)
return -1;
/* Activate the grammar on the speech object */
res = ast_speech_grammar_activate(speech, data);
return res;
}
| static int speech_background | ( | struct ast_channel * | chan, |
| void * | data | ||
| ) | [static] |
SpeechBackground(Sound File,Timeout) Dialplan Application.
Definition at line 639 of file app_speech_utils.c.
References ast_channel::_state, ast_answer(), AST_APP_ARG, ast_app_parse_options(), ast_calloc, ast_channel_datastore_find(), ast_channel_datastore_remove(), ast_channel_lock, ast_channel_unlock, ast_clear_flag, AST_CONTROL_HANGUP, AST_DECLARE_APP_ARGS, AST_FORMAT_SLINEAR, AST_FRAME_CONTROL, AST_FRAME_DTMF, AST_FRAME_VOICE, ast_frfree, AST_MAX_EXTENSION, ast_mutex_lock(), ast_mutex_unlock(), ast_read(), ast_sched_runq(), ast_sched_wait(), ast_set_read_format(), ast_speech_change_state(), ast_speech_destroy(), ast_speech_dtmf(), AST_SPEECH_QUIET, ast_speech_results_get(), ast_speech_start(), AST_SPEECH_STATE_DONE, AST_SPEECH_STATE_NOT_READY, AST_SPEECH_STATE_READY, AST_SPEECH_STATE_WAIT, ast_speech_write(), AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_stopstream(), ast_strdup, ast_strdupa, ast_strlen_zero(), ast_test_flag, ast_tvdiff_ms(), ast_tvnow(), ast_waitfor(), ast_frame::data, ast_frame::datalen, ast_pbx::dtimeoutms, f, find_speech(), ast_speech::format, ast_frame::frametype, ast_speech_result::grammar, ast_channel::language, ast_speech::lock, parse(), ast_channel::pbx, pbx_builtin_getvar_helper(), ast_speech::processing_sound, ast_frame::ptr, ast_channel::readformat, ast_speech::results, SB_OPT_NOANSWER, ast_channel::sched, ast_speech_result::score, speech_background_options, speech_streamfile(), ast_speech::state, ast_channel::stream, ast_channel::streamid, strsep(), ast_frame::subclass, ast_speech_result::text, and ast_channel::timingfunc.
Referenced by load_module().
{
unsigned int timeout = 0;
int res = 0, done = 0, started = 0, quieted = 0, max_dtmf_len = 0;
struct ast_speech *speech = find_speech(chan);
struct ast_frame *f = NULL;
int oldreadformat = AST_FORMAT_SLINEAR;
char dtmf[AST_MAX_EXTENSION] = "";
struct timeval start = { 0, 0 }, current;
struct ast_datastore *datastore = NULL;
char *parse, *filename_tmp = NULL, *filename = NULL, tmp[2] = "", dtmf_terminator = '#';
const char *tmp2 = NULL;
struct ast_flags options = { 0 };
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(soundfile);
AST_APP_ARG(timeout);
AST_APP_ARG(options);
);
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
if (speech == NULL)
return -1;
if (!ast_strlen_zero(args.options)) {
char *options_buf = ast_strdupa(args.options);
ast_app_parse_options(speech_background_options, &options, NULL, options_buf);
}
/* If channel is not already answered, then answer it */
if (chan->_state != AST_STATE_UP && !ast_test_flag(&options, SB_OPT_NOANSWER)
&& ast_answer(chan)) {
return -1;
}
/* Record old read format */
oldreadformat = chan->readformat;
/* Change read format to be signed linear */
if (ast_set_read_format(chan, speech->format))
return -1;
if (!ast_strlen_zero(args.soundfile)) {
/* Yay sound file */
filename_tmp = ast_strdupa(args.soundfile);
if (!ast_strlen_zero(args.timeout)) {
if ((timeout = atof(args.timeout) * 1000.0) == 0)
timeout = -1;
} else
timeout = 0;
}
/* See if the maximum DTMF length variable is set... we use a variable in case they want to carry it through their entire dialplan */
ast_channel_lock(chan);
if ((tmp2 = pbx_builtin_getvar_helper(chan, "SPEECH_DTMF_MAXLEN")) && !ast_strlen_zero(tmp2)) {
max_dtmf_len = atoi(tmp2);
}
/* See if a terminator is specified */
if ((tmp2 = pbx_builtin_getvar_helper(chan, "SPEECH_DTMF_TERMINATOR"))) {
if (ast_strlen_zero(tmp2))
dtmf_terminator = '\0';
else
dtmf_terminator = tmp2[0];
}
ast_channel_unlock(chan);
/* Before we go into waiting for stuff... make sure the structure is ready, if not - start it again */
if (speech->state == AST_SPEECH_STATE_NOT_READY || speech->state == AST_SPEECH_STATE_DONE) {
ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY);
ast_speech_start(speech);
}
/* Ensure no streams are currently running */
ast_stopstream(chan);
/* Okay it's streaming so go into a loop grabbing frames! */
while (done == 0) {
/* If the filename is null and stream is not running, start up a new sound file */
if (!quieted && (chan->streamid == -1 && chan->timingfunc == NULL) && (filename = strsep(&filename_tmp, "&"))) {
/* Discard old stream information */
ast_stopstream(chan);
/* Start new stream */
speech_streamfile(chan, filename, chan->language);
}
/* Run scheduled stuff */
ast_sched_runq(chan->sched);
/* Yay scheduling */
res = ast_sched_wait(chan->sched);
if (res < 0)
res = 1000;
/* If there is a frame waiting, get it - if not - oh well */
if (ast_waitfor(chan, res) > 0) {
f = ast_read(chan);
if (f == NULL) {
/* The channel has hung up most likely */
done = 3;
break;
}
}
/* Do timeout check (shared between audio/dtmf) */
if ((!quieted || strlen(dtmf)) && started == 1) {
current = ast_tvnow();
if ((ast_tvdiff_ms(current, start)) >= timeout) {
done = 1;
if (f)
ast_frfree(f);
break;
}
}
/* Do checks on speech structure to see if it's changed */
ast_mutex_lock(&speech->lock);
if (ast_test_flag(speech, AST_SPEECH_QUIET)) {
if (chan->stream)
ast_stopstream(chan);
ast_clear_flag(speech, AST_SPEECH_QUIET);
quieted = 1;
}
/* Check state so we can see what to do */
switch (speech->state) {
case AST_SPEECH_STATE_READY:
/* If audio playback has stopped do a check for timeout purposes */
if (chan->streamid == -1 && chan->timingfunc == NULL)
ast_stopstream(chan);
if (!quieted && chan->stream == NULL && timeout && started == 0 && !filename_tmp) {
if (timeout == -1) {
done = 1;
if (f)
ast_frfree(f);
break;
}
start = ast_tvnow();
started = 1;
}
/* Write audio frame out to speech engine if no DTMF has been received */
if (!strlen(dtmf) && f != NULL && f->frametype == AST_FRAME_VOICE) {
ast_speech_write(speech, f->data.ptr, f->datalen);
}
break;
case AST_SPEECH_STATE_WAIT:
/* Cue up waiting sound if not already playing */
if (!strlen(dtmf)) {
if (chan->stream == NULL) {
if (speech->processing_sound != NULL) {
if (strlen(speech->processing_sound) > 0 && strcasecmp(speech->processing_sound, "none")) {
speech_streamfile(chan, speech->processing_sound, chan->language);
}
}
} else if (chan->streamid == -1 && chan->timingfunc == NULL) {
ast_stopstream(chan);
if (speech->processing_sound != NULL) {
if (strlen(speech->processing_sound) > 0 && strcasecmp(speech->processing_sound, "none")) {
speech_streamfile(chan, speech->processing_sound, chan->language);
}
}
}
}
break;
case AST_SPEECH_STATE_DONE:
/* Now that we are done... let's switch back to not ready state */
ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY);
if (!strlen(dtmf)) {
/* Copy to speech structure the results, if available */
speech->results = ast_speech_results_get(speech);
/* Break out of our background too */
done = 1;
/* Stop audio playback */
if (chan->stream != NULL) {
ast_stopstream(chan);
}
}
break;
default:
break;
}
ast_mutex_unlock(&speech->lock);
/* Deal with other frame types */
if (f != NULL) {
/* Free the frame we received */
switch (f->frametype) {
case AST_FRAME_DTMF:
if (dtmf_terminator != '\0' && f->subclass == dtmf_terminator) {
done = 1;
} else {
quieted = 1;
if (chan->stream != NULL) {
ast_stopstream(chan);
}
if (!started) {
/* Change timeout to be 5 seconds for DTMF input */
timeout = (chan->pbx && chan->pbx->dtimeoutms) ? chan->pbx->dtimeoutms : 5000;
started = 1;
}
start = ast_tvnow();
snprintf(tmp, sizeof(tmp), "%c", f->subclass);
strncat(dtmf, tmp, sizeof(dtmf) - strlen(dtmf) - 1);
/* If the maximum length of the DTMF has been reached, stop now */
if (max_dtmf_len && strlen(dtmf) == max_dtmf_len)
done = 1;
}
break;
case AST_FRAME_CONTROL:
switch (f->subclass) {
case AST_CONTROL_HANGUP:
/* Since they hung up we should destroy the speech structure */
done = 3;
default:
break;
}
default:
break;
}
ast_frfree(f);
f = NULL;
}
}
if (!ast_strlen_zero(dtmf)) {
/* We sort of make a results entry */
speech->results = ast_calloc(1, sizeof(*speech->results));
if (speech->results != NULL) {
ast_speech_dtmf(speech, dtmf);
speech->results->score = 1000;
speech->results->text = ast_strdup(dtmf);
speech->results->grammar = ast_strdup("dtmf");
}
ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY);
}
/* See if it was because they hung up */
if (done == 3) {
/* Destroy speech structure */
ast_speech_destroy(speech);
datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL);
if (datastore != NULL)
ast_channel_datastore_remove(chan, datastore);
} else {
/* Channel is okay so restore read format */
ast_set_read_format(chan, oldreadformat);
}
return 0;
}
| static int speech_create | ( | struct ast_channel * | chan, |
| void * | data | ||
| ) | [static] |
SpeechCreate() Dialplan Application.
Definition at line 484 of file app_speech_utils.c.
References ast_channel_datastore_add(), ast_datastore_alloc(), ast_speech_destroy(), ast_speech_new(), ast_datastore::data, ast_channel::nativeformats, and pbx_builtin_setvar_helper().
Referenced by load_module().
{
struct ast_speech *speech = NULL;
struct ast_datastore *datastore = NULL;
/* Request a speech object */
speech = ast_speech_new(data, chan->nativeformats);
if (speech == NULL) {
/* Not available */
pbx_builtin_setvar_helper(chan, "ERROR", "1");
return 0;
}
datastore = ast_datastore_alloc(&speech_datastore, NULL);
if (datastore == NULL) {
ast_speech_destroy(speech);
pbx_builtin_setvar_helper(chan, "ERROR", "1");
return 0;
}
pbx_builtin_setvar_helper(chan, "ERROR", NULL);
datastore->data = speech;
ast_channel_datastore_add(chan, datastore);
return 0;
}
| static int speech_deactivate | ( | struct ast_channel * | chan, |
| void * | data | ||
| ) | [static] |
SpeechDeactivateGrammar(Grammar Name) Dialplan Application.
Definition at line 552 of file app_speech_utils.c.
References ast_speech_grammar_deactivate(), and find_speech().
Referenced by load_module().
{
int res = 0;
struct ast_speech *speech = find_speech(chan);
if (speech == NULL)
return -1;
/* Deactivate the grammar on the speech object */
res = ast_speech_grammar_deactivate(speech, data);
return res;
}
| static int speech_destroy | ( | struct ast_channel * | chan, |
| void * | data | ||
| ) | [static] |
SpeechDestroy() Dialplan Application.
Definition at line 892 of file app_speech_utils.c.
References ast_channel_datastore_find(), ast_channel_datastore_remove(), ast_speech_destroy(), and find_speech().
Referenced by load_module().
{
int res = 0;
struct ast_speech *speech = find_speech(chan);
struct ast_datastore *datastore = NULL;
if (speech == NULL)
return -1;
/* Destroy speech structure */
ast_speech_destroy(speech);
datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL);
if (datastore != NULL) {
ast_channel_datastore_remove(chan, datastore);
}
return res;
}
| static int speech_engine_write | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| const char * | value | ||
| ) | [static] |
SPEECH_ENGINE() Dialplan Function.
Definition at line 392 of file app_speech_utils.c.
References ast_speech_change(), and find_speech().
{
struct ast_speech *speech = find_speech(chan);
if (data == NULL || speech == NULL) {
return -1;
}
ast_speech_change(speech, data, value);
return 0;
}
| static int speech_grammar | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
SPEECH_GRAMMAR() Dialplan Function.
Definition at line 366 of file app_speech_utils.c.
References ast_copy_string(), find_result(), find_speech(), ast_speech_result::grammar, and ast_speech::results.
{
struct ast_speech_result *result = NULL;
struct ast_speech *speech = find_speech(chan);
if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) {
return -1;
}
if (result->grammar != NULL) {
ast_copy_string(buf, result->grammar, len);
} else {
buf[0] = '\0';
}
return 0;
}
| static int speech_load | ( | struct ast_channel * | chan, |
| void * | vdata | ||
| ) | [static] |
SpeechLoadGrammar(Grammar Name,Path) Dialplan Application.
Definition at line 511 of file app_speech_utils.c.
References AST_APP_ARG, AST_DECLARE_APP_ARGS, ast_speech_grammar_load(), AST_STANDARD_APP_ARGS, ast_strdupa, ast_speech::data, and find_speech().
Referenced by load_module().
{
int res = 0;
struct ast_speech *speech = find_speech(chan);
char *data;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(grammar);
AST_APP_ARG(path);
);
data = ast_strdupa(vdata);
AST_STANDARD_APP_ARGS(args, data);
if (speech == NULL)
return -1;
if (args.argc != 2)
return -1;
/* Load the grammar locally on the object */
res = ast_speech_grammar_load(speech, args.grammar, args.path);
return res;
}
| static int speech_processing_sound | ( | struct ast_channel * | chan, |
| void * | data | ||
| ) | [static] |
SpeechProcessingSound(Sound File) Dialplan Application.
Definition at line 596 of file app_speech_utils.c.
References ast_free, ast_strdup, find_speech(), and ast_speech::processing_sound.
Referenced by load_module().
{
int res = 0;
struct ast_speech *speech = find_speech(chan);
if (speech == NULL)
return -1;
if (speech->processing_sound != NULL) {
ast_free(speech->processing_sound);
speech->processing_sound = NULL;
}
speech->processing_sound = ast_strdup(data);
return res;
}
| static int speech_read | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
SPEECH() Dialplan Function.
Definition at line 434 of file app_speech_utils.c.
References ast_copy_string(), AST_LIST_NEXT, AST_SPEECH_SPOKE, ast_test_flag, find_speech(), and ast_speech::results.
{
int results = 0;
struct ast_speech_result *result = NULL;
struct ast_speech *speech = find_speech(chan);
char tmp[128] = "";
/* Now go for the various options */
if (!strcasecmp(data, "status")) {
if (speech != NULL)
ast_copy_string(buf, "1", len);
else
ast_copy_string(buf, "0", len);
return 0;
}
/* Make sure we have a speech structure for everything else */
if (speech == NULL) {
return -1;
}
/* Check to see if they are checking for silence */
if (!strcasecmp(data, "spoke")) {
if (ast_test_flag(speech, AST_SPEECH_SPOKE))
ast_copy_string(buf, "1", len);
else
ast_copy_string(buf, "0", len);
} else if (!strcasecmp(data, "results")) {
/* Count number of results */
for (result = speech->results; result; result = AST_LIST_NEXT(result, list))
results++;
snprintf(tmp, sizeof(tmp), "%d", results);
ast_copy_string(buf, tmp, len);
} else {
buf[0] = '\0';
}
return 0;
}
| static int speech_results_type_write | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| const char * | value | ||
| ) | [static] |
SPEECH_RESULTS_TYPE() Dialplan Function.
Definition at line 412 of file app_speech_utils.c.
References ast_speech_change_results_type(), AST_SPEECH_RESULTS_TYPE_NBEST, AST_SPEECH_RESULTS_TYPE_NORMAL, and find_speech().
{
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 int speech_score | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
SPEECH_SCORE() Dialplan Function.
Definition at line 315 of file app_speech_utils.c.
References ast_copy_string(), find_result(), find_speech(), ast_speech::results, and ast_speech_result::score.
{
struct ast_speech_result *result = NULL;
struct ast_speech *speech = find_speech(chan);
char tmp[128] = "";
if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) {
return -1;
}
snprintf(tmp, sizeof(tmp), "%d", result->score);
ast_copy_string(buf, tmp, len);
return 0;
}
| static int speech_start | ( | struct ast_channel * | chan, |
| void * | data | ||
| ) | [static] |
SpeechStart() Dialplan Application.
Definition at line 582 of file app_speech_utils.c.
References ast_speech_start(), and find_speech().
Referenced by load_module().
{
int res = 0;
struct ast_speech *speech = find_speech(chan);
if (speech == NULL)
return -1;
ast_speech_start(speech);
return res;
}
| static int speech_streamfile | ( | struct ast_channel * | chan, |
| const char * | filename, | ||
| const char * | preflang | ||
| ) | [static] |
Helper function used by speech_background to playback a soundfile.
Definition at line 615 of file app_speech_utils.c.
References ast_applystream(), ast_openstream(), and ast_playstream().
Referenced by speech_background().
{
struct ast_filestream *fs = NULL;
if (!(fs = ast_openstream(chan, filename, preflang)))
return -1;
if (ast_applystream(chan, fs))
return -1;
ast_playstream(fs);
return 0;
}
| static int speech_text | ( | struct ast_channel * | chan, |
| const char * | cmd, | ||
| char * | data, | ||
| char * | buf, | ||
| size_t | len | ||
| ) | [static] |
SPEECH_TEXT() Dialplan Function.
Definition at line 340 of file app_speech_utils.c.
References ast_copy_string(), find_result(), find_speech(), ast_speech::results, and ast_speech_result::text.
{
struct ast_speech_result *result = NULL;
struct ast_speech *speech = find_speech(chan);
if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) {
return -1;
}
if (result->text != NULL) {
ast_copy_string(buf, result->text, len);
} else {
buf[0] = '\0';
}
return 0;
}
| static int speech_unload | ( | struct ast_channel * | chan, |
| void * | data | ||
| ) | [static] |
SpeechUnloadGrammar(Grammar Name) Dialplan Application.
Definition at line 537 of file app_speech_utils.c.
References ast_speech_grammar_unload(), and find_speech().
Referenced by load_module().
{
int res = 0;
struct ast_speech *speech = find_speech(chan);
if (speech == NULL)
return -1;
/* Unload the grammar */
res = ast_speech_grammar_unload(speech, data);
return res;
}
| static int unload_module | ( | void | ) | [static] |
Definition at line 912 of file app_speech_utils.c.
References ast_custom_function_unregister(), and ast_unregister_application().
{
int res = 0;
res = ast_unregister_application("SpeechCreate");
res |= ast_unregister_application("SpeechLoadGrammar");
res |= ast_unregister_application("SpeechUnloadGrammar");
res |= ast_unregister_application("SpeechActivateGrammar");
res |= ast_unregister_application("SpeechDeactivateGrammar");
res |= ast_unregister_application("SpeechStart");
res |= ast_unregister_application("SpeechBackground");
res |= ast_unregister_application("SpeechDestroy");
res |= ast_unregister_application("SpeechProcessingSound");
res |= ast_custom_function_unregister(&speech_function);
res |= ast_custom_function_unregister(&speech_score_function);
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);
return res;
}
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Dialplan Speech Applications" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 958 of file app_speech_utils.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 958 of file app_speech_utils.c.
struct ast_app_option speech_background_options[128] = { [ 'n' ] = { .flag = SB_OPT_NOANSWER }, } [static] |
Definition at line 636 of file app_speech_utils.c.
Referenced by speech_background().
struct ast_datastore_info speech_datastore [static] |
{
.type = "speech",
.destroy = destroy_callback
}
Static structure for datastore information.
Definition at line 264 of file app_speech_utils.c.
struct ast_custom_function speech_engine_function [static] |
{
.name = "SPEECH_ENGINE",
.read = NULL,
.write = speech_engine_write,
}
Definition at line 405 of file app_speech_utils.c.
struct ast_custom_function speech_function [static] |
{
.name = "SPEECH",
.read = speech_read,
.write = NULL,
}
Definition at line 475 of file app_speech_utils.c.
struct ast_custom_function speech_grammar_function [static] |
{
.name = "SPEECH_GRAMMAR",
.read = speech_grammar,
.write = NULL,
}
Definition at line 385 of file app_speech_utils.c.
struct ast_custom_function speech_results_type_function [static] |
{
.name = "SPEECH_RESULTS_TYPE",
.read = NULL,
.write = speech_results_type_write,
}
Definition at line 427 of file app_speech_utils.c.
struct ast_custom_function speech_score_function [static] |
{
.name = "SPEECH_SCORE",
.read = speech_score,
.write = NULL,
}
Definition at line 333 of file app_speech_utils.c.
struct ast_custom_function speech_text_function [static] |
{
.name = "SPEECH_TEXT",
.read = speech_text,
.write = NULL,
}
Definition at line 359 of file app_speech_utils.c.