Sat Nov 1 06:28:47 2008

Asterisk developer's documentation


app_speech_utils.c File Reference

Speech Recognition Utility Applications. More...

#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"

Include dependency graph for app_speech_utils.c:

Go to the source code of this file.

Functions

 AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Dialplan Speech Applications")
 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_resultfind_result (struct ast_speech_result *results, char *result_num)
static struct ast_speechfind_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_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


Detailed Description

Speech Recognition Utility Applications.

Author:
Joshua Colp <jcolp@digium.com>

Definition in file app_speech_utils.c.


Function Documentation

AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY  ,
"Dialplan Speech Applications"   
)

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_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, strsep(), 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(&current);
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 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_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 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 }