diff --git a/src/whisper.cpp b/src/whisper.cpp index f0f08c795..f4f7ac3a9 100644 --- a/src/whisper.cpp +++ b/src/whisper.cpp @@ -416,9 +416,9 @@ static const std::map g_aheads { static std::vector get_alignment_heads_by_layer(const whisper_context_params & cparams, int il, int32_t n_text_layer, int32_t n_head); struct whisper_mel { - int n_len; - int n_len_org; - int n_mel; + int n_len = 0; + int n_len_org = 0; + int n_mel = 0; std::vector data; }; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b8bbbe84d..57bfb51b6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -103,6 +103,16 @@ target_link_libraries(${BUFFER_LOADER_TEST} PRIVATE common) add_test(NAME ${BUFFER_LOADER_TEST} COMMAND ${BUFFER_LOADER_TEST}) set_tests_properties(${BUFFER_LOADER_TEST} PROPERTIES LABELS "unit;gh") +# whisper_full() with n_samples == 0 must not read an uninitialized mel (#3978) +set(ZERO_SAMPLES_TEST test-whisper-zero-samples) +add_executable(${ZERO_SAMPLES_TEST} ${ZERO_SAMPLES_TEST}.cpp) +target_include_directories(${ZERO_SAMPLES_TEST} PRIVATE ../include ../ggml/include ../examples) +target_link_libraries(${ZERO_SAMPLES_TEST} PRIVATE common) +target_compile_definitions(${ZERO_SAMPLES_TEST} PRIVATE + WHISPER_MODEL_PATH="${PROJECT_SOURCE_DIR}/models/for-tests-ggml-tiny.bin") +add_test(NAME ${ZERO_SAMPLES_TEST} COMMAND ${ZERO_SAMPLES_TEST}) +set_tests_properties(${ZERO_SAMPLES_TEST} PROPERTIES LABELS "tiny;gh") + # VAD test tests VAD in isolation set(VAD_TEST test-vad) add_executable(${VAD_TEST} ${VAD_TEST}.cpp) diff --git a/tests/test-whisper-zero-samples.cpp b/tests/test-whisper-zero-samples.cpp new file mode 100644 index 000000000..5357e62fa --- /dev/null +++ b/tests/test-whisper-zero-samples.cpp @@ -0,0 +1,30 @@ +#include "whisper.h" + +#include + +#ifdef NDEBUG +#undef NDEBUG +#endif +#include + +int main() { + struct whisper_context_params cparams = whisper_context_default_params(); + cparams.use_gpu = false; + + struct whisper_context * ctx = whisper_init_from_file_with_params(WHISPER_MODEL_PATH, cparams); + assert(ctx != nullptr); + + struct whisper_full_params params = whisper_full_default_params(WHISPER_SAMPLING_GREEDY); + params.no_timestamps = true; + params.print_progress = false; + params.print_realtime = false; + + const int rc = whisper_full(ctx, params, nullptr, 0); + assert(rc == 0); + assert(whisper_full_n_segments(ctx) == 0); + + whisper_free(ctx); + + printf("test-whisper-zero-samples: OK\n"); + return 0; +}