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.
This commit is contained in:
cmaj 2024-02-02 10:27:31 -07:00 committed by asterisk-org-access-app[bot]
parent 775352ee6c
commit 3f00a32d9d
1 changed files with 9 additions and 1 deletions

View File

@ -105,6 +105,9 @@
<option name="n">
<para>Don't answer the channel if it has not already been answered.</para>
</option>
<option name="p">
<para>Return partial results when backend is terminated by timeout.</para>
</option>
</optionlist>
</parameter>
</syntax>
@ -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) {