<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Whisper.cpp on kenji.blog</title><link>http://kenji.blog/fr/tags/whisper.cpp/</link><description>Recent content in Whisper.cpp on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 04:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/fr/tags/whisper.cpp/index.xml" rel="self" type="application/rss+xml"/><item><title>Comment intégrer l'IA de reconnaissance vocale (Whisper) dans un projet C++</title><link>http://kenji.blog/fr/p/whisper-cpp-integration-guide/</link><pubDate>Fri, 11 Sep 2026 04:00:00 +0900</pubDate><guid>http://kenji.blog/fr/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 Comment intégrer l'IA de reconnaissance vocale (Whisper) dans un projet C++" />&lt;h2 id="1-introduction--pourquoi-la-reconnaissance-vocale-en-c-">1. Introduction : Pourquoi la reconnaissance vocale en C++ ?
&lt;/h2>&lt;p>Le modèle de reconnaissance vocale de haute précision « Whisper », développé par OpenAI, est utilisé dans diverses applications depuis qu&amp;rsquo;il a été rendu open source. Bien qu&amp;rsquo;il soit couramment utilisé dans un environnement Python (basé sur PyTorch), l&amp;rsquo;intégration dans des &lt;strong>appareils périphériques (smartphones, appareils IoT, systèmes embarqués)&lt;/strong> ou des &lt;strong>applications natives C++ nécessitant de hautes performances en temps réel&lt;/strong> (moteurs de jeu, logiciels DAW, robotique, etc.) rend la dépendance à l&amp;rsquo;interpréteur Python un goulot d&amp;rsquo;étranglement majeur pour les performances.&lt;/p>
&lt;p>Le sauveur ici est &lt;strong>&lt;a class="link" href="https://github.com/ggerganov/whisper.cpp" target="_blank" rel="noopener"
>whisper.cpp&lt;/a>&lt;/strong>, développé par M. Georgi Gerganov. Cette bibliothèque, basée sur la bibliothèque de calcul tensoriel pour l&amp;rsquo;apprentissage automatique &lt;code>ggml&lt;/code>, réduit les dépendances à la limite absolue et réalise l&amp;rsquo;inférence de Whisper uniquement en C/C++.&lt;/p>
&lt;p>Cet article expliquera de manière exhaustive comment utiliser &lt;code>whisper.cpp&lt;/code> pour intégrer des fonctionnalités de reconnaissance vocale de pointe dans vos propres projets C++, allant des bases du traitement des signaux audio, de l&amp;rsquo;utilisation détaillée de l&amp;rsquo;API, de la gestion de la mémoire, de l&amp;rsquo;optimisation multithread, jusqu&amp;rsquo;aux modèles d&amp;rsquo;implémentation de traitement en temps réel.&lt;/p>
&lt;hr>
&lt;h2 id="2-traitement-des-signaux-audio-et-exigences-dentrée-de-whisper">2. Traitement des signaux audio et exigences d&amp;rsquo;entrée de Whisper
&lt;/h2>&lt;p>Pour qu&amp;rsquo;une IA comprenne la parole, le « son », qui est un signal analogique, doit être converti en données numériques et décomposé en un format (tenseur) que le modèle d&amp;rsquo;IA peut traiter. Le format audio requis par Whisper est très strict.&lt;/p>
&lt;h3 id="21-format-audio-requis-par-whisper">2.1 Format audio requis par Whisper
&lt;/h3>&lt;p>Le modèle Whisper accepte des données audio avec les spécifications suivantes en entrée :&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Fréquence d&amp;rsquo;échantillonnage (Sample Rate)&lt;/strong> : 16 000 Hz (16 kHz)&lt;/li>
&lt;li>&lt;strong>Nombre de canaux (Channels)&lt;/strong> : 1 (Mono)&lt;/li>
&lt;li>&lt;strong>Type de données (Data Type)&lt;/strong> : Nombre à virgule flottante de 32 bits (&lt;code>float&lt;/code> en C/C++)&lt;/li>
&lt;li>&lt;strong>Normalisation (Normalization)&lt;/strong> : Valeurs mises à l&amp;rsquo;échelle dans la plage de $[-1.0, 1.0]$&lt;/li>
&lt;/ul>
&lt;p>Par exemple, si vous utilisez un fichier audio de qualité CD (44,1 kHz, stéréo, 16 bits PCM) comme entrée, vous devez effectuer au préalable un sous-échantillonnage, un mixage réducteur des canaux et une conversion de format.&lt;/p>
&lt;p>La formule de calcul du taux de transfert de données est la suivante :&lt;/p>
$$ \text{Data Rate (bytes/sec)} = \text{Sample Rate} \times \text{Channels} \times \frac{\text{Bit Depth}}{8} $$
&lt;p>La taille des données par seconde pour les exigences de Whisper (16 kHz, 1 canal, 32 bits Float) est :&lt;/p>
$$ 16000 \times 1 \times \frac{32}{8} = 64,000 \text{ bytes/sec (64 KB/s)} $$
&lt;p>Étant très léger, la mise en mémoire tampon est tout à fait possible même sur les appareils périphériques avec une bande passante mémoire limitée.&lt;/p>
&lt;h3 id="22-mathématiques-de-la-conversion-en-spectrogramme-mel">2.2 Mathématiques de la conversion en spectrogramme Mel
&lt;/h3>&lt;p>En interne, Whisper ne traite pas directement les données de forme d&amp;rsquo;onde audio unidimensionnelles (Raw Waveform). Avant d&amp;rsquo;être transmises au modèle Transformer, elles sont converties en un &lt;strong>spectrogramme Mel (Mel-Spectrogram)&lt;/strong>, qui est une représentation fréquentielle proche des caractéristiques de l&amp;rsquo;audition humaine. &lt;code>whisper.cpp&lt;/code> inclut ce processus de conversion dans son implémentation C++, mais en comprendre le mécanisme est utile pour la réduction du bruit et l&amp;rsquo;optimisation du prétraitement.&lt;/p>
&lt;p>La formule pour convertir une fréquence normale $f$ (Hz) à l&amp;rsquo;échelle Mel $m$ est approximée comme suit :&lt;/p>
$$ m = 2595 \log_{10} \left( 1 + \frac{f}{700} \right) $$
&lt;p>Inversement, la transformation de l&amp;rsquo;échelle Mel vers la fréquence est :&lt;/p>
$$ f = 700 \left( 10^{\frac{m}{2595}} - 1 \right) $$
&lt;p>De plus, la forme d&amp;rsquo;onde audio est convertie dans le domaine temps-fréquence par une &lt;strong>Transformation de Fourier à court terme (STFT: Short-Time Fourier Transform)&lt;/strong>. La forme discrète de la STFT utilisant une fonction de fenêtrage $w(n)$ est exprimée comme suit :&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>(Où $N$ est la taille de la fenêtre FFT, $H$ est la taille de saut, et $w(n)$ est une fonction de fenêtrage comme la fenêtre de Hann)&lt;/em>&lt;/p>
&lt;p>Le modèle Whisper utilise généralement une taille de fenêtre $N = 400$ (25 ms), une taille de saut $H = 160$ (10 ms) et une banque de filtres Mel à 80 dimensions. Cette extraction de caractéristiques est effectuée automatiquement (et rapidement à l&amp;rsquo;aide d&amp;rsquo;instructions SIMD) lors de l&amp;rsquo;appel de &lt;code>whisper_full()&lt;/code> dans &lt;code>whisper.cpp&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="3-architecture-et-conception-du-pipeline">3. Architecture et conception du pipeline
&lt;/h2>&lt;p>Concevons le pipeline de traitement audio dans une application C++. Le flux commence par une entrée de fichier ou de microphone, passe par le prétraitement, suivi de l&amp;rsquo;inférence par &lt;code>whisper.cpp&lt;/code>, et enfin de la sortie texte.&lt;/p>
&lt;div class="mermaid">graph TD
A["Source audio (Microphone/Fichier)"] -->|Octets bruts, par ex. 48kHz Stéréo| B["Décodeur audio &amp; Rééchantillonneur (FFmpeg/miniaudio)"]
B -->|16kHz Mono 32 bits Flottant| C["Tampon circulaire / Tableau de mémoire"]
C -->|Fournir les données PCM| D["Noyau whisper.cpp (ggml)"]
D --> E["Extraction du spectrogramme Mel"]
E --> F["Encodeur-Décodeur Transformer"]
F --> G["Génération de jetons de texte"]
G --> H["Sortie texte (Chaîne UTF-8)"]&lt;/div>
&lt;p>La responsabilité du côté de l&amp;rsquo;application est la &lt;strong>section de A à C (décodage et rééchantillonnage audio)&lt;/strong> dans le diagramme ci-dessus. Comme &lt;code>whisper.cpp&lt;/code> lui-même n&amp;rsquo;inclut pas de décodeur de fichier audio, la meilleure pratique consiste à l&amp;rsquo;utiliser en combinaison avec des bibliothèques telles que FFmpeg ou &lt;code>miniaudio&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="4-construction-et-introduction-de-whispercpp">4. Construction et introduction de whisper.cpp
&lt;/h2>&lt;p>Voici les étapes pour intégrer &lt;code>whisper.cpp&lt;/code> dans votre projet. L&amp;rsquo;utilisation de CMake est la plus polyvalente.&lt;/p>
&lt;h3 id="configuration-de-cmakeliststxt">Configuration de CMakeLists.txt
&lt;/h3>&lt;p>&lt;code>whisper.cpp&lt;/code> peut être inclus dans le projet sous forme de code source, ou ajouté en tant que sous-module et lié.&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"># Activation des instructions d&amp;#39;extension CPU (AVX, F16C, etc.)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Sur MacOS, le framework NEON/Accelerate est automatiquement activé
&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>Avec cette configuration, le backend &lt;code>ggml&lt;/code> hautement optimisé de &lt;code>whisper.cpp&lt;/code> sera construit et lié statiquement à l&amp;rsquo;application.&lt;/p>
&lt;hr>
&lt;h2 id="5-détails-de-lapi-c-et-étapes-dimplémentation">5. Détails de l&amp;rsquo;API C++ et étapes d&amp;rsquo;implémentation
&lt;/h2>&lt;p>Maintenant, expliquons comment appeler l&amp;rsquo;API en regardant le code C++ réel.&lt;/p>
&lt;h3 id="51-initialisation-du-contexte-et-chargement-du-modèle">5.1 Initialisation du contexte et chargement du modèle
&lt;/h3>&lt;p>Dans &lt;code>whisper.cpp&lt;/code>, tous les états et l&amp;rsquo;allocation de mémoire sont gérés par la structure &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. Initialisation des paramètres
&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">// Utiliser l&amp;#39;accélération GPU (CuBLAS/Metal) si disponible
&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. Chargement du modèle (modèle binaire au format 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;Erreur : Échec du chargement du modèle - &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;Le modèle a été chargé avec succès.&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>Le fichier de modèle est dans un format &lt;code>.bin&lt;/code> quantifié de manière unique. Vous pouvez utiliser le script de conversion dans le dépôt officiel ou le télécharger directement depuis HuggingFace. Dans les environnements avec des limites de mémoire strictes, l&amp;rsquo;utilisation d&amp;rsquo;un modèle quantifié sur 4 bits (par exemple, &lt;code>ggml-base-q4_0.bin&lt;/code>) peut réduire la consommation de RAM à environ un quart.&lt;/p>
&lt;h3 id="52-configuration-des-paramètres-dinférence">5.2 Configuration des paramètres d&amp;rsquo;inférence
&lt;/h3>&lt;p>Ensuite, nous configurons &lt;code>whisper_full_params&lt;/code> qui contrôle le comportement de l&amp;rsquo;inférence.&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. Configuration des paramètres pour l&amp;#39;inférence complète (Utilise l&amp;#39;échantillonnage glouton - 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">// Configuration du nombre de threads (le mieux est de correspondre au nombre de cœurs physiques du 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">// Configuration de la langue (La détection automatique est &amp;#34;auto&amp;#34;, la spécification japonaise est &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">// Supprimer la sortie standard des résultats intermédiaires (pour la contrôler dans l&amp;#39;application)
&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">// Fonctionnalité de traduction (true si on traduit l&amp;#39;audio japonais directement en texte anglais)
&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-préparation-des-données-audio-et-exécution-de-linférence">5.3 Préparation des données audio et exécution de l&amp;rsquo;inférence
&lt;/h3>&lt;p>Ici, nous supposons que les données audio 16 kHz sont déjà stockées dans un &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">// Données audio virtuelles (en réalité, des données PCM acquises à partir d&amp;#39;un fichier ou d&amp;#39;un micro)
&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 secondes (16000 Hz * 3 sec = 48000 échantillons)
&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. Exécution de l&amp;#39;inférence
&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;Erreur : Échec de l&amp;#39;exécution de 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-extraction-des-résultats">5.4 Extraction des résultats
&lt;/h3>&lt;p>Une fois &lt;code>whisper_full&lt;/code> terminé, les résultats de la reconnaissance sont sauvegardés segment par segment dans le contexte.&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. Récupération et affichage des résultats
&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">// Obtenir l&amp;#39;horodatage (Unité : 10ms)
&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. Libération de la mémoire
&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>Ce bloc de code est le modèle le plus basique pour utiliser Whisper en C++.&lt;/p>
&lt;hr>
&lt;h2 id="6-implémentation-avancée-de-la-reconnaissance-vocale-en-temps-réel">6. Implémentation avancée de la reconnaissance vocale en temps réel
&lt;/h2>&lt;p>Le traitement de fichiers préenregistrés est facile, mais pour améliorer l&amp;rsquo;expérience utilisateur (UX) d&amp;rsquo;une application, la &amp;ldquo;reconnaissance vocale en temps réel (reconnaissance en continu)&amp;rdquo; à partir de l&amp;rsquo;entrée du microphone est nécessaire.&lt;/p>
&lt;p>Pour implémenter cela, une architecture multithread et la gestion du flux audio par le biais d&amp;rsquo;un tampon circulaire (Ring Buffer) sont indispensables.&lt;/p>
&lt;div class="mermaid">graph LR
subgraph "Fil d'exécution audio (Haute priorité)"
A["API de capture audio (CoreAudio/WASAPI/ALSA)"] -->|Rappel| B["Rééchantillonneur (vers 16kHz)"]
B --> C["Tampon circulaire"]
end
subgraph "Fil principal / Travailleur"
C -->|Extraire un morceau de 30ms-1000ms| D["Détection d'activité vocale (VAD)"]
D -->|Si parole détectée| E["Accumuler le tampon PCM"]
E -->|Déclencher l'inférence| F["whisper_full()"]
F --> G["Mettre à jour l'interface utilisateur/Texte"]
end&lt;/div>
&lt;h3 id="61-limportance-de-la-détection-dactivité-vocale-vad">6.1 L&amp;rsquo;importance de la détection d&amp;rsquo;activité vocale (VAD)
&lt;/h3>&lt;p>Dans le traitement en temps réel, exécuter constamment des inférences même sur les parties silencieuses est un gaspillage de ressources informatiques. En insérant un algorithme VAD (tel qu&amp;rsquo;un seuillage basé sur l&amp;rsquo;énergie simple ou WebRTC VAD) à l&amp;rsquo;étape précédente, vous pouvez contrôler le flux de sorte que &lt;strong>&amp;ldquo;la mise en mémoire tampon ne commence que lorsque la parole commence, et que &lt;code>whisper_full&lt;/code> soit déclenché à la fin de la parole (après une certaine période de silence).&amp;rdquo;&lt;/strong>&lt;/p>
&lt;h3 id="62-lapproche-de-la-fenêtre-glissante">6.2 L&amp;rsquo;approche de la fenêtre glissante
&lt;/h3>&lt;p>Si le discours se poursuit pendant longtemps, on utilise une méthode de &amp;ldquo;fenêtre glissante&amp;rdquo;, dans laquelle des morceaux de quelques secondes sont découpés et soumis à inférence. Cependant, si le son est simplement coupé, des mots seront coupés en plein milieu et la précision de la reconnaissance chutera considérablement.&lt;/p>
&lt;p>Pour contrer cela, on utilise une technique qui consiste à &lt;strong>&amp;ldquo;toujours inclure le contexte des N secondes précédentes dans l&amp;rsquo;inférence&amp;rdquo;&lt;/strong> (chevauchement). &lt;code>whisper.cpp&lt;/code> possède également une fonctionnalité &lt;code>wparams.prompt_tokens&lt;/code> pour hériter des jetons de texte passés comme invite, ce qui permet une reconnaissance en continu de haute précision tout en conservant le contexte.&lt;/p>
&lt;hr>
&lt;h2 id="7-gestion-de-la-mémoire-et-optimisation-pour-les-appareils-périphériques">7. Gestion de la mémoire et optimisation pour les appareils périphériques
&lt;/h2>&lt;p>Nous approfondirons l&amp;rsquo;avantage le plus important de &lt;code>whisper.cpp&lt;/code> : ses performances et son efficacité de mémoire.&lt;/p>
&lt;h3 id="71-la-puissance-de-la-bibliothèque-tensorielle-ggml">7.1 La puissance de la bibliothèque tensorielle ggml
&lt;/h3>&lt;p>&lt;code>ggml&lt;/code>, le backend de &lt;code>whisper.cpp&lt;/code>, est une bibliothèque tensorielle en langage C sans dépendances. Sa plus grande caractéristique est la prise en charge de la &lt;strong>quantification dynamique (Quantization) des données de poids&lt;/strong>.&lt;/p>
&lt;p>Par exemple, calculons la taille de la mémoire du modèle Whisper &lt;code>Small&lt;/code> (environ 240 millions de paramètres).
Dans le cas normal (Flottant 16 bits = 2 octets) :&lt;/p>
$$ \text{Memory (FP16)} \approx 244,000,000 \times 2 \text{ bytes} \approx 488 \text{ MB} $$
&lt;p>Si cela est converti en quantification sur 4 bits (format Q4_0), la moyenne est de 0,5 octet par paramètre (environ 0,56 octet si l&amp;rsquo;on inclut la surcharge des facteurs d&amp;rsquo;échelle, etc.).&lt;/p>
$$ \text{Memory (Q4\_0)} \approx 244,000,000 \times 0.56 \text{ bytes} \approx 137 \text{ MB} $$
&lt;p>Dans des environnements soumis à de fortes contraintes de RAM, comme les appareils iOS et les Raspberry Pi, cette réduction de l&amp;rsquo;empreinte mémoire se traduit directement par la stabilité globale de l&amp;rsquo;application.&lt;/p>
&lt;h3 id="72-utilisation-de-laccélération-matérielle">7.2 Utilisation de l&amp;rsquo;accélération matérielle
&lt;/h3>&lt;p>Bien que le processeur (CPU) seul soit suffisamment rapide avec les instructions AVX2 ou NEON, &lt;code>whisper.cpp&lt;/code> prend également en charge l&amp;rsquo;accélération matérielle de divers GPU et NPU en tant que backend.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Apple Silicon (Mac/iOS)&lt;/strong> : Prise en charge de l&amp;rsquo;API Metal via &lt;code>ggml-metal&lt;/code>. Inférence ultra-rapide utilisant le GPU.&lt;/li>
&lt;li>&lt;strong>NVIDIA GPU (Windows/Linux)&lt;/strong> : Prise en charge de &lt;code>cuBLAS&lt;/code>. Spécifiez &lt;code>-DWHISPER_CUBLAS=ON&lt;/code> lors de la construction avec CMake.&lt;/li>
&lt;li>&lt;strong>Intel (Windows/Linux)&lt;/strong> : Prise en charge du backend &lt;code>OpenVINO&lt;/code>. Peut tirer parti du NPU sur les derniers processeurs Intel Core.&lt;/li>
&lt;/ul>
&lt;p>Si vous souhaitez utiliser ces accélérateurs dans votre projet C++, il n&amp;rsquo;est presque pas nécessaire de modifier le code source. Tant que &lt;code>cparams.use_gpu = true;&lt;/code> est défini lors de l&amp;rsquo;initialisation du contexte, il sera automatiquement déchargé sur le matériel en fonction du backend construit.&lt;/p>
&lt;h3 id="73-ajustement-du-cache-et-du-nombre-de-threads">7.3 Ajustement du cache et du nombre de threads
&lt;/h3>&lt;p>La configuration de &lt;code>wparams.n_threads&lt;/code> est très importante. Augmenter le nombre de threads sans discernement n&amp;rsquo;améliorera pas les performances en raison du goulot d&amp;rsquo;étranglement de la bande passante mémoire (Memory Bound).&lt;/p>
&lt;p>En règle générale, il est idéal de déterminer le nombre de threads à l&amp;rsquo;aide de la formule suivante :&lt;/p>
$$ N_{\text{threads}} = \min(\text{Cœurs CPU Physiques}, 4 \sim 8) $$
&lt;p>Si l&amp;rsquo;on inclut les cœurs logiques tels que l&amp;rsquo;Hyper-Threading, les conflits de cache se produisent souvent, réduisant en fait la vitesse d&amp;rsquo;inférence. Par conséquent, la règle d&amp;rsquo;or est de la définir sur le &lt;strong>nombre de cœurs physiques&lt;/strong>. Si vous utilisez &lt;code>std::thread::hardware_concurrency()&lt;/code> en C++11, il renvoie le nombre de cœurs logiques. Il est donc recommandé de coder en dur en fonction de l&amp;rsquo;environnement ou d&amp;rsquo;obtenir le nombre de cœurs physiques avec une API de niveau système d&amp;rsquo;exploitation.&lt;/p>
&lt;hr>
&lt;h2 id="8-conclusion">8. Conclusion
&lt;/h2>&lt;p>Dans cet article, nous avons expliqué en détail comment utiliser &lt;code>whisper.cpp&lt;/code> pour intégrer l&amp;rsquo;IA de reconnaissance vocale de premier ordre dans des projets C++, couvrant la théorie, la pratique et l&amp;rsquo;optimisation.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Respect des exigences d&amp;rsquo;entrée&lt;/strong> : Application stricte du 16 kHz, 1 canal, Flottant 32 bits.&lt;/li>
&lt;li>&lt;strong>Utilisation intuitive de l&amp;rsquo;API&lt;/strong> : Une conception simple où l&amp;rsquo;inférence peut être complétée uniquement avec &lt;code>whisper_init_from_file_with_params&lt;/code> et &lt;code>whisper_full&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Mise en œuvre en temps réel&lt;/strong> : Contrôle multithread via VAD et fenêtres glissantes.&lt;/li>
&lt;li>&lt;strong>Optimisation impressionnante&lt;/strong> : Les avantages de la quantification 4 bits via &lt;code>ggml&lt;/code> et des backends matériels tels que Metal/cuBLAS.&lt;/li>
&lt;/ul>
&lt;p>Veuillez utiliser &lt;code>whisper.cpp&lt;/code> pour développer des applications de traitement audio hautement sécurisées et rapides dans un environnement natif, en vous libérant des dépendances aux énormes environnements Python et aux API cloud. L&amp;rsquo;IA entièrement locale est appelée à devenir une technologie fondamentale extrêmement importante dans le développement logiciel futur du point de vue de la protection de la vie privée et de la latence.&lt;/p></description></item></channel></rss>