From 3f00a32d9d73749d3525d114e87396bb0890e794 Mon Sep 17 00:00:00 2001 From: cmaj Date: Fri, 2 Feb 2024 10:27:31 -0700 Subject: [PATCH] app_speech_utils.c: Allow partial speech results. Adds 'p' option to SpeechBackground() application. With this option, when the app timeout is reached, whatever the backend speech engine collected will be returned as if it were the final, full result. (This works for engines that make partial results.) Resolves: #572 UserNote: The SpeechBackground dialplan application now supports a 'p' option that will return partial results from speech engines that provide them when a timeout occurs. --- apps/app_speech_utils.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/app_speech_utils.c b/apps/app_speech_utils.c index fa4a75a148..51975407bf 100644 --- a/apps/app_speech_utils.c +++ b/apps/app_speech_utils.c @@ -105,6 +105,9 @@ + @@ -700,10 +703,12 @@ static int speech_streamfile(struct ast_channel *chan, const char *filename, con enum { SB_OPT_NOANSWER = (1 << 0), + SB_OPT_PARTIALRESULTS = (1 << 1), }; AST_APP_OPTIONS(speech_background_options, BEGIN_OPTIONS AST_APP_OPTION('n', SB_OPT_NOANSWER), + AST_APP_OPTION('p', SB_OPT_PARTIALRESULTS), END_OPTIONS ); /*! \brief SpeechBackground(Sound File,Timeout) Dialplan Application */ @@ -933,7 +938,10 @@ static int speech_background(struct ast_channel *chan, const char *data) } } - if (!ast_strlen_zero(dtmf)) { + if (ast_strlen_zero(dtmf) && speech->state == AST_SPEECH_STATE_READY && ast_test_flag(&options, SB_OPT_PARTIALRESULTS)) { + /* Copy to speech structure the results, even partial ones, if desired and available */ + speech->results = ast_speech_results_get(speech); + } else if (!ast_strlen_zero(dtmf)) { /* We sort of make a results entry */ speech->results = ast_calloc(1, sizeof(*speech->results)); if (speech->results != NULL) {