# Speech-to-Text Bahasa Indonesia di Production: WER Whisper Nyata

> Setiap word error rate bahasa Indonesia yang dipublikasikan selalu milik sebuah benchmark. Ini angka sebenarnya, alasan code-switching merusak semua model, dan berapa biaya self-hosting.

URL: https://www.matthewswong.com/id/blog/speech-to-text-bahasa-indonesia-production/

- Author: Matthews Wong (https://www.matthewswong.com/id/about/)
- Published: 2026-09-18
- Updated: 2026-09-18
- Category: AI

> **Key takeaway:** Paper Whisper dari OpenAI mencatat word error rate 7,1 persen untuk bahasa Indonesia di FLEURS dengan large-v2, tetapi FLEURS berisi ucapan bersih yang dibacakan. Evaluasi independen pada ucapan spontan menaikkan angka itu sekitar dua kali lipat, dan code-switching Indonesia-Inggris memperburuknya jauh lebih dalam. Pilih model speech-to-text dengan mengukurnya pada tiga puluh menit rekaman Anda sendiri, bukan pada benchmark yang dipublikasikan.

Ini satu kalimat yang mungkin diucapkan seorang agent customer service Indonesia empat puluh kali sehari: tolong follow up invoice yang outstanding itu ya, nanti saya forward ke finance. Tiga belas kata, lima di antaranya bahasa Inggris, dalam susunan kalimat Indonesia, diucapkan dengan kecepatan percakapan lewat saluran telepon 8 kHz. Semua angka word error rate bahasa Indonesia yang bisa Anda temukan diukur pada audio yang sama sekali tidak menyerupai itu.

Tulisan ini berisi angka-angkanya lengkap dengan benchmark yang menyertainya. Paper Whisper sendiri memuat tabel per bahasa yang hampir tidak pernah dikutip orang, sebuah evaluasi Indonesia tahun 2024 menerbitkan angka yang sangat berbeda untuk model yang sama, dan sebuah studi code-switching tahun 2024 menerbitkan angka yang paling pantas membuat Anda khawatir. Setelah itu: di mana language detection salah jalan, parameter mana yang penting untuk bahasa Indonesia, cara melakukan chunking pada rekaman panggilan panjang, dan berapa biaya GPU dibandingkan tarif per menit.

## Angka WER Indonesia yang dikutip semua orang diukur pada audio yang tidak Anda miliki

Mulai dari angka primernya. Appendix D paper Whisper memuat Table 13, WER pada FLEURS, dirinci per bahasa dan per ukuran model. Kolom bahasa Indonesia berbunyi: tiny 51,7, base 33,1, small 16,3, medium 10,2, large 8,5, large-v2 7,1. Itu pengukuran OpenAI sendiri atas model OpenAI sendiri, dan dari sanalah hampir semua klaim yang beredar bahwa Whisper mencapai sekitar 7 persen untuk bahasa Indonesia berasal.

Sekarang angka keduanya. Pada Oktober 2024 sebuah tim menerbitkan evaluasi model multilingual untuk ucapan bahasa Indonesia dengan variasi yang sengaja dicampur, disusun menjadi korpus 80,54 jam dari rapat parlemen, berita, Common Voice, FLEURS, podcast dan talkshow. Pada test set itu whisper-small mencatat WER 30,87. Model yang sama mencatat 16,3 di FLEURS. Tidak ada yang berubah selain audionya.

Pembagian di dalam paper itu adalah bagian yang layak diingat. whisper-small mencapai WER 27,22 pada ucapan yang dibacakan, formal dan bersih, lalu 40,66 pada ucapan spontan, informal dan bersih. Itu tiga belas poin penurunan tanpa tambahan noise sama sekali, murni karena penuturnya berhenti membaca teks. Versi fine-tuned dari whisper-small kemudian mencatat 14,85 secara keseluruhan, kurang dari setengah error model aslinya. Word error rate yang dikutip tanpa benchmark-nya adalah angka marketing, dan setiap angka di bawah ini membawa benchmark-nya masing-masing.

## Enam opsi yang layak dipertimbangkan serius

Opsi-opsi ini tidak terbelah rapi menjadi open dan managed, dan juga tidak terurut berdasarkan harga. Kolom akurasi selalu menyebut benchmark-nya, dan jika sebuah angka adalah klaim vendor sendiri, hal itu dinyatakan.

| Opsi | WER bahasa Indonesia, dan diukur di mana | Perkiraan biaya per jam audio | Bentuk latency | Jebakan operasionalnya |
| --- | --- | --- | --- | --- |
| Whisper small, self-hosted | 16,3 di FLEURS; 30,87 di set Indonesia 80 jam dengan variasi campuran | Hanya waktu GPU | Batch, sekitar 2 GB VRAM | Runtuh pada ucapan spontan, WER 40,66 di bagian informal |
| Whisper large-v2, self-hosted | 7,1 di FLEURS, dari tabel OpenAI sendiri | Hanya waktu GPU | Batch, sekitar 10 GB VRAM | Lisensi MIT, tetapi queue, retry dan GPU-nya jadi tanggungan Anda |
| Whisper small yang di-fine-tune untuk bahasa Indonesia | 14,85 di set campuran yang sama, dibanding 30,87 versi standar | Waktu GPU plus satu training run | Batch, footprint 2 GB yang sama | Anda butuh audio Indonesia berlabel, dan itu bagian yang mahal |
| API whisper-1 dari OpenAI | Bobot yang sama dengan large-v2, jadi 7,1 di FLEURS | Sekitar $0,36 | Hitungan detik per request | Batas 25 MB per request, jadi panggilan panjang harus di-chunk dulu |
| ElevenLabs Scribe | Vendor mengklaim 2,4 persen di FLEURS untuk Scribe v1 | Sekitar $0,22 | Hitungan detik, tier realtime lebih mahal | Benchmark dijalankan vendor sendiri, dan halaman yang sama juga menyebut 3,1 persen |
| Deepgram Nova-3 dengan language dikunci ke id | Tidak ada angka Indonesia resmi; ElevenLabs mencantumkan Nova-2 di 10,4 persen pada FLEURS | Sekitar $0,26 | Streaming, di bawah satu detik | Mode code-switching miliknya sendiri sama sekali tidak mencakup bahasa Indonesia |

Ubah semua harga menjadi biaya per jam audio sebelum membandingkan apa pun. OpenAI mencantumkan $0,006 per menit untuk whisper-1 dan $0,003 untuk gpt-4o-mini-transcribe, Deepgram mencantumkan $0,0043 per menit untuk Nova-3 pre-recorded pada tarif pay-as-you-go, dan ElevenLabs mencantumkan $0,22 per jam audio untuk Scribe v2 serta $0,39 untuk tier realtime. Kutipan per menit dan per jam berjarak enam puluh kali lipat, dan itu kesalahan yang mudah sekali terjadi di dalam spreadsheet.

> Harga list sebagaimana dipublikasikan tiap vendor:

Harga API OpenAI

Harga API ElevenLabs

Harga Deepgram

## Code-switching adalah titik di mana speech recognition bahasa Indonesia benar-benar patah

Kembali ke kalimat pembuka tadi. Ini bukan penyerapan kata. Follow up, invoice, outstanding dan forward adalah kata bahasa Inggris dengan fonologi Inggris, dijatuhkan ke dalam sintaksis bahasa Indonesia oleh penutur yang fasih keduanya dan tidak sedang memberi aba-aba peralihan kepada siapa pun. Percakapan kantor di Indonesia penuh dengan pola ini, begitu pula percakapan klinik, percakapan tim lapangan, dan apa pun yang melibatkan sistem yang layarnya dirancang dalam bahasa Inggris.

Arsitektur Whisper mengambil satu keputusan di titik ini yang menjelaskan sebagian besar kerusakannya. Decoder-nya mengeluarkan satu language token lebih dulu, satu token dari himpunan sembilan puluh sembilan bahasa, diprediksi sebelum ada teks transkrip sama sekali, dan paper-nya menyatakan dengan jelas bahwa hal ini terjadi sekali per jendela audio tiga puluh detik. Semua yang muncul sesudahnya di-decode dengan syarat pilihan itu. Tidak ada cara menyatakan bahwa jendela ini berbahasa Indonesia kecuali empat kata di dalamnya. Model harus memilih satu sisi, lalu mengeja bahasa yang lain menurut cara sisi yang dipilihnya mengeja.

Besarannya terdokumentasi. Sebuah studi tahun 2024 melatih ASR pada 24 jam audio Inggris dan 40 jam audio Indonesia lalu mengukur character error rate dengan tiga cara. Monolingual Inggris: 2,43 persen. Monolingual Indonesia: 4,10 persen. Code-switching Indonesia-Inggris hasil sintesis: 37,57 persen. Code-switching Indonesia-Inggris yang alami, spontan dan sedikit berisik: 91,76 persen. Itu character error rate, bukan word error rate, dan diukur pada Speech-Transformer, bukan pada Whisper, jadi jangan memindahkan angkanya. Pindahkan bentuknya: model yang membaca bahasa Indonesia pada 4 persen CER dan bahasa Indonesia ber-code-switching pada 92 persen bukan sedang menurun, melainkan gagal.

Metode semi-supervised mereka, sebuah machine speech chain yang dilatih pada audio code-switching tanpa label, menurunkan kasus sintesis ke 18,56 persen dan kasus alami hanya sampai 82,62 persen. Perbaikan pada data sintetis besar dan pada data alami kecil, dan justru itulah temuannya: audio code-switching yang bersih adalah masalah rekayasa yang bisa diselesaikan, sedangkan audio code-switching spontan yang berisik masih menjadi riset terbuka.

> Kalau Anda memilih managed API karena ia mengiklankan code-switching, bacalah daftar bahasanya, bukan daftar fiturnya. Multilingual Codeswitching milik Deepgram diaktifkan dengan language=multi, dan pada Nova-3 mode itu mencakup Inggris, Spanyol, Prancis, Jerman, Hindi, Rusia, Portugis, Jepang, Italia dan Belanda. Bahasa Indonesia memang didukung Nova-3, tetapi hanya ketika Anda mengunci language=id, yaitu mode satu bahasa, yang justru merupakan mode yang tidak bisa melakukan code-switching.

## Parameter language menentukan lebih banyak daripada modelnya

Baris paling menentukan dalam sebuah panggilan Whisper adalah baris yang justru sering dihilangkan orang. Baca whisper/transcribe.py: kalau Anda tidak mengirim language, fungsi itu menjalankan detect_language pada maksimal tiga puluh detik pertama, mengambil argmax-nya, menuliskan pemenangnya ke decode_options, dan memakainya untuk seluruh file. Satu tebakan, diambil dari bagian pembuka, diterapkan pada semua yang datang sesudahnya. Sebuah panggilan berbahasa Indonesia yang dibuka dengan sapaan bahasa Inggris dan nama perusahaan berbahasa Inggris adalah panggilan di mana detector punya peluang nyata memilih English lalu men-decode empat puluh menit bahasa Indonesia di bawah prior bahasa Inggris.

Mengunci language ke id memperbaiki hal itu dan memunculkan masalah yang lebih kecil sebagai gantinya: setiap kata bahasa Inggris di dalam audio kini di-decode di bawah prior bahasa Indonesia. Untuk audio bisnis Indonesia itu pertukaran yang tepat, karena bahasa Indonesia adalah matrix language dan bahasa Inggris yang tersisip hanya minoritas token. Tetap saja itu pertukaran, bukan perbaikan, dan initial_prompt adalah tuas yang sebagian mengompensasinya. Memberi decoder istilah bahasa Inggris yang Anda harapkan, ditulis dalam ejaan Inggris, menaikkan probabilitasnya tanpa menyentuh language token sama sekali.

Managed API membawa jebakan yang sama dengan dampak lebih luas, karena deteksi berjalan per request dan rekaman panjang berarti banyak request. Kunci bahasanya pada setiap chunk, atau terimalah bahwa chunk ketujuh bisa berbeda pendapat dengan chunk keenam soal bahasa apa yang dipakai di panggilan itu.

> Setel condition_on_previous_text ke False untuk rekaman panggilan. Nilai defaultnya True, yang berarti output tiap jendela dimasukkan sebagai prompt untuk jendela berikutnya. Itu bagus untuk konsistensi dan fatal ketika satu jendela meleset, karena repetition loop yang dihasilkannya lalu merambat maju ke semua jendela sesudahnya. Docstring Whisper sendiri menyebut kegagalan persis ini.

## Chunking, keheningan, dan tembok dua puluh lima megabyte

Endpoint transkripsi OpenAI membatasi upload pada 25 MB, dan panduannya menyuruh Anda memecah file yang lebih besar sambil menghindari potongan di tengah kalimat. Paruh kedua instruksi itulah yang penting dan justru paling sering dilewati. Memotong rekaman dua jam setiap sepuluh menit berdasarkan jam akan menjatuhkan sebagian potongan tepat di tengah kata, dan Whisper tidak mengembalikan separuh kata di kedua sisi sambungan. Ia mengembalikan satu kata utuh yang terdengar meyakinkan dan tidak pernah diucapkan.

Potonglah pada keheningan. Jalankan voice activity detector di seluruh file, ambil region ucapannya, kemas menjadi chunk sampai batas ukuran atau durasi Anda, dan letakkan setiap batas di dalam jeda. Biayanya nyaris nol dan ia menghapus satu kelas kesalahan yang selain itu tidak terlihat sampai ada orang membaca transkripnya dengan teliti.

Silero VAD adalah yang biasa saya pakai: berlisensi MIT, dipasang dengan pip install silero-vad, tanpa key dan tanpa registrasi, dan mendukung 8000 Hz serta 16000 Hz secara native, yang sangat penting untuk bagian berikutnya. README-nya melaporkan satu chunk 30 ms diproses di bawah 1 ms pada satu thread CPU, jadi menjalankannya di seluruh rekaman panjang sebelum transkripsi praktis gratis.

snakers4/silero-vad

## Audio call center itu delapan kilohertz, dan itu adalah plafonnya

Whisper melakukan resample pada setiap input ke 16.000 Hz sebelum menghitung mel spectrogram-nya. Hal itu dinyatakan di bagian arsitektur paper-nya dan bukan sebuah setting. Rekaman call center di Indonesia datang pada 8 kHz karena itulah yang dibawa jalur telepon, dan menaikkan 8 kHz ke 16 kHz tidak memulihkan apa pun, sebab tidak ada sinyal di atas 4 kHz di dalam file yang bisa dipulihkan. Model itu berjalan pada separuh bandwidth yang dimiliki distribusi pelatihannya.

Saya belum menemukan pengukuran khusus bahasa Indonesia tentang berapa biayanya, dan saya tidak akan mengarangnya. Yang bisa saya katakan adalah hal ini membuat semua angka yang dipublikasikan dalam tulisan ini tidak berlaku untuk audio telepon tanpa pengukuran ulang, karena FLEURS dan Common Voice sama-sama wideband. Tiga hal layak dikerjakan sebelum Anda menerima kerugian itu:

- Minta rekaman sebelum mixdown. Kebanyakan platform panggilan bisa menyimpan agent dan pelanggan di channel terpisah. Dua file mono yang ditranskrip terpisah mengalahkan satu file tercampur plus speaker diarisation, dan hasilnya pasti, bukan probabilistik.
- Kalau yang Anda punya hanya mono, perlakukan diarisation sebagai cadangan, bukan default. WhisperX membungkus Whisper dengan diarisation pyannote dan forced alignment, jadi sediakan anggaran untuk waktu GPU tambahan dan untuk menyetujui syarat gated model di Hugging Face sebelum semuanya bisa berjalan.
- Pertahankan satu sample rate dari ujung ke ujung. Silero VAD pada 8 kHz untuk audio 8 kHz sudah benar, dan menaikkan semuanya ke 16 kHz lebih dulu supaya pipeline terlihat seragam hanya menambah satu resample tanpa membeli apa pun.

Aturan umumnya, sebuah pipeline sebaiknya menyentuh audio sesedikit mungkin, dan setiap konversi di dalamnya harus konversi yang alasannya bisa Anda sebutkan.

## Berapa biaya self-hosting dibandingkan tarif per menit

Biaya komputasinya murah dan aritmetikanya tidak intuitif, jadi berikut hitungannya secara utuh. README faster-whisper mem-benchmark large-v2 pada fp16 dengan batch size 8, mentranskrip 13 menit audio dalam 17 detik di RTX 3070 Ti, yang berarti sekitar 46 kali real time. RunPod mencantumkan RTX 4090 pada $0,34 per jam di tier community-nya. Dua angka publik itu adalah satu-satunya input yang dibutuhkan perhitungan ini.

> Dua input tersebut, keduanya dipublikasikan:

Benchmark faster-whisper

Harga GPU RunPod

Jadi satu GPU yang dibiarkan menyala sebulan penuh berbiaya kira-kira setara dengan 680 jam transkripsi OpenAI, atau 949 jam Deepgram, atau 1.113 jam ElevenLabs Scribe. Di bawah sekitar 23 jam audio per hari, managed API jelas lebih murah dan Anda tidak perlu menulis kode apa pun untuk sampai ke sana. Di atas angka itu GPU menang di atas kertas, tetapi lihat duty cycle-nya: 680 jam audio pada 46 kali real time itu kurang dari 15 jam GPU, jadi mesin yang Anda sewa bulanan menganggur selama 98 persen waktunya.

Sehingga versi jujur dari argumen ini begini. Sewa GPU per detik, bukan per bulan, dan biaya komputasinya runtuh menjadi beberapa dolar saja, dan pada titik itu yang sebenarnya Anda bayar adalah orkestrasi, cold start, logika retry, dan orang yang harus bangun jam dua pagi. Harga bukan alasan untuk self-hosting. Audio yang tidak boleh keluar dari infrastruktur Anda sendiri adalah alasan. Keinginan melakukan fine-tune pada data Indonesia Anda sendiri, yang menurut hasil 14,85 itu memang layak dilakukan, adalah alasan. Menghemat dua ratus dolar sebulan bukan alasan.

## Yang tidak akan diceritakan angka-angka yang dipublikasikan

Semua angka WER dalam tulisan ini, termasuk yang paling saya percaya, dihitung setelah text normalization, dan paper Whisper terbuka mengakui bahwa mereka mengembangkan normalizer mereka sendiri dan bahwa normalizer itu umumnya menghasilkan WER lebih rendah daripada pembandingnya. Normalisasi menentukan apakah Rp 1.500.000 dan satu juta lima ratus ribu rupiah dihitung sebagai jawaban yang sama. Untuk bahasa Indonesia, dengan angkanya, gelarnya, dan spasi imbuhannya yang tidak konsisten, satu pilihan itu menggeser skor lebih jauh daripada kebanyakan pilihan model.

Jadi perlakukan WER yang dipublikasikan sebagai batas bawah. Audio benchmark dibacakan oleh penutur yang kooperatif ke mikrofon yang layak, pada bandwidth penuh, dalam satu bahasa. Audio Anda adalah orang yang sedang tertekan di telepon, di ruangan berkipas, beralih ke bahasa Inggris untuk setiap kata benda yang berasal dari layar ERP, dengan logat daerah yang nyaris tidak terlihat oleh data pelatihan. Satu-satunya angka yang memprediksi pengalaman production Anda adalah angka yang Anda ukur sendiri.

1. Ambil tiga puluh sampai enam puluh menit rekaman nyata, disampel dari kondisi yang benar-benar Anda hadapi, bukan dari yang bersih-bersih saja.
2. Transkrip manual satu kali, dan catat aturan normalisasi yang Anda pakai selama mengerjakannya.
3. Nilai setiap kandidat model terhadap referensi itu dengan normalizer yang sama, dan catat benchmark asal setiap angka vendor supaya selisihnya tetap terlihat.
4. Jalankan ulang setiap kali Anda mengubah chunking, sample rate atau parameter language. Ketiganya menggeser skor, dan hanya satu dari ketiganya yang merupakan modelnya.

Set referensi itu memakan waktu satu sore dan akan menjadi aset paling berguna dalam proyeknya. Ia juga satu-satunya hal yang bisa memberi tahu Anda apakah code-switching menyumbang 5 persen token Anda atau 30 persen, dan angka itulah yang menentukan apakah seluruh rencana ini layak atau tidak.

Perlakukan setiap word error rate bahasa Indonesia yang dipublikasikan sebagai pernyataan tentang sebuah benchmark, bukan tentang audio Anda. Kunci parameter language, potong pada keheningan alih-alih pada jam, pertahankan sample rate yang Anda terima, dan bangun set referensi internal tiga puluh menit sebelum memilih apa pun. Empat keputusan itu akan menggerakkan kualitas transkrip Anda lebih jauh daripada pilihan modelnya.

## Sumber dan bacaan lanjutan

- Radford dkk., Robust Speech Recognition via Large-Scale Weak Supervision, arXiv 2212.04356 - Table 13, WER pada FLEURS
- openai/whisper di GitHub - ukuran model, VRAM, lisensi MIT, dan language detection di transcribe.py
- Adila dkk., Enhancing Indonesian Automatic Speech Recognition: Evaluating Multilingual Models with Diverse Speech Variabilities, arXiv 2410.08828
- Tazakka dkk., Indonesian-English Code-Switching Speech Recognition Using the Machine Speech Chain Based Semi-Supervised Learning, SIGUL 2024
- Panduan speech-to-text API OpenAI - batas 25 MB, parameter language, dan prompting
- Halaman speech-to-text bahasa Indonesia ElevenLabs - klaim FLEURS dan Common Voice dari vendor sendiri
- Deepgram Multilingual Codeswitching - daftar bahasa di balik opsi multi

## Source links

- https://arxiv.org/abs/2212.04356
- https://github.com/openai/whisper
- https://arxiv.org/abs/2410.08828
- https://aclanthology.org/2024.sigul-1.18/
- https://developers.openai.com/api/docs/guides/speech-to-text
- https://elevenlabs.io/speech-to-text/indonesian
- https://developers.deepgram.com/docs/multilingual-code-switching

## FAQ

### Berapa word error rate Whisper untuk bahasa Indonesia?

Paper Whisper dari OpenAI mencatat WER 7,1 persen untuk bahasa Indonesia pada benchmark FLEURS dengan large-v2, dan 16,3 persen dengan whisper-small. FLEURS berisi ucapan bersih yang dibacakan, jadi angka itu adalah batas bawah, bukan ramalan. Evaluasi independen tahun 2024 pada korpus Indonesia 80,54 jam yang memuat ucapan spontan mencatat whisper-small di WER 30,87, kira-kira dua kali angka FLEURS-nya.

### Kenapa speech-to-text bahasa Indonesia memburuk saat penutur menyisipkan kata bahasa Inggris?

Whisper memprediksi satu language token per jendela audio tiga puluh detik, sebelum mengeluarkan teks transkrip apa pun, sehingga seluruh jendela di-decode sebagai bahasa Indonesia atau bahasa Inggris. Sebuah studi code-switching Indonesia-Inggris tahun 2024 mengukur character error rate 4,10 persen pada bahasa Indonesia monolingual dan 91,76 persen pada ucapan ber-code-switching alami dengan model yang sama. Code-switching adalah sumber error terbesar pada audio kantor dan call center Indonesia yang nyata.

### Sebaiknya saya mengunci parameter language ke id atau membiarkan Whisper mendeteksinya?

Kunci saja. Fungsi transcribe milik Whisper menjalankan language detection hanya pada maksimal tiga puluh detik pertama lalu menerapkan satu tebakan itu ke seluruh file, sehingga sapaan bahasa Inggris di awal bisa membuat empat puluh menit bahasa Indonesia di-decode di bawah prior bahasa Inggris. Managed API mendeteksi per request, jadi kunci juga bahasanya di setiap chunk.

### Apakah self-hosting Whisper lebih murah daripada managed speech-to-text API untuk bahasa Indonesia?

Hanya di atas volume yang cukup tinggi. Satu GPU pada harga list RunPod $0,34 per jam berbiaya sekitar $245 sebulan, yang setara dengan kira-kira 680 jam transkripsi OpenAI pada tarif publiknya $0,006 per menit. Di bawah sekitar 23 jam audio per hari managed API lebih murah dan tidak butuh kode, jadi alasan sebenarnya untuk self-hosting adalah data residency dan fine-tuning, bukan harga.

### Apakah Whisper bisa menangani rekaman call center Indonesia yang 8 kHz?

Bisa jalan, tetapi semua WER yang dipublikasikan berhenti berlaku. Whisper me-resample semua input ke 16.000 Hz, dan menaikkan rekaman telepon 8 kHz tidak menambah informasi apa pun di atas 4 kHz, sehingga model bekerja pada separuh bandwidth yang dipakai saat pelatihannya. Mintalah rekaman sebelum mixdown ke platform panggilan Anda, dan ukur akurasinya pada audio Anda sendiri sebelum memilih vendor mana pun.

---

- HTML version: https://www.matthewswong.com/id/blog/speech-to-text-bahasa-indonesia-production/
- English: https://www.matthewswong.com/en/blog/speech-to-text-bahasa-indonesia-production/
- Site index for agents: https://www.matthewswong.com/llms.txt
- Sitemap: https://www.matthewswong.com/sitemap.xml
- API description (OpenAPI): https://www.matthewswong.com/openapi.json
