<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Audio Processing on kenji.blog</title><link>http://kenji.blog/hi/categories/audio-processing/</link><description>Recent content in Audio Processing on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 04:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/categories/audio-processing/index.xml" rel="self" type="application/rss+xml"/><item><title>सी++ प्रोजेक्ट में स्पीच रिकग्निशन एआई (Whisper) को कैसे इंटीग्रेट करें</title><link>http://kenji.blog/hi/p/whisper-cpp-integration-guide/</link><pubDate>Fri, 11 Sep 2026 04:00:00 +0900</pubDate><guid>http://kenji.blog/hi/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) को कैसे इंटीग्रेट करें" />&lt;h2 id="1-परचय-c-म-सपच-रकगनशन-कय">1. परिचय: C++ में स्पीच रिकग्निशन क्यों?
&lt;/h2>&lt;p>OpenAI द्वारा विकसित उच्च-सटीकता वाला स्पीच रिकग्निशन मॉडल &amp;ldquo;Whisper&amp;rdquo;, ओपन सोर्स होने के बाद से विभिन्न एप्लिकेशन्स में उपयोग किया जा रहा है। हालांकि आमतौर पर इसका उपयोग Python वातावरण (PyTorch पर आधारित) में किया जाता है, लेकिन &lt;strong>एज डिवाइसेज (स्मार्टफोन, IoT डिवाइस, एम्बेडेड सिस्टम)&lt;/strong> और &lt;strong>उच्च रियल-टाइम प्रदर्शन की आवश्यकता वाले नेटिव C++ एप्लिकेशन्स&lt;/strong> (गेम इंजन, DAW सॉफ्टवेयर, रोबोटिक्स आदि) में इसे एम्बेड करते समय, Python इंटरप्रेटर पर निर्भरता परफॉरमेंस के लिए एक बड़ी बाधा बन जाती है।&lt;/p>
&lt;p>इसलिए, Georgi Gerganov द्वारा विकसित &lt;strong>&lt;a class="link" href="https://github.com/ggerganov/whisper.cpp" target="_blank" rel="noopener"
>whisper.cpp&lt;/a>&lt;/strong> एक तारणहार के रूप में सामने आता है। यह लाइब्रेरी मशीन लर्निंग के लिए एक टेंसर कंप्यूटेशन लाइब्रेरी &lt;code>ggml&lt;/code> पर आधारित है, जो निर्भरता को काफी कम करती है और केवल C/C++ का उपयोग करके Whisper इन्फेरेंस को सक्षम बनाती है।&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>AI को आवाज़ समझने के लिए, एनालॉग सिग्नल &amp;ldquo;आवाज़&amp;rdquo; को डिजिटल डेटा में बदलना पड़ता है, और इसे ऐसे फॉर्मेट (टेंसर) में बदलना होता है जिसे AI मॉडल प्रोसेस कर सके। 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 Hz (16 kHz)&lt;/li>
&lt;li>&lt;strong>चैनलों की संख्या (Channels)&lt;/strong>: 1 (मोनो)&lt;/li>
&lt;li>&lt;strong>डेटा प्रकार (Data Type)&lt;/strong>: 32-bit फ्लोटिंग पॉइंट (&lt;code>float&lt;/code> in C/C++)&lt;/li>
&lt;li>&lt;strong>नॉर्मलाइजेशन (Normalization)&lt;/strong>: $[-1.0, 1.0]$ की सीमा में स्केल किया गया मान&lt;/li>
&lt;/ul>
&lt;p>उदाहरण के लिए, यदि आप एक सीडी-क्वालिटी (44.1kHz, स्टीरियो, 16-bit PCM) ऑडियो फ़ाइल का उपयोग इनपुट के रूप में करते हैं, तो आपको पहले डाउनसैंपलिंग, चैनल मिक्सडाउन, और फॉर्मेट रूपांतरण करना होगा।&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 की आवश्यकताओं (16kHz, 1ch, 32-bit Float) के आधार पर 1 सेकंड का डेटा साइज़ है:&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-सपकटरगरम-रपतरण-क-गणत">2.2 Mel स्पेक्ट्रोग्राम रूपांतरण का गणित
&lt;/h3>&lt;p>Whisper आंतरिक रूप से 1-आयामी ऑडियो वेवफॉर्म डेटा (Raw Waveform) को सीधे प्रोसेस नहीं करता है। ट्रांसफॉर्मर मॉडल में इनपुट किए जाने से पहले इसे &lt;strong>मेल-स्पेक्ट्रोग्राम (Mel-Spectrogram)&lt;/strong> में बदल दिया जाता है, जो मानव श्रवण विशेषताओं के करीब एक फ्रीक्वेंसी प्रतिनिधित्व है। &lt;code>whisper.cpp&lt;/code> में यह रूपांतरण प्रक्रिया इसके C++ कार्यान्वयन के भीतर शामिल है, लेकिन यह समझना नॉइज़ रिडक्शन और प्री-प्रोसेसिंग ऑप्टिमाइज़ेशन में मदद कर सकता है।&lt;/p>
&lt;p>सामान्य फ्रीक्वेंसी $f$ (Hz) को Mel स्केल $m$ में बदलने का सूत्र इस प्रकार अनुमानित है:&lt;/p>
$$ m = 2595 \log_{10} \left( 1 + \frac{f}{700} \right) $$
&lt;p>इसके विपरीत, Mel स्केल से फ्रीक्वेंसी में वापस बदलने का सूत्र इस प्रकार है:&lt;/p>
$$ f = 700 \left( 10^{\frac{m}{2595}} - 1 \right) $$
&lt;p>इसके अलावा, ऑडियो वेवफॉर्म को &lt;strong>शॉर्ट-टाइम फूरियर ट्रांसफॉर्म (STFT: Short-Time Fourier Transform)&lt;/strong> द्वारा समय-आवृत्ति डोमेन में बदला जाता है। विंडो फ़ंक्शन $w(n)$ का उपयोग करके STFT का असतत रूप इस प्रकार व्यक्त किया जाता है:&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$ हॉप आकार है, और $w(n)$ हान विंडो जैसा एक विंडो फ़ंक्शन है)&lt;/em>&lt;/p>
&lt;p>Whisper मॉडल में आमतौर पर $N = 400$ (25ms) का विंडो साइज़, $H = 160$ (10ms) का हॉप साइज़, और 80-आयामी Mel फ़िल्टर बैंक का उपयोग किया जाता है। यह फ़ीचर एक्सट्रैक्शन &lt;code>whisper.cpp&lt;/code> में &lt;code>whisper_full()&lt;/code> को कॉल करने पर स्वचालित रूप से (और SIMD निर्देशों का उपयोग करके तेज़ी से) निष्पादित होता है।&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["ऑडियो स्रोत (माइक्रोफ़ोन/फ़ाइल)"] -->|Raw Bytes, e.g. 48kHz Stereo| B["ऑडियो डिकोडर और रीसैंपलर (FFmpeg/miniaudio)"]
B -->|16kHz Mono 32-bit Float| C["रिंग बफर / मेमोरी एरे"]
C -->|Feed PCM Data| D["whisper.cpp कोर (ggml)"]
D --> E["Mel स्पेक्ट्रोग्राम निष्कर्षण"]
E --> F["ट्रांसफॉर्मर एनकोडर-डिकोडर"]
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"># CPU एक्सटेंशन निर्देशों को सक्षम करें (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>whisper.cpp&lt;/code> का अत्यधिक अनुकूलित &lt;code>ggml&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-कनटकसट-क-इनशयलइज-करन-और-मडल-क-लड-करन">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-bit क्वांटाइज़्ड मॉडल (उदाहरण: &lt;code>ggml-base-q4_0.bin&lt;/code>) का उपयोग करने से RAM की खपत लगभग 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>यहां, हम मान लेते हैं कि 16kHz ऑडियो डेटा पहले से ही &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 Hz * 3 sec = 48000 samples)
&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">// टाइमस्टैम्प प्राप्त करें (इकाई: 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. मेमोरी मुक्त करें
&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>यह कोड ब्लॉक C++ में Whisper का उपयोग करने के लिए सबसे बुनियादी टेम्प्लेट है।&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["रीसैंपलर (16kHz तक)"]
B --> C["रिंग बफर"]
end
subgraph "मेन / वर्कर थ्रेड"
C -->|Pop 30ms-1000ms chunk| D["वॉयस एक्टिविटी डिटेक्शन (VAD)"]
D -->|If speech detected| E["PCM बफर जमा करें"]
E -->|Trigger Inference| F["whisper_full()"]
F --> G["UI/टेक्स्ट अपडेट करें"]
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-सलइडग-वड-एपरच">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> नामक एक सुविधा भी है जो पिछले टेक्स्ट टोकन को प्रॉम्प्ट के रूप में आगे बढ़ाती है, जिससे संदर्भ को बनाए रखते हुए अत्यधिक सटीक स्ट्रीमिंग रिकग्निशन की अनुमति मिलती है।&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-ggml-टसर-लइबरर-क-शकत">7.1 ggml टेंसर लाइब्रेरी की शक्ति
&lt;/h3>&lt;p>&lt;code>whisper.cpp&lt;/code> का बैकएंड, &lt;code>ggml&lt;/code>, एक C भाषा की टेंसर लाइब्रेरी है जिसकी कोई बाहरी निर्भरता नहीं है। इसकी सबसे बड़ी विशेषता यह है कि यह &lt;strong>वजन डेटा (Weight Data) के डायनेमिक क्वांटाइज़ेशन (Quantization)&lt;/strong> का समर्थन करती है।&lt;/p>
&lt;p>उदाहरण के लिए, आइए Whisper &lt;code>Small&lt;/code> मॉडल (लगभग 244 मिलियन पैरामीटर्स) के मेमोरी साइज़ की गणना करें।
सामान्य स्थिति में (16-bit Float = 2 बाइट्स):&lt;/p>
$$ \text{Memory (FP16)} \approx 244,000,000 \times 2 \text{ bytes} \approx 488 \text{ MB} $$
&lt;p>जब इसे 4-bit क्वांटाइज़ेशन (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 जैसे सख्त RAM सीमाओं वाले वातावरण में, मेमोरी फ़ुटप्रिंट में यह कमी सीधे एप्लिकेशन की समग्र स्थिरता से संबंधित है।&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>: &lt;code>ggml-metal&lt;/code> के माध्यम से Metal API सपोर्ट। GPU का उपयोग करके अति-तीव्र इन्फेरेंस।&lt;/li>
&lt;li>&lt;strong>NVIDIA GPU (Windows/Linux)&lt;/strong>: &lt;code>cuBLAS&lt;/code> सपोर्ट। CMake बिल्ड के दौरान &lt;code>-DWHISPER_CUBLAS=ON&lt;/code> निर्दिष्ट करें।&lt;/li>
&lt;li>&lt;strong>Intel (Windows/Linux)&lt;/strong>: &lt;code>OpenVINO&lt;/code> बैकएंड सपोर्ट। नवीनतम Intel Core प्रोसेसर पर NPU का लाभ उठाया जा सकता है।&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{Physical CPU Cores}, 4 \sim 8) $$
&lt;p>यदि आप हाइपर-थ्रेडिंग जैसे लॉजिकल कोर शामिल करते हैं, तो अक्सर कैश कनफ्लिक्ट होते हैं जो वास्तव में इन्फेरेंस गति को कम करते हैं, इसलिए इसे &lt;strong>भौतिक कोरों (Physical Cores) की संख्या&lt;/strong> पर सेट करना एक सख्त नियम है। यदि आप C++11 के &lt;code>std::thread::hardware_concurrency()&lt;/code> का उपयोग करते हैं, तो यह लॉजिकल कोर की संख्या लौटाएगा, इसलिए वातावरण के अनुसार इसे हार्डकोड करने या OS-स्तर के API का उपयोग करके भौतिक कोर प्राप्त करने की अनुशंसा की जाती है।&lt;/p>
&lt;hr>
&lt;h2 id="8-नषकरष">8. निष्कर्ष
&lt;/h2>&lt;p>इस लेख में, हमने &lt;code>whisper.cpp&lt;/code> का उपयोग करके C++ प्रोजेक्ट में बेहतरीन स्पीच रिकग्निशन AI को एकीकृत करने का विस्तार से वर्णन किया है, जिसमें सिद्धांत से लेकर अभ्यास और ऑप्टिमाइज़ेशन तक सब कुछ शामिल है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>इनपुट आवश्यकताओं का अनुपालन&lt;/strong>: 16kHz, 1ch, 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>: &lt;code>ggml&lt;/code> के माध्यम से 4-bit क्वांटाइज़ेशन और Metal/cuBLAS जैसे हार्डवेयर बैकएंड के लाभ।&lt;/li>
&lt;/ul>
&lt;p>कृपया विशाल Python वातावरण या क्लाउड APIs पर निर्भरता को तोड़ने और ऐसे ऑडियो प्रोसेसिंग एप्लिकेशन विकसित करने के लिए &lt;code>whisper.cpp&lt;/code> का उपयोग करें जो नेटिव वातावरण में तेज़ी से और सुरक्षित रूप से काम करते हैं। गोपनीयता सुरक्षा और लेटेंसी के दृष्टिकोण से भविष्य के सॉफ्टवेयर विकास में स्थानीय-केवल (Local-only) AI एक अत्यंत महत्वपूर्ण मुख्य तकनीक बन जाएगा।&lt;/p></description></item></channel></rss>