Skip to content
Blog Programming

Bagaimana Saya Menjernihkan Audio Rekaman Tanpa Meng-encode Ulang Videonya

By Romi Fadli, S.Kom. 20 min read Tooling & Automation
On this page
A video track passing through unchanged above, and an audio waveform losing its low noise teeth while the tall peaks survive below

Pendahuluan

A. Bagian rekaman yang selalu meleset

Rekaman layar adalah dua bagian yang dijahit jadi satu, dan biasanya cuma salah satunya yang keluar jelek. Gambarnya apa pun yang ditulis software perekam, dan ia benar sejak awal — jendelanya memang di sana, kursornya memang bergerak, frame-nya memang mendarat. Audionya sebuah mic di dalam ruangan, dan ruangan punya kulkas, kipas, jalanan di luar, serta laptop yang putarannya naik tiap kali encoder mulai sibuk.

Yang pulang dari satu sesi karena itu timpang: track video yang tak perlu diapa-apakan, dinikahkan dengan track audio yang membawa lantai desis tetap — tak terdengar saat merekam, mustahil diabaikan saat diputar. Rekaman yang mengalami ini berupa screen capture untuk artikel dan demo, video tutorial yang lebih panjang, serta rekaman rapat dan wawancara — tiga bentuk isi yang berbeda dengan cacat yang sama di paruh file yang sama.

Tantangannya: menjernihkan suara sebuah rekaman, sebanyak yang pekerjaannya butuhkan, tanpa watermark dan tanpa batas pemakaian.

Frekuensinya bagian yang menentukan. Satu rekaman beraudio buruk cuma kerepotan yang bisa diselesaikan manual. Merekam secara rutin berarti keseleo satu kalimat, merekam ulang, keseleo di kalimat lain, lalu tiba di satu folder berisi take yang semuanya butuh perlakuan sama. Solusi yang menagih per file, membatasi menit per bulan, atau mencapkan watermark audio ke hasilnya kecuali kita berlangganan, dihargai persis melawan pola pemakaian yang melahirkan kebutuhannya. Yang murah di file pertama jadi mahal di file kelima belas, dan jumlah itu bukan angka yang muluk untuk satu sesi perekaman.

Gampang dirumuskan, canggung dibangun. Kecanggungannya bukan pada peredaman noise-nya, yang ternyata cuma satu filter bawaan program yang sudah ada di kebanyakan mesin. Melainkan pada segala yang mengelilinginya: tidak merusak paruh file yang sudah benar, memilih di antara model yang cuma telinga bisa menilainya, dan segelintir jebakan environment yang memisahkan script yang jalan di mesin sendiri dari script yang jalan saat dipanggil namanya dari mana pun.

B. Apa yang harus dipenuhi "tanpa batas"

Dua syarat lahir dari memproses rekaman berulang kali, dan keduanya mendorong pekerjaannya dikerjakan lokal.

Pertama, hasilnya wajib langsung pakai. Watermark audio — nada, suara orang, atau jeda senyap — bukan persoalan kosmetik di sebuah tutorial; ia cacat pada barang yang mau diserahkan. Tool yang menghasilkan pratinjau lalu menagih untuk membuang capnya bukan menyelesaikan persoalan, melainkan memperagakan solusinya lalu menahannya.

Kedua, bahannya sebaiknya tak meninggalkan mesin. Rekaman rapat dan wawancara memuat suara orang lain, dan mengunggahnya ke sebuah layanan demi kepraktisan adalah keputusan atas data milik orang lain yang diambil sepihak. Mengerjakannya lokal menghapus pertanyaan itu ketimbang menjawabnya. Tak ada syarat layanan yang perlu dibaca, tak ada kebijakan retensi yang perlu dipercaya, dan tak ada yang perlu dijelaskan kepada orang yang suaranya ikut terekam.

Digabung, keduanya mencoret seluruh kategori layanan penjernih online, dan menyisakan pertanyaan mau memakai apa — yang jawabannya ternyata sudah terpasang.

C. Sembilan hambatan yang menghalangi

Layanan penjernih online dihargai melawan pemakaian berulang. Watermark, batas durasi, dan tagihan per file semuanya menggigit paling keras justru pada situasi yang melahirkan kebutuhannya: banyak take dari rekaman yang sama. Alternatif yang saya tolak pantas disebut terus terang, sebab ia langkah pertama yang paling jelas sekaligus yang gagal di file kedua, bukan di file pertama. Percobaan pertama justru mulus, dan itulah yang membuatnya terasa menjanjikan sampai jumlahnya bertambah.

Yang rusak cuma audionya, tapi tool video memperlakukan kedua paruh itu sama. Meng-encode ulang gambar menurunkan mutu bagian yang sudah benar, dan memakan waktu jauh lebih banyak ketimbang pekerjaan audionya. Inilah keputusan inti tool ini, dan inilah yang pantas dibuktikan ketimbang sekadar dinyatakan.

Peredaman noise bukan satu tombol. Ada lima model RNNoise, masing-masing dilatih untuk kombinasi karakter noise dan karakter sinyal yang berbeda, dan beda di antaranya urusan telinga ketimbang urusan angka. Tool yang tak menawarkan pilihan berarti menebak atas nama pemakainya; tool yang menawarkan lima tanpa panduan sama saja tak lebih baik.

Denoise penuh kadang terdengar lebih buruk ketimbang denoise separuh. Membuang seluruh noise bisa membuat suara terdengar tipis dan terlalu diproses, sebab filter-nya tak sanggup memisahkan keduanya dengan sempurna. Penawarnya sebuah kendali campuran, dan keberadaannya adalah pengakuan bahwa mutu audio itu penilaian, bukan pengukuran.

Symlink memutus jalan sebuah program ke file pendampingnya sendiri. Dipanggil lewat /usr/local/bin, cara naif mencari folder sebuah script akan menunjuk ke lokasi symlink-nya, dan file model tidak ada di sana. Hambatan ini muncul justru karena tool ini punya file data di sebelahnya — tool saya sebelumnya yang murni shortcut tak pernah menabraknya.

Bash tak mengekspansi tilde sesudah tanda sama dengan. Ditulis dengan satu cara, path relatif-home tiba sebagai path sungguhan; ditulis dengan cara lain, ia tiba sebagai coretan harfiah. Bedanya tak kelihatan sampai ada yang mengetik bentuk kedua.

Rekaman aslinya wajib selamat. Sebuah take tak bisa direkam ulang begitu ruangan, cahaya, dan kalimatnya sudah bergerak. Tool yang menulis menimpa masukannya cuma berjarak satu ketukan tombol dari memusnahkan bahan yang tak punya cadangan.

Jalan yang mati di tengah tak boleh meninggalkan file separuh tulis yang tampak jadi. Encode makan waktu, dan gangguan terjadi. Keluaran separuh yang duduk di folder tujuan dengan nama yang benar lebih buruk ketimbang tak ada keluaran sama sekali, sebab ia akan dipakai.

Berhasil atau tidak adalah pertanyaan yang mestinya dibantu jawab oleh tool-nya. "Terdengar lebih baik?" itu subjektif, tapi "lantai noise-nya turun sementara puncaknya tetap?" bisa diukur, dan yang kedua proxy yang bagus untuk yang pertama.

Urutannya berjalan dari kenapa tool ini ada, melewati keputusan yang mendefinisikannya, lalu ke penilaian yang subjektif, jebakan environment, dan akhirnya tiga syarat yang wajib dipenuhi sebuah tool agar boleh dipercaya memegang bahan yang tak bisa dibuat ulang.

Metode

A. Filternya memang sudah terpasang

Inilah jawaban atas hambatan pertama: tak ada yang perlu dibeli maupun diunggah, sebab ffmpeg — program command-line gratis untuk mengonversi dan mengolah audio maupun video — membawa peredam noise berbasis neural network bernama arnndn, yang menjalankan model RNNoise secara lokal.

bash
-af "arnndn=m=models/sh.rnnn:mix=1"

Yang ia butuhkan sebuah file bobot. Filternya sendiri sudah dikompilasi ke dalam ffmpeg, tapi model terlatihnya data terpisah, dan tanpa itu filter menolak jalan. Bobot itulah isi folder models/ — lima file, total sekitar 1,5 MB, disimpan di sebelah script ketimbang diunduh saat dibutuhkan, supaya pipeline-nya jalan offline dan hasilnya tahun depan sama dengan hasilnya hari ini.

Tak ada langkah build dan tak ada library yang dipasang, dan justru itulah alasan pendekatan ini lebih murah ketimbang kedengarannya. Saya tidak mengambil alternatif yang sering disarankan — mem-build library RNNoise lalu menyambungkannya ke rantai pemrosesan — karena filternya sudah ada di dalam binary.

B. Menyalin gambarnya, byte demi byte

Ini menjawab hambatan kedua, dan inilah keputusan yang jadi poros seluruh tool. Saya memilih tidak meng-encode ulang gambarnya; gambar itu saya salin.

bash
-map 0:v -c:v copy \
-map 0:a -af "arnndn=m=$MODEL_PATH:mix=$MIX" -c:a aac -b:a "$ABITRATE"

Dua stream, dua perlakuan berbeda. Stream video diteruskan tanpa disentuh, dan cuma audionya yang di-decode, difilter, lalu di-encode ulang.

"Tanpa disentuh" klaim yang kuat, jadi ia pantas diperiksa ketimbang dipercaya. Menghitung hash stream video pada input dan output menjawabnya langsung:

bash
$ ffmpeg -i recording.mp4 -map 0:v -c copy -f md5 -
MD5=6665057e1a0aa5e54aec08268ad994ab

$ ffmpeg -i recording_denoised.mp4 -map 0:v -c copy -f md5 -
MD5=6665057e1a0aa5e54aec08268ad994ab

Identik. Bukan mirip secara visual, bukan cukup dekat — byte yang sama persis. Stream audio dari kedua file itu menghasilkan hash yang berbeda, dan justru itulah pemisahan yang dimaksud: satu paruh ditulis ulang, paruh lainnya diangkut menyeberang tanpa pernah di-decode sama sekali.

Sisi ongkosnya sama terangnya. Pada klip 1080p, memproses dengan penyalinan stream dibanding meng-encode ulang video dengan filter yang sama:

bash
-c:v copy        0.83 s
-c:v libx264     4.58 s

Lima setengah kali, pada dua puluh detik footage uji sintetis. Rasionya yang berarti ketimbang angka mutlaknya: pekerjaan audio itu ongkos kecil yang tetap, dan segala di atasnya adalah harga mengompresi ulang gambar yang sebetulnya tak perlu. Pada tutorial yang direkam dalam satu take panjang, pengali itu beda antara sebuah jeda dengan sebuah rehat kopi — dan di ujung encode ulang, gambarnya terukur lebih buruk ketimbang yang masuk.

C. Lima model, dan sebuah tabel ketimbang tebakan

Ini menjawab hambatan ketiga. Kelima model berbeda pada dua sumbu: jenis noise yang dilatihkan untuk dibuang, dan jenis sinyal yang dilatihkan untuk dipertahankan.

noise ↓ / sinyal →GeneralVoiceSpeech
Generalmplqtidak disertakan
Recordingcbbdsh

"Voice" dan "speech" bukan kolom yang sama: voice mencakup suara manusia yang bukan kata, seperti tawa, sedangkan speech lebih sempit. Rekaman layar bernarasi duduk di persilangan noise rekaman dengan sinyal speech, dan di situlah sh berada — itulah alasan ia jadi default.

Default-nya tidak saya pilih dari tabel saja. Saya mendengarkan kelimanya pada screen capture sungguhan lalu mengambil yang terdengar paling baik, dengan pilihan kedua dicatat untuk saat ia kurang cocok pada suatu rekaman. Itulah prosedur yang jujur untuk penilaian yang dijatuhkan telinga, dan mencatat juara keduanya itulah yang membuat catatan tersebut berguna belakangan.

bash
denoise recording.mp4              # sh, default-nya
denoise recording.mp4 --model=mp   # pilihan kedua

Nama pendeknya diterjemahkan ke file di dalam folder milik program, jadi kasus yang paling sering tak butuh path. Path utuh tetap diterima, untuk model yang tinggal di tempat lain.

D. Kendali campuran, sebab kekuatan penuh tak selalu paling baik

Ini menjawab hambatan keempat. Denoise pada kekuatan penuh bisa meninggalkan suara yang terdengar kopong, dan penawarnya mencampurkan sebagian aslinya kembali.

bash
denoise recording.mp4 --mix=0.7

Efeknya terukur meski penilaiannya tidak. Menjalankan file yang sama pada dua setelan lalu mengukur mean volume-nya memperlihatkan seberapa banyak lantai noise yang dibuang masing-masing:

bash
--mix=1     mean_volume -50.8 dB
--mix=0.3   mean_volume -29.7 dB

Pada kekuatan penuh, lantainya turun jauh; pada 0,3 sebagian besarnya masih ada, sebab sebagian besar aslinya juga masih ada. Tak satu pun dari kedua angka itu yang benar dengan sendirinya — intinya kendali tersebut berpengaruh nyata di sepanjang rentangnya, jadi ia tombol sungguhan ketimbang hiasan.

Alasan ia ada sama sekali: peredaman noise itu tawar-menawar. Yang dibuang model adalah yang ia yakini bukan speech, dan ketika ia keliru sedikit, sebagian suara ikut terbawa. Menahan sebagian aslinya adalah cara membeli kembali bagian yang semestinya tak ia ambil, dengan ongkos menyisakan sebagian desisnya.

Ini menjawab hambatan kelima. Tool ini tinggal di folder project dengan model di sebelahnya, dan dipasang lewat symlink ke /usr/local/bin. Pemasangan itulah yang mematahkan cara naif menemukan file pendamping.

bash
SELF="$(readlink -f -- "${BASH_SOURCE[0]}")"
SCRIPT_DIR="$(cd -- "$(dirname -- "$SELF")" && pwd)"

Tanpa readlink -f, path yang diperiksa adalah path symlink-nya sendiri, dan folder yang diturunkan darinya jadi /usr/local/bin — tempat yang tak punya folder models/, sehingga filter gagal inisialisasi dengan pesan soal file model, bukan soal pemasangannya.

bash
/usr/local/bin/denoise            # yang dipanggil shell
/usr/local/bin/models/sh.rnnn     # tempat pencarian naif mencari — kosong
~/Documents/programs/denoise/models/sh.rnnn   # tempat ia sebenarnya

Menyelesaikan link-nya lebih dulu membuat pencarian menunjuk folder yang sebenarnya, tak peduli tool-nya dipanggil dengan cara apa. Ini jebakan khas tool yang membawa file data; script yang murni shortcut tak punya apa pun di sebelahnya untuk dicari, dan boleh di-symlink ke mana-mana tanpa merasakan bedanya.

F. Tilde yang tiba sebagai coretan

Ini menjawab hambatan keenam, yang kecil, nyata, dan cuma ketahuan lewat pemakaian. Shell mengekspansi ~ jadi home directory pada sebagian posisi dan tidak pada posisi lain.

bash
--source ~/video.mp4     ->  /home/user/video.mp4
--source=~/video.mp4     ->  ~/video.mp4

Dipisah spasi, tilde jadi kata tersendiri dan diekspansi sebelum programnya sempat melihatnya. Ditempelkan sesudah tanda sama dengan, ia bagian dari kata yang lebih panjang, dan shell membiarkannya — jadi program menerima coretan harfiah lalu melaporkan file bernama begitu tidak ada.

Karena tool ini menerima kedua ejaan untuk tiap opsi, ia mengekspansi tilde-nya sendiri ketimbang memberitahukan ejaan mana yang harus dihindari:

bash
expand_tilde() {
  case "$1" in
    "~")   printf '%s' "$HOME" ;;
    "~/"*) printf '%s' "$HOME/${1#\~/}" ;;
    *)     printf '%s' "$1" ;;
  esac
}

Tiga cabang, dan yang ketiga yang penting: apa pun yang tak diawali tilde lewat tanpa berubah, sehingga fungsi ini aman diterapkan ke tiap argumen path tanpa perlu dipikirkan lagi.

G. Menolak memusnahkan aslinya

Ini menjawab hambatan ketujuh. Saya menulis keluarannya di sebelah masukannya dengan suffix disisipkan sebelum ekstensi, dan dua pagar terpisah berdiri antara tool ini dengan rekaman yang hilang.

bash
$ denoise recording.mp4 --suffix=""
Error: output file would overwrite the source; change --suffix or --outdir

$ denoise recording.mp4
Error: output file already exists: recording_denoised.mp4
Use --force to overwrite it.

Pagar pertama membandingkan path keluaran yang sudah diselesaikan dengan path sumber yang sudah diselesaikan, jadi ia menangkap kasus ketika opsinya bersekongkol menunjuk keduanya ke file yang sama. Pagar kedua menolak mengganti hasil yang sudah ada kecuali menimpa memang diminta terang-terangan. Tak satu pun cerdik; keduanya ada sebab masukannya bahan yang tak bisa dibuat ulang, dan rekaman sumber tak layak dijaga cuma dengan mengingat-ingat untuk berhati-hati.

H. Menulis ke tempat lain lebih dulu

Ini menjawab hambatan kedelapan. Saya tidak membiarkan encode menulis langsung ke nama file finalnya. Ia menulis ke file sementara, yang baru dipindahkan ke tempatnya sesudah ffmpeg melaporkan sukses.

bash
tmp="$(mktemp -- "$dest_dir/.denoise.XXXXXX")"
trap cleanup EXIT INT TERM
# ... ffmpeg menulis ke "$tmp_out" ...
mv -- "$tmp_out" "$OUTPUT"

Dua rincian yang mengerjakan pekerjaannya. File sementaranya dibuat di folder tujuan ketimbang di /tmp, yang menjaga rename-nya tetap dalam satu filesystem sehingga atomik — perpindahan antar-filesystem adalah salin lalu hapus, yang punya keadaan separuh jadi yang terlihat, persis jenis yang hendak dihindari ini. Dan trap-nya membuang file sementara bila jalannya terganggu, sehingga encode yang ditinggalkan tak meninggalkan apa pun ketimbang meninggalkan serpihan yang tampak masuk akal.

Hasilnya, nama file keluaran baru muncul begitu ia utuh. Tak ada celah waktu ketika proses lain bisa memungut file separuh lalu memperlakukannya sebagai barang jadi.

I. Melaporkan apa yang berubah

Ini menjawab hambatan kesembilan. Tool ini mengukur audionya sebelum dan sesudah, lalu mencetak keduanya.

bash
Audio level BEFORE:
  mean_volume -26.6 dB
  max_volume  -18.3 dB
Audio level AFTER:
  mean_volume -50.8 dB
  max_volume  -28.2 dB

Kedua angka itu menjawab pertanyaan berbeda. mean_volume dikuasai apa pun yang hadir hampir sepanjang waktu, yang pada rekaman bernoise berarti lantai noise-nya — jadi penurunan besar berarti desis tetapnya sudah pergi. max_volume mengikuti puncak paling keras, yang berarti suaranya, jadi ia mestinya tetap kira-kira di tempatnya. Jalan yang membuat keduanya turun sebanyak yang sama bukan membuang noise; ia mengecilkan segalanya, termasuk yang pantas dipertahankan.

Ini bukan pengganti mendengarkan, dan tak disodorkan sebagai pengganti. Ia cara cepat menangkap kasus ketika filter bertindak terlalu jauh, sebelum satu menit perhatian dihabiskan untuk memutarnya.

Satu penataan lagi membuat tool ini bisa dipakai dari script lain: laporannya pergi ke stderr, dan satu-satunya yang ada di stdout adalah path file yang sudah jadi.

bash
next-stage "$(denoise recording.mp4 | tail -1)"

Pemisahan itu disengaja. Informasi kemajuan untuk orang yang menonton; path-nya adalah nilai balik tool yang sesungguhnya, dan menaruhnya sendirian di stdout membuat tahap berikutnya dalam rantai bisa menelannya tanpa mengurai keterangan di sekitarnya.

Hasil dan Pembahasan

A. Apa yang dijumlahkan kesembilan keputusan itu

Saya belum perlu mengubah tool ini sejak menulisnya, dan rekaman yang diprosesnya kini berjalan dari perekaman sampai audio siap pakai tanpa apa pun meninggalkan mesin. Tabel di bawah adalah rancangannya, satu baris per keputusan.

KeputusanYang dibeliAlternatif yang ditolak
arnndn di ffmpegtanpa unggah, tanpa watermark, tanpa batas per filelayanan penjernih online — dihargai melawan pengulangan
-c:v copyhash stream video identik; 5.5× lebih cepatencode ulang — lebih lambat dan terukur lebih buruk
model dibawa sertajalan offline; hasil yang sama tahun depanunduh saat dibutuhkan — pihak ketiga di dalam pipeline
lima model, tabel didokumentasikantitik awal plus juara kedua yang disebut namanyasatu model dipatok — menebak untuk yang mendengarkan
--mixmembeli kembali suara yang keliru diambil filterselalu kekuatan penuh — terdengar terlalu diproses
readlink -fmenemukan model-nya lewat symlinkpencarian folder naif — patah saat dipasang
expand_tildekedua ejaan opsi sama-sama bekerjamendokumentasikan keanehannya — jebakan dibiarkan
suffix + dua pagaraslinya tak bisa hilang karena kecelakaansunting di tempat — sejengkal dari kehilangan permanen
file sementara + mv atomiknama finalnya cuma pernah memuat file yang utuhmenulis langsung — serpihan yang tampak jadi

B. Ke mana tenaganya sebenarnya pergi

Satu baris di tabel itu adalah fiturnya. Peredaman noise-nya sendiri cuma satu pemanggilan filter, dan seandainya pekerjaannya berhenti di situ, tool ini akan sepanjang satu baris. Selebihnya soal rekaman yang memang bahan sungguhan ketimbang file uji: ia tak bisa dibuat ulang, ia mungkin memuat suara orang lain, ia datang berkelompok, dan ia diumpankan ke tahap berikutnya.

Proporsi itulah pelajaran umumnya. Kemampuan teknis yang menarik — peredam noise berbasis neural network — gratis dan memakan satu baris. Pekerjaannya justru pada menolak merusak paruh yang sudah benar, pada membuat pilihan subjektif bisa dinavigasi ketimbang disembunyikan, dan pada tiga mekanisme terpisah yang ada semata supaya satu kekeliruan atau satu gangguan tak berujung pada hilangnya sebuah rekaman. Tool yang cuma mengerjakan penyaringannya akan bekerja sempurna pada tiap file kecuali file yang justru penting.

Pantas disebut sebagai batas ketimbang kemenangan: ini dibangun untuk rekaman satu orang di satu mesin. Ia memproses satu file per jalan, tanpa paralelisme, dan mengandaikan seluruh file cocok dengan alur encode-lalu-rename. Memproses sekelompok file berarti sebuah loop shell, yang memadai pada skala beberapa take dan takkan memadai pada skala sebuah media library.

C. Yang tidak dijawab pendekatan ini

RNNoise membuang noise yang tetap dan berpita lebar — kipas, desis, dengung. Filter ini bukan tool perbaikan. Rekaman yang clipping, yang mic-nya tersenggol di tengah kalimat, atau yang ada percakapan kedua terdengar di latar takkan diselesaikan model noise, dan menjalankannya lebih keras tak menolong; ia justru mengambil lebih banyak suaranya.

Batas yang sama berlaku pada bentuk pekerjaannya. Tool ini mengandaikan persoalan audionya seragam di sepanjang file, sebab lantai noise sebuah ruangan biasanya memang begitu. Audio yang butuh perlakuan berbeda di tempat berbeda adalah pekerjaan penyuntingan, dan tempatnya di program bertimeline ketimbang di satu perintah yang menerapkan satu setelan ke seluruh durasi.

Simpulan

Sebuah rekaman terdiri dari dua paruh, dan biasanya cuma satu yang rusak. Menjernihkan audionya berulang kali, tanpa watermark maupun batas, cuma butuh filter yang sudah dikompilasi ke dalam ffmpeg — lalu delapan keputusan lain yang sama sekali tak berurusan dengan noise: salin gambarnya ketimbang meng-encode ulang, bawa serta file bobotnya supaya pipeline jalan offline, dokumentasikan tabel model supaya pilihan subjektif punya titik awal, sediakan kendali campuran sebab kekuatan penuh tak selalu paling baik, selesaikan symlink-nya supaya program bisa menemukan file miliknya, ekspansi tilde yang dibiarkan shell, dan pertahankan tiga mekanisme terpisah antara sebuah kekeliruan dengan hilangnya file asli.

Pengukuran yang pantas disimpan adalah hash-nya. Stream video keluarannya identik byte demi byte dengan stream video masukannya, dan itu klaim yang lebih kuat ketimbang "mutunya terjaga" sekaligus jauh lebih gampang diperiksa. Ia juga menjelaskan beda kecepatan 5,5 kali itu: cara tercepat memproses sebuah stream dengan benar adalah tidak memprosesnya sama sekali.

Yang menjaga tool ini tetap kecil adalah sempitnya pekerjaan — satu file, satu mesin, satu persoalan noise yang seragam. Tiap fitur yang tak dimilikinya adalah fitur yang dibuat tak perlu oleh kesempitan tersebut, dan fitur yang dimilikinya sebagian besar ada untuk melindungi bahan yang tak bisa direkam dua kali.

Istilah

ffmpeg
Program command-line gratis untuk mengonversi dan mengolah audio maupun video. Ia membaca rekaman, menjalankan filter noise, lalu menulis hasilnya.
RNNoise
Metode peredaman noise memakai recurrent neural network kecil yang dilatih memisahkan speech dari noise latar. Ditampilkan di ffmpeg sebagai filter arnndn, yang butuh file bobot terlatih untuk berjalan.
stream copy
Meneruskan stream audio atau video dari input ke output tanpa men-decode lalu meng-encode ulangnya. Ditulis -c:v copy; byte keluaran untuk stream itu adalah byte masukannya.
mean_volume / max_volume
Dua angka yang dilaporkan volumedetect milik ffmpeg. Pertama level rata-rata sepanjang file, dikuasai apa pun yang hadir hampir sepanjang waktu; kedua puncak paling keras.
lantai noise
Suara tetap berlevel rendah yang hadir di sebuah rekaman bahkan ketika tak ada yang bicara — kipas, pendingin ruangan, dengung listrik, noise bawaan mic.
rename atomik
Memindahkan file di dalam satu filesystem, yang entah selesai entah tidak; tak ada pengamat yang melihat file setengah dipindahkan. Antar-filesystem, perintah yang sama berubah jadi salin lalu hapus, yang tidak atomik.
file bobot
Parameter hasil pelatihan sebuah neural network, disimpan terpisah dari code yang menjalankannya. Di sini, file .rnnn yang dimuat arnndn saat mulai.

Technologies covered

  • Bash
  • FFmpeg
  • RNNoise

About the author

Photo of Romi Fadli

Romi Fadli, S.Kom.

Solution Architect · Backend Engineer · Embedded Systems

In my day job I work as a solution architect. I design the system, lead the team that builds it — quality assurance, backend developers, a UI developer, DevOps and DevSecOps — and write the most critical modules myself, such as a certificate authority, a long-term PDF signer, and the core API of a personnel system.

I work across the whole stack that a running system actually needs. On the hardware side that means PCB design, microcontrollers, and embedded firmware — including RISC-V boards running FreeRTOS and Embassy, speaking MQTT over mutually authenticated TLS on a microcontroller with 64 KB of SRAM.

Most of my day-to-day work is software: Rust backends and API modules built on Clean Architecture, an OAuth2/OpenID Connect authorization server written from scratch, PAdES document signing, and certificate authorities — root CAs, timestamping authorities, and OCSP responders. I also build the frontends that sit on top of them.

Running all of that means infrastructure: Docker Compose stacks, networking, Mikrotik and RADIUS, observability with OpenTelemetry, and a steady habit of writing command-line tools and utilities for Linux when the existing ones do not fit.

Share

Enjoyed this?

Get an email when a new article is published.

Related Articles