NoisyBoy adalah aplikasi desktop (fokus awal: macOS) yang menghilangkan suara berisik (background noise) dari microphone secara real-time menggunakan AI, mirip Krisp.ai. Output audio bersih dialirkan ke aplikasi konferensi (Zoom, Google Meet, Discord, dll) lewat sebuah virtual microphone.
- Tangkap audio mic fisik → denoise dengan AI → keluarkan ke virtual mic.
- Latency rendah (target < 20ms end-to-end untuk terasa "live").
- UI toggle on/off, pilih input device, indikator level suara.
[Mic Fisik] --> [NoisyBoy: capture] --> [AI Denoise] --> [Virtual Mic Output]
|
v
[Zoom / Meet memilih "NoisyBoy Mic"]
Kunci: aplikasi konferensi tidak bicara langsung ke mic fisik. Mereka memilih virtual mic kita sebagai input. Inilah bagian tersulit & paling penting.
- Framework: Flutter Desktop (macOS).
- State management:
flutter_bloc(BLoC pattern, cocok untuk stream audio state). - Tanggung jawab: kontrol UI, toggle noise suppression, pilih device, visualisasi level audio (waveform / VU meter), pengaturan.
- Catatan: Flutter TIDAK memproses audio. Flutter hanya UI + kontrol. Semua audio berjalan di native layer demi latency rendah.
- Bahasa: Rust (cross-platform, memory-safe, no GC pause → cocok audio real-time).
- Audio I/O:
cpal— capture mic & output, cross-platform (macOS/Windows/Linux). Tak perlu nulis Swift/CoreAudio manual. - Threading: audio callback jalan di thread real-time Rust. DSP + denoise di dalam callback → latency minimal, no glitch.
- Jembatan Flutter <-> Rust:
flutter_rust_bridge— auto-generate binding type-safe, support async & stream (untuk kirim event level audio ke UI).- Kontrol (on/off, pilih device) via panggilan fungsi Rust.
- Event level audio via Rust
Stream→ DartStream. - Pemrosesan audio real-time TIDAK melewati Flutter — murni di Rust.
Note
Keuntungan Rust: cpal + nnnoiseless = cross-platform. Windows support (fase 2)
jadi jauh lebih murah, tak perlu tulis ulang audio layer.
Important
Ini komponen TERSULIT. Membuat virtual mic di macOS butuh sebuah Audio Server Plugin (kernel/driver-level extension).
Opsi:
- A. AudioDriverKit (macOS 12+, modern, System Extension). Resmi Apple,
butuh entitlement
com.apple.developer.driverkit(perlu approval Apple + Developer ID). - B. CoreAudio HAL Plugin (cara lama, seperti BlackHole). Lebih mudah dibangun,
tapi user harus install
.driverbundle ke/Library/Audio/Plug-Ins/HAL. - Referensi open-source: BlackHole adalah virtual audio driver open-source (GPL) yang bisa jadi basis / referensi.
Rencana MVP: adaptasi konsep BlackHole untuk membuat virtual device "NoisyBoy Mic". NoisyBoy menulis audio bersih ke device ini.
Diproses di dalam Rust (di audio thread), bukan di Dart.
Opsi model:
| Engine | Kualitas | Latency | Ukuran | Catatan |
|---|---|---|---|---|
| nnnoiseless | Baik | Sangat rendah | kecil | Port RNNoise murni Rust, no C deps. Pilihan MVP. |
| DeepFilterNet | Sangat baik | Rendah | ~2MB | Rust-native, ada crate df. Kualitas mendekati Krisp. Fase 2. |
| RNNoise (C via bindgen) | Baik | Sangat rendah | ~85KB | Kalau butuh RNNoise asli. Alternatif. |
- MVP:
nnnoiseless— port RNNoise murni Rust, tanpa dependency C, integrasi mulus dengancpal. Bekerja pada 48kHz frame 480 sample. - Fase 2: DeepFilterNet — punya crate Rust
native (
deep_filter), kualitas premium mendekati Krisp.
| Layer | Teknologi |
|---|---|
| UI | Flutter (macOS), Bloc |
| Bridge | flutter_rust_bridge |
| Audio I/O | Rust cpal (cross-platform) |
| Denoise | Rust nnnoiseless → DeepFilterNet (fase 2) |
| Virtual Mic | Audio Server Plugin native macOS (BlackHole-based / AudioDriverKit) |
Important
Virtual mic driver TETAP native macOS (C/Swift). Rust tidak bisa gantikan ini — Audio Server Plugin wajib CoreAudio HAL / AudioDriverKit. Rust urus capture + denoise; driver virtual mic komponen native terpisah (milestone 4).
flowchart TD
A[Mic Fisik] -->|cpal capture| B[Rust Audio Engine]
B -->|PCM frames| C[nnnoiseless Denoise - Rust]
C -->|clean PCM| D[Virtual Mic Driver - NoisyBoy Mic - native macOS]
D -->|selected as input| E[Zoom / Meet / Discord]
B -.level events via flutter_rust_bridge stream.-> F[Flutter UI]
F -.control on/off/device.-> B
[x]Capture mic fisik via Rustcpal.[x]Integrasinnnoiselessuntuk denoise real-time + Intelligent VAD Gating.[x]UI Flutter: toggle on/off, pilih input device, VU meter & real-time level visualizer.[x]Virtual mic "NoisyBoy Audio" (native macOS CoreAudio HAL Plugin).[x]Routing audio bersih ke virtual mic (Meeting Mode vs Speaker Test Mode).[x]macOS MenuBar Tray (Status bar icon, quick controls, background execution).[ ]Persist pengaturan.
[ ]DeepFilterNet (kualitas premium).[ ]Echo cancellation.[ ]Noise suppression untuk speaker/output (bukan hanya mic).[ ]Windows support.
Warning
Virtual mic driver adalah risiko terbesar. Butuh code signing, System Extension approval, dan (untuk AudioDriverKit) entitlement khusus Apple. Tanpa Apple Developer account berbayar + Developer ID, distribusi sulit.
Caution
Latency: audio real-time HARUS diproses di native. Mengirim frame audio melewati Flutter MethodChannel akan menyebabkan latency tinggi & glitch.
- Kompleksitas: proyek ini campuran Flutter + Rust + driver native macOS. Bukan proyek Flutter murni. Rust kurangi kompleksitas audio (cross-platform), tapi virtual mic driver tetap butuh native macOS.
- Distribusi: notarization Apple diperlukan agar user bisa install.
- Apple Developer Account: TIDAK punya akun berbayar. Target user: diri sendiri saja (personal use). Jadi tak perlu notarization; jalan di mesin sendiri (developer mode).
- Strategi virtual mic: BlackHole (HAL plugin). Dipakai saat milestone 4.
- Scope MVP: Buktikan denoise dulu — loopback (mic → denoise → speaker), baru virtual mic menyusul.
- Nama produk: NoisyBoy.
- Milestone 1: Flutter macOS app +
flutter_rust_bridgesetup. Rustcpalcapture mic → play balik ke speaker (loopback). Buktikan pipeline audio jalan.[SELESAI] - Milestone 2: Integrasi
nnnoiseless→ denoise di loopback + Intelligent VAD Gate. Dengar hasil bersih.[SELESAI] - Milestone 3: UI Flutter (toggle, device picker, VU meter) + stream level via bridge.
[SELESAI] - Milestone 4: Virtual mic driver native macOS (NoisyBoy Audio) + routing.
[SELESAI] - Milestone 5: Packaging macOS installer (.pkg & .dmg with auto CoreAudio activation).
[SELESAI]