mirror of
https://github.com/ggerganov/whisper.cpp.git
synced 2025-02-11 13:05:17 +00:00
whisper : add mechanism for aborting the whisper_full() computation
This commit is contained in:
parent
6fd5358dd0
commit
4698dcdb52
@ -607,6 +607,19 @@ int main(int argc, char ** argv) {
|
|||||||
wparams.new_segment_callback_user_data = &user_data;
|
wparams.new_segment_callback_user_data = &user_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// example for abort mechanism
|
||||||
|
// in this example, we do not abort the processing, but we could if the flag is set to true
|
||||||
|
// the callback is called before every encoder run - if it returns false, the processing is aborted
|
||||||
|
{
|
||||||
|
static bool is_aborted = false; // NOTE: this should be atomic to avoid data race
|
||||||
|
|
||||||
|
wparams.encoder_begin_callback = [](struct whisper_context * ctx, void * user_data) {
|
||||||
|
bool is_aborted = *(bool*)user_data;
|
||||||
|
return !is_aborted;
|
||||||
|
};
|
||||||
|
wparams.encoder_begin_callback_user_data = &is_aborted;
|
||||||
|
}
|
||||||
|
|
||||||
if (whisper_full_parallel(ctx, wparams, pcmf32.data(), pcmf32.size(), params.n_processors) != 0) {
|
if (whisper_full_parallel(ctx, wparams, pcmf32.data(), pcmf32.size(), params.n_processors) != 0) {
|
||||||
fprintf(stderr, "%s: failed to process audio\n", argv[0]);
|
fprintf(stderr, "%s: failed to process audio\n", argv[0]);
|
||||||
return 10;
|
return 10;
|
||||||
|
13
whisper.cpp
13
whisper.cpp
@ -2451,6 +2451,9 @@ struct whisper_full_params whisper_full_default_params(enum whisper_sampling_str
|
|||||||
|
|
||||||
/*.new_segment_callback =*/ nullptr,
|
/*.new_segment_callback =*/ nullptr,
|
||||||
/*.new_segment_callback_user_data =*/ nullptr,
|
/*.new_segment_callback_user_data =*/ nullptr,
|
||||||
|
|
||||||
|
/*.encoder_begin_callback =*/ nullptr,
|
||||||
|
/*.encoder_begin_callback_user_data =*/ nullptr,
|
||||||
};
|
};
|
||||||
} break;
|
} break;
|
||||||
case WHISPER_SAMPLING_BEAM_SEARCH:
|
case WHISPER_SAMPLING_BEAM_SEARCH:
|
||||||
@ -2497,6 +2500,9 @@ struct whisper_full_params whisper_full_default_params(enum whisper_sampling_str
|
|||||||
|
|
||||||
/*.new_segment_callback =*/ nullptr,
|
/*.new_segment_callback =*/ nullptr,
|
||||||
/*.new_segment_callback_user_data =*/ nullptr,
|
/*.new_segment_callback_user_data =*/ nullptr,
|
||||||
|
|
||||||
|
/*.encoder_begin_callback =*/ nullptr,
|
||||||
|
/*.encoder_begin_callback_user_data =*/ nullptr,
|
||||||
};
|
};
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
@ -2659,6 +2665,13 @@ int whisper_full(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (params.encoder_begin_callback) {
|
||||||
|
if (params.encoder_begin_callback(ctx, params.encoder_begin_callback_user_data) == false) {
|
||||||
|
fprintf(stderr, "%s: encoder_begin_callback returned false - aborting\n", __func__);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// encode audio features starting at offset seek
|
// encode audio features starting at offset seek
|
||||||
if (whisper_encode(ctx, seek, params.n_threads) != 0) {
|
if (whisper_encode(ctx, seek, params.n_threads) != 0) {
|
||||||
fprintf(stderr, "%s: failed to encode\n", __func__);
|
fprintf(stderr, "%s: failed to encode\n", __func__);
|
||||||
|
11
whisper.h
11
whisper.h
@ -185,6 +185,14 @@ extern "C" {
|
|||||||
// Use the whisper_full_...() functions to obtain the text segments
|
// Use the whisper_full_...() functions to obtain the text segments
|
||||||
typedef void (*whisper_new_segment_callback)(struct whisper_context * ctx, int n_new, void * user_data);
|
typedef void (*whisper_new_segment_callback)(struct whisper_context * ctx, int n_new, void * user_data);
|
||||||
|
|
||||||
|
// Encoder begin callback
|
||||||
|
// If not NULL, called before the encoder starts
|
||||||
|
// If it returns false, the computation is aborted
|
||||||
|
typedef bool (*whisper_encoder_begin_callback)(struct whisper_context * ctx, void * user_data);
|
||||||
|
|
||||||
|
// Parameters for the whisper_full() function
|
||||||
|
// If you chnage the order or add new parameters, make sure to update the default values in whisper.cpp:
|
||||||
|
// whisper_full_default_params()
|
||||||
struct whisper_full_params {
|
struct whisper_full_params {
|
||||||
enum whisper_sampling_strategy strategy;
|
enum whisper_sampling_strategy strategy;
|
||||||
|
|
||||||
@ -231,6 +239,9 @@ extern "C" {
|
|||||||
|
|
||||||
whisper_new_segment_callback new_segment_callback;
|
whisper_new_segment_callback new_segment_callback;
|
||||||
void * new_segment_callback_user_data;
|
void * new_segment_callback_user_data;
|
||||||
|
|
||||||
|
whisper_encoder_begin_callback encoder_begin_callback;
|
||||||
|
void * encoder_begin_callback_user_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
WHISPER_API struct whisper_full_params whisper_full_default_params(enum whisper_sampling_strategy strategy);
|
WHISPER_API struct whisper_full_params whisper_full_default_params(enum whisper_sampling_strategy strategy);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user