<pre style='margin:0'>
Herby Gillot (herbygillot) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/9e321c3ac39782fd6c365d5373b41d9738e1b670">https://github.com/macports/macports-ports/commit/9e321c3ac39782fd6c365d5373b41d9738e1b670</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 9e321c3ac39 whisper: add port (whisper.cpp)
</span>9e321c3ac39 is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 9e321c3ac39782fd6c365d5373b41d9738e1b670
</span>Author: Nate Ijams <nate@ijams.me>
AuthorDate: Sat Aug 10 13:02:14 2024 -0500
<span style='display:block; white-space:pre;color:#404040;'> whisper: add port (whisper.cpp)
</span>---
audio/whisper/Portfile | 120 ++++++++++++++++++++++++++++
audio/whisper/files/add-metal-path.diff | 14 ++++
audio/whisper/files/ggml-hard-coded.diff | 10 +++
audio/whisper/files/whisper-add-models.diff | 64 +++++++++++++++
4 files changed, 208 insertions(+)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/audio/whisper/Portfile b/audio/whisper/Portfile
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..c18ed1aed71
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/audio/whisper/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,120 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#-*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortSystem 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup github 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+PortGroup makefile 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+name whisper
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+categories audio
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup ggerganov whisper.cpp 1.6.2 v
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.tarball_from archive
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+license MIT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+maintainers {ijams.me:nate @exprez135} \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ openmaintainer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+description Port of OpenAI's Whisper model in C/C++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+long_description High-performance inference of OpenAI's Whisper automatic speech recognition \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (ASR) model
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+notes "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Install this port's variants to include models, or download
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+your own and use the built-in `-m` feature.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Remember that whisper.cpp only functions on 16-bit WAV
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+files. You can use `ffmpeg -i input.mp3 -ar 16000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+output.wav` to convert the file first.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums whisper.cpp-${version}.tar.gz \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ rmd160 26b0b29e46c990b13c9d10d95c11aa429fc8d56d \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 da7988072022acc3cfa61b370b3c51baad017f1900c3dc4e68cb276499f66894 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 5088298
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+build.target main
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+makefile.has_destdir no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles whisper-add-models.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ggml-hard-coded.diff \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ add-metal-path.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+post-patch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ reinplace "s|__PREFIX__|${prefix}|" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ whisper.cpp \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ggml-metal.metal \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ggml-metal.m
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+post-build {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ move ${worksrcpath}/main ${worksrcpath}/whisper
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+destroot {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall -d ${destroot}${prefix}/bin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall -m 755 ${worksrcpath}/whisper ${destroot}${prefix}/bin/whisper
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+post-destroot {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall -d ${destroot}${prefix}/share/whisper/ggml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall ${worksrcpath}/ggml-metal.metal ${destroot}${prefix}/share/whisper/ggml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall ${worksrcpath}/ggml-common.h ${destroot}${prefix}/share/whisper/ggml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Define model variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant tiny description {Install tiny model} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ distfiles-append ggml-tiny.bin:tiny
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ master_sites-append https://huggingface.co/ggerganov/whisper.cpp/resolve/main/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ checksums-append ggml-tiny.bin \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 be07e048e1e599ad46341c8d2a135645097a538221678b7acdd1b1919c6e1b21 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 77691713
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ post-destroot {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall -d ${destroot}${prefix}/share/whisper/models
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall ${distpath}/ggml-tiny.bin ${destroot}${prefix}/share/whisper/models/tiny.bin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant base description {Install base model} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ distfiles-append ggml-base.bin:base
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ master_sites-append https://huggingface.co/ggerganov/whisper.cpp/resolve/main/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ checksums-append ggml-base.bin \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 60ed5bc3dd14eea856493d334349b405782ddcaf0028d4b5df4088345fba2efe \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 147951465
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ post-destroot {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall -d ${destroot}${prefix}/share/whisper/models
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall ${distpath}/ggml-base.bin ${destroot}${prefix}/share/whisper/models/base.bin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant small description {Install small model} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ distfiles-append ggml-small.bin:small
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ master_sites-append https://huggingface.co/ggerganov/whisper.cpp/resolve/main/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ checksums-append ggml-small.bin \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 1be3a9b2063867b937e64e2ec7483364a79917e157fa98c5d94b5c1fffea987b \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 487601967
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ post-destroot {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall -d ${destroot}${prefix}/share/whisper/models
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall ${distpath}/ggml-small.bin ${destroot}${prefix}/share/whisper/models/small.bin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant medium description {Install medium model} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ distfiles-append ggml-medium.bin:medium
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ master_sites-append https://huggingface.co/ggerganov/whisper.cpp/resolve/main/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ checksums-append ggml-medium.bin \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 6c14d5adee5f86394037b4e4e8b59f1673b6cee10e3cf0b11bbdbee79c156208 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 1533763059
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ post-destroot {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall -d ${destroot}${prefix}/share/whisper/models
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall ${distpath}/ggml-medium.bin ${destroot}${prefix}/share/whisper/models/medium.bin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variant large description {Install large model} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ distfiles-append ggml-large-v3.bin:large
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ master_sites-append https://huggingface.co/ggerganov/whisper.cpp/resolve/main/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ checksums-append ggml-large.bin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sha256 64d182b440b98d5203c4f9bd541544d84c605196c4f7b845dfa11fb23594d1e2 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ size 3095033483
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ post-destroot {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall -d ${destroot}${prefix}/share/whisper/models
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xinstall ${distpath}/ggml-large-v3.bin ${destroot}${prefix}/share/whisper/models/large.bin
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/audio/whisper/files/add-metal-path.diff b/audio/whisper/files/add-metal-path.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..cda58a7f585
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/audio/whisper/files/add-metal-path.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,14 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ggml-metal.m 2024-05-27 02:35:09
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ CHANGED-ggml-metal.m 2024-08-09 10:44:38
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -360,7 +360,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (path_resource) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ path_source = [path_resource stringByAppendingPathComponent:@"ggml-metal.metal"];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- path_source = [bundle pathForResource:@"ggml-metal" ofType:@"metal"];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ path_resource = @"__PREFIX__/share/whisper/ggml";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ GGML_METAL_LOG_INFO("%s: GGML_METAL_PATH_RESOURCES = %s\n", __func__, path_resource ? [path_resource UTF8String] : "nil");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ path_source = [path_resource stringByAppendingPathComponent:@"ggml-metal.metal"];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* path_source = [bundle pathForResource:@"ggml-metal" ofType:@"metal"];*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (path_source == nil) {
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/audio/whisper/files/ggml-hard-coded.diff b/audio/whisper/files/ggml-hard-coded.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..ef74cda325e
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/audio/whisper/files/ggml-hard-coded.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- ggml-metal.metal 2024-05-27 02:35:09
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ CHANGED-ggml-metal.metal 2024-08-09 10:44:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,6 +1,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define GGML_COMMON_DECL_METAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define GGML_COMMON_IMPL_METAL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#include "ggml-common.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "__PREFIX__/share/whisper/ggml/ggml-common.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <metal_stdlib>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/audio/whisper/files/whisper-add-models.diff b/audio/whisper/files/whisper-add-models.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..c56c47bd6df
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/audio/whisper/files/whisper-add-models.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,64 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- whisper.cpp 2024-07-31 09:14:56
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ CHANGED.cpp 2024-08-09 10:45:42
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -53,6 +53,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <random>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <functional>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <codecvt>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <dirent.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(_MSC_VER)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #pragma warning(disable: 4244 4267) // possible loss of data
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3621,17 +3623,50 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct whisper_context * whisper_init_from_file_with_params_no_state(const char * path_model, struct whisper_context_params params) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ WHISPER_LOG_INFO("%s: loading model from '%s'\n", __func__, path_model);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef _MSC_VER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- // Convert UTF-8 path to wide string (UTF-16) for Windows, resolving character encoding issues.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ std::wstring path_model_wide = converter.from_bytes(path_model);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ auto fin = std::ifstream(path_model_wide, std::ios::binary);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ auto fin = std::ifstream(path_model, std::ios::binary);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (!fin) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ WHISPER_LOG_ERROR("%s: failed to open '%s'\n", __func__, path_model);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const std::string fallback_dir = "__PREFIX__/share/whisper/models";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ std::string fallback_path;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DIR *dir = opendir(fallback_dir.c_str());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (dir) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct dirent *entry;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ while ((entry = readdir(dir)) != nullptr) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ std::string filename = entry->d_name;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (filename.size() > 4 && filename.substr(filename.size() - 4) == ".bin") {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fallback_path = fallback_dir + "/" + filename;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ closedir(dir);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (fallback_path.empty()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ WHISPER_LOG_ERROR("%s: no .bin files found in fallback directory '%s'\n", __func__, fallback_dir.c_str());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef _MSC_VER
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ std::wstring fallback_path_wide = converter.from_bytes(fallback_path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fin.open(fallback_path_wide, std::ios::binary);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fin.open(fallback_path, std::ios::binary);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!fin) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ WHISPER_LOG_ERROR("%s: failed to open fallback file '%s'\n", __func__, fallback_path.c_str());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ whisper_model_loader loader = {};
</span></pre><pre style='margin:0'>
</pre>