diff --git a/src/include/switch_cpp.h b/src/include/switch_cpp.h index 1e050b2846..21126ea571 100644 --- a/src/include/switch_cpp.h +++ b/src/include/switch_cpp.h @@ -316,6 +316,10 @@ SWITCH_DECLARE(bool) email(char *to, char *from, char *headers = NULL, char *bod SWITCH_DECLARE(char *) read(int min_digits, int max_digits, const char *prompt_audio_file, int timeout, const char *valid_terminators, int digit_timeout = 0); + + SWITCH_DECLARE(void) detectSpeech(char *arg0, char *arg1 = NULL, char *arg2 = NULL, char *arg3 = NULL); + + /** \brief Play a file into channel and collect dtmfs * * See API docs in switch_ivr.h: switch_play_and_get_digits(..) @@ -331,6 +335,14 @@ SWITCH_DECLARE(bool) email(char *to, char *from, char *headers = NULL, char *bod char *digits_regex, const char *var_name = NULL, int digit_timeout = 0, const char *transfer_on_failure = NULL); + + /** \brief Play a file and detect speech + * See API docs switch_ivr_play_and_detect_speech(...) + */ + + SWITCH_DECLARE(char *) playAndDetectSpeech(char *file, char *engine, char *grammar); + + /** \brief Play a file that resides on disk into the channel * * \param file - the path to the .wav/.mp3 to be played diff --git a/src/mod/languages/mod_java/mod_java.i b/src/mod/languages/mod_java/mod_java.i index 858dac8d08..d79cc53ce9 100644 --- a/src/mod/languages/mod_java/mod_java.i +++ b/src/mod/languages/mod_java/mod_java.i @@ -13,6 +13,9 @@ %newobject CoreSession; %newobject Event; %newobject Stream; +%newobject API::execute; +%newobject API::executeString; +%newobject CoreSession::playAndDetectSpeech; // I thought we were using swig because it's easier than the alternatives :-) diff --git a/src/mod/languages/mod_lua/freeswitch.i b/src/mod/languages/mod_lua/freeswitch.i index 4933bfefbc..8f114fcb88 100644 --- a/src/mod/languages/mod_lua/freeswitch.i +++ b/src/mod/languages/mod_lua/freeswitch.i @@ -42,6 +42,7 @@ %newobject Dbh; %newobject API::execute; %newobject API::executeString; +%newobject CoreSession::playAndDetectSpeech; %include "typemaps.i" %apply int *OUTPUT { int *len }; diff --git a/src/mod/languages/mod_lua/my_swigable_cpp.h b/src/mod/languages/mod_lua/my_swigable_cpp.h index 80f689e56e..8c0e6233e3 100644 --- a/src/mod/languages/mod_lua/my_swigable_cpp.h +++ b/src/mod/languages/mod_lua/my_swigable_cpp.h @@ -128,6 +128,10 @@ class CoreSession { int max_digits, int max_tries, int timeout, char *terminators, char *audio_files, char *bad_input_audio_files, char *dtmf_buf, char *digits_regex); + + int playAndDetectSpeech(char *file, char *engine, char *grammar); + void detectSpeech(char *arg0, char * = NULL, char *arg2 = NULL, char *arg3 = NULL); + int streamFile(char *file, int starting_sample_count = 0); diff --git a/src/mod/languages/mod_managed/freeswitch.i b/src/mod/languages/mod_managed/freeswitch.i index 1123651479..b38300af96 100644 --- a/src/mod/languages/mod_managed/freeswitch.i +++ b/src/mod/languages/mod_managed/freeswitch.i @@ -84,6 +84,7 @@ char * SWIG_csharp_string_callback(const char * str) { %newobject Stream; %newobject API::execute; %newobject API::executeString; +%newobject CoreSession::playAndDetectSpeech; // Allow bitwise compare on flag fields %typemap(csclassmodifiers) session_flag_t "[System.Flags] public enum" diff --git a/src/mod/languages/mod_managed/switch_platform.i b/src/mod/languages/mod_managed/switch_platform.i index a6f0aaa6ba..fa78438260 100644 --- a/src/mod/languages/mod_managed/switch_platform.i +++ b/src/mod/languages/mod_managed/switch_platform.i @@ -45,6 +45,9 @@ typedef unsigned long in_addr_t; %newobject CoreSession; %newobject Event; %newobject Stream; +%newobject API::execute; +%newobject API::executeString; +%newobject CoreSession::playAndDetectSpeech; #define SWITCH_DECLARE(type) type #define SWITCH_DECLARE_NONSTD(type) type diff --git a/src/mod/languages/mod_perl/freeswitch.i b/src/mod/languages/mod_perl/freeswitch.i index 262a70e2c1..2674b01f81 100644 --- a/src/mod/languages/mod_perl/freeswitch.i +++ b/src/mod/languages/mod_perl/freeswitch.i @@ -17,6 +17,7 @@ %newobject Stream; %newobject API::execute; %newobject API::executeString; +%newobject CoreSession::playAndDetectSpeech; /** insert the following includes into generated code so it compiles */ %{ diff --git a/src/mod/languages/mod_python/mod_python.i b/src/mod/languages/mod_python/mod_python.i index c22acf6055..0e8be465ee 100644 --- a/src/mod/languages/mod_python/mod_python.i +++ b/src/mod/languages/mod_python/mod_python.i @@ -14,6 +14,9 @@ %newobject CoreSession; %newobject Event; %newobject Stream; +%newobject API::execute; +%newobject API::executeString; +%newobject CoreSession::playAndDetectSpeech; /** insert the following includes into generated code so it compiles */ %{ diff --git a/src/switch_cpp.cpp b/src/switch_cpp.cpp index 3741ba2ffd..342d91a187 100644 --- a/src/switch_cpp.cpp +++ b/src/switch_cpp.cpp @@ -984,6 +984,71 @@ SWITCH_DECLARE(char *) CoreSession::playAndGetDigits(int min_digits, return dtmf_buf; } +SWITCH_DECLARE(void) CoreSession::detectSpeech(char *arg0, char *arg1, char *arg2, char *arg3) +{ + this_check_void(); + sanity_check_noreturn; + + begin_allow_threads(); + + if (!arg0) return; + + if (!strcasecmp(arg0, "grammar") && arg1 && arg2) { + switch_ivr_detect_speech_load_grammar(session, arg1, arg2); + } else if (!strcasecmp(arg0, "nogrammar") && arg1) { + switch_ivr_detect_speech_unload_grammar(session, arg1); + } else if (!strcasecmp(arg0, "grammaron") && arg1) { + switch_ivr_detect_speech_enable_grammar(session, arg1); + } else if (!strcasecmp(arg0, "grammaroff") && arg1) { + switch_ivr_detect_speech_disable_grammar(session, arg1); + } else if (!strcasecmp(arg0, "grammarsalloff")) { + switch_ivr_detect_speech_disable_all_grammars(session); + } else if (!strcasecmp(arg0, "init") && arg1 && arg2) { + switch_ivr_detect_speech_init(session, arg1, arg2, NULL); + } else if (!strcasecmp(arg0, "pause")) { + switch_ivr_pause_detect_speech(session); + } else if (!strcasecmp(arg0, "resume")) { + switch_ivr_resume_detect_speech(session); + } else if (!strcasecmp(arg0, "stop")) { + switch_ivr_stop_detect_speech(session); + } else if (!strcasecmp(arg0, "param") && arg1 && arg2) { + switch_ivr_set_param_detect_speech(session, arg1, arg2); + } else if (!strcasecmp(arg0, "start-input-timers")) { + switch_ivr_detect_speech_start_input_timers(session); + } else if (!strcasecmp(arg0, "start_input_timers")) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "start_input_timers is deprecated, please use start-input-timers instead!\n"); + switch_ivr_detect_speech_start_input_timers(session); + } else if (arg1 && arg2 && arg3) { + switch_ivr_detect_speech(session, arg0, arg1, arg2, arg3, NULL); + } + + end_allow_threads(); +} + +SWITCH_DECLARE(char *) CoreSession::playAndDetectSpeech(char *file, char *engine, char *grammar) +{ + sanity_check((char *)""); + this_check((char *)""); + begin_allow_threads(); + + char *result = NULL; + + switch_status_t status = switch_ivr_play_and_detect_speech(session, file, engine, grammar, &result, 0, NULL); + if (status == SWITCH_STATUS_SUCCESS) { + // good + } else if (status == SWITCH_STATUS_GENERR) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "GRAMMAR ERROR\n"); + } else if (status == SWITCH_STATUS_NOT_INITALIZED) { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "ASR INIT ERROR\n"); + } else { + switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "ERROR\n"); + } + + end_allow_threads(); + + return result; // remeber to free me +} + SWITCH_DECLARE(void) CoreSession::say(const char *tosay, const char *module_name, const char *say_type, const char *say_method, const char *say_gender) { this_check_void();