<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Whisper on kenji.blog</title><link>http://kenji.blog/id/tags/whisper/</link><description>Recent content in Whisper on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>id</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 04:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/id/tags/whisper/index.xml" rel="self" type="application/rss+xml"/><item><title>Cara Mengintegrasikan AI Pengenalan Suara (Whisper) ke dalam Proyek C++</title><link>http://kenji.blog/id/p/whisper-cpp-integration-guide/</link><pubDate>Fri, 11 Sep 2026 04:00:00 +0900</pubDate><guid>http://kenji.blog/id/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 Cara Mengintegrasikan AI Pengenalan Suara (Whisper) ke dalam Proyek C++" />&lt;h2 id="1-pengantar-mengapa-menggunakan-c-untuk-pengenalan-suara">1. Pengantar: Mengapa Menggunakan C++ untuk Pengenalan Suara?
&lt;/h2>&lt;p>Model pengenalan suara berakurasi tinggi &amp;ldquo;Whisper&amp;rdquo; yang dikembangkan oleh OpenAI telah dimanfaatkan dalam berbagai aplikasi sejak dijadikan sumber terbuka (open-source). Penggunaannya dalam lingkungan Python (berbasis PyTorch) memang umum, tetapi jika diintegrasikan ke dalam &lt;strong>perangkat edge (ponsel pintar, perangkat IoT, sistem tertanam)&lt;/strong> atau &lt;strong>aplikasi C++ native yang membutuhkan real-time tinggi&lt;/strong> (mesin game, perangkat lunak DAW, robotika, dll.), ketergantungan pada interpreter Python akan menjadi hambatan kinerja (bottleneck) yang signifikan.&lt;/p>
&lt;p>Di sinilah &lt;strong>&lt;a class="link" href="https://github.com/ggerganov/whisper.cpp" target="_blank" rel="noopener"
>whisper.cpp&lt;/a>&lt;/strong> yang dikembangkan oleh Georgi Gerganov hadir sebagai penyelamat. Pustaka ini berbasis &lt;code>ggml&lt;/code>, sebuah pustaka komputasi tensor untuk pembelajaran mesin, yang meminimalkan dependensi hingga batas maksimal dan mewujudkan inferensi Whisper hanya dengan menggunakan C/C++.&lt;/p>
&lt;p>Pada artikel ini, kami akan menjelaskan secara menyeluruh cara mengintegrasikan fitur pengenalan suara terbaik ke dalam proyek C++ Anda sendiri menggunakan &lt;code>whisper.cpp&lt;/code>. Penjelasan mencakup dasar-dasar pemrosesan sinyal suara, cara terperinci menggunakan API, manajemen memori, optimasi multi-threading, hingga pola implementasi pemrosesan real-time.&lt;/p>
&lt;hr>
&lt;h2 id="2-pemrosesan-sinyal-audio-dan-persyaratan-input-whisper">2. Pemrosesan Sinyal Audio dan Persyaratan Input Whisper
&lt;/h2>&lt;p>Agar AI dapat memahami suara, sinyal analog berupa &amp;ldquo;suara&amp;rdquo; perlu diubah menjadi data digital dan diformat ke dalam bentuk yang dapat diproses oleh model AI (tensor). Format audio yang diminta oleh Whisper sangat ketat.&lt;/p>
&lt;h3 id="21-format-audio-yang-diminta-oleh-whisper">2.1 Format Audio yang Diminta oleh Whisper
&lt;/h3>&lt;p>Model Whisper menerima data audio dengan spesifikasi berikut sebagai input:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Frekuensi Sampling (Sample Rate)&lt;/strong>: 16.000 Hz (16 kHz)&lt;/li>
&lt;li>&lt;strong>Jumlah Saluran (Channels)&lt;/strong>: 1 (Mono)&lt;/li>
&lt;li>&lt;strong>Tipe Data (Data Type)&lt;/strong>: Angka floating-point 32-bit (&lt;code>float&lt;/code> dalam C/C++)&lt;/li>
&lt;li>&lt;strong>Normalisasi (Normalization)&lt;/strong>: Nilai diskalakan ke rentang $[-1.0, 1.0]$&lt;/li>
&lt;/ul>
&lt;p>Misalnya, jika Anda menggunakan file audio kualitas CD (44.1kHz, Stereo, 16-bit PCM) sebagai input, Anda harus melakukan downsampling, mixdown saluran, dan konversi format terlebih dahulu.&lt;/p>
&lt;p>Rumus untuk menghitung kecepatan transfer data adalah sebagai berikut:&lt;/p>
$$ \text{Data Rate (bytes/sec)} = \text{Sample Rate} \times \text{Channels} \times \frac{\text{Bit Depth}}{8} $$
&lt;p>Ukuran data untuk 1 detik dengan persyaratan Whisper (16kHz, 1ch, 32-bit Float) adalah:&lt;/p>
$$ 16000 \times 1 \times \frac{32}{8} = 64,000 \text{ bytes/sec (64 KB/s)} $$
&lt;p>Karena ukurannya sangat ringan, buffering dapat dilakukan dengan mudah bahkan pada perangkat edge dengan bandwidth memori yang terbatas.&lt;/p>
&lt;h3 id="22-matematika-transformasi-mel-spectrogram">2.2 Matematika Transformasi Mel-Spectrogram
&lt;/h3>&lt;p>Secara internal, Whisper tidak memproses data bentuk gelombang audio 1D (Raw Waveform) secara langsung. Data tersebut dikonversi ke &lt;strong>Mel-Spectrogram&lt;/strong>, sebuah representasi frekuensi yang mendekati karakteristik pendengaran manusia, sebelum dimasukkan ke model Transformer. Pustaka &lt;code>whisper.cpp&lt;/code> menyertakan proses konversi ini di dalam implementasi C++-nya, namun memahami cara kerjanya akan berguna untuk mitigasi noise dan optimasi prapemrosesan.&lt;/p>
&lt;p>Rumus aproksimasi untuk mengubah frekuensi normal $f$ (Hz) ke skala Mel $m$ adalah sebagai berikut:&lt;/p>
$$ m = 2595 \log_{10} \left( 1 + \frac{f}{700} \right) $$
&lt;p>Sebaliknya, transformasi balik dari skala Mel ke frekuensi adalah:&lt;/p>
$$ f = 700 \left( 10^{\frac{m}{2595}} - 1 \right) $$
&lt;p>Selanjutnya, bentuk gelombang audio diubah ke domain waktu-frekuensi menggunakan &lt;strong>Short-Time Fourier Transform (STFT)&lt;/strong>. Bentuk diskret STFT menggunakan fungsi jendela $w(n)$ direpresentasikan sebagai berikut:&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>(Di mana $N$ adalah ukuran jendela FFT, $H$ adalah ukuran hop, dan $w(n)$ adalah fungsi jendela seperti jendela Hann)&lt;/em>&lt;/p>
&lt;p>Model Whisper biasanya menggunakan ukuran jendela $N = 400$ (25ms), ukuran hop $H = 160$ (10ms), dan 80 dimensi filter bank Mel. Ekstraksi fitur ini dijalankan secara otomatis (dan dengan cepat menggunakan instruksi SIMD) saat memanggil &lt;code>whisper_full()&lt;/code> di dalam &lt;code>whisper.cpp&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="3-arsitektur-dan-desain-pipeline">3. Arsitektur dan Desain Pipeline
&lt;/h2>&lt;p>Mari kita merancang pipeline pemrosesan audio dalam aplikasi C++. Prosesnya dimulai dari input file atau mikrofon, berlanjut ke prapemrosesan, inferensi oleh &lt;code>whisper.cpp&lt;/code>, hingga menghasilkan output teks.&lt;/p>
&lt;div class="mermaid">graph TD
A["Sumber Audio (Mikrofon/File)"] -->|Byte Mentah, mis. 48kHz Stereo| B["Dekoder Audio &amp; Resampler (FFmpeg/miniaudio)"]
B -->|16kHz Mono 32-bit Float| C["Ring Buffer / Array Memori"]
C -->|Masukkan Data PCM| D["Inti whisper.cpp (ggml)"]
D --> E["Ekstraksi Mel Spectrogram"]
E --> F["Transformer Encoder-Decoder"]
F --> G["Generasi Token Teks"]
G --> H["Output Teks (String UTF-8)"]&lt;/div>
&lt;p>Bagian yang menjadi tanggung jawab aplikasi Anda adalah &lt;strong>zona dari A hingga C pada diagram di atas (dekode dan resample audio)&lt;/strong>. Karena &lt;code>whisper.cpp&lt;/code> sendiri tidak menyertakan dekoder file audio, praktik terbaiknya adalah dengan mengombinasikannya dengan pustaka seperti FFmpeg atau &lt;code>miniaudio&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="4-build-dan-integrasi-whispercpp">4. Build dan Integrasi whisper.cpp
&lt;/h2>&lt;p>Berikut adalah langkah-langkah untuk mengintegrasikan &lt;code>whisper.cpp&lt;/code> ke dalam proyek Anda. Menggunakan CMake adalah metode yang paling serbaguna.&lt;/p>
&lt;h3 id="konfigurasi-cmakeliststxt">Konfigurasi CMakeLists.txt
&lt;/h3>&lt;p>Anda dapat menyertakan &lt;code>whisper.cpp&lt;/code> sebagai kode sumber (source code) ke dalam proyek Anda, atau menambahkannya sebagai submodule lalu menautkannya.&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"># Mengaktifkan ekstensi instruksi CPU (AVX, F16C, dll.)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Pada MacOS, framework NEON/Accelerate akan diaktifkan secara otomatis
&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>Konfigurasi ini akan mem-build backend &lt;code>ggml&lt;/code> dari &lt;code>whisper.cpp&lt;/code> yang sangat dioptimalkan, lalu menautkannya secara statis ke aplikasi Anda.&lt;/p>
&lt;hr>
&lt;h2 id="5-detail-dan-langkah-langkah-implementasi-c-api">5. Detail dan Langkah-langkah Implementasi C++ API
&lt;/h2>&lt;p>Selanjutnya, kami akan menjelaskan cara menggunakan API dengan melihat kode C++ yang sebenarnya.&lt;/p>
&lt;h3 id="51-inisialisasi-konteks-dan-memuat-model">5.1 Inisialisasi Konteks dan Memuat Model
&lt;/h3>&lt;p>Dalam &lt;code>whisper.cpp&lt;/code>, semua status dan alokasi memori dikelola oleh struktur &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. Inisialisasi parameter
&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">// Gunakan akselerasi GPU (CuBLAS/Metal) jika tersedia
&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. Memuat model (model biner dalam 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;Error: Gagal memuat model - &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;Model berhasil dimuat.&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>File model memiliki format &lt;code>.bin&lt;/code> yang dikuantisasi secara khusus. Anda dapat menggunakan skrip konversi di repositori resminya, atau mengunduhnya langsung dari HuggingFace. Pada lingkungan dengan memori terbatas, menggunakan model kuantisasi 4-bit (misalnya &lt;code>ggml-base-q4_0.bin&lt;/code>) dapat mengurangi konsumsi RAM hingga sekitar 1/4.&lt;/p>
&lt;h3 id="52-pengaturan-parameter-inferensi">5.2 Pengaturan Parameter Inferensi
&lt;/h3>&lt;p>Selanjutnya, atur &lt;code>whisper_full_params&lt;/code> untuk mengontrol perilaku inferensi.&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. Mengatur parameter untuk full inferensi (menggunakan 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">// Pengaturan jumlah thread (paling ideal disamakan dengan jumlah core fisik 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">// Pengaturan bahasa (&amp;#34;auto&amp;#34; untuk deteksi otomatis, &amp;#34;id&amp;#34; untuk bahasa Indonesia, &amp;#34;ja&amp;#34; untuk bahasa Jepang)
&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">// Menekan standard output hasil sementara (untuk dikontrol di dalam aplikasi)
&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">// Fitur terjemahan (set ke true jika ingin menerjemahkan suara langsung ke teks bahasa Inggris)
&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-persiapan-data-audio-dan-eksekusi-inferensi">5.3 Persiapan Data Audio dan Eksekusi Inferensi
&lt;/h3>&lt;p>Di sini, kita asumsikan bahwa data audio 16kHz telah disimpan di dalam &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">// Data audio virtual (pada kenyataannya data PCM didapat dari file atau mikrofon)
&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 detik (16000 Hz * 3 detik = 48000 sampel)
&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. Eksekusi inferensi
&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;Error: Eksekusi whisper_full gagal.&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-ekstraksi-hasil">5.4 Ekstraksi Hasil
&lt;/h3>&lt;p>Setelah &lt;code>whisper_full&lt;/code> selesai dieksekusi, hasil pengenalan suara akan disimpan per segmen di dalam konteks.&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. Mengambil dan menampilkan hasil
&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">// Mendapatkan timestamp (satuan: 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. Pembebasan memori
&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>Blok kode ini merupakan template paling mendasar untuk menggunakan Whisper di C++.&lt;/p>
&lt;hr>
&lt;h2 id="6-implementasi-lanjutan-untuk-pengenalan-suara-real-time">6. Implementasi Lanjutan untuk Pengenalan Suara Real-time
&lt;/h2>&lt;p>Memproses rekaman file memang mudah, tetapi untuk meningkatkan UX aplikasi, diperlukan &amp;ldquo;pengenalan suara real-time (streaming)&amp;rdquo; dari input mikrofon.&lt;/p>
&lt;p>Untuk mengimplementasikannya, arsitektur multi-threading dan manajemen aliran audio melalui ring buffer (Ring Buffer) sangatlah penting.&lt;/p>
&lt;div class="mermaid">graph LR
subgraph "Thread Audio (Prioritas Tinggi)"
A["API Pengambilan Audio (CoreAudio/WASAPI/ALSA)"] -->|Callback| B["Resampler (ke 16kHz)"]
B --> C["Ring Buffer"]
end
subgraph "Thread Utama / Worker"
C -->|Ambil chunk 30ms-1000ms| D["Deteksi Aktivitas Suara (VAD)"]
D -->|Jika ucapan terdeteksi| E["Akumulasi Buffer PCM"]
E -->|Picu Inferensi| F["whisper_full()"]
F --> G["Perbarui UI/Teks"]
end&lt;/div>
&lt;h3 id="61-pentingnya-voice-activity-detection-vad">6.1 Pentingnya Voice Activity Detection (VAD)
&lt;/h3>&lt;p>Dalam pemrosesan real-time, mengeksekusi inferensi pada bagian tanpa suara akan membuang-buang sumber daya komputasi. Dengan menempatkan algoritma VAD (seperti pemrosesan threshold berbasis energi sederhana atau WebRTC VAD) di tahapan awal, Anda dapat menerapkan sistem kontrol di mana &lt;strong>&amp;ldquo;buffering hanya dimulai ketika ucapan terdeteksi, dan &lt;code>whisper_full&lt;/code> dieksekusi ketika ucapan berakhir (setelah periode tanpa suara tertentu)&amp;rdquo;.&lt;/strong>&lt;/p>
&lt;h3 id="62-pendekatan-jendela-geser-sliding-window">6.2 Pendekatan Jendela Geser (Sliding Window)
&lt;/h3>&lt;p>Jika ucapan berlangsung lama, digunakan metode &amp;ldquo;jendela geser&amp;rdquo; di mana inferensi dilakukan dengan memotong (chunking) audio setiap beberapa detik. Namun, jika Anda memotong audio secara asal, kata-kata mungkin terpotong di tengah dan akurasi pengenalan suara akan menurun drastis.&lt;/p>
&lt;p>Sebagai solusinya, digunakan metode &lt;strong>&amp;ldquo;overlap&amp;rdquo;&lt;/strong>, di mana inferensi selalu menyertakan konteks dari N detik terakhir. Pustaka &lt;code>whisper.cpp&lt;/code> juga memiliki fitur &lt;code>wparams.prompt_tokens&lt;/code> yang meneruskan token teks sebelumnya sebagai prompt, memungkinkan pengenalan suara streaming dengan akurasi tinggi sambil mempertahankan konteks pembicaraan.&lt;/p>
&lt;hr>
&lt;h2 id="7-manajemen-memori-dan-optimasi-untuk-perangkat-edge">7. Manajemen Memori dan Optimasi untuk Perangkat Edge
&lt;/h2>&lt;p>Mari kita gali lebih dalam mengenai efisiensi performa dan memori, yang merupakan keunggulan terbesar dari &lt;code>whisper.cpp&lt;/code>.&lt;/p>
&lt;h3 id="71-kehebatan-pustaka-tensor-ggml">7.1 Kehebatan Pustaka Tensor ggml
&lt;/h3>&lt;p>Backend dari &lt;code>whisper.cpp&lt;/code>, yaitu &lt;code>ggml&lt;/code>, adalah pustaka tensor berbasis C tanpa dependensi eksternal. Fitur terbesarnya adalah dukungannya untuk &lt;strong>kuantisasi dinamis (Quantization) dari data bobot (weight)&lt;/strong>.&lt;/p>
&lt;p>Misalnya, mari kita hitung ukuran memori dari model Whisper &lt;code>Small&lt;/code> (sekitar 240 juta parameter).
Untuk ukuran normal (Float 16-bit = 2 byte):&lt;/p>
$$ \text{Memory (FP16)} \approx 244,000,000 \times 2 \text{ bytes} \approx 488 \text{ MB} $$
&lt;p>Jika dikonversi ke kuantisasi 4-bit (format Q4_0), ukuran rata-rata setiap parameternya menjadi 0,5 byte (sekitar 0,56 byte termasuk overhead koefisien penskalaan).&lt;/p>
$$ \text{Memory (Q4\_0)} \approx 244,000,000 \times 0.56 \text{ bytes} \approx 137 \text{ MB} $$
&lt;p>Pada lingkungan yang memiliki RAM sangat terbatas seperti perangkat iOS atau Raspberry Pi, pengurangan memori ini berkorelasi langsung dengan stabilitas keseluruhan aplikasi.&lt;/p>
&lt;h3 id="72-pemanfaatan-akselerasi-perangkat-keras">7.2 Pemanfaatan Akselerasi Perangkat Keras
&lt;/h3>&lt;p>Meskipun instruksi AVX2 atau NEON pada CPU tunggal sudah cukup cepat, &lt;code>whisper.cpp&lt;/code> juga mendukung berbagai bentuk akselerasi perangkat keras GPU dan NPU pada backend-nya.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Apple Silicon (Mac/iOS)&lt;/strong>: Dukungan API Metal melalui &lt;code>ggml-metal&lt;/code>. Inferensi super cepat menggunakan GPU.&lt;/li>
&lt;li>&lt;strong>GPU NVIDIA (Windows/Linux)&lt;/strong>: Dukungan &lt;code>cuBLAS&lt;/code>. Tetapkan &lt;code>-DWHISPER_CUBLAS=ON&lt;/code> saat build menggunakan CMake.&lt;/li>
&lt;li>&lt;strong>Intel (Windows/Linux)&lt;/strong>: Mendukung backend &lt;code>OpenVINO&lt;/code>. Anda dapat memanfaatkan NPU pada prosesor Intel Core terbaru.&lt;/li>
&lt;/ul>
&lt;p>Saat menggunakan akselerator tersebut dalam proyek C++, pada dasarnya Anda tidak perlu mengubah kode sumber. Selama &lt;code>cparams.use_gpu = true;&lt;/code> disetel saat inisialisasi konteks, pemrosesan akan otomatis dioffload ke perangkat keras berdasarkan backend yang dibuild.&lt;/p>
&lt;h3 id="73-tuning-cache-dan-jumlah-thread">7.3 Tuning Cache dan Jumlah Thread
&lt;/h3>&lt;p>Pengaturan &lt;code>wparams.n_threads&lt;/code> sangat krusial. Menambah jumlah thread secara berlebihan tidak akan meningkatkan performa karena adanya bottleneck (Memory Bound) pada bandwidth memori.&lt;/p>
&lt;p>Sebagai aturan praktis, sangat ideal untuk menentukan jumlah thread dengan rumus berikut:&lt;/p>
$$ N_{\text{threads}} = \min(\text{Jumlah Core Fisik CPU}, 4 \sim 8) $$
&lt;p>Sangat disarankan untuk menyetel ke &lt;strong>jumlah core fisik&lt;/strong>, karena menyertakan core logis (seperti pada Hyper-Threading) sering kali memicu kompetisi cache yang justru memperlambat laju inferensi. Jika Anda memanggil &lt;code>std::thread::hardware_concurrency()&lt;/code> dari C++11, nilai yang dikembalikan adalah jumlah core logis. Karena itu, direkomendasikan untuk melakukan hard-coding yang sesuai dengan lingkungan, atau mendapatkan informasi core fisik melalui API pada tingkat OS.&lt;/p>
&lt;hr>
&lt;h2 id="8-kesimpulan">8. Kesimpulan
&lt;/h2>&lt;p>Pada artikel ini, kami telah menjelaskan secara rinci tentang cara memanfaatkan &lt;code>whisper.cpp&lt;/code> untuk mengintegrasikan AI pengenalan suara canggih ke dalam proyek C++, mulai dari teori, praktik, hingga langkah-langkah optimasinya.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Memenuhi Persyaratan Input&lt;/strong>: Memastikan penggunaan 16kHz, 1ch, 32-bit Float.&lt;/li>
&lt;li>&lt;strong>Penggunaan API yang Intuitif&lt;/strong>: Desain yang sederhana di mana inferensi diselesaikan hanya dengan &lt;code>whisper_init_from_file_with_params&lt;/code> dan &lt;code>whisper_full&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Pemrosesan Real-time&lt;/strong>: Kontrol multi-threading dengan VAD dan metode Jendela Geser.&lt;/li>
&lt;li>&lt;strong>Optimasi yang Luar Biasa&lt;/strong>: Manfaat kuantisasi 4-bit oleh &lt;code>ggml&lt;/code> dan backend perangkat keras seperti Metal/cuBLAS.&lt;/li>
&lt;/ul>
&lt;p>Silakan manfaatkan &lt;code>whisper.cpp&lt;/code> untuk memutus ketergantungan pada lingkungan Python yang berat atau API cloud, serta mewujudkan pengembangan aplikasi pemrosesan suara yang dapat beroperasi secara cepat dan aman di lingkungan native. AI yang berjalan secara lokal niscaya akan menjadi teknologi kunci dalam pengembangan perangkat lunak masa depan, terutama dari sisi perlindungan privasi dan latensi.&lt;/p></description></item></channel></rss>