<?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/ar/tags/whisper.cpp/</link><description>Recent content in Whisper.cpp on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ar</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 04:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ar/tags/whisper.cpp/index.xml" rel="self" type="application/rss+xml"/><item><title>كيفية دمج الذكاء الاصطناعي للتعرف على الصوت (Whisper) في مشروع C++</title><link>http://kenji.blog/ar/p/whisper-cpp-integration-guide/</link><pubDate>Fri, 11 Sep 2026 04:00:00 +0900</pubDate><guid>http://kenji.blog/ar/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) شائعًا، فإن الاعتماد على مترجم Python يُعد عنق زجاجة كبير للأداء عند الدمج في &lt;strong>الأجهزة الطرفية (الهواتف الذكية، أجهزة إنترنت الأشياء، الأنظمة المدمجة)&lt;/strong> أو &lt;strong>تطبيقات C++ الأصلية التي تتطلب استجابة عالية في الوقت الفعلي&lt;/strong> (محركات الألعاب، برامج الصوت الرقمية (DAW)، الروبوتات، إلخ).&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>، وهي مكتبة حسابات موتر (tensor) مخصصة للتعلم الآلي، لتقليل التبعيات إلى أقصى حد وتحقيق استدلال Whisper باستخدام C/C++ فقط.&lt;/p>
&lt;p>في هذا المقال، سنشرح بالتفصيل كيفية دمج أفضل ميزات التعرف على الصوت في مشروع C++ الخاص بك باستخدام &lt;code>whisper.cpp&lt;/code>، بدءًا من أساسيات معالجة الإشارات الصوتية، وطريقة الاستخدام التفصيلية لواجهة برمجة التطبيقات (API)، وإدارة الذاكرة، وتحسين تعدد المسارات (Multi-threading)، وصولًا إلى أنماط تنفيذ المعالجة في الوقت الفعلي.&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 (أحادي/Mono)&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>على سبيل المثال، إذا تم إدخال ملف صوتي بجودة القرص المضغوط (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>حجم البيانات لثانية واحدة وفقًا لمتطلبات Whisper (16 كيلو هرتز، قناة واحدة، 32-بت عائم) هو:&lt;/p>
$$ 16000 \times 1 \times \frac{32}{8} = 64,000 \text{ bytes/sec (64 KB/s)} $$
&lt;p>نظرًا لأنه خفيف للغاية، فإن التخزين المؤقت (Buffering) ممكن تمامًا حتى على الأجهزة الطرفية ذات النطاق الترددي المحدود للذاكرة.&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-أبعاد من بنك مرشحات ميل (Mel filter bank). يتم تنفيذ استخراج الميزات هذا تلقائيًا (وبسرعة باستخدام تعليمات SIMD) عند استدعاء &lt;code>whisper_full()&lt;/code> داخل &lt;code>whisper.cpp&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="3-هندسة-النظام-وتصميم-مسار-المعالجة-pipeline">3. هندسة النظام وتصميم مسار المعالجة (Pipeline)
&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-بت عائم| C["ذاكرة تخزين مؤقت حلقية (Ring Buffer) / مصفوفة ذاكرة"]
C -->|تغذية بيانات PCM| D["نواة whisper.cpp (ggml)"]
D --> E["استخراج مخطط طيف ميل (Mel Spectrogram)"]
E --> F["مشفر-مفكك ترميز Transformer (Transformer Encoder-Decoder)"]
F --> G["توليد رموز النص (Text Tokens)"]
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> ككود مصدري في المشروع أو إضافته كـ submodule وربطه.&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>بهذا الإعداد، سيتم بناء الواجهة الخلفية (backend) المحسّنة للغاية &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>الآن، دعونا نلقي نظرة على كود C++ الفعلي ونشرح كيفية استخدام واجهة برمجة التطبيقات (API).&lt;/p>
&lt;h3 id="51-تهيئة-السياق-context-وتحميل-النموذج">5.1 تهيئة السياق (Context) وتحميل النموذج
&lt;/h3>&lt;p>في &lt;code>whisper.cpp&lt;/code>، تتم إدارة جميع الحالات وتخصيص الذاكرة من خلال هيكل (struct) &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> المكمّم (Quantized) الخاص بهم. استخدم برنامج التحويل النصي الموجود في المستودع الرسمي أو قم بتنزيله مباشرة من HuggingFace. في البيئات ذات الذاكرة المحدودة بصرامة، يمكن أن يؤدي استخدام نماذج التكميم 4-بت (مثل: &lt;code>ggml-base-q4_0.bin&lt;/code>) إلى تقليل استهلاك ذاكرة الوصول العشوائي (RAM) إلى حوالي الربع.&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">// إعداد عدد المسارات (Threads) (الأمثل هو مطابقته لعدد النوى المادية لوحدة المعالجة المركزية)
&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;ar&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>، يتم حفظ نتائج التعرف مقسمة إلى أجزاء (segments) داخل السياق.&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; مللي ثانية -&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; مللي ثانية]: &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>لتنفيذ ذلك، تعد بنية متعددة المسارات (Multi-thread architecture) وإدارة التدفق الصوتي باستخدام الذاكرة المؤقتة الحلقية (Ring Buffer) أمورًا لا غنى عنها.&lt;/p>
&lt;div class="mermaid">graph LR
subgraph "مسار الصوت (أولوية عالية)"
A["واجهة برمجة تطبيقات التقاط الصوت (CoreAudio/WASAPI/ALSA)"] -->|استدعاء Callback| B["مغير معدل أخذ العينات (إلى 16 كيلو هرتز)"]
B --> C["ذاكرة تخزين مؤقت حلقية (Ring Buffer)"]
end
subgraph "المسار الرئيسي / مسار العامل (Worker Thread)"
C -->|استخراج قطعة 30 مللي ثانية-1000 مللي ثانية| D["اكتشاف النشاط الصوتي (VAD)"]
D -->|في حالة اكتشاف كلام| E["تجميع في مخزن PCM المؤقت"]
E -->|تشغيل الاستدلال| F["whisper_full()"]
F --> G["تحديث واجهة المستخدم/النص"]
end&lt;/div>
&lt;h3 id="61-أهمية-اكتشاف-النشاط-الصوتي-vad">6.1 أهمية اكتشاف النشاط الصوتي (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-نهج-النافذة-المنزلقة-sliding-window">6.2 نهج النافذة المنزلقة (Sliding Window)
&lt;/h3>&lt;p>إذا استمر التحدث لفترة طويلة، يُستخدم نهج &amp;ldquo;النافذة المنزلقة&amp;rdquo; لاقتطاع أجزاء كل بضع ثوان وتنفيذ الاستدلال. ومع ذلك، إذا قمت ببساطة بتقطيع الصوت بشكل عشوائي، فقد يتم قطعه في منتصف الكلمة، مما يؤدي إلى انخفاض كبير في دقة التعرف.&lt;/p>
&lt;p>كحل، نستخدم تقنية &lt;strong>&amp;ldquo;إجراء الاستدلال دائمًا بحيث يتضمن سياق الثواني الـ N الماضية مباشرة&amp;rdquo;&lt;/strong> (تداخل/Overlap). في &lt;code>whisper.cpp&lt;/code>، هناك ميزة تسمى &lt;code>wparams.prompt_tokens&lt;/code> التي ترحّل رموز النص السابقة كموجه (prompt)، مما يسمح بالتعرف على البث بدقة عالية مع الحفاظ على السياق.&lt;/p>
&lt;hr>
&lt;h2 id="7-إدارة-الذاكرة-وتحسين-الأجهزة-الطرفية">7. إدارة الذاكرة وتحسين الأجهزة الطرفية
&lt;/h2>&lt;p>سنتعمق أكثر في الأداء وكفاءة الذاكرة، وهما أكبر مزايا &lt;code>whisper.cpp&lt;/code>.&lt;/p>
&lt;h3 id="71-قوة-مكتبة-موتر-tensor-ggml">7.1 قوة مكتبة موتر (Tensor) ggml
&lt;/h3>&lt;p>&lt;code>ggml&lt;/code>، وهي الواجهة الخلفية لـ &lt;code>whisper.cpp&lt;/code>، هي مكتبة موتر مكتوبة بلغة C ولا تحتوي على تبعيات. الميزة الأكبر هي أنها تدعم &lt;strong>التكميم الديناميكي لبيانات الوزن (Quantization)&lt;/strong>.&lt;/p>
&lt;p>على سبيل المثال، دعونا نحسب حجم الذاكرة لنموذج Whisper &lt;code>Small&lt;/code> (حوالي 240 مليون معامل/Parameter).
في العادة (16-بت عائم = 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>في البيئات التي تعاني من قيود صارمة على ذاكرة الوصول العشوائي (RAM) مثل أجهزة iOS أو Raspberry Pi، فإن هذا التخفيض في بصمة الذاكرة يرتبط ارتباطًا مباشرًا بالاستقرار العام للتطبيق.&lt;/p>
&lt;h3 id="72-الاستفادة-من-تسريع-الأجهزة-hardware-acceleration">7.2 الاستفادة من تسريع الأجهزة (Hardware Acceleration)
&lt;/h3>&lt;p>على الرغم من أنها سريعة بما يكفي بواسطة وحدة المعالجة المركزية (CPU) وحدها مع تعليمات AVX2 و NEON، إلا أن &lt;code>whisper.cpp&lt;/code> تدعم أيضًا تسريع الأجهزة لمختلف وحدات المعالجة الرسومية (GPUs) ووحدات المعالجة العصبية (NPUs) كواجهات خلفية (backends).&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-ضبط-ذاكرة-التخزين-المؤقت-cache-وعدد-المسارات-threads">7.3 ضبط ذاكرة التخزين المؤقت (Cache) وعدد المسارات (Threads)
&lt;/h3>&lt;p>إعداد &lt;code>wparams.n_threads&lt;/code> مهم للغاية. مجرد زيادة عدد المسارات بشكل عشوائي لن يؤدي إلى تحسين الأداء بسبب عنق الزجاجة في النطاق الترددي للذاكرة (Memory Bound).&lt;/p>
&lt;p>كقاعدة عامة، من المثالي تحديد عدد المسارات بالصيغة التالية:&lt;/p>
$$ N_{\text{threads}} = \min(\text{Physical CPU Cores}, 4 \sim 8) $$
&lt;p>إذا قمت بتضمين النوى المنطقية (Logical Cores) مثل Hyper-Threading، فغالبًا ما تحدث تعارضات في ذاكرة التخزين المؤقت، وستنخفض سرعة الاستدلال بدلاً من ذلك، لذا فإن القاعدة الذهبية هي ضبطه على &lt;strong>عدد النوى المادية (Physical Cores)&lt;/strong>. عند استخدام &lt;code>std::thread::hardware_concurrency()&lt;/code> من C++11، فإنه يُرجع عدد النوى المنطقية، لذلك نوصي إما بترميزه بقيم ثابتة وفقًا للبيئة، أو استخدام واجهات برمجة تطبيقات على مستوى نظام التشغيل للحصول على النوى المادية.&lt;/p>
&lt;hr>
&lt;h2 id="8-الخاتمة">8. الخاتمة
&lt;/h2>&lt;p>في هذا المقال، شرحنا بالتفصيل كيفية دمج أفضل ذكاء اصطناعي للتعرف على الصوت في مشاريع C++ باستخدام &lt;code>whisper.cpp&lt;/code>، بدءًا من النظرية والتطبيق وحتى التحسين.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>الالتزام بمتطلبات الإدخال&lt;/strong>: الالتزام الصارم بـ 16 كيلو هرتز، قناة واحدة، و 32-بت عائم.&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>: التحكم متعدد المسارات (Multi-thread) مع VAD والنافذة المنزلقة (Sliding window).&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 الضخمة أو واجهات برمجة تطبيقات الحوسبة السحابية (Cloud APIs). من منظور حماية الخصوصية وزمن الوصول (Latency)، سيكون الذكاء الاصطناعي الذي يعمل محليًا بالكامل تقنية أساسية بالغة الأهمية في تطوير البرمجيات المستقبلية.&lt;/p></description></item></channel></rss>