From 95a657e2002ce1249c59e540e96ed5f8de34e1d8 Mon Sep 17 00:00:00 2001 From: William Tambellini Date: Wed, 8 May 2024 16:17:18 -0700 Subject: [PATCH] Add support for trnascoding compressed input with ffmpeg libs (Linux) - search for ffmpeg at cmake time - added ffmpeg_transcode.cpp into libcommon if ffmpeg on - hooked ffmpeg trancoding in common read_wav(...) - passed test: ./main -m ggml-base.en.bin -f samples/jfk.mp3 --- CMakeLists.txt | 26 +++ cmake/FindFFmpeg.cmake | 163 ++++++++++++++++ examples/CMakeLists.txt | 5 + examples/common.cpp | 18 +- examples/ffmpeg_transcode.cpp | 350 ++++++++++++++++++++++++++++++++++ examples/main/CMakeLists.txt | 2 +- samples/.gitignore | 3 + samples/jfk.mp3 | Bin 0 -> 76447 bytes tests/CMakeLists.txt | 11 ++ 9 files changed, 576 insertions(+), 2 deletions(-) create mode 100644 cmake/FindFFmpeg.cmake create mode 100644 examples/ffmpeg_transcode.cpp create mode 100644 samples/jfk.mp3 diff --git a/CMakeLists.txt b/CMakeLists.txt index cdffbcaa1c0..6d706b37760 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,10 @@ option(WHISPER_BUILD_EXAMPLES "whisper: build examples" ${WHISPER_STANDA option(WHISPER_SDL2 "whisper: support for libSDL2" OFF) +if (CMAKE_SYSTEM_NAME MATCHES "Linux") + option(WHISPER_FFMPEG "whisper: support building and linking with ffmpeg libs" OFF) +endif() + option(WHISPER_NO_AVX "whisper: disable AVX" OFF) option(WHISPER_NO_AVX2 "whisper: disable AVX2" OFF) option(WHISPER_NO_AVX512 "whisper: disable AVX512" ON) @@ -125,6 +129,28 @@ else() set(CMAKE_CXX_STANDARD 11) endif() +if (WHISPER_FFMPEG) + # As today (cmake 3.27), there is no official cmake support for FindFFmpeg. + # Consequnelty we added a FindFFmpeg.cmake script the cmake subfolder: + #unset(FFmpeg_FIND_COMPONENTS CACHE) + #set(FFmpeg_FIND_COMPONENTS AVFORMAT AVCODEC AVUTIL) # AVFILTER + find_package(FFmpeg REQUIRED) + if (NOT ${FFMPEG_FOUND}) + message(FATAL_ERROR "Cannot find ffmpeg libs/headers") + endif() + message(STATUS "Found ffmpeg libs: ${FFMPEG_LIBRARIES}") + message(STATUS "Found ffmpeg headers in: ${FFMPEG_INCLUDE_DIRS}") + message(STATUS "ffmpeg definitions: ${FFMPEG_DEFINITIONS}") + message(STATUS "Found avformat ${AVFORMAT_VERSION}") + include_directories(${FFMPEG_INCLUDE_DIRS}) + add_compile_definitions(WHISPER_FFMPEG) + # not swscale is not needed + # libswresample performs highly optimized audio resampling, rematrixing and sample format conversion operations + # libavcodec provides a generic encoding/decoding framework and contains multiple decoders and encoders for audio, video and subtitle streams, and several bitstream filters. + # libavformat provides a generic framework for multiplexing and demultiplexing (muxing and demuxing) audio, video and subtitle streams. + set(WHISPER_EXTRA_LIBS ${WHISPER_EXTRA_LIBS} ${FFMPEG_LIBRARIES}) +endif() + # on APPLE if (APPLE) # include Accelerate framework diff --git a/cmake/FindFFmpeg.cmake b/cmake/FindFFmpeg.cmake new file mode 100644 index 00000000000..4caf80a178f --- /dev/null +++ b/cmake/FindFFmpeg.cmake @@ -0,0 +1,163 @@ +# From +# https://github.com/snikulov/cmake-modules/blob/master/FindFFmpeg.cmake +# +# vim: ts=2 sw=2 +# - Try to find the required ffmpeg components(default: AVFORMAT, AVUTIL, AVCODEC) +# +# Once done this will define +# FFMPEG_FOUND - System has the all required components. +# FFMPEG_INCLUDE_DIRS - Include directory necessary for using the required components headers. +# FFMPEG_LIBRARIES - Link these to use the required ffmpeg components. +# FFMPEG_DEFINITIONS - Compiler switches required for using the required ffmpeg components. +# +# For each of the components it will additionally set. +# - AVCODEC +# - AVDEVICE +# - AVFORMAT +# - AVFILTER +# - AVUTIL +# - POSTPROC +# - SWSCALE +# the following variables will be defined +# _FOUND - System has +# _INCLUDE_DIRS - Include directory necessary for using the headers +# _LIBRARIES - Link these to use +# _DEFINITIONS - Compiler switches required for using +# _VERSION - The components version +# +# Copyright (c) 2006, Matthias Kretz, +# Copyright (c) 2008, Alexander Neundorf, +# Copyright (c) 2011, Michael Jansen, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + +include(FindPackageHandleStandardArgs) + +# The default components were taken from a survey over other FindFFMPEG.cmake files +if (NOT FFmpeg_FIND_COMPONENTS) + set(FFmpeg_FIND_COMPONENTS AVFORMAT AVCODEC AVUTIL SWRESAMPLE) +endif () + +# +### Macro: set_component_found +# +# Marks the given component as found if both *_LIBRARIES AND *_INCLUDE_DIRS is present. +# +macro(set_component_found _component ) + if (${_component}_LIBRARIES AND ${_component}_INCLUDE_DIRS) + message(DEBUG " - ${_component} found.") + set(${_component}_FOUND TRUE) + else () + message(DEBUG " - ${_component} not found.") + endif () +endmacro() + +# +### Macro: find_component +# +# Checks for the given component by invoking pkgconfig and then looking up the libraries and +# include directories. +# +macro(find_component _component _pkgconfig _library _header) + + if (NOT WIN32) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + find_package(PkgConfig) + if (PKG_CONFIG_FOUND) + pkg_check_modules(PC_${_component} ${_pkgconfig}) + message(STATUS "Pkgconfig found: ${PC_${_component}_INCLUDEDIR}") + message(STATUS "Pkgconfig found: ${PC_${_component}_INCLUDE_DIRS}") + message(STATUS "${PC_${_component}_CFLAGS}") + endif () + endif (NOT WIN32) + + + find_path(${_component}_INCLUDE_DIRS ${_header} + HINTS + ${PC_${_component}_INCLUDEDIR} + ${PC_${_component}_INCLUDE_DIRS} + PATH_SUFFIXES + ffmpeg + ) + + # CMake's default is to search first for shared libraries and then for static libraries. + # Todo later: add option to prefer static libs over dynamic: + find_library(${_component}_LIBRARIES NAMES ${_library} lib${_library}.a + HINTS + ${PC_${_component}_LIBDIR} + ${PC_${_component}_LIBRARY_DIRS} + ) + + set(${_component}_DEFINITIONS ${PC_${_component}_CFLAGS_OTHER} CACHE STRING "The ${_component} CFLAGS.") + set(${_component}_VERSION ${PC_${_component}_VERSION} CACHE STRING "The ${_component} version number.") + + set_component_found(${_component}) + + mark_as_advanced( + ${_component}_INCLUDE_DIRS + ${_component}_LIBRARIES + ${_component}_DEFINITIONS + ${_component}_VERSION) + +endmacro() + + +# Check for cached results. If there are skip the costly part. +if (NOT FFMPEG_LIBRARIES) + + # Check for all possible component. + find_component(AVCODEC libavcodec avcodec libavcodec/avcodec.h) + find_component(AVFORMAT libavformat avformat libavformat/avformat.h) + find_component(AVDEVICE libavdevice avdevice libavdevice/avdevice.h) + #find_component(AVRESAMPLE libavresample avresample libavresample/avresample.h) # old name for swresample + find_component(AVUTIL libavutil avutil libavutil/avutil.h) + find_component(AVFILTER libavfilter avfilter libavfilter/avfilter.h) + find_component(SWSCALE libswscale swscale libswscale/swscale.h) + find_component(POSTPROC libpostproc postproc libpostproc/postprocess.h) + find_component(SWRESAMPLE libswresample swresample libswresample/swresample.h) + + # Check if the required components were found and add their stuff to the FFMPEG_* vars. + foreach (_component ${FFmpeg_FIND_COMPONENTS}) + if (${_component}_FOUND) + # message(STATUS "Required component ${_component} present.") + set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${${_component}_LIBRARIES}) + set(FFMPEG_DEFINITIONS ${FFMPEG_DEFINITIONS} ${${_component}_DEFINITIONS}) + list(APPEND FFMPEG_INCLUDE_DIRS ${${_component}_INCLUDE_DIRS}) + else () + # message(STATUS "Required component ${_component} missing.") + endif () + endforeach () + + # Build the include path with duplicates removed. + if (FFMPEG_INCLUDE_DIRS) + list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS) + endif () + + # cache the vars. + set(FFMPEG_INCLUDE_DIRS ${FFMPEG_INCLUDE_DIRS} CACHE STRING "The FFmpeg include directories." FORCE) + set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} CACHE STRING "The FFmpeg libraries." FORCE) + set(FFMPEG_DEFINITIONS ${FFMPEG_DEFINITIONS} CACHE STRING "The FFmpeg cflags." FORCE) + + mark_as_advanced(FFMPEG_INCLUDE_DIRS + FFMPEG_LIBRARIES + FFMPEG_DEFINITIONS) + +endif () + +# Now set the noncached _FOUND vars for the components. +# whisper.cpp does not need SWSCALE +foreach (_component AVCODEC AVDEVICE AVFORMAT AVRESAMPLE AVUTIL POSTPROCESS) + set_component_found(${_component}) +endforeach () + +# Compile the list of required vars +set(_FFmpeg_REQUIRED_VARS FFMPEG_LIBRARIES FFMPEG_INCLUDE_DIRS) +foreach (_component ${FFmpeg_FIND_COMPONENTS}) + list(APPEND _FFmpeg_REQUIRED_VARS ${_component}_LIBRARIES ${_component}_INCLUDE_DIRS) +endforeach () + +# Give a nice error message if some of the required vars are missing. +find_package_handle_standard_args(FFmpeg DEFAULT_MSG ${_FFmpeg_REQUIRED_VARS}) + diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 3b493e3db7e..e2ffc12d719 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -22,6 +22,10 @@ endif() set(TARGET common) +if (WHISPER_FFMPEG) + set(FFMPEG_SRC ffmpeg_transcode.cpp) +endif() + add_library(${TARGET} STATIC common.h common.cpp @@ -29,6 +33,7 @@ add_library(${TARGET} STATIC common-ggml.cpp grammar-parser.h grammar-parser.cpp + ${FFMPEG_SRC} ) include(DefaultTargetOptions) diff --git a/examples/common.cpp b/examples/common.cpp index 2c0cdf082ed..aaa1d22eb96 100644 --- a/examples/common.cpp +++ b/examples/common.cpp @@ -24,6 +24,11 @@ #include #endif +#ifdef WHISPER_FFMPEG +// as implemented in ffmpeg_trancode.cpp only embedded in common lib if whisper built with ffmpeg support +extern bool ffmpeg_decode_audio(const std::string& ifname, std::vector& wav_data); +#endif + // Function to check if the next argument exists std::string get_next_arg(int& i, int argc, char** argv, const std::string& flag, gpt_params& params) { if (i + 1 < argc && argv[i + 1][0] != '-') { @@ -637,7 +642,7 @@ bool is_wav_buffer(const std::string buf) { bool read_wav(const std::string & fname, std::vector& pcmf32, std::vector>& pcmf32s, bool stereo) { drwav wav; - std::vector wav_data; // used for pipe input from stdin + std::vector wav_data; // used for pipe input from stdin or ffmpeg decoding output if (fname == "-") { { @@ -670,8 +675,19 @@ bool read_wav(const std::string & fname, std::vector& pcmf32, std::vector } } else if (drwav_init_file(&wav, fname.c_str(), nullptr) == false) { +#if defined(WHISPER_FFMPEG) + if (ffmpeg_decode_audio(fname, wav_data) != 0) { + fprintf(stderr, "error: failed to ffmpeg decode '%s' \n", fname.c_str()); + return false; + } + if (drwav_init_memory(&wav, wav_data.data(), wav_data.size(), nullptr) == false) { + fprintf(stderr, "error: failed to read wav data as wav \n"); + return false; + } +#else fprintf(stderr, "error: failed to open '%s' as WAV file\n", fname.c_str()); return false; +#endif } if (wav.channels != 1 && wav.channels != 2) { diff --git a/examples/ffmpeg_transcode.cpp b/examples/ffmpeg_transcode.cpp new file mode 100644 index 00000000000..910cdf5700b --- /dev/null +++ b/examples/ffmpeg_transcode.cpp @@ -0,0 +1,350 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +/* + * transcode.c - convert audio file to WAVE + * + * Copyright (C) 2019 Andrew Clayton + * Copyright (C) 2024 William Tambellini + */ + +// Just for conveninent C++ API +#include +#include + +// C +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#include +#include +#include +#include +} + +typedef uint64_t u64; +typedef int64_t s64; +typedef uint32_t u32; +typedef int32_t s32; +typedef uint16_t u16; +typedef int16_t s16; +typedef uint8_t u8; +typedef int8_t s8; + +#define WAVE_SAMPLE_RATE 16000 +#define AVIO_CTX_BUF_SZ 4096 + +static const char* ffmpegLog = getenv("FFMPEG_LOG"); +// Todo: add __FILE__ __LINE__ +#define LOG(...) \ + do { if (ffmpegLog) fprintf(stderr, __VA_ARGS__); } while(0) // C99 + +/* + * WAVE file header based on definition from + * https://gist.github.com/Jon-Schneider/8b7c53d27a7a13346a643dac9c19d34f + * + * We must ensure this structure doesn't have any holes or + * padding so we can just map it straight to the WAVE data. + */ +struct wave_hdr { + /* RIFF Header: "RIFF" */ + char riff_header[4]; + /* size of audio data + sizeof(struct wave_hdr) - 8 */ + int wav_size; + /* "WAVE" */ + char wav_header[4]; + + /* Format Header */ + /* "fmt " (includes trailing space) */ + char fmt_header[4]; + /* Should be 16 for PCM */ + int fmt_chunk_size; + /* Should be 1 for PCM. 3 for IEEE Float */ + s16 audio_format; + s16 num_channels; + int sample_rate; + /* + * Number of bytes per second + * sample_rate * num_channels * bit_depth/8 + */ + int byte_rate; + /* num_channels * bytes per sample */ + s16 sample_alignment; + /* bits per sample */ + s16 bit_depth; + + /* Data Header */ + /* "data" */ + char data_header[4]; + /* + * size of audio + * number of samples * num_channels * bit_depth/8 + */ + int data_bytes; +} __attribute__((__packed__)); + +struct audio_buffer { + u8 *ptr; + int size; /* size left in the buffer */ +}; + +static void set_wave_hdr(wave_hdr& wh, size_t size) { + memcpy(&wh.riff_header, "RIFF", 4); + wh.wav_size = size + sizeof(struct wave_hdr) - 8; + memcpy(&wh.wav_header, "WAVE", 4); + memcpy(&wh.fmt_header, "fmt ", 4); + wh.fmt_chunk_size = 16; + wh.audio_format = 1; + wh.num_channels = 1; + wh.sample_rate = WAVE_SAMPLE_RATE; + wh.sample_alignment = 2; + wh.bit_depth = 16; + wh.byte_rate = wh.sample_rate * wh.sample_alignment; + memcpy(&wh.data_header, "data", 4); + wh.data_bytes = size; +} + +static void write_wave_hdr(int fd, size_t size) { + struct wave_hdr wh; + set_wave_hdr(wh, size); + write(fd, &wh, sizeof(struct wave_hdr)); +} + +static int map_file(int fd, u8 **ptr, size_t *size) +{ + struct stat sb; + + fstat(fd, &sb); + *size = sb.st_size; + + *ptr = (u8*)mmap(NULL, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + if (*ptr == MAP_FAILED) { + perror("mmap"); + return -1; + } + + return 0; +} + +static int read_packet(void *opaque, u8 *buf, int buf_size) +{ + struct audio_buffer *audio_buf = (audio_buffer*)opaque; + + buf_size = FFMIN(buf_size, audio_buf->size); + + /* copy internal buffer data to buf */ + memcpy(buf, audio_buf->ptr, buf_size); + audio_buf->ptr += buf_size; + audio_buf->size -= buf_size; + + return buf_size; +} + +static void convert_frame(struct SwrContext *swr, AVCodecContext *codec, + AVFrame *frame, s16 **data, int *size, bool flush) +{ + int nr_samples; + s64 delay; + u8 *buffer; + + delay = swr_get_delay(swr, codec->sample_rate); + nr_samples = av_rescale_rnd(delay + frame->nb_samples, + WAVE_SAMPLE_RATE, codec->sample_rate, + AV_ROUND_UP); + av_samples_alloc(&buffer, NULL, 1, nr_samples, AV_SAMPLE_FMT_S16, 0); + + /* + * !flush is used to check if we are flushing any remaining + * conversion buffers... + */ + nr_samples = swr_convert(swr, &buffer, nr_samples, + !flush ? (const u8 **)frame->data : NULL, + !flush ? frame->nb_samples : 0); + + *data = (s16*)realloc(*data, (*size + nr_samples) * sizeof(s16)); + memcpy(*data + *size, buffer, nr_samples * sizeof(s16)); + *size += nr_samples; + av_freep(&buffer); +} + +static bool is_audio_stream(const AVStream *stream) +{ + if (stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) + return true; + + return false; +} + +// Return non zero on error, 0 on success +// audio_buffer: input memory +// data: decoded output audio data (wav file) +// size: size of output data +static int decode_audio(struct audio_buffer *audio_buf, s16 **data, int *size) +{ + LOG("decode_audio: input size: %d\n", audio_buf->size); + AVFormatContext *fmt_ctx; + AVIOContext *avio_ctx; + AVStream *stream; + AVCodecContext *codec; + AVPacket packet; + AVFrame *frame; + struct SwrContext *swr; + u8 *avio_ctx_buffer; + unsigned int i; + int stream_index = -1; + int err; + const size_t errbuffsize = 1024; + char errbuff[errbuffsize]; + + av_register_all(); // from avformat. Still a must-have call for ffmpeg v3! (can be skipped for later versions) + + fmt_ctx = avformat_alloc_context(); + avio_ctx_buffer = (u8*)av_malloc(AVIO_CTX_BUF_SZ); + LOG("Creating an avio context: AVIO_CTX_BUF_SZ=%d\n", AVIO_CTX_BUF_SZ); + avio_ctx = avio_alloc_context(avio_ctx_buffer, AVIO_CTX_BUF_SZ, 0, audio_buf, &read_packet, NULL, NULL); + fmt_ctx->pb = avio_ctx; + + // open the input stream and read header + err = avformat_open_input(&fmt_ctx, NULL, NULL, NULL); + if (err) { + LOG("Could not read audio buffer: %d: %s\n", err, av_make_error_string(errbuff, errbuffsize, err)); + return err; + } + + err = avformat_find_stream_info(fmt_ctx, NULL); + if (err < 0) { + LOG("Could not retrieve stream info from audio buffer: %d\n", err); + return err; + } + + for (i = 0; i < fmt_ctx->nb_streams; i++) { + if (is_audio_stream(fmt_ctx->streams[i])) { + stream_index = i; + break; + } + } + + if (stream_index == -1) { + LOG("Could not retrieve audio stream from buffer\n"); + return -1; + } + + stream = fmt_ctx->streams[stream_index]; + codec = avcodec_alloc_context3( + avcodec_find_decoder(stream->codecpar->codec_id)); + avcodec_parameters_to_context(codec, stream->codecpar); + err = avcodec_open2(codec, avcodec_find_decoder(codec->codec_id), + NULL); + if (err) { + LOG("Failed to open decoder for stream #%d in audio buffer\n", stream_index); + return err; + } + + /* prepare resampler */ + swr = swr_alloc(); + + av_opt_set_int(swr, "in_channel_count", codec->channels, 0); + av_opt_set_int(swr, "out_channel_count", 1, 0); + av_opt_set_int(swr, "in_channel_layout", codec->channel_layout, 0); + av_opt_set_int(swr, "out_channel_layout", AV_CH_LAYOUT_MONO, 0); + av_opt_set_int(swr, "in_sample_rate", codec->sample_rate, 0); + av_opt_set_int(swr, "out_sample_rate", WAVE_SAMPLE_RATE, 0); + av_opt_set_sample_fmt(swr, "in_sample_fmt", codec->sample_fmt, 0); + av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0); + + swr_init(swr); + if (!swr_is_initialized(swr)) { + LOG("Resampler has not been properly initialized\n"); + return -1; + } + + av_init_packet(&packet); + frame = av_frame_alloc(); + if (!frame) { + LOG("Error allocating the frame\n"); + return -1; + } + + /* iterate through frames */ + *data = NULL; + *size = 0; + while (av_read_frame(fmt_ctx, &packet) >= 0) { + avcodec_send_packet(codec, &packet); + + err = avcodec_receive_frame(codec, frame); + if (err == AVERROR(EAGAIN)) + continue; + + convert_frame(swr, codec, frame, data, size, false); + } + /* Flush any remaining conversion buffers... */ + convert_frame(swr, codec, frame, data, size, true); + + av_frame_free(&frame); + swr_free(&swr); + //avio_context_free(); // todo? + avcodec_close(codec); + avformat_close_input(&fmt_ctx); + avformat_free_context(fmt_ctx); + + if (avio_ctx) { + av_freep(&avio_ctx->buffer); + av_freep(&avio_ctx); + } + + return 0; +} + +// in mem decoding/conversion/resampling: +// ifname: input file path +// owav_data: in mem wav file. Can be forwarded as it to whisper/drwav +// return 0 on success +int ffmpeg_decode_audio(const std::string &ifname, std::vector& owav_data) { + LOG("ffmpeg_decode_audio: %s\n", ifname.c_str()); + int ifd = open(ifname.c_str(), O_RDONLY); + if (ifd == -1) { + fprintf(stderr, "Couldn't open input file %s\n", ifname.c_str()); + return -1; + } + u8 *ibuf = NULL; + size_t ibuf_size; + int err = map_file(ifd, &ibuf, &ibuf_size); + if (err) { + LOG("Couldn't map input file %s\n", ifname.c_str()); + return err; + } + LOG("Mapped input file: %x size: %d\n", ibuf, ibuf_size); + struct audio_buffer inaudio_buf; + inaudio_buf.ptr = ibuf; + inaudio_buf.size = ibuf_size; + + s16 *odata=NULL; + int osize=0; + + err = decode_audio(&inaudio_buf, &odata, &osize); + LOG("decode_audio returned %d \n", err); + if (err != 0) { + LOG("decode_audio failed\n"); + return err; + } + LOG("decode_audio output size: %d\n", osize); + + wave_hdr wh; + const size_t outdatasize = osize * sizeof(s16); + set_wave_hdr(wh, outdatasize); + owav_data.resize(sizeof(wave_hdr) + outdatasize); + // header: + memcpy(owav_data.data(), &wh, sizeof(wave_hdr)); + // the data: + memcpy(owav_data.data() + sizeof(wave_hdr), odata, osize* sizeof(s16)); + + return 0; +} diff --git a/examples/main/CMakeLists.txt b/examples/main/CMakeLists.txt index 1bb16f58214..1e66e4b5cc8 100644 --- a/examples/main/CMakeLists.txt +++ b/examples/main/CMakeLists.txt @@ -3,4 +3,4 @@ add_executable(${TARGET} main.cpp) include(DefaultTargetOptions) -target_link_libraries(${TARGET} PRIVATE common whisper ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(${TARGET} PRIVATE common whisper ${FFMPEG_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) diff --git a/samples/.gitignore b/samples/.gitignore index 72e8ffc0db8..e084659df25 100644 --- a/samples/.gitignore +++ b/samples/.gitignore @@ -1 +1,4 @@ * +!jfk.wave +!jfk.mp3 + diff --git a/samples/jfk.mp3 b/samples/jfk.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fbfa1d9897365f05adf4f624c3210cc4fd374a44 GIT binary patch literal 76447 zcmce7_g7P2@a;_{K!8vUND0-@L$6BcT|$+rp%)P;N>P;1yYwm|ND&Z}-b4vix^zXU z7EnY$X&(^CgYSE9t@jtav(`=Oe3fMfxXhz9_H zQqj^gv7$M+FnmJ7q7pb6IRzz^%U9Gjv~=_gOf0V1+B*>4Ja69e@%6tG7<@036cHVl zkerg9nfth~xTL)D#mn0IhNhO*_RijSgCk=TQ!{g)7ni?&|FOQg{daf&zoV10|05Ww z8*9s)TLUHhA4>pMga8E33xJl-?cjqx>iWMo{y)D{c7l5WSTGn51_1B{%Ktl_-o7M! z^#1q?5O%`1*K$rT z{5MG{1bZYsnzDoKons88*W$sWKqyUVT2dly7=@yC$eP&yvn<=QNEa2?D+Wd5hEod- z;Cf;hYVr45;sJRSg;#Opjkkhe>8q3Ylw$|VPHyj*StgsZL%~PjA4!9(R~<`2jaPV( z!DUP!3C#@=*a_v75>lu-ZYD-`~RSY`~iOi(;EM9Kb>gUu7b#R4L z=XGcE=|3YL6~wqw7`BdK_?gmlw~d0=Q)CHikXd0Lk4(3)(*;nEEDmbMko8{A^>6Mz zq4%mCm7!;rKn_Qo{CtC*nSzA7%O^tZaIaY!`ipT`xnil^om~fujkwM3LO0_}QU+x2YDmRulc0`S8>7ub1ji zKfe)tWg^s|roh!Cm9ZlJjI<`$y4Yr@q#MP9`u(H8R#HW{#rUC=iEWIHWT$%8#n&Qj zUJGI~wsucH2MHGs^tQjOD_@&`7o?JNb1nPwP=EFJ>>D`(4cD&xerwSg{p)j`&)CLL z?bytS*lmjB*3QKPx#MBFfTmkP5{svf2j{W6s9Lfgc;h1(L}^mF-x8uE~D*f>0pIT6n zg*sd5RZu4EP9LJjgY47SoeOy@~?+(_8@Peu2c#0+@P*UX}m!E*0TXuZP5rc z4;RhoOn4g~ze}9)-)MO+6_}AKfr^i{ddXs@GSxLPIHXKNM|#pjKljnzVIZ?()O62F z_3-fFClv?rWVPCnFE!lhgpAadzbXDzo3`75;wapSLzYNBIkJQT=_|>ffX1HZNl>=%brM zVl7`Q{k%9Y_vS(g+DwJTYb5Q>gMVLj-d^tftc;0I&Z^nsRvq=<-`!Z4UpkOi)n1N1 z`1^Kz^n1o(S_p36`r#h(L3~mh-B8``Pm|K4lT#hvx;ch_LLRJna>4?P^)%3@$iSV* zs<7Wnm0Kl^W~@CG$EIycJo@492` zqF1l|H^53o(7qf)&wO|(()UM{EO9Ns$~p%3H-_f&7tU(l+z%}p=QjVsM*fZ44~b3g zGvM~mzw@R4_ScCa*|c|l!i?qto{;oHm9%~Ltxp1a(`~^wn?wDD>L>ox?q$q}l-!Jw zdr2qB-9%wNE;G6Fw0HQKg~Q#Zi!CF*-_4EhYkWFkb>HT(6ag61B5bf<+TJcHl@FwU zk>w%VIZ=T$V#;q9SXB`GhlSMRuz!jj318|Mr7%pa^mNpqA#{ocV;M(xQ)PKa*Yu!# z?vQ%5o=D))sh`&i%8p*|HkNiX>VpX$Wp!k>PhbsZc$qA_*}85)$g+vrcVB*PMtg95fQ;n{aG5)m&+1>#(8c&lEcKm-cGs z96o7k&*qtvM+T?^ey%VLu+Qc{D5CnSanxC}krKR~M_Y7Z>}WQ+yNv$vfk?*Zp^dtO z+u5o-Jbqs$gnafj8>asoCaPTfaibzom-YFRoQ3XdbPgq*kl7a|>KrZbnX=9xs=39n z!Y7{_3^jfFU-QRsB>(h&>$9rbAhlnbg+KrR6;~P`EE7x;N))N>M~}FMmt#;N@j?O? zK|r*NMz>MYwDIU8i}8y|(9A*Jf!<=-o^i4F4O&xo3O=bTj%o~iPTTFf^rL&6r5le6 zhTyEx(l{rPaQG$aZgTj?XusTW#{|cpIpL;}>S!zv4g

P~0>~dJsUCB3wX4Mgyp* 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 TeBsR_I!(_|*f2 zH}^)H^vo!61y<(bPfrr^{&d!P!mwz!O6Q;j=}MKI^TlffiVCRB4=ZExlQiac{>yCz z^5>1$24k{W%BmlU)$8JHN~0F1F|SB@=p@u`a2zMHY;_$=<4m}{DD zqx|e2*OOPGF_lVN9ig59)-^KwEdB(*gAjG$m4453k((Lto#A%C zEPa*i@j5*{?`1AibNbkPD=TZft&^%wI=|2(~N97Viw=z#5I=|ptu2} zl1l<_@7Erc3@xri}hh_H$d+)jC58&n0aF3$twwY|l$;`^jH=?yPz5LbGX! zlQQGa$mhxjid{lZcF}5vC|wK?!sru(5g$T87!^GQlC5v%F=SPHb`cy{Ekr;(O4lBo za^|n(JQ7o`Irsw4qtU@~sJH%LP_GCI4;XgS*I=VO_EN+Je^boPSqBpC1r-h`1GsBt zz}$>jZha`v+1cW0gGODb}7X5x0Q-gsr3`&HB^?hm}rVnMyCkcz< zQ=CS<)XioorqrsjqY^GjX0ny7CcEH4A{pSsAqH7Nm9*fagSvH_(L_}M(g6(z*==Ak zryS9)H=QF&DqIE7Sokrw#T|6q6dT2>RSYmFL7IE72w5Y{1Jz04t@i)APxOL+Wn)Mz zbPeQ&V&HI$(aI2Ohb`0bYefus2Sa#hM115GF}PVGYw?{aqP*KY_-B^GyW%$i5u0@~ zmSd%f|4nc21~|G+Zii5{w+P~A8Aj-XZpUA{T+<@{JqsFNOmQVm_cSi}9`k*=vNN$O ze|#-ZaL9CY(f`r?wz_ZYKDWP=@|(trQDq3=?O&M5q6EM>gefxU3>$-V)Et!H$&I6# z!0~7Wx9Kf+OpZI*3SSGsJJ40A?Ve4|?jNFkpF!mLh>87@Qm{&}BG6(0$aSVD(P)zg zf+S;lDWYJ^B7DFNg)1^S^q6)eClLGN0VMO=P8Bqy%oz;U1bGHSh630X%Yp~-86<~B zSU)XZI6)UU@J*=`H&_u5fm8V7lsL!xB*ZX?@n%a!Kf2i)0eXAo)E}u4zug{Ov%Cr@ zn}bx0pLbB&n-`ITok5Zzg2IY*;xt{N7YYjTD4QXUiQJTqA4`NGkYx;d5{OS-EY;Sx>X-hI99u z6V~FlIH+tSw>Y>76#;_M+^Nx|WCC8Eje#?6ixsH{FpbBvQO^L^hz@DUGzu}D-;M8p z9Y~xu&V=$MHr7$a7`iB^#R5H)bjA0%LeJc_&hjo~JF6nW0m4JrgL97a#d-D)Gnf%{ z-0YB&9DO_ZRdxsr&??Sf4JiY;k--oqR42X!GQ>cuz*Aw~h`2rXB0&fn*5UL|V3{c1 z1hmO0BIuSOS`F`A^n3x>G$jGtX$*;Mgl`~#Ef6Dx$$_8x#ZBGj>NWxVGS3KwXZR~| z!5*Bg;!^Z8*SGu#!=!=4*icW|y)0byC>Ffqv-Rm$;!>6JCY*`myvnc+Js1bTA_qYO z?x*6Ja~T{Phef&+|I|E;Bn*?`BA6mc%&NSiR!+Yu%#Gml(-*XhC)tY zrf)&Wk_!0{nG|mhXd)w`nx8q58?=FKgt1cn#Xwfd+#DV}@D`qtP_`6XK%%YWum_9f zI)|CEQ2dW|4k)#=$k<^un_xZQ#K9cFp~ z*MEKiJV2@YUQDFn@c=LZZ;f$-;Av)pATHK84U9Jfo&e?~auU#}S`osu7BP`Zqlm#c zdK*V>>RVjZb@4?~09Zm_k-CLIU&cT*GlfkL<8X1@b^`UX;f)2B2JNfm1!6C?K1P9T zfp85BKg5G;e+cu2Asdu|gfb}-SYQCN2yr}=Zk7SS;A6xj#e41Wo6uD(*QN4RFdu*m zfCpkSz+6z;BSpM~GXK6j#u4DbfKodLjN4PDi>DL>B~g89_`g>-=Yc;xCfTct<@#YoD!Y2t_5sI$TV3KJKlOB?1Tm8uO-C7HkiR4gD6m^i~=JQ#>wt;J}Z zMGndE@dnW!07wTOaZciDJq~#lPW^3CDCk%aD9=x_V@?N!PsFYe0RR>uH+A{OX@&6uhsd`)$2!- zFfYX9L0+D8&u*;T#XmhKFG~}h{;H4fKS|O&JlQbQ@e<05>+L6jZ!Rx3}SUlosNSM z_TlVcf<-NW7_5Wg0OBz)K3L&e20$1o1lFJ%6aoNpBoGCPRRIARXyR@Fu1zt9%lJh> zZ%+JWyf=td903-=U&Ty8xPW^`Fs27WcmZX3{%o#BMT`?*9fb42II$`-W?G;i%51Bn z%5GQ1#`52(hZu>m(4JwaEOZs-5XOLMj_x(oIj|Y~lh*+9srwn00RsVZF{0QoCLpo1 z?msZ*usKfDI4jVIfIKha)F)6m*R18zca0^*Z6X1O~jlmY$ z+)~EdD-HA9(LC4lsn5MZ1S1x*5f@aFi?Ldex_JxQ8|O;_W9$&@j4&qd@dzH65eO#B z0W0OB=zw$qa47xq1lv!fuEvcGxRv>E457b-(x;Z5?ba35pTzF(ZaaAWar^ygW##Xy zx~lMyspk7g^PZFcdd4Dl@FhQ~+X}b7ca#Y2Djj<{!{pp_7M_IOeR*x=c;nA*=i1Yz z=)DX-a0U-(6$2fDfoN#d*;z7<3q%XUlQ@RhX*TX;NHrTuPmXnysmvD*-4w+C#TP;e zI896-v|olxMcw$KGAAa7?&ul{XjJEc^t0pK>CTebK%5CC8WhjfOj5h(lr4!#z+465 zpj_3cMrh3eOq=Go(=jpErd$9$<@1NcuxEaiNNWtjU0D$Y2QZH19J} zVZ0`gUzZy0WpGkMc>m;wRTVMFm*;QEBH8X)6Q}vo0XI>sR2IMpfyRK8PO8fQ%2EaL zmXbBBsA7yw3A9cefFWM53_z=<>sHO;sdt6>D;xQS0mx0(BqoM(zQjt!qzBf-e#c~8 z(^4b86nx#ivJn!^T}RW1EshMvKrxCLua%^gWPn)RX+f(5tO#5fKh2JJsP#l^ciIld_Iy=n-*@N=*X+8Ei^6npnu){{kDPp(uk>0LY6Sze4D8E^$xDltG9%Fy?czu`q;iSSh`{BJml0L6p?Jpg+& zrOV8rz&$nzus&$j!qkJAb_qfhbpjLiXv5mDZ4p#2+Rgy0g$FPtLa+dLUqLT|9^G9a z9=b}w4D!x#`~<400_Ip&Suhs?ig*l0i7B2n;}S;s^wJQ)s4{_BmCh-G&pu$t5Cj7_ z3AY)j8ej(~`#6kdK?6W7puJ>Tm?f+Rh6XVk0a4;OkO&UI2x2Cfup*g&(s6KRWLutY zDhZDqPD>_{VMsk-=Ku0Odzb4QJ@1j_CN{`~l-}erL@r&Ct|DfU2y1=Wl{$$uS{&HB zNcTv^!T=~ZyTS!dj1=Gp41Z4Pk_4C0_Xm z5ohI^AM(hS;h;Rjp=FR6d2Y=j3kxrg1PZAtyVhyMv+L|hMhS6o5BQl=8PZh9cJ%-r z;1yyPa9JFLWI*ASMD9TojvRkn_ITDZb#gMsCmRB0i374P#Jo>hF@B#f7qIcjD{uQm zx$b$;hFOoTX4l`?lRtEo!kdT9ZO=51UY=dKHCDK+b2k4%$uH;oQ_kPMzwf!Ff(mwv zUI715nXS#ca1+Kk3;@)^#wo0fuuRrol(IGx_#qU+RbGY$T+_ww%;l;;fr{#$w-J~! zBa92Hfj)rL1c&*z5!`(<*g@Au@D6YUN8f6wCdPybBmSCQ%}yc;o8A=JN5G&MM8Otf zVr=}Z6eKV&nIx(iFVdUVMITUM3FdbMy+?S zZ9N|Cf`>wzORmJ(^bG@k0OR{r;dA`PE$je8)&K|_Q?(I*OvRs`cZQwBdFi^p*TXm@ ziiv{Lm|%ohpqRa1b@ca<#B{a-rh#QJyZW7_k$l(E>lN;PhQnqy@-Av zV**^u#Nm`?3GG& zrhMp+J;@35wA?ar`84r$movCft@r8_gN0?Ux!mt6GAs^JW7 zlQjtyfiHpX!Tn%E9*iOlr0cXN(D~7W@)Iy-Lh;1bLI_fga9%gU5K5U3Mc=y;mt+jG zR$^0V#IvAtjdb-Z6j5>CMHtdRtT{aVN(C+Y_t$Tqw;S)LXoU4of(c_Kp7EPnW*+_3 z8ZvfJw1BR49<$w3+PY}7v&e*ZZI}O5Zt*%~wq`)x?1z@Buo-w~w-jr9v%5*F?(Dgc zo8lJDx~{h?9)9+|hK?=bxgI2QI-5FeW`0P3yywVdsXsUOed&x{H#Eq+;J(2|`{QZ- z*7TqCLX^pnchwWl7w<@K|4?adm;ZO9{%9z4jQ`c=bqzMCMw124Juu*z9s_IV@75p3 zp(p>H_WX85yRR>6Zf$1y8P@~OvAs#KQj;!g5;JsRSVf}+>Gs$c{1c@y%oy=SIrL(K zs+a|)h1+gQ-UZ?Ulu6zh;*{h_>ZReU&)VV2hO7xOG5w2J9r+(EIZ7D zW($=5Gp(4C@rvqpj+ed>9Q5dw6w<_4cc@3-KHj{jgO4oPe>KQ|ymMn`W5z|!z7qtJ z8wl_sznXpR$tiVH@d2jr<;~5T%G`114Bb*9)YJQ*@}Rt=$Gi_{=YE#H@HVdb?-ZXd zEciGYGB-HEb5Z5Zn6qQ`(0;;oK5a+7iT`GLd7g6$eG|00b<0YMn|ZK?6}>GK9A>i> zeVZcizf{Cr)kwa_!C+Uk%=U*1=*XcRwrPHXHb_ zBP|Mudj=_(gn8S#A$cNVoQLoJfAVX##^JM&lkdy4wrgm}s+KI1y$bWgDUDeZ#R8GaCL@tq8wIOuL(j*XU8 ziHtol(zWGZ`0{wmBPhiF=}f+P)8t+0!rEv4UG{LEzdEaLsvWgot`-y+QS9@$xc3xC z0fA)Sx+{{*-^IULykN+KYg02y{Hg}8m>SKzAF|4eEtF;-qaL5O{ z^yCCrIZFSYd}(ucJd(x@da&TYgLptj$~D=%G%Bb;)l z>(X)Ur0P4cpTikvLW|z!V)4;#=_ffkhC)xCmB4Hb&!#!P{_v*_IyPy#uFmJOvGBu9 zSiBfJ^!wAJgc}{z%i|>S+e^x?uBoDt%M*+V*Cyr?HY>6ZN#BNVCG}2)Xm;M}`S|rB zqS0e2x%@r*2bl~)!q^?zxcciI8Nouyk`zg=8Z*{fk@muxkahu)?q^;OxwXu)4SHW| z508DFU210B6Ww)^-`6=h664(jZXix${)iqMC4Hm63t))@O(;MqEinadWQ+N<-ANt} zRky#g3x72)(v}s(f^nAM_o{-m|fs^REI}wN7LHg!VX0 z4!Xm{bDKhfsGhhEOM^}Q46x~jc{25NwTlMx)@qB-BI8TaN}2S%4fRrvQXi!@{mQ?o zE`eMO=MgW|kdY=jRraeqC|)@UPl?U%I8<8(mo6yk$!lE>$URav&pKWR#v=LhPE1l- zF#l|T6bJv=^e~coi%F-NM;5^iMOhY+WqqKrV)n%SNyXdi;iE=AKa2@ekjS7wCp}(h=8fQP9@vtB^M--$-Lc6bMp3g@stH&M+ci!Couei9frqN4-Y-mE}Dq;~o z8iGHav+TX%{b9K3>G>MDwoxe3N8uBdS&oNY42eBdQwN#=Bae)`Of-MASt|^~P+lO9dU@gBo=iQ#{#~}O z*YjJiX!c0cH@q-Pvr)A$9ck;AF0E$YVXg>+PQzrDHr@PBt#>_t^Zar6 z-tgGk`AJyC6w^3qp$a4Cd}+9k@VeiJ0O*LViYfhP;@awX;q5smu*kQOD|i>+w4I~B zDClxBd%G|XrPcgJ_09aI*7{Wgw~!S7wo{zfW#hjQUX2>7im)eWEC1ns>iROYKq9g6 zoq0su&R}?3qDe8!)X%;+6jPeZW2!9T{iiGK&m$jDmg0e;=YBx**PfIVWOKVrga|A= z_x(dqv1N3V4{1*sIk{VH6`ifFLbQ@an1W zR^63(8Hl}q-0hyCSvV6dOrnIbAV}X(yTO}BDu@Jqd@# z1GJ#hZR+6QzFyP)#362ww5yQDD#ME*W*`y|y5_bj$^cwYL~NVL4J3e7zN(Hy3;cG^ zx?B&v$w}}LX3@T%s7B=WZD%kXVfnB$iEu=s!a?!!?*glJM}ktS#*}D+3=X#3>l(AN z^s^`3r_1^$d!W&#b>`;+GeBjOmkpmm~#iahN9ddzP;z zmfnll!k^H8A2yT|0i?eElj_2g>FLWTzAe&%;f$2FrGZ1A!iU0P^uy}OQc_Ix6Oo(XFKQBj-h`T)?m_7w~YJvi~!P%%%@yziwPb3z!MC>FLx(vEeu`bkTa$P(W&H|z@y@4@e1L+g2 z6xHG3@tx=iR>_R%&Ry6Y((j>$Q%>elxcPwr;FnmY1WdFKO6z2YvCv4gVO9!=2BmRh zV6Fo@15hCfJE5UWfL6xO0tgP~rE-FLNn5-~XXqL+@kun;`c==G5VqgaMuBji6#x z(}w;JO3Ts}f`dSB4jX>OvM9n#L1|)zFp`$x<%UDT^|%$?Dp@|CPx*O#PXt|8Ip=K% z1SV55g1J!~1>~4O6lb?ZqB(bd7z08Pg@>v5`H7k_@yjs*1c7iUMhV}j0mZ~&YmtNN z>%4KvX)T$NUt&+{a7IAW01Yd*lcTyM9Or}1nV#d|i;CHhG4-IHI|u(=Tdr+0car(H z^!f4gk-Vl?O4Inqp&0Ck(cpu@?2fLcP#pkBvH|i#0-u#0 za*t7`0>dcZi$ZaWD{8S}pq!GZ33a~lJDBl70fU4MZV>=u9Kg5IM=#H3?*Q-k(`(Vn zW0+lqg(?h4p}+r4G!o>g)+Bo?G#GUo_y|9!7A6>RfsI&5)l3Z4NFGT}8OZ`M$xbOL zEr!1P~QMyG>{ts*kVZ8{O} zz=DRhPmqnkjM$LHii)4EAk#+ z;Po$;kSQiEw<5CqciL@%mxhj?abDskzfHONbjj|8eCQ>0vG5+D$ zj|$oVp>SK>vQ`ZN1?%LGjwv5Z6G^=!KxR64rU&dtKt(1IoQQnl7pO2ESVp{VQ``sZ zJQQbZNMq(>HySSe08f{YX;0$vN3t;eqLn07wL|=z9#6$Sz(T(#~mJs$^RNiC-4CASE zCvL!bd~=xLT|C0;S_C~_Dq?XYmL3>X1;~lTmT@)? z(7=vUz+nU-J7`_(jUsZ`*FcydZXiR_g^L>I4L@^9jFlCp0#h>K){|xswn%f<;h)rVRkda`t~Te-{3JRYbKrp2n34BLn&WyN~qfd#Q0P)EL`rqzsV4= z1(<0uAHbwac_SzYR>E8f<$|av(elJ(?3MMF;RxNP z1R_Xp;W{RmOvA?ur&EMM@^M8n1u-vmtrMiL&L6a;x?|BQ5Q?SFiG!Wy)XDK(J)EG} zNzeb1{okAO4R>FEib)xi(>CVnneaGTp13>}>0J8cmj_o--&eOU(F<1X90|OxvA5jAY@m?4x~q_;9mn?%&i#Yjv2`q zskY-}H1*~Zr5?zGaFQa z4D*#mY&fi;-bOIch$~s~o12_&vXWQxFg05?sQJ^(lB)tG>SKgMSJkxL!LJjWJe4D( zTV1g~P7sdl-)i*KH_!#&%7Oa#TGWfancs~q{Mn-EUlk$GUc15LIA(1IxRl*1=S3!@ z_|~pd<&fzjARDajo-U6uRwS4&&L9yWOtsT+pVo~BJ~W_0+%vv7QaeRS^tu6yCl2&W zvcLkBA)Mog9A)O#Ibyb3F`I&{>hN@eAn;7#vm)QhxuH+<5vKmO3zasezZy#TkZqmVl9OEUlqK2o)oc z3llp;B>z0KJ@XA`N73{bpCw;7+PHUw&0Mi8c%p7-^faeipVuvana@1xM@UP{)qETq z&z8Ye#EKbutv2n^L}*U#SGQaj*;r5BlW9tgK_=ftrA=9z=oland4qQjDp zZLVKN;g*1l=)Si_uQ;0&EZ`F1;(GpxjASr_oLtW8T~s&x!HiMb zpObcH4^T1;O^?BBg_6%=tV8i4jDQR<($O>@`N9B9>RlCE>qn5e&hh#~x{MH_dXIjx z3iCKPj%KJ8s6H26h)c;?oZx2Te%T~%^YL;SBMM``2oDDMewgKPLCr&6@+dvdlb%I5 z-D&Pen1+B889-whig)G8(9FWmPW!qw^HZGPn^VMOwcA{t2-I)uTJ0Q%S1q5kA%-&g z$~pVWXPMG8)&~s?YGh@EfWvY9{>HrcA0Mfuvf)0>$+<&p|6HH<92;?&)ng6{ifumU zzO=xfXSoqFz;?Yxo8<$aSMz`67v#dJIceOZu4cFXncMJQ9`(CiyK2)WZwh*8E;Dy! z+FCjWW%lS?g=;@t)+1=f*i<`J^jy}hyzn$EeC%Uc6VrF~nDs9M1@k}LTow7N#WT@G zQG&@bxYvBCde(cwIugQ91kD~JdI>pN}%+j#!Dt)rpszVU+P>2^im{x*~5)}(vcBIwkP|NF0hTGT!VxmdYKzM)#nbX zaJ?Wy`k7L7xC6z{&1A$Zi*NYTK%1YGgkuzokjRfBvVhIFD!XN?#*f(--W6F}-j13# zv&!63+eqL!@A|Ut5D`w+)Fbsh393Mj->Pw?dCqaGF)ciAALRW0fpKWqW0Jn}=MARs z10xHTUef}7=U-u34_HuHtY$baE?Uz$X~m=eWDnkIwccD2HhdFAOwKKg?uIW;I#(BW zQ9n3k5DDj~HVvqD$CJ;+0R_QB4y3kT0YDBq6r4w#47}nwxHru zR$HKuuC>U}BD>>`PbME<9WY2-AG}jJ?0qJTh#sQOGS}Ww4*nE#_T)=!>_JTapPN^v zj_b^BI`VU!ap_s^f0UuF_KlOx!E5U~?B}Q$ON7UNU%m?Q=rY7SyehOO;2_rj)jWnlNYzos7I@$pCXVXpXZu`SR~gMp7i81YVe6OQ=GlCncqJ{b z^yN$b3k^i$clCTndyzc86zTypY;*(M=;b99GziOrUU)1wqZumKf#V-SU-p@^@ymRR zvY@J7LR9fwVyL%`8>p0tTDIj1Y=H+=$q%%A)i{ei%*_Bk?eKqC`!a4u>s(EDoruWf zx|m)8otw(AJT&**_19!AcorpSo-|FR%q~7fqL|q>{>LYvvmwbwcbG7hZ!{;=DCt@` zm(*M8?9?0xY2HM^)HqV6j~4CFfT0-05@#@!_w0NsAg80V{QFX)GZ->2>_}o|FaP6N zv6AT7Sf6MwQ?JQi=u)s$bN(Tttr84CyKg-9S#Ebls9YwjBT?*V z8UIhiiyj?Ku!>CbgTl`k@~Rclj-MrJLc6Z*8C1zc2`{+%`CB#)l)Se@*d)Bm;nEJc zN~q*#o`a!)48MUqb{eE$T^N2uUARRXMK(X zZ!vtGPJG0>PPqBH*v{@XgLGWZNGg~2lXwij$(_}C+nCn$l6=OPSjoc{!uCq4k3GZq3J0FVlB*0ZfaZd;Uaf zg5zFrGw(Z1d#m4v6p4Crr^E*~x;efW*quY4;b5#0Yq=p$Ajnj$d@i@yM`W=Lf?P8W z^e!ca{w^3|AZiCxp@Z&^j^!nd8_iujAg%J1mtRxpzITe@q~wc;}a0T&VdCAaO8L0ZbHpN!UomQJcPc^napWaP#bwhh@)^xv) zjqAU%a;FQP_e!(`nDQ--ea;JP=dAg4K4I!&%ZJj^qp7tX4hd{2vYZA;$@{n3P<)OO zF)cmVi7tOP<}GNF+{F^l~I7!f{B5J*cW?^9hlZf&MmIf`Cc$`@~qO zKdLXU`d>|u2t6hr+<_F&A1{jrP_llGji}G}Qst$-$dj7d$+N9L z|Lx~%9_je}Nc02Ly}D6>41i5nXlD!|B}k8MSl%k3h86BbhWrIA#AsZ9V4gY z^S0QfR@{I`Nk&{I^2MIqE05siemWU$=%2SSbei`s60?)ZSMR`F1#vedW!RgtV;1_H z+OD!~h{eLGrOK}C`C+p~=C93-Z!ZlVgDy&yDh)q*opj^mhfJhG^ITUz)1nw9(I8PFU*c0e^=bYVD#;Dyx8Hh01l)i=t=1Yw#l9brR7e&63 z)?Ht2dvrA8T?ay!)SU&y@bx7c#B=MMXRbM!^Bnr*R)=amDSC3T(y&0?<7dyw6-i~e zq|_69;h1f;*3r^x*6xReGI~QbS9mh{z*qgXr$z_qChmcbsZ9i**#{SE3!`}E1uDx( zUZL>9hvOFVCACtmQ4f*B)WY3QLFDgyV!h99Yj1m;56P5unmNUAQ;IbrO(%*;=-V2T zN7%_>j8AToV6~k8*cHj?O5Lf{Oi8W564R3kq#*IL5Inmm(=J>k)=He>nd{e3RjzJ+ z-E#Qmr`jcie0OF(Jl!MWljxtP_|%#c$J=*!W~9og_ROwt=PiEi#9 zbd_;YKVNrYm!)CpC0%;yB_)+^q#Nl*8WfONx{;QYM!G`@=?>`z=@bM7{3*gd%m3L| z-_O39xpQac&b{ZJ6FBlTA-btQ2yd~}@voI*#-c=HWbLbDxqVs9@?x(^MD|>sZf)ME z_C((AtIQVDr>#)Rd4a0i-`|J>9p5m6IZWK9K5)c9=oC$f#Y+swc5^CkOm*B<6~+!t zGT$t8^(;+OonskR+x$16eW6zKa}+>CtFzg;&*BWVn&T-UF(p5Q_#FqVT@B`0c56@i zz3A2(u$519FP5Eo_5z4Om&jdmW#sR$oM%_~A({IsRnc3hWrt4wv)ILvjnLSmoiEsb z)jjrQdpc~*eNaAp#i~5Wv|Q8vCOD0cb`PqV)IbPYWip}h|$8d zdup$qrjqPI^GDAeuj9+K&a3csex5;qt^33IzlkMDW!L&aJ=eiE7$m(jv`>odRVW>W znm#IL#u0f8=HTVBq@JXN?Z@_~%SN#DYA58;LPrXe(E8>^gR?Boym1Tx>SJnU?#la) zdrq-Mb=L_Sl0rWMmdD<7*W0-^wm*cl4NX#BhkIL(XD8hF89S+Qrj~$rE2nKoCHeT< zwgfsCy}7TF{wN9We2F}#>(S|Z{`_9>zqU)LUsW%r@n@cIH^rV~tIDbv48hJUT=a>f zDwHh36}^{#th9jdh&(*N{T)D0YXwI_V$6d)Mm1t=<&-Gw5dlXyNQovQqCY&#%JJF8 z)$RZ%nDBqT%BpIRB+{?`5*>y#p3D35m%-yzuK1@j7#1n!)Rq(;=L3INWqBxZ=2{nYfB16GAxM&cWC;qbXyd_1=doECI z-0P}oJk!?9KIJ}2XN#5SNJB<_h1+#14MYZa&x^gMc05ue?oSTJNYL1P2_>uPfRPv} zvgE-ICAp^xAc@OsYtHXYqWR?>Kjmt3=nB0z4Z(O(CUSf(T9XsPA1cYmg(IvU!pq17 z;5U-SLmxs8xX&ZG@X*dv(Dy(zQh+wB@E@Vmr)++wR399c}oEL`+^J{4V#ll>th{(j;l zxOMgO3(~XnOgHo4%$wL#r;}OqhdhC?a8C?y8PdH8(wQ z-dU4+qfHhC(?zCV8i^ei4^CxLmLOV{2ro=VHy6qlk?h|;UasRoJ(A5-%$a+RqU1Fh zE;s-hd4sT4CMY=-!emXi!(q{jJbDJSs<&FxX;^K#im3xRy3?yvx!h5-LvcBi!#eM# zO7ejSh2Z3*ejW}iTno2&rnF%O$C8(Uh1ee~)HjRNwa4BR^9V@VEZTr5Z>s+Tp`OsJWd zN_>hCgom*FCrvDb^L?;{7r%6LuYLgNu@jx&pDb}b+4khk$xhe4(c*h&P2a2OY0r~& z@^>}sC7Kd6A0stqw3g~QN~;lP6DMq^NC0>F!MAG@h23+HLQ3y0zm&$}qqJJDZ8t8F zYBxjX>O9pl90F}+Lb)9=jMG9<5;E&iE5STZRvw#an%#kX%GpI7aI$KWXTqYMbVpIO zo2PA=woX-($Q+l7N__lVTA}5qfvrh8oz)Q^iss)}#^&a}bofbASKs-k)a-K3W_|EeKeuBK=PpdE3&Y;#KWJajFIvWSq=*9ZCRGUPI%+*tH z#gYr+>YW;To9p--E{SuPP8E)+#7uL2l7>we2uCujDG;|c$)rj}mI|Y})k94+9RyWW z&;cA_^&P{<(|V;KdWwJD76v{08`?M5&grQSIoI!C2Y6MVfp##*ctL%fs=dtf2PV<& zU%ZSw3UyQp|NX2S%tyRH%g7O6t0yzRj_Yu98daCgO@4-fflznE6Yz0X=6^gBR^V!n zJPb+{6f~uA1;(!4SR{!UrVNQ~=5Os*4IKt2D#uBnRY^{x!>H!Be@d-Fs3&5E{m8{Ax6 z3y|WpYbRsx&KRqg01;kS`Ks7OA&E`Z@SC@AofH(-`3us62|hB5&spnoyB4=yd}m_M zM)x!LAv$|QA-%32%FiVGFnK0e*YA3t9|$P{-ee92uv|uUz7S-FRj|9|s|*Q&h&N^y zIY;*-fJ7o2s z{dag!Z2)c`$!Cy8QVioLRJA9ZhcfJ!hJjz<_C!krd`R*i(C7Bb%A7zdsJ1t zP#}p1-|{cy0y@(Fd*A!i>(`6qiP$M5#-`WHtBf99ylig@tqD4I+=3zI6j7|tojwio zpN>a|dW>PMky$Wt>_}<}pw7h-b7?@EItH&i`FdRdA5dntt2Cdiat@$Rznzpp<(it&yrrXvnNxT^MI;htrptjZc3He;U- z;=1M<1tmAXU*aJUxmxP@+wJ_RPaio$ za(5$N_bYDHJv(SNl0H)Y^sl^F-On)hAbIe|Q66b`UdguA9cAw5;f2Y|?CTBR^e5-j zdIUQ!(uJsFDdO1<#NNm)mv^nn{I|(N%zmg;dF*_s9sEPJKc@PllMckqltVl@WAt0u znq|iMelLd8@aFn$i4^pUHEpk@0plU=en`>BZb-(uAd5UZiQaefx@9T{r?wN8w~9@# zZ^Lfdxc5jY)5N4(y2Wt0i-}SIk7M44%iTWq@ZK9UV$Y49Y+rEacfoG#w&KzWTjB7_U#fV=aT&HX&#JdCs@ERJdfxPYZ{Xq$HhtJnq9x}QkA=+BJew~HMcx_oC{(VdI4X4q=nGOc75v9fLp#$ zO_o=-YE0>GwLj<(6X~(8T1}~k@WqeRoq>rI~CD&KZli{ z?2J`}S`d#~@w*muobVX0R=dUAqW#%rJ)dccX+4NjwRYiMt8uza+d6*&JL|dK4%Y>% zxP@x)7kcf|?A!2~{US~tC`<@p3@mvyxlG;AB&4J8P^jZ6Qd zKmxG-(6)zc#qMd+b6dFxLGf4RQ*3NZWL@4QX!x3yQPOU6fw=#h6irT6?pW}Y~#0+ z*XlPu;-@`7MGH-k_^j}Yty(1p#L%cT6S;PyP~`1x3w*-dd3utVE0}uY*Q< z$p@}BdDcQnWFqZ|N7dR|o-N%wfK4TYQxYhOu$CT{FILOAv;l&}%Uvq|$1icfdG>&O z=!@2WhSwRtgVCZ`I7mxp5^4ULnfNxaRj<9s%^h-MUXuGx|0g?>fK}3!V4SRnNAwM; zYthw3pHtCJsLu4^1WiTpwlQIvxsbo!Wl<&51pkuhf-;tPJ~0dMUu2dNMo3`6(?RaG zBw?LU%FLz4pqI4qQ4wQu#4{(Lc7`fj2ygbQ zC@fsoOHoc~T7I;+Wks_}{^XLcP!;#Yb{aK70t{282tYT$L{=l8kVh=u!0*$W)TwY8 z1T**(F3V+>*gER_+vvNL#b)gDgk2f?YfxV5n_|f3Vv;dg+!zQ%0F;t8`HGdFnKN7! znd?QuA1c}Y&x%S;|_P`y%O^$AD-^rhUBu zT|o43=+LjnIP+A|r7h^iA-;Y**Kn4$-i2QNZYgZm78AeV4=pJ_j=ne!0LBFC2pMs7 zFO|>df&QX&S<|0!&?*D)Q?cV{`ker2_8k#Nyz(~#q_9zD9L#6SA2=Or!m>>dHuO=s& zH3_HP{vjaW>7_- zNKv&iDIpL4#L<(FVLC6tMpc)Am=+7$IuW{H2n>SGXT}WfsYhTw)*^k^z{K*4yqK9- za8I(AGTZ*NCnOC^EacbiO}QnpYTWY%6FPpS2kZ|w8aftlEZ+K;DhDrdp@Q%}u3JU9 zqbnV%Wp$x=ML6#anCM`1`gTZ+yHDE!RNo6l3SiQqk%LU5HaKA~v9J+1EFfC`UPP9M zwO4Nf8JkQ40B0y%5SUFk$0s^GxvT0;f+=qqjvY=(Pl5@wEK>PW?g5EZVq^`KRHVoT zTsC>yL^aD=3{N zp{Zb1>NplkJR8C+7#I+XWMWak9opqVf+{lrs>xfQo>tH!97`?qOfy}{v1EkWN{6WQ z&Z~_4AK!z6>i@ugvnJn)Udm%K?@(ua46v7`WAfdbp)I8o`#z z;$hIkGcI(z2$`My?~tHOOX=OEC2~%lUF|f7DVbSrisl_F29wPbRz@kU)(oWp*1w5G zMRyCr^YN>5klf1y+lw4KWXLB;JN*KOw@zP=iwt4$&f*mnXCEDx8_Z{42JQTZ3`>6c z27Xla;Gj3ivv2l#DJeqpk}u@JG|*zoViR2&MeDn0mEo?Nw8uEVO)5Ir?Uxa|7shye z@0^L7q3t|BtFMWrsg{)rm>~jNVpXjOh;b$5sVt1YS0yb@mJJk$AdN$Mfc4%riD8IU z&ci%b<9&l(j&uJ07A*kqD%eo<1-mH?7Q6ZY`@ z7wp!9PbcO|sl#SGAimIlTBT8#BHoLNUjq-MNcL14&jclJI|CD5U9r5YCv9A&KkR%f zwNTZHiRQycyq8H3%HjjHu~UBp=@ zmKaIJ2E#wK>Sc$PWVuE$8PZsJ19d~}7rJ?IVE-D09N8YV5k@111(F=D?1~6QLJ)}d zNv^UYW_@m4TxwK(o(Bv^EA2|v4k+8bpkKF|9%o;vAbya{Lpkf-mp-#!UPG+J*A0;0 zX|r9-D*{z9Wl$mEOcmf59w&d$P~gw`17EYsrb-H0emM*d{@8QTnu;^6>6dc9X7GsR z7~7xVD#$igf@2z`-~Vk#{V@BnHYOz@nD|7Fe)a;*6X-YiLrM~Dp9$jqYA&D758{C5 zT$*pIUgL4|!2$B)H#jKVh)HP$8XQpW9xg;MHSLM8EHl>=N_KJpejE^_e&DmBnApIP z!(`Nple}XOVmuV#ZE(q8ocJ`OuRH=y_=HA8QDcUcl0<~kU=~$TL3?t8E_z@lj_WX{ohyp_!J$;p!E(gOLL{>X!fYYEFv!8M%?x?#oJthT;I} zKoRgNYsR5%lZk92Dz4!gg1VsXU{c|32R+XD8(LpUtO{E7?Bk~np5sWKO4tIvjEeL; zv^2plw;#eyQRzb5%d3s zJ+%b}W4!Px{IDRT^QeCXXrL3Z*yIQ~q!pckFNY=n=9(6(LSl6r*#)##S)W0r!Qr?- zLK!VBrq(roJvtb05{H1`6)C}UXy^n<+%{YqCQkxY=ceJnpw}va4g=p|!(fpb$}#|) zD4Pm%tA-brj@(kpTK-OxD&CrAlWjP`UpAH<8@Q(yqQg8^m!Oa4~=&Ozak?bKj`&e@XZk@ z4`KEY@W90v6r?;iIuIDE#D9bJ?6_(8_BOXj&o(8)pm10TR2rX65!+}Sy)Y7S;KW^L zdcJn@)gdH9g9r0^kmsmp^FPgy%Xgv}VZ9`)5`Bz}1iYtSavsCRCp!@@exam>x19e3 z*QHT0M$rt#KK*?YA{UKTuS~+_S$W($3z8C5Xk8&qvE)Br>b#FFw>>vqU04DO?$>$` zNCm|TqWrA%YOOFdKgM~^zL1|nplJlOM6dxm=G<(YNBcgy|heQ#PfB{tq5@1=; zr!BdFOV{rKGGf$%I#EvqTJ{ao)nq}y{mFT_q*nHHa8C)P80UZGsX>KOQBdgWXA)+; zvdP^eL?z2i<%mL3b^`4rVUJ{8jq! z$%1G95o#$556Qc>64X;SZh7(RLJhA-&rPkB`9m}f(kp@|K$zBePVw97R>*}HX6yT- zZy11ZtmOV9hHv+ebDxtGJVfhBP0&02M^uo7vUDG{;K%;weieoK2^bB%(-U0s_|;|i zrWT3a?O^?q!K@YpV-T{?8}I$mTk*H7urCGKcL>1`4`V|!h`p4VP@(KVnuuJ>|{<8q@{8{0S=D6Znn6C^~wUN7LxRQ^4lvB?U5H`LJ3$AaK~*R z05tdkQH++hC~Ux7trmD+#Nx6s;iN`HresQ)@G z1y?~|mrCADK7B<2bhr22YLleq#7I=kO9R_if;$xeEwfsD9L@$ZG1lI~IlIL)ir1bk zoS2+8nAz4akc|rAsnU&D3Yx`a5UJ)PO^(x~)&cif)4;LBWJ#_V91NAss0vW6t&`2* z&Fs4GLC_KgzdX9-{`b5_cw3A8pD$iAzLh|6b!^-y+?BH7c1>tdW90i`&KKjOvSonh9n3}xU17eL^LB z9m2sHrU(wlI|Zu@Qz;u4jWWPCY3&(nR3IlQ1G+(S!EqXfV$Zq)h0ktZ!By9UhRL{B z-n7-7lkNXT%heLM@!!0?DdzcT`rI)pR5hGnEtNW!oIi{0!87I`N_Nr}PbrD8Nj^K| zY!q@`8<5?{_f5&d85ysEA~25VQ2ANgYxB~!(#x*)JL0zj9SgYURc(0;z=s6ah;{^1 zMSZZoC5y**YKX%|8(Js40`&P`E`@9TFwy{>OEGWqV@MRIANjfaJyv)LZ--YJ5_3rx z>OMnMX2TOE%l)4>t4BQNFQ80lnftW?6>Uz`N$qEM+Q3bVW8Qtx8bY*1V>F}ZjKTG7 zox(Uu(jzcfg)Apg^@yWj44u{Hus716q*9>~ARxeT1u@Uar-JP-eJ9eY%N>y3^IKXE z>Ia^bVnbmpaYus6Ur~QJ$MiPMCJu?6=W4W*IS4M)GB#&OrUr{t|F>SEXn$@Si`;j{ z`TTt5a;j~N3nNr$Rik+ep3sjwt*>>_3xQh7 z3Ho!sH0LH!k|3p54c&TeSvhoQq(uXx$aSF>BI)49DmdV?vFXgnfn;V%Yk@Bz+a3h;o52IrR3KH%UW zkU$~=AYm?(STh4VS~fQnIcX*|Jg5wcB}vdCKeAJI`jkoVO?Qfb{w?Kq0(oXBp<7^F zk)%lY!^JaRV3PnW!0ublJX^BA5wI$PnWOc!hi+DSc{0F9%Y_+{_xIJav#*DHay6%w zLbkGu2^jpL;XrJ9pfSfR)FU>^BLz88+QPa8UKkF8<(MaZl!zzVu&R+|jLoa-f0J1)Uh%XTq<8T*B{H*PK}keCfcP8K?GN zsdY+oU-&IPYjFEYa80?ua*NJcp*gs$2`B@>Ta7sGZ}&(mz4!n+3JiG0ub#N^b0vNq z|6MWIWMN`V@It?bHgUq~+kcx<%APBkcF+Vh{)_?7PT!qR!37-h*8Khq_(_SbF~BZ0!(G7_+jl)IOh1+h1SNERIQ`PJLOJx=+uU!Ku|I8x zzO3P)B_ouim`6utpiX^{H=H9!l^3uZj8Vi+s+j55(p!?I>dI;&e;r`zz@bThqTCC! zdVk#>kaD>4^{2a<`(eY%3L#k37tQTR&l#fpHM%%tRmy zNHs*=>U{g#nhGNjtD`wKa4yofN`k*?{aLLw-YMu@8&LIqqEAT#&w~RlCxACdRah74 zC>MY~V~#~f?xU@W@fEGR?Ks%SXUhBK#l)-=?*h3rP(u(S0$I3+8LAFZ6mZls0$^Yl z&iOu5BkwP^VJ>_JSQakm-QLv&1AtggRmMZZSeTq1Dg>NZ2*Ca*#-d*pr|3yXUvG-l z4qUyzR}c$B2TN7nvdt$-p%DvHolQt!b!LujfR3n_vBBdYS8aj?`jo%VY-(tphhm~F zv=L8btq!Ld2jb^f4b0o_G^i|>9U)h#f_cSN)WBw?4~9T7-DUq7>;w6ZGnq*TGyK#{DeVg2GX@NwOH z`O?sF!aTlf=bhW8a@@bsj^VL2hrB314(Fo_juS@G*OICg zDPN95CVvh^z9kS-DpU8o=8Mq1Ty-R*<=(6;E@=NzS*&WRIT>}V2= zbdAoR8CfcJog$V@XmyN!B#epd^wW+~^|ZenPQj{cC!J5z&7nnJm|a(K`*Oi*>k+;> zF*lmiG%-tiwECBzU`UVYRaVsO>yRMvfW*v0*(UvOZ!7&LkFGM1RB!K~?tWpXdHhzX z8q@_VG}L0EZ=P|wDK4Q5y6`2BUh=vP1ws@;lkc7b$P zFh+#(^(+<=aCBEzYRui&m?a8&oY#Ty9@-DbBBz)M-R)<5Dn&*+jI`|8*T3gz6SPJl!T7edoNxWVoS0L~EB_#o!#(h>7nFFh*G=i>LjnKVWBf4X=p;@`n&4eR84bi`01n$Jt%B2$qpSxG{< z?=xkB7qoh4{x=Owur11^g49Ad`0ZOMBjl+7NJOvylDl-#ShNgAB$epzC`&jeCMc6+ zux*7DD;ny^i4ElXj3#vwsaxL8$brM`knp(uYHwa$PoyaQ4#LAj%Q6|Cd%VVB=9FAg zlE*n{po~%o!zuSO42$I%^CwT*1z-mw_QOZHAVLiWNz|0`h)Kw zRj8xY$EHm-&#rSbB5t$pk@Txrn>;wTDd|o1f6wtf29}ByVSq~g=d6@ZUEE$ixVN#@ zy8|dGBGSn@Tcd(h5u{8VvsY|P| z4Lh{!O znpA@X#~TmP!|{t>io2eckzzTpD}Rh4spl{ruk6$B7et*w_2Jbzumk3Udo;GT}zws0-(;Z&!5Nly zl;L-^0t!i<<;NKH`hdXEG^_z*%R=3!hzj+7JbTe0eQT7q3E#k>{P(qJ9)k~CGw5@kG%y0iWrK1l$zlrH?p zZ;#4fw`=;STCM8r*>Rz5nT5;M5QQVc8g332D{Mr6LzKQ0$FpXi|^LkYYM+HYALltR0U*Eb- zj?ZaO&tR%TIyBX+KyVS3Ldx$0yKW1-W@+RlW6G~vgsU00RJlrB9ZKSF^ne`x&3!RG z9X8KCoD1x!JBwQfgnR(@P5x?vzY*l!YhX$vy zK?G)&hh^H2cgndih{zAy#1HVxOi4ga4hIk6jnLjUCKy&8mL~wn!%5#^d9nqA-Yc?+ zvM?}`$;#u!xe!@}G4|Ftk%jGI3}MxiL=`*7g8+Qm5Ds6cIBAyZEDp9-gYphCHOmMu zm<&&dT^7+W7BjqJ9Z)i;$E#y+d8qZuku@q1V$Dc!|%0P@7wXvJO0cz ztlR`IIf|1UQynqWOv?CD%QpW-7Ws2*6|45{pKo_-ZgP7GJ7uw0p$&k`4Om|!fh}SJ z92JfooBj94dpUk5^uEX%+&AQ=v}Dg+0j$LiUY+p=(fslVI!K{SPn%B;+Y+q`z>&87 z%t$Kx*ZetTeVy?6cP4O1>D=A7JJbd)h)2OX%<`!J<@5vUhU)E_T!u3r*d!0NgfiK@ z2!2w()wrnstX<$vqB(#1&F?p_n?CdWQJ84EOA0U;NqLtwwyflUes(30av z4gpFm5m1}m#z=GwLxHKQ1A&fOimH~E9jk!;AmBKDiiDV13t?Jh{3IYKEq~TzFDxPv z0Zm5tl3Oa=GGRhLA+4lU5)|3OwX?b5OgMlj@B~#Bj*ex2Q7&ba4g~;n7!#PK%$XlW zN`lk-Xy;w4=GRU~x!Zt)CWQ3HAb@E`po9XQGRKvNAyeEGk;gfrlxRh24BS~UTuVT& zsNzcmOsfwj0Kp@rDB{!(s#9Hdq0Duz^Lmn*i~!%UG1J?t-kMG5F7Z-fXKk>BrS>1= z02CV3apfk6MP?nOqQ*bO`JBetp#6O$b|E=`6dSGTi24)nLJ!k5>RiS?h26yCJc7z_l z^2#dNJ?edN-oh~jA&9W>Be!FrP3B3p?l2cAKDK;Vm<(ni6vU2zs8?iQF)D>>i#fsQ ziI5QEXq9qaEKM(Y_uAT&bje^0J zS8N10P*G(|Z5;+OtZ%l@Nx}v(kTB?Q7^7v${_K+YsGL$)@Ae$bwsA|>h2T$SbpXKJ zkn#&@j^g4;X;jq?>hA<9B(f@5>Qp;2BD&}2rwR1}PZ*~b0XC`Rf0Cl0WFQ`9;T}fe zt}_z%J7u9K_A7ElN?fR;mz8DXOvH|s7(b*J7FuX~IYTgj?hO|ux8on>&Wf;v;Av%v zs@ooTt}~PyaAfu>;&4XnTh5S#g1~xDpm~zW{jbenf&NiQf;yBK4xoaHk`~s8EdUVGNay!+syU|v6@Ehg7(l3GU#dVMFq}=rWgZTN^s(aA!3hfX z$ijdLmY=v^ z5Ry~klXHtU{?c_5WS#pRCWkp-Sp@PIRMMlYpPhUsh<)$FO}Cd#-%TPjpEvxns#@8ubV4Wd`zEp2-4khWqV?e)(L<^Jo7lxF}JPF9gL; z`{JEGTk*vc3?f{JXo*~>gWwAW>e!!(@l(V!MldPoW(hzOdr+oRZJzX(pTO` z7}!V+U`l62l*JnJT0Wn$X&3AF=v-w`GLog%i~Goa1&yIovF@h3>ImooP1+p`lpPQO`%&`)bT56zX?Y)1_j+E|b@ z*6R8j&ON+DC5B+Ohhn2?+`pkj9-jTChk88x4juw9;ys3Ej2%?3^bC zOE?W{kCeQWa+j1`_-kgRNp)psM3v*#<|Z}|aRN*c$qcr{95~o6@}}$%ZnlSBiMj*3 zCg`uhUGaqi7yeqoAkS5f-RE`s~Bu&ooHs3>fE z0@7Av7fkuzXf27X!71GY$^gT>8JNM}30MHN{_P%n)Sk<{S@&}j>uf2g4f1|wz_ZKI zbEIj+oNZUurnS|}nfUMLpImgg5sRO>v-3hLZp1#g2jcY6j;;UvZ;^%fp{d7)uk~N; z*MqUGTMG@&@=OPvj3(t%Z5OZ

%fOaPbyTQv%HY2-7b)qPG}C#WoggynqK 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 z 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 Y?*G>deNH!g09?VM0wMu`|3{Gj2W%$_b^rhX literal 0 HcmV?d00001 diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5366f848b09..295bc48cf53 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -74,3 +74,14 @@ add_test(NAME ${TEST_TARGET} -m ${PROJECT_SOURCE_DIR}/models/for-tests-ggml-large.bin -f ${PROJECT_SOURCE_DIR}/samples/jfk.wav) set_tests_properties(${TEST_TARGET} PROPERTIES LABELS "large") + +if (WHISPER_FFMPEG) + set(TEST_TARGET test-main-tiny-mp3) + # Check with reviewers: any way to check the output transcription via ctest (diff, ...)? + add_test(NAME ${TEST_TARGET} + COMMAND $ + -m ${PROJECT_SOURCE_DIR}/models/for-tests-ggml-tiny.en.bin + -f ${PROJECT_SOURCE_DIR}/samples/jfk.mp3) + set_tests_properties(${TEST_TARGET} PROPERTIES LABELS "tiny;mp3") +endif() +