#include "asterisk.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "asterisk/file.h"
#include "asterisk/logger.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.
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
ASTERISK_FILE_VERSION (__FILE__,"$Revision: 147517 $") | |
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, char *cmd, char *data, const char *value) |
SPEECH_ENGINE() Dialplan Function. | |
static int | speech_grammar (struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) |
SPEECH_GRAMMAR() Dialplan Function. | |
static int | speech_load (struct ast_channel *chan, void *data) |
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, char *cmd, char *data, char *buf, size_t len) |
SPEECH() Dialplan Function. | |
static int | speech_results_type_write (struct ast_channel *chan, char *cmd, char *data, const char *value) |
SPEECH_RESULTS_TYPE() Dialplan Function. | |
static int | speech_score (struct ast_channel *chan, 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, 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 | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Dialplan Speech Applications" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "f450f61f60e761b3aa089ebed76ca8a5" , .load = load_module, .unload = unload_module, } |
static const struct ast_module_info * | ast_module_info = &__mod_info |
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 |
static char * | speechactivategrammar_descrip |
static char * | speechbackground_descrip |
static char * | speechcreate_descrip |
static char * | speechdeactivategrammar_descrip |
static char * | speechdestroy_descrip |
static char * | speechload_descrip |
static char * | speechprocessingsound_descrip |
static char * | speechstart_descrip |
static char * | speechunload_descrip |
Definition in file app_speech_utils.c.
static void __reg_module | ( | void | ) | [static] |
Definition at line 875 of file app_speech_utils.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 875 of file app_speech_utils.c.
ASTERISK_FILE_VERSION | ( | __FILE__ | , | |
"$Revision: 147517 $" | ||||
) |
static void destroy_callback | ( | void * | data | ) | [static] |
Helper function used by datastores to destroy the speech structure upon hangup.
Definition at line 94 of file app_speech_utils.c.
References ast_speech_destroy().
00095 { 00096 struct ast_speech *speech = (struct ast_speech*)data; 00097 00098 if (speech == NULL) { 00099 return; 00100 } 00101 00102 /* Deallocate now */ 00103 ast_speech_destroy(speech); 00104 00105 return; 00106 }
static struct ast_speech_result* find_result | ( | struct ast_speech_result * | results, | |
char * | result_num | |||
) | [static] |
Definition at line 130 of file app_speech_utils.c.
References ast_speech_result::nbest_num, and ast_speech_result::next.
Referenced by speech_grammar(), speech_score(), and speech_text().
00131 { 00132 struct ast_speech_result *result = results; 00133 char *tmp = NULL; 00134 int nbest_num = 0, wanted_num = 0, i = 0; 00135 00136 if (!result) 00137 return NULL; 00138 00139 if ((tmp = strchr(result_num, '/'))) { 00140 *tmp++ = '\0'; 00141 nbest_num = atoi(result_num); 00142 wanted_num = atoi(tmp); 00143 } else { 00144 wanted_num = atoi(result_num); 00145 } 00146 00147 do { 00148 if (result->nbest_num != nbest_num) 00149 continue; 00150 if (i == wanted_num) 00151 break; 00152 i++; 00153 } while ((result = result->next)); 00154 00155 return result; 00156 }
static struct ast_speech* find_speech | ( | struct ast_channel * | chan | ) | [static] |
Helper function used to find the speech structure attached to a channel.
Definition at line 115 of file app_speech_utils.c.
References ast_channel_datastore_find(), ast_datastore::data, and speech_datastore.
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().
00116 { 00117 struct ast_speech *speech = NULL; 00118 struct ast_datastore *datastore = NULL; 00119 00120 datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); 00121 if (datastore == NULL) { 00122 return NULL; 00123 } 00124 speech = datastore->data; 00125 00126 return speech; 00127 }
static int load_module | ( | void | ) | [static] |
Definition at line 852 of file app_speech_utils.c.
References ast_custom_function_register(), ast_register_application(), speech_activate(), speech_background(), speech_create(), speech_deactivate(), speech_destroy(), speech_engine_function, speech_function, speech_grammar_function, speech_load(), speech_processing_sound(), speech_results_type_function, speech_score_function, speech_start(), speech_text_function, speech_unload(), speechactivategrammar_descrip, speechbackground_descrip, speechcreate_descrip, speechdeactivategrammar_descrip, speechdestroy_descrip, speechload_descrip, speechprocessingsound_descrip, speechstart_descrip, and speechunload_descrip.
00853 { 00854 int res = 0; 00855 00856 res = ast_register_application("SpeechCreate", speech_create, "Create a Speech Structure", speechcreate_descrip); 00857 res |= ast_register_application("SpeechLoadGrammar", speech_load, "Load a Grammar", speechload_descrip); 00858 res |= ast_register_application("SpeechUnloadGrammar", speech_unload, "Unload a Grammar", speechunload_descrip); 00859 res |= ast_register_application("SpeechActivateGrammar", speech_activate, "Activate a Grammar", speechactivategrammar_descrip); 00860 res |= ast_register_application("SpeechDeactivateGrammar", speech_deactivate, "Deactivate a Grammar", speechdeactivategrammar_descrip); 00861 res |= ast_register_application("SpeechStart", speech_start, "Start recognizing voice in the audio stream", speechstart_descrip); 00862 res |= ast_register_application("SpeechBackground", speech_background, "Play a sound file and wait for speech to be recognized", speechbackground_descrip); 00863 res |= ast_register_application("SpeechDestroy", speech_destroy, "End speech recognition", speechdestroy_descrip); 00864 res |= ast_register_application("SpeechProcessingSound", speech_processing_sound, "Change background processing sound", speechprocessingsound_descrip); 00865 res |= ast_custom_function_register(&speech_function); 00866 res |= ast_custom_function_register(&speech_score_function); 00867 res |= ast_custom_function_register(&speech_text_function); 00868 res |= ast_custom_function_register(&speech_grammar_function); 00869 res |= ast_custom_function_register(&speech_engine_function); 00870 res |= ast_custom_function_register(&speech_results_type_function); 00871 00872 return res; 00873 }
static int speech_activate | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
SpeechActivateGrammar(Grammar Name) Dialplan Application.
Definition at line 465 of file app_speech_utils.c.
References ast_module_user_add, ast_module_user_remove, ast_speech_grammar_activate(), and find_speech().
Referenced by load_module().
00466 { 00467 int res = 0; 00468 struct ast_module_user *u = NULL; 00469 struct ast_speech *speech = find_speech(chan); 00470 00471 u = ast_module_user_add(chan); 00472 00473 if (speech == NULL) { 00474 ast_module_user_remove(u); 00475 return -1; 00476 } 00477 00478 /* Activate the grammar on the speech object */ 00479 res = ast_speech_grammar_activate(speech, data); 00480 00481 ast_module_user_remove(u); 00482 00483 return res; 00484 }
static int speech_background | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
SpeechBackground(Sound File|Timeout) Dialplan Application.
Definition at line 550 of file app_speech_utils.c.
References ast_channel::_state, ast_answer(), ast_app_separate_args(), ast_calloc, ast_channel_datastore_find(), ast_channel_datastore_remove(), ast_clear_flag, AST_CONTROL_HANGUP, AST_FORMAT_SLINEAR, AST_FRAME_CONTROL, AST_FRAME_DTMF, AST_FRAME_VOICE, ast_frfree, AST_MAX_EXTENSION, ast_module_user_add, ast_module_user_remove, 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_STATE_UP, ast_stopstream(), ast_strdupa, ast_strlen_zero(), ast_test_flag, ast_waitfor(), ast_pbx::dtimeout, f, find_speech(), ast_channel::language, ast_speech::lock, ast_channel::pbx, pbx_builtin_getvar_helper(), ast_speech::processing_sound, ast_channel::readformat, ast_speech::results, ast_channel::sched, speech_datastore, speech_streamfile(), ast_speech::state, strdup, ast_channel::stream, ast_channel::streamid, and ast_channel::timingfunc.
Referenced by load_module().
00551 { 00552 unsigned int timeout = 0; 00553 int res = 0, done = 0, argc = 0, started = 0, quieted = 0, max_dtmf_len = 0; 00554 struct ast_module_user *u = NULL; 00555 struct ast_speech *speech = find_speech(chan); 00556 struct ast_frame *f = NULL; 00557 int oldreadformat = AST_FORMAT_SLINEAR; 00558 char dtmf[AST_MAX_EXTENSION] = ""; 00559 time_t start, current; 00560 struct ast_datastore *datastore = NULL; 00561 char *argv[2], *args = NULL, *filename_tmp = NULL, *filename = NULL, tmp[2] = "", dtmf_terminator = '#'; 00562 const char *tmp2 = NULL; 00563 00564 args = ast_strdupa(data); 00565 00566 u = ast_module_user_add(chan); 00567 00568 if (speech == NULL) { 00569 ast_module_user_remove(u); 00570 return -1; 00571 } 00572 00573 /* If channel is not already answered, then answer it */ 00574 if (chan->_state != AST_STATE_UP && ast_answer(chan)) { 00575 ast_module_user_remove(u); 00576 return -1; 00577 } 00578 00579 /* Record old read format */ 00580 oldreadformat = chan->readformat; 00581 00582 /* Change read format to be signed linear */ 00583 if (ast_set_read_format(chan, AST_FORMAT_SLINEAR)) { 00584 ast_module_user_remove(u); 00585 return -1; 00586 } 00587 00588 /* Parse out options */ 00589 argc = ast_app_separate_args(args, '|', argv, sizeof(argv) / sizeof(argv[0])); 00590 if (argc > 0) { 00591 /* Yay sound file */ 00592 filename_tmp = ast_strdupa(argv[0]); 00593 if (!ast_strlen_zero(argv[1])) { 00594 if ((timeout = atoi(argv[1])) == 0) 00595 timeout = -1; 00596 } else 00597 timeout = 0; 00598 } 00599 00600 /* See if the maximum DTMF length variable is set... we use a variable in case they want to carry it through their entire dialplan */ 00601 if ((tmp2 = pbx_builtin_getvar_helper(chan, "SPEECH_DTMF_MAXLEN")) && !ast_strlen_zero(tmp2)) 00602 max_dtmf_len = atoi(tmp2); 00603 00604 /* See if a terminator is specified */ 00605 if ((tmp2 = pbx_builtin_getvar_helper(chan, "SPEECH_DTMF_TERMINATOR"))) { 00606 if (ast_strlen_zero(tmp2)) 00607 dtmf_terminator = '\0'; 00608 else 00609 dtmf_terminator = tmp2[0]; 00610 } 00611 00612 /* Before we go into waiting for stuff... make sure the structure is ready, if not - start it again */ 00613 if (speech->state == AST_SPEECH_STATE_NOT_READY || speech->state == AST_SPEECH_STATE_DONE) { 00614 ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY); 00615 ast_speech_start(speech); 00616 } 00617 00618 /* Ensure no streams are currently running */ 00619 ast_stopstream(chan); 00620 00621 /* Okay it's streaming so go into a loop grabbing frames! */ 00622 while (done == 0) { 00623 /* If the filename is null and stream is not running, start up a new sound file */ 00624 if (!quieted && (chan->streamid == -1 && chan->timingfunc == NULL) && (filename = strsep(&filename_tmp, "&"))) { 00625 /* Discard old stream information */ 00626 ast_stopstream(chan); 00627 /* Start new stream */ 00628 speech_streamfile(chan, filename, chan->language); 00629 } 00630 00631 /* Run scheduled stuff */ 00632 ast_sched_runq(chan->sched); 00633 00634 /* Yay scheduling */ 00635 res = ast_sched_wait(chan->sched); 00636 if (res < 0) { 00637 res = 1000; 00638 } 00639 00640 /* If there is a frame waiting, get it - if not - oh well */ 00641 if (ast_waitfor(chan, res) > 0) { 00642 f = ast_read(chan); 00643 if (f == NULL) { 00644 /* The channel has hung up most likely */ 00645 done = 3; 00646 break; 00647 } 00648 } 00649 00650 /* Do timeout check (shared between audio/dtmf) */ 00651 if ((!quieted || strlen(dtmf)) && started == 1) { 00652 time(¤t); 00653 if ((current-start) >= timeout) { 00654 done = 1; 00655 if (f) 00656 ast_frfree(f); 00657 break; 00658 } 00659 } 00660 00661 /* Do checks on speech structure to see if it's changed */ 00662 ast_mutex_lock(&speech->lock); 00663 if (ast_test_flag(speech, AST_SPEECH_QUIET)) { 00664 if (chan->stream) 00665 ast_stopstream(chan); 00666 ast_clear_flag(speech, AST_SPEECH_QUIET); 00667 quieted = 1; 00668 } 00669 /* Check state so we can see what to do */ 00670 switch (speech->state) { 00671 case AST_SPEECH_STATE_READY: 00672 /* If audio playback has stopped do a check for timeout purposes */ 00673 if (chan->streamid == -1 && chan->timingfunc == NULL) 00674 ast_stopstream(chan); 00675 if (!quieted && chan->stream == NULL && timeout && started == 0 && !filename_tmp) { 00676 if (timeout == -1) { 00677 done = 1; 00678 if (f) 00679 ast_frfree(f); 00680 break; 00681 } 00682 time(&start); 00683 started = 1; 00684 } 00685 /* Write audio frame out to speech engine if no DTMF has been received */ 00686 if (!strlen(dtmf) && f != NULL && f->frametype == AST_FRAME_VOICE) { 00687 ast_speech_write(speech, f->data, f->datalen); 00688 } 00689 break; 00690 case AST_SPEECH_STATE_WAIT: 00691 /* Cue up waiting sound if not already playing */ 00692 if (!strlen(dtmf)) { 00693 if (chan->stream == NULL) { 00694 if (speech->processing_sound != NULL) { 00695 if (strlen(speech->processing_sound) > 0 && strcasecmp(speech->processing_sound,"none")) { 00696 speech_streamfile(chan, speech->processing_sound, chan->language); 00697 } 00698 } 00699 } else if (chan->streamid == -1 && chan->timingfunc == NULL) { 00700 ast_stopstream(chan); 00701 if (speech->processing_sound != NULL) { 00702 if (strlen(speech->processing_sound) > 0 && strcasecmp(speech->processing_sound,"none")) { 00703 speech_streamfile(chan, speech->processing_sound, chan->language); 00704 } 00705 } 00706 } 00707 } 00708 break; 00709 case AST_SPEECH_STATE_DONE: 00710 /* Now that we are done... let's switch back to not ready state */ 00711 ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY); 00712 if (!strlen(dtmf)) { 00713 /* Copy to speech structure the results, if available */ 00714 speech->results = ast_speech_results_get(speech); 00715 /* Break out of our background too */ 00716 done = 1; 00717 /* Stop audio playback */ 00718 if (chan->stream != NULL) { 00719 ast_stopstream(chan); 00720 } 00721 } 00722 break; 00723 default: 00724 break; 00725 } 00726 ast_mutex_unlock(&speech->lock); 00727 00728 /* Deal with other frame types */ 00729 if (f != NULL) { 00730 /* Free the frame we received */ 00731 switch (f->frametype) { 00732 case AST_FRAME_DTMF: 00733 if (dtmf_terminator != '\0' && f->subclass == dtmf_terminator) { 00734 done = 1; 00735 } else { 00736 if (chan->stream != NULL) { 00737 ast_stopstream(chan); 00738 } 00739 if (!started) { 00740 /* Change timeout to be 5 seconds for DTMF input */ 00741 timeout = (chan->pbx && chan->pbx->dtimeout) ? chan->pbx->dtimeout : 5; 00742 started = 1; 00743 } 00744 time(&start); 00745 snprintf(tmp, sizeof(tmp), "%c", f->subclass); 00746 strncat(dtmf, tmp, sizeof(dtmf) - strlen(dtmf) - 1); 00747 /* If the maximum length of the DTMF has been reached, stop now */ 00748 if (max_dtmf_len && strlen(dtmf) == max_dtmf_len) 00749 done = 1; 00750 } 00751 break; 00752 case AST_FRAME_CONTROL: 00753 switch (f->subclass) { 00754 case AST_CONTROL_HANGUP: 00755 /* Since they hung up we should destroy the speech structure */ 00756 done = 3; 00757 default: 00758 break; 00759 } 00760 default: 00761 break; 00762 } 00763 ast_frfree(f); 00764 f = NULL; 00765 } 00766 } 00767 00768 if (strlen(dtmf)) { 00769 /* We sort of make a results entry */ 00770 speech->results = ast_calloc(1, sizeof(*speech->results)); 00771 if (speech->results != NULL) { 00772 ast_speech_dtmf(speech, dtmf); 00773 speech->results->score = 1000; 00774 speech->results->text = strdup(dtmf); 00775 speech->results->grammar = strdup("dtmf"); 00776 } 00777 ast_speech_change_state(speech, AST_SPEECH_STATE_NOT_READY); 00778 } 00779 00780 /* See if it was because they hung up */ 00781 if (done == 3) { 00782 /* Destroy speech structure */ 00783 ast_speech_destroy(speech); 00784 datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); 00785 if (datastore != NULL) { 00786 ast_channel_datastore_remove(chan, datastore); 00787 } 00788 } else { 00789 /* Channel is okay so restore read format */ 00790 ast_set_read_format(chan, oldreadformat); 00791 } 00792 00793 ast_module_user_remove(u); 00794 00795 return 0; 00796 }
static int speech_create | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
SpeechCreate() Dialplan Application.
Definition at line 354 of file app_speech_utils.c.
References ast_channel_datastore_add(), ast_channel_datastore_alloc(), AST_FORMAT_SLINEAR, ast_module_user_add, ast_module_user_remove, ast_speech_destroy(), ast_speech_new(), ast_datastore::data, pbx_builtin_setvar_helper(), and speech_datastore.
Referenced by load_module().
00355 { 00356 struct ast_module_user *u = NULL; 00357 struct ast_speech *speech = NULL; 00358 struct ast_datastore *datastore = NULL; 00359 00360 u = ast_module_user_add(chan); 00361 00362 /* Request a speech object */ 00363 speech = ast_speech_new(data, AST_FORMAT_SLINEAR); 00364 if (speech == NULL) { 00365 /* Not available */ 00366 pbx_builtin_setvar_helper(chan, "ERROR", "1"); 00367 ast_module_user_remove(u); 00368 return 0; 00369 } 00370 00371 datastore = ast_channel_datastore_alloc(&speech_datastore, NULL); 00372 if (datastore == NULL) { 00373 ast_speech_destroy(speech); 00374 pbx_builtin_setvar_helper(chan, "ERROR", "1"); 00375 ast_module_user_remove(u); 00376 return 0; 00377 } 00378 datastore->data = speech; 00379 ast_channel_datastore_add(chan, datastore); 00380 00381 ast_module_user_remove(u); 00382 00383 return 0; 00384 }
static int speech_deactivate | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
SpeechDeactivateGrammar(Grammar Name) Dialplan Application.
Definition at line 443 of file app_speech_utils.c.
References ast_module_user_add, ast_module_user_remove, ast_speech_grammar_deactivate(), and find_speech().
Referenced by load_module().
00444 { 00445 int res = 0; 00446 struct ast_module_user *u = NULL; 00447 struct ast_speech *speech = find_speech(chan); 00448 00449 u = ast_module_user_add(chan); 00450 00451 if (speech == NULL) { 00452 ast_module_user_remove(u); 00453 return -1; 00454 } 00455 00456 /* Deactivate the grammar on the speech object */ 00457 res = ast_speech_grammar_deactivate(speech, data); 00458 00459 ast_module_user_remove(u); 00460 00461 return res; 00462 }
static int speech_destroy | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
SpeechDestroy() Dialplan Application.
Definition at line 800 of file app_speech_utils.c.
References ast_channel_datastore_find(), ast_channel_datastore_remove(), ast_module_user_add, ast_module_user_remove, ast_speech_destroy(), find_speech(), and speech_datastore.
Referenced by load_module().
00801 { 00802 int res = 0; 00803 struct ast_module_user *u = NULL; 00804 struct ast_speech *speech = find_speech(chan); 00805 struct ast_datastore *datastore = NULL; 00806 00807 u = ast_module_user_add(chan); 00808 00809 if (speech == NULL) { 00810 ast_module_user_remove(u); 00811 return -1; 00812 } 00813 00814 /* Destroy speech structure */ 00815 ast_speech_destroy(speech); 00816 00817 datastore = ast_channel_datastore_find(chan, &speech_datastore, NULL); 00818 if (datastore != NULL) { 00819 ast_channel_datastore_remove(chan, datastore); 00820 } 00821 00822 ast_module_user_remove(u); 00823 00824 return res; 00825 }
static int speech_engine_write | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
const char * | value | |||
) | [static] |
SPEECH_ENGINE() Dialplan Function.
Definition at line 245 of file app_speech_utils.c.
References ast_speech_change(), and find_speech().
00246 { 00247 struct ast_speech *speech = find_speech(chan); 00248 00249 if (data == NULL || speech == NULL) 00250 return -1; 00251 00252 ast_speech_change(speech, data, value); 00253 00254 return 0; 00255 }
static int speech_grammar | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
SPEECH_GRAMMAR() Dialplan Function.
Definition at line 216 of file app_speech_utils.c.
References ast_copy_string(), find_result(), find_speech(), ast_speech_result::grammar, and ast_speech::results.
00218 { 00219 struct ast_speech_result *result = NULL; 00220 struct ast_speech *speech = find_speech(chan); 00221 00222 if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) 00223 return -1; 00224 00225 if (result->grammar != NULL) { 00226 ast_copy_string(buf, result->grammar, len); 00227 } else { 00228 buf[0] = '\0'; 00229 } 00230 00231 return 0; 00232 }
static int speech_load | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
SpeechLoadGrammar(Grammar Name|Path) Dialplan Application.
Definition at line 387 of file app_speech_utils.c.
References ast_app_separate_args(), ast_module_user_add, ast_module_user_remove, ast_speech_grammar_load(), ast_strdupa, find_speech(), and name.
Referenced by load_module().
00388 { 00389 int res = 0, argc = 0; 00390 struct ast_module_user *u = NULL; 00391 struct ast_speech *speech = find_speech(chan); 00392 char *argv[2], *args = NULL, *name = NULL, *path = NULL; 00393 00394 args = ast_strdupa(data); 00395 00396 u = ast_module_user_add(chan); 00397 00398 if (speech == NULL) { 00399 ast_module_user_remove(u); 00400 return -1; 00401 } 00402 00403 /* Parse out arguments */ 00404 argc = ast_app_separate_args(args, '|', argv, sizeof(argv) / sizeof(argv[0])); 00405 if (argc != 2) { 00406 ast_module_user_remove(u); 00407 return -1; 00408 } 00409 name = argv[0]; 00410 path = argv[1]; 00411 00412 /* Load the grammar locally on the object */ 00413 res = ast_speech_grammar_load(speech, name, path); 00414 00415 ast_module_user_remove(u); 00416 00417 return res; 00418 }
static int speech_processing_sound | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
SpeechProcessingSound(Sound File) Dialplan Application.
Definition at line 508 of file app_speech_utils.c.
References ast_module_user_add, ast_module_user_remove, find_speech(), free, ast_speech::processing_sound, and strdup.
Referenced by load_module().
00509 { 00510 int res = 0; 00511 struct ast_module_user *u = NULL; 00512 struct ast_speech *speech = find_speech(chan); 00513 00514 u = ast_module_user_add(chan); 00515 00516 if (speech == NULL) { 00517 ast_module_user_remove(u); 00518 return -1; 00519 } 00520 00521 if (speech->processing_sound != NULL) { 00522 free(speech->processing_sound); 00523 speech->processing_sound = NULL; 00524 } 00525 00526 speech->processing_sound = strdup(data); 00527 00528 ast_module_user_remove(u); 00529 00530 return res; 00531 }
static int speech_read | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
SPEECH() Dialplan Function.
Definition at line 294 of file app_speech_utils.c.
References ast_copy_string(), AST_SPEECH_SPOKE, ast_test_flag, find_speech(), ast_speech_result::next, and ast_speech::results.
00296 { 00297 int results = 0; 00298 struct ast_speech_result *result = NULL; 00299 struct ast_speech *speech = find_speech(chan); 00300 char tmp[128] = ""; 00301 00302 /* Now go for the various options */ 00303 if (!strcasecmp(data, "status")) { 00304 if (speech != NULL) 00305 ast_copy_string(buf, "1", len); 00306 else 00307 ast_copy_string(buf, "0", len); 00308 return 0; 00309 } 00310 00311 /* Make sure we have a speech structure for everything else */ 00312 if (speech == NULL) { 00313 return -1; 00314 } 00315 00316 /* Check to see if they are checking for silence */ 00317 if (!strcasecmp(data, "spoke")) { 00318 if (ast_test_flag(speech, AST_SPEECH_SPOKE)) 00319 ast_copy_string(buf, "1", len); 00320 else 00321 ast_copy_string(buf, "0", len); 00322 } else if (!strcasecmp(data, "results")) { 00323 /* Count number of results */ 00324 result = speech->results; 00325 while (result) { 00326 results++; 00327 result = result->next; 00328 } 00329 snprintf(tmp, sizeof(tmp), "%d", results); 00330 ast_copy_string(buf, tmp, len); 00331 } else { 00332 buf[0] = '\0'; 00333 } 00334 00335 return 0; 00336 }
static int speech_results_type_write | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
const char * | value | |||
) | [static] |
SPEECH_RESULTS_TYPE() Dialplan Function.
Definition at line 268 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().
00269 { 00270 struct ast_speech *speech = find_speech(chan); 00271 00272 if (data == NULL || speech == NULL) 00273 return -1; 00274 00275 if (!strcasecmp(value, "normal")) 00276 ast_speech_change_results_type(speech, AST_SPEECH_RESULTS_TYPE_NORMAL); 00277 else if (!strcasecmp(value, "nbest")) 00278 ast_speech_change_results_type(speech, AST_SPEECH_RESULTS_TYPE_NBEST); 00279 00280 return 0; 00281 }
static int speech_score | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
SPEECH_SCORE() Dialplan Function.
Definition at line 159 of file app_speech_utils.c.
References ast_copy_string(), find_result(), find_speech(), ast_speech::results, and ast_speech_result::score.
00161 { 00162 struct ast_speech_result *result = NULL; 00163 struct ast_speech *speech = find_speech(chan); 00164 char tmp[128] = ""; 00165 00166 if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) 00167 return -1; 00168 00169 snprintf(tmp, sizeof(tmp), "%d", result->score); 00170 00171 ast_copy_string(buf, tmp, len); 00172 00173 return 0; 00174 }
static int speech_start | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
SpeechStart() Dialplan Application.
Definition at line 487 of file app_speech_utils.c.
References ast_module_user_add, ast_module_user_remove, ast_speech_start(), and find_speech().
Referenced by load_module().
00488 { 00489 int res = 0; 00490 struct ast_module_user *u = NULL; 00491 struct ast_speech *speech = find_speech(chan); 00492 00493 u = ast_module_user_add(chan); 00494 00495 if (speech == NULL) { 00496 ast_module_user_remove(u); 00497 return -1; 00498 } 00499 00500 ast_speech_start(speech); 00501 00502 ast_module_user_remove(u); 00503 00504 return res; 00505 }
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 534 of file app_speech_utils.c.
References ast_applystream(), ast_openstream(), and ast_playstream().
Referenced by speech_background().
00535 { 00536 struct ast_filestream *fs = NULL; 00537 00538 if (!(fs = ast_openstream(chan, filename, preflang))) 00539 return -1; 00540 00541 if (ast_applystream(chan, fs)) 00542 return -1; 00543 00544 ast_playstream(fs); 00545 00546 return 0; 00547 }
static int speech_text | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | data, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
SPEECH_TEXT() Dialplan Function.
Definition at line 187 of file app_speech_utils.c.
References ast_copy_string(), find_result(), find_speech(), ast_speech::results, and ast_speech_result::text.
00189 { 00190 struct ast_speech_result *result = NULL; 00191 struct ast_speech *speech = find_speech(chan); 00192 00193 if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) 00194 return -1; 00195 00196 if (result->text != NULL) { 00197 ast_copy_string(buf, result->text, len); 00198 } else { 00199 buf[0] = '\0'; 00200 } 00201 00202 return 0; 00203 }
static int speech_unload | ( | struct ast_channel * | chan, | |
void * | data | |||
) | [static] |
SpeechUnloadGrammar(Grammar Name) Dialplan Application.
Definition at line 421 of file app_speech_utils.c.
References ast_module_user_add, ast_module_user_remove, ast_speech_grammar_unload(), and find_speech().
Referenced by load_module().
00422 { 00423 int res = 0; 00424 struct ast_module_user *u = NULL; 00425 struct ast_speech *speech = find_speech(chan); 00426 00427 u = ast_module_user_add(chan); 00428 00429 if (speech == NULL) { 00430 ast_module_user_remove(u); 00431 return -1; 00432 } 00433 00434 /* Unload the grammar */ 00435 res = ast_speech_grammar_unload(speech, data); 00436 00437 ast_module_user_remove(u); 00438 00439 return res; 00440 }
static int unload_module | ( | void | ) | [static] |
Definition at line 827 of file app_speech_utils.c.
References ast_custom_function_unregister(), ast_module_user_hangup_all, ast_unregister_application(), speech_engine_function, speech_function, speech_grammar_function, speech_results_type_function, speech_score_function, and speech_text_function.
00828 { 00829 int res = 0; 00830 00831 res = ast_unregister_application("SpeechCreate"); 00832 res |= ast_unregister_application("SpeechLoadGrammar"); 00833 res |= ast_unregister_application("SpeechUnloadGrammar"); 00834 res |= ast_unregister_application("SpeechActivateGrammar"); 00835 res |= ast_unregister_application("SpeechDeactivateGrammar"); 00836 res |= ast_unregister_application("SpeechStart"); 00837 res |= ast_unregister_application("SpeechBackground"); 00838 res |= ast_unregister_application("SpeechDestroy"); 00839 res |= ast_unregister_application("SpeechProcessingSound"); 00840 res |= ast_custom_function_unregister(&speech_function); 00841 res |= ast_custom_function_unregister(&speech_score_function); 00842 res |= ast_custom_function_unregister(&speech_text_function); 00843 res |= ast_custom_function_unregister(&speech_grammar_function); 00844 res |= ast_custom_function_unregister(&speech_engine_function); 00845 res |= ast_custom_function_unregister(&speech_results_type_function); 00846 00847 ast_module_user_hangup_all(); 00848 00849 return res; 00850 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT | AST_MODFLAG_BUILDSUM, .description = "Dialplan Speech Applications" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "f450f61f60e761b3aa089ebed76ca8a5" , .load = load_module, .unload = unload_module, } [static] |
Definition at line 875 of file app_speech_utils.c.
const struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 875 of file app_speech_utils.c.
struct ast_datastore_info speech_datastore [static] |
Initial value:
{ .type = "speech", .destroy = destroy_callback }
Definition at line 109 of file app_speech_utils.c.
Referenced by find_speech(), speech_background(), speech_create(), and speech_destroy().
struct ast_custom_function speech_engine_function [static] |
Definition at line 257 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function speech_function [static] |
Definition at line 338 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function speech_grammar_function [static] |
Definition at line 234 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function speech_results_type_function [static] |
Definition at line 283 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function speech_score_function [static] |
Definition at line 176 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
struct ast_custom_function speech_text_function [static] |
Definition at line 205 of file app_speech_utils.c.
Referenced by load_module(), and unload_module().
char* speechactivategrammar_descrip [static] |
Initial value:
"SpeechActivateGrammar(Grammar Name)\n" "This activates the specified grammar to be recognized by the engine. A grammar tells the speech recognition engine what to recognize, \n" "and how to portray it back to you in the dialplan. The grammar name is the only argument to this application.\n"
Definition at line 52 of file app_speech_utils.c.
Referenced by load_module().
char* speechbackground_descrip [static] |
char* speechcreate_descrip [static] |
Initial value:
"SpeechCreate(engine name)\n" "This application creates information to be used by all the other applications. It must be called before doing any speech recognition activities such as activating a grammar.\n" "It takes the engine name to use as the argument, if not specified the default engine will be used.\n"
Definition at line 47 of file app_speech_utils.c.
Referenced by load_module().
char* speechdeactivategrammar_descrip [static] |
Initial value:
"SpeechDeactivateGrammar(Grammar Name)\n" "This deactivates the specified grammar so that it is no longer recognized. The only argument is the grammar name to deactivate.\n"
Definition at line 69 of file app_speech_utils.c.
Referenced by load_module().
char* speechdestroy_descrip [static] |
Initial value:
"SpeechDestroy()\n" "This destroys the information used by all the other speech recognition applications.\n" "If you call this application but end up wanting to recognize more speech, you must call SpeechCreate\n" "again before calling any other application. It takes no arguments.\n"
Definition at line 78 of file app_speech_utils.c.
Referenced by load_module().
char* speechload_descrip [static] |
Initial value:
"SpeechLoadGrammar(Grammar Name|Path)\n" "Load a grammar only on the channel, not globally.\n" "It takes the grammar name as first argument and path as second.\n"
Definition at line 84 of file app_speech_utils.c.
Referenced by load_module().
char* speechprocessingsound_descrip [static] |
Initial value:
"SpeechProcessingSound(Sound File)\n" "This changes the processing sound that SpeechBackground plays back when the speech recognition engine is processing and working to get results.\n" "It takes the sound file as the only argument.\n"
Definition at line 73 of file app_speech_utils.c.
Referenced by load_module().
char* speechstart_descrip [static] |
Initial value:
"SpeechStart()\n" "Tell the speech recognition engine that it should start trying to get results from audio being fed to it. This has no arguments.\n"
Definition at line 57 of file app_speech_utils.c.
Referenced by load_module().
char* speechunload_descrip [static] |
Initial value:
"SpeechUnloadGrammar(Grammar Name)\n" "Unload a grammar. It takes the grammar name as the only argument.\n"
Definition at line 89 of file app_speech_utils.c.
Referenced by load_module().