<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Whisper on kenji.blog</title><link>http://kenji.blog/ru/tags/whisper/</link><description>Recent content in Whisper on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ru</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 04:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ru/tags/whisper/index.xml" rel="self" type="application/rss+xml"/><item><title>Как интегрировать ИИ для распознавания речи (Whisper) в C++ проект</title><link>http://kenji.blog/ru/p/whisper-cpp-integration-guide/</link><pubDate>Fri, 11 Sep 2026 04:00:00 +0900</pubDate><guid>http://kenji.blog/ru/p/whisper-cpp-integration-guide/</guid><description>&lt;img src="http://kenji.blog/p/whisper-cpp-integration-guide/img/eyecatch.jpg" alt="Featured image of post Как интегрировать ИИ для распознавания речи (Whisper) в C++ проект" />&lt;h2 id="1-введение-почему-c-для-распознавания-речи">1. Введение: Почему C++ для распознавания речи?
&lt;/h2>&lt;p>Высокоточная модель распознавания речи &amp;ldquo;Whisper&amp;rdquo;, разработанная OpenAI, используется в различных приложениях с момента ее публикации в открытом доступе. Хотя обычно она используется в среде Python (на базе PyTorch), при интеграции в &lt;strong>граничные устройства (смартфоны, устройства IoT, встроенные системы)&lt;/strong> или &lt;strong>нативные C++ приложения, требующие высокой производительности в реальном времени&lt;/strong> (игровые движки, программное обеспечение DAW, робототехника и т.д.), зависимость от интерпретатора Python становится серьезным узким местом для производительности.&lt;/p>
&lt;p>Здесь на помощь приходит &lt;strong>&lt;a class="link" href="https://github.com/ggerganov/whisper.cpp" target="_blank" rel="noopener"
>whisper.cpp&lt;/a>&lt;/strong>, разработанный Георгием Гергановым (Georgi Gerganov). Эта библиотека основана на &lt;code>ggml&lt;/code>, библиотеке тензорных вычислений для машинного обучения, и минимизирует зависимости, реализуя вывод Whisper исключительно на C/C++.&lt;/p>
&lt;p>В этой статье мы подробно расскажем, как использовать &lt;code>whisper.cpp&lt;/code> для интеграции первоклассных функций распознавания речи в ваши собственные проекты на C++, начиная от основ обработки звуковых сигналов, детального использования API, управления памятью, оптимизации многопоточности и заканчивая шаблонами реализации обработки в реальном времени.&lt;/p>
&lt;hr>
&lt;h2 id="2-обработка-звукового-сигнала-и-требования-к-входу-whisper">2. Обработка звукового сигнала и требования к входу Whisper
&lt;/h2>&lt;p>Чтобы ИИ мог понимать речь, необходимо преобразовать &amp;ldquo;звук&amp;rdquo;, являющийся аналоговым сигналом, в цифровые данные и привести к формату (тензору), который может обрабатывать модель ИИ. Требования к аудиоформату у Whisper очень строгие.&lt;/p>
&lt;h3 id="21-аудиоформат-требуемый-whisper">2.1 Аудиоформат, требуемый Whisper
&lt;/h3>&lt;p>Модель Whisper принимает на вход аудиоданные со следующими характеристиками:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Частота дискретизации (Sample Rate)&lt;/strong>: 16 000 Гц (16 кГц)&lt;/li>
&lt;li>&lt;strong>Количество каналов (Channels)&lt;/strong>: 1 (моно)&lt;/li>
&lt;li>&lt;strong>Тип данных (Data Type)&lt;/strong>: 32-битное число с плавающей запятой (&lt;code>float&lt;/code> в C/C++)&lt;/li>
&lt;li>&lt;strong>Нормализация (Normalization)&lt;/strong>: Значения, масштабированные в диапазоне $[-1.0, 1.0]$&lt;/li>
&lt;/ul>
&lt;p>Например, если в качестве ввода используется аудиофайл качества CD (44,1 кГц, стерео, 16-битный PCM), необходимо предварительно выполнить понижение частоты дискретизации (downsampling), сведение каналов (mixdown) и преобразование формата.&lt;/p>
&lt;p>Формула расчета скорости передачи данных выглядит следующим образом:&lt;/p>
$$ \text{Data Rate (bytes/sec)} = \text{Sample Rate} \times \text{Channels} \times \frac{\text{Bit Depth}}{8} $$
&lt;p>Размер данных за 1 секунду при требованиях Whisper (16 кГц, 1 канал, 32-bit Float) составляет:&lt;/p>
$$ 16000 \times 1 \times \frac{32}{8} = 64,000 \text{ bytes/sec (64 KB/s)} $$
&lt;p>Поскольку это очень мало, буферизация вполне возможна даже на граничных устройствах с ограниченной пропускной способностью памяти.&lt;/p>
&lt;h3 id="22-математика-преобразования-в-мел-спектрограмму-mel-spectrogram">2.2 Математика преобразования в мел-спектрограмму (Mel-Spectrogram)
&lt;/h3>&lt;p>Внутри Whisper не обрабатывает напрямую одномерные данные звуковой волны (Raw Waveform). Перед подачей в модель Transformer они преобразуются в &lt;strong>Мел-спектрограмму (Mel-Spectrogram)&lt;/strong>, частотное представление, близкое к характеристикам человеческого слуха. &lt;code>whisper.cpp&lt;/code> включает этот процесс преобразования в свою реализацию на C++, но понимание механизма полезно для противодействия шуму и оптимизации предварительной обработки.&lt;/p>
&lt;p>Формула аппроксимации для перевода обычной частоты $f$ (Гц) в мел-шкалу $m$ выглядит следующим образом:&lt;/p>
$$ m = 2595 \log_{10} \left( 1 + \frac{f}{700} \right) $$
&lt;p>И наоборот, обратное преобразование из мел-шкалы в частоту:&lt;/p>
$$ f = 700 \left( 10^{\frac{m}{2595}} - 1 \right) $$
&lt;p>Кроме того, звуковая волна преобразуется во временно-частотную область с помощью &lt;strong>кратковременного преобразования Фурье (STFT: Short-Time Fourier Transform)&lt;/strong>. Дискретная форма STFT с использованием оконной функции $w(n)$ выражается следующим образом:&lt;/p>
$$ X(m, k) = \sum_{n=0}^{N-1} x(n + mH) w(n) e^{-j \frac{2\pi}{N} k n} $$
&lt;p>
&lt;em>(Где $N$ — размер окна FFT, $H$ — размер шага (hop size), $w(n)$ — оконная функция, такая как окно Ханна (Hann window))&lt;/em>&lt;/p>
&lt;p>В модели Whisper обычно используется размер окна $N = 400$ (25 мс), шаг $H = 160$ (10 мс) и 80-мерный банк мел-фильтров. Это извлечение признаков выполняется автоматически (и быстро с использованием SIMD-инструкций) при вызове &lt;code>whisper_full()&lt;/code> внутри &lt;code>whisper.cpp&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="3-архитектура-и-проектирование-конвейера">3. Архитектура и проектирование конвейера
&lt;/h2>&lt;p>Давайте спроектируем конвейер обработки звука в приложении C++. Это поток, начинающийся с ввода файла или микрофона, проходящий через предварительную обработку, вывод через &lt;code>whisper.cpp&lt;/code> и заканчивающийся выводом текста.&lt;/p>
&lt;div class="mermaid">graph TD
A["Источник звука (Микрофон/Файл)"] -->|Сырые байты, например 48кГц Стерео| B["Аудио Декодер и Ресемплер (FFmpeg/miniaudio)"]
B -->|16кГц Моно 32-bit Float| C["Кольцевой буфер / Массив памяти"]
C -->|Передача PCM данных| D["Ядро whisper.cpp (ggml)"]
D --> E["Извлечение Мел-спектрограммы"]
E --> F["Кодер-Декодер Transformer"]
F --> G["Генерация текстовых токенов"]
G --> H["Текстовый вывод (UTF-8 Строка)"]&lt;/div>
&lt;p>Ответственность приложения — это участок от &lt;strong>A до C на диаграмме выше (декодирование аудио и ресемплинг)&lt;/strong>. Поскольку сам &lt;code>whisper.cpp&lt;/code> не включает декодер аудиофайлов, лучшей практикой является использование в комбинации библиотек, таких как FFmpeg или &lt;code>miniaudio&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="4-сборка-и-внедрение-whispercpp">4. Сборка и внедрение whisper.cpp
&lt;/h2>&lt;p>Вот шаги по внедрению &lt;code>whisper.cpp&lt;/code> в ваш проект. Использование CMake является наиболее универсальным подходом.&lt;/p>
&lt;h3 id="настройка-cmakeliststxt">Настройка CMakeLists.txt
&lt;/h3>&lt;p>&lt;code>whisper.cpp&lt;/code> можно включить в проект как исходный код или добавить как подмодуль и скомпоновать.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmake" data-lang="cmake">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cmake_minimum_required&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">VERSION&lt;/span> &lt;span class="s">3.14&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">project&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">WhisperApp&lt;/span> &lt;span class="s">C&lt;/span> &lt;span class="s">CXX&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">CMAKE_CXX_STANDARD&lt;/span> &lt;span class="s">17&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">CMAKE_CXX_STANDARD_REQUIRED&lt;/span> &lt;span class="s">ON&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># Включение расширенных инструкций процессора (AVX, F16C и т.д.)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># В macOS автоматически включается фреймворк NEON/Accelerate
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&lt;/span>&lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">WHISPER_SUPPORT_SDL2&lt;/span> &lt;span class="s">OFF&lt;/span> &lt;span class="s">CACHE&lt;/span> &lt;span class="s">BOOL&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span> &lt;span class="s">FORCE&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">add_subdirectory&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">whisper.cpp&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">add_executable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">whisper_app&lt;/span> &lt;span class="s">main.cpp&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">target_link_libraries&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">whisper_app&lt;/span> &lt;span class="s">PRIVATE&lt;/span> &lt;span class="s">whisper&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>С помощью этих настроек будет собран высокооптимизированный бэкенд &lt;code>ggml&lt;/code> из &lt;code>whisper.cpp&lt;/code> и статически скомпонован с вашим приложением.&lt;/p>
&lt;hr>
&lt;h2 id="5-подробности-c-api-и-шаги-реализации">5. Подробности C++ API и шаги реализации
&lt;/h2>&lt;p>Теперь давайте разберем, как использовать API, рассматривая реальный C++ код.&lt;/p>
&lt;h3 id="51-инициализация-контекста-и-загрузка-модели">5.1 Инициализация контекста и загрузка модели
&lt;/h3>&lt;p>В &lt;code>whisper.cpp&lt;/code> все состояния и распределение памяти управляются структурой &lt;code>whisper_context&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;whisper.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;iostream&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;vector&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 1. Инициализация параметров
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="nc">whisper_context_params&lt;/span> &lt;span class="n">cparams&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">whisper_context_default_params&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cparams&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">use_gpu&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">true&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Использовать аппаратное ускорение GPU (CuBLAS/Metal), если доступно
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 2. Загрузка модели (бинарная модель в формате ggml)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span> &lt;span class="n">model_path&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;models/ggml-base.bin&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">struct&lt;/span> &lt;span class="nc">whisper_context&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">ctx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">whisper_init_from_file_with_params&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model_path&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">c_str&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">cparams&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="k">nullptr&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cerr&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Ошибка: Не удалось загрузить модель - &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">model_path&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Модель успешно загружена.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Файлы моделей имеют специальный квантованный формат &lt;code>.bin&lt;/code>. Вы можете использовать скрипт преобразования из официального репозитория или скачать их напрямую с HuggingFace. В средах с жесткими ограничениями памяти использование 4-битных квантованных моделей (например, &lt;code>ggml-base-q4_0.bin&lt;/code>) может сократить потребление оперативной памяти примерно до 1/4.&lt;/p>
&lt;h3 id="52-настройка-параметров-вывода">5.2 Настройка параметров вывода
&lt;/h3>&lt;p>Далее настроим &lt;code>whisper_full_params&lt;/code>, которые управляют поведением вывода.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 3. Настройка параметров для полного вывода (используется Greedy Sampling)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">struct&lt;/span> &lt;span class="nc">whisper_full_params&lt;/span> &lt;span class="n">wparams&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">whisper_full_default_params&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">WHISPER_SAMPLING_GREEDY&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Настройка количества потоков (Оптимально соответствовать количеству физических ядер CPU)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">wparams&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">n_threads&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Настройка языка (&amp;#34;auto&amp;#34; для автоматического определения, &amp;#34;ja&amp;#34; для японского и т.д.)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">wparams&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">language&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;ja&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Подавление стандартного вывода промежуточных результатов (для управления внутри приложения)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">wparams&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">print_progress&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">wparams&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">print_realtime&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Функция перевода (true для прямого перевода японской/другой речи в английский текст)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">wparams&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">translate&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="53-подготовка-аудиоданных-и-выполнение-вывода">5.3 Подготовка аудиоданных и выполнение вывода
&lt;/h3>&lt;p>Здесь мы предполагаем, что аудиоданные с частотой 16 кГц уже сохранены в &lt;code>std::vector&amp;lt;float&amp;gt;&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Виртуальные аудиоданные (в реальности PCM данные, полученные из файла или микрофона)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// 3 секунды (16000 Гц * 3 сек = 48000 сэмплов)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">vector&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="kt">float&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">pcmf32&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">48000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.0f&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 4. Выполнение вывода
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">whisper_full&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">wparams&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pcmf32&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">pcmf32&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">size&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cerr&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;Ошибка: Не удалось выполнить whisper_full.&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">whisper_free&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="54-извлечение-результатов">5.4 Извлечение результатов
&lt;/h3>&lt;p>По завершении &lt;code>whisper_full&lt;/code>, результаты распознавания сохраняются сегментами внутри контекста.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 5. Получение и отображение результатов
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">n_segments&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">whisper_full_n_segments&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">n_segments&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="o">++&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">const&lt;/span> &lt;span class="kt">char&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">text&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">whisper_full_get_segment_text&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Получение временных меток (Единица измерения: 10 мс)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="kt">int64_t&lt;/span> &lt;span class="n">t0&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">whisper_full_get_segment_t0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">const&lt;/span> &lt;span class="kt">int64_t&lt;/span> &lt;span class="n">t1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">whisper_full_get_segment_t1&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">cout&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34;[&amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">t0&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mf">10.0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; ms -&amp;gt; &amp;#34;&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">t1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mf">10.0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="s">&amp;#34; ms]: &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">text&lt;/span> &lt;span class="o">&amp;lt;&amp;lt;&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">endl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 6. Освобождение памяти
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">whisper_free&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ctx&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Этот блок кода является самым базовым шаблоном для использования Whisper на C++.&lt;/p>
&lt;hr>
&lt;h2 id="6-продвинутая-реализация-распознавания-речи-в-реальном-времени">6. Продвинутая реализация распознавания речи в реальном времени
&lt;/h2>&lt;p>Обрабатывать предварительно записанные файлы легко, но для улучшения пользовательского опыта (UX) приложения необходимо &amp;ldquo;распознавание речи в реальном времени (потоковое распознавание)&amp;rdquo; с ввода микрофона.&lt;/p>
&lt;p>Для реализации этого необходима многопоточная архитектура и управление аудиопотоком с помощью кольцевого буфера (Ring Buffer).&lt;/p>
&lt;div class="mermaid">graph LR
subgraph "Аудиопоток (Высокий приоритет)"
A["API захвата звука (CoreAudio/WASAPI/ALSA)"] -->|Callback| B["Ресемплер (до 16кГц)"]
B --> C["Кольцевой буфер"]
end
subgraph "Главный / Рабочий поток"
C -->|Извлечение фрагмента 30-1000мс| D["Детектор голосовой активности (VAD)"]
D -->|Если речь обнаружена| E["Накопление PCM буфера"]
E -->|Запуск вывода| F["whisper_full()"]
F --> G["Обновление UI/Текста"]
end&lt;/div>
&lt;h3 id="61-важность-детектора-голосовой-активности-voice-activity-detection---vad">6.1 Важность детектора голосовой активности (Voice Activity Detection - VAD)
&lt;/h3>&lt;p>При обработке в реальном времени постоянное выполнение вывода даже для участков тишины является пустой тратой вычислительных ресурсов. Вставив на предварительном этапе алгоритм VAD (простая пороговая обработка на основе энергии или WebRTC VAD и т.д.), мы осуществляем следующее управление: &lt;strong>&amp;ldquo;начинать буферизацию только тогда, когда начинается речь, и запускать &lt;code>whisper_full&lt;/code> тогда, когда речь заканчивается (определенный период тишины)&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;h3 id="62-подход-со-скользящим-окном">6.2 Подход со скользящим окном
&lt;/h3>&lt;p>Если речь продолжается долго, используется метод &amp;ldquo;скользящего окна&amp;rdquo;, при котором фрагменты вырезаются каждые несколько секунд для выполнения вывода. Однако, если вы просто грубо разрежете звук, он оборвется посреди слова, и точность распознавания значительно упадет.&lt;/p>
&lt;p>В качестве контрмеры используется метод, который &lt;strong>&amp;ldquo;всегда выполняет вывод, включая контекст предыдущих N секунд прошлого&amp;rdquo;&lt;/strong> (перекрытие). В &lt;code>whisper.cpp&lt;/code> также есть функция &lt;code>wparams.prompt_tokens&lt;/code>, которая переносит предыдущие текстовые токены в качестве подсказки (prompt), обеспечивая высокоточное потоковое распознавание с сохранением контекста.&lt;/p>
&lt;hr>
&lt;h2 id="7-управление-памятью-и-оптимизация-для-граничных-устройств-edge-devices">7. Управление памятью и оптимизация для граничных устройств (Edge Devices)
&lt;/h2>&lt;p>Давайте углубимся в производительность и эффективность памяти, которые являются самыми большими преимуществами &lt;code>whisper.cpp&lt;/code>.&lt;/p>
&lt;h3 id="71-мощь-тензорной-библиотеки-ggml">7.1 Мощь тензорной библиотеки ggml
&lt;/h3>&lt;p>Бэкенд &lt;code>whisper.cpp&lt;/code>, &lt;code>ggml&lt;/code> — это библиотека тензоров на языке C, не имеющая зависимостей. Её главная особенность заключается в том, что она поддерживает &lt;strong>динамическое квантование весовых данных (Quantization)&lt;/strong>.&lt;/p>
&lt;p>Например, давайте рассчитаем объем памяти модели Whisper &lt;code>Small&lt;/code> (около 240 миллионов параметров).
В обычном случае (16-bit Float = 2 байта):&lt;/p>
$$ \text{Memory (FP16)} \approx 244,000,000 \times 2 \text{ bytes} \approx 488 \text{ MB} $$
&lt;p>Если преобразовать это в 4-битное квантование (формат Q4_0), то в среднем на один параметр будет приходиться 0,5 байта (около 0,56 байта, включая накладные расходы, такие как масштабный коэффициент).&lt;/p>
$$ \text{Memory (Q4\_0)} \approx 244,000,000 \times 0.56 \text{ bytes} \approx 137 \text{ MB} $$
&lt;p>В средах со строгими ограничениями ОЗУ, таких как устройства iOS или Raspberry Pi, это сокращение объема занимаемой памяти напрямую связано с общей стабильностью приложения.&lt;/p>
&lt;h3 id="72-использование-аппаратного-ускорения">7.2 Использование аппаратного ускорения
&lt;/h3>&lt;p>Даже на одном только CPU скорость достаточно высока благодаря инструкциям AVX2 и NEON, но &lt;code>whisper.cpp&lt;/code> также поддерживает аппаратное ускорение различных GPU и NPU в качестве бэкендов.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Apple Silicon (Mac/iOS)&lt;/strong>: Поддержка Metal API через &lt;code>ggml-metal&lt;/code>. Сверхбыстрый вывод с использованием GPU.&lt;/li>
&lt;li>&lt;strong>NVIDIA GPU (Windows/Linux)&lt;/strong>: Поддержка &lt;code>cuBLAS&lt;/code>. Укажите &lt;code>-DWHISPER_CUBLAS=ON&lt;/code> при сборке CMake.&lt;/li>
&lt;li>&lt;strong>Intel (Windows/Linux)&lt;/strong>: Поддержка бэкенда &lt;code>OpenVINO&lt;/code>. Возможность использовать NPU на новейших процессорах Intel Core.&lt;/li>
&lt;/ul>
&lt;p>При использовании этих ускорителей в проекте C++ исходный код практически не нужно менять. Пока при инициализации контекста установлено &lt;code>cparams.use_gpu = true;&lt;/code>, обработка будет автоматически перенесена на оборудование в соответствии со скомпилированным бэкендом.&lt;/p>
&lt;h3 id="73-настройка-кэша-и-количества-потоков">7.3 Настройка кэша и количества потоков
&lt;/h3>&lt;p>Настройка &lt;code>wparams.n_threads&lt;/code> чрезвычайно важна. Слепое увеличение количества потоков не улучшит производительность из-за узкого места в пропускной способности памяти (Memory Bound).&lt;/p>
&lt;p>Эмпирическое правило — идеальным является определение количества потоков по следующей формуле:&lt;/p>
$$ N_{\text{threads}} = \min(\text{Физические ядра CPU}, 4 \sim 8) $$
&lt;p>Если вы включите логические ядра (например, Hyper-Threading), часто будут возникать конфликты кэша, и скорость вывода, наоборот, снизится, поэтому железное правило — устанавливать &lt;strong>количество физических ядер&lt;/strong>. Поскольку использование &lt;code>std::thread::hardware_concurrency()&lt;/code> в C++11 возвращает количество логических ядер, рекомендуется жестко закодировать его в зависимости от среды или получать количество физических ядер через API на уровне ОС.&lt;/p>
&lt;hr>
&lt;h2 id="8-заключение">8. Заключение
&lt;/h2>&lt;p>В этой статье мы подробно рассмотрели, как использовать &lt;code>whisper.cpp&lt;/code> для интеграции первоклассного ИИ распознавания речи в проекты на C++, начиная с теории и заканчивая практикой и оптимизацией.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Соблюдение требований к входу&lt;/strong>: Строгое соблюдение 16 кГц, 1 канал, 32-bit Float.&lt;/li>
&lt;li>&lt;strong>Интуитивно понятное использование API&lt;/strong>: Простой дизайн, где вывод завершается только с помощью &lt;code>whisper_init_from_file_with_params&lt;/code> и &lt;code>whisper_full&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Реализация в реальном времени&lt;/strong>: Многопоточное управление с использованием VAD и скользящего окна.&lt;/li>
&lt;li>&lt;strong>Потрясающая оптимизация&lt;/strong>: Преимущества 4-битного квантования с помощью &lt;code>ggml&lt;/code> и аппаратных бэкендов, таких как Metal/cuBLAS.&lt;/li>
&lt;/ul>
&lt;p>Пожалуйста, используйте &lt;code>whisper.cpp&lt;/code> для разработки приложений обработки звука, которые работают быстро и безопасно в нативной среде, избавившись от огромных сред Python или зависимости от облачных API. Локальные ИИ, не требующие подключения к интернету, станут чрезвычайно важной базовой технологией в будущей разработке программного обеспечения с точки зрения защиты конфиденциальности и минимизации задержек.&lt;/p></description></item></channel></rss>