Voice to Color adalah aplikasi iPhone yang mengubah karakter suara menjadi visual dan interpretasi mood secara real-time.
Aplikasi ini tidak mencoba membaca pikiran atau menentukan emosi pengguna secara mutlak. Aplikasi menganalisis karakter akustik suara—seperti energi, perubahan frekuensi, ketajaman, jeda, dan noise—lalu menerjemahkannya menjadi warna, grafik, dan kesimpulan mood.
Suara dari microphone
→ analisis audio lokal
→ fitur akustik
→ valence + arousal
→ emotion family
→ warna dan grafik
→ kesimpulan sesi
Contoh interpretasi visual:
- Hijau/teal: suara cenderung tenang dan stabil.
- Merah: energi tinggi dan perubahan tajam, dapat terasa tegang atau kesal.
- Biru: energi rendah dan cenderung murung.
- Ungu: energi tinggi tetapi tidak stabil.
- Kuning/oranye: energi positif atau meningkat.
Warna merupakan interpretasi visual yang dapat dikalibrasi, bukan aturan universal bahwa satu emosi selalu memiliki satu warna.
Aplikasi menampilkan Live Audio Chart yang bergerak mengikuti suara saat ini. Grafik memperlihatkan:
- level energi/volume sebagai area dan garis utama;
- spectral sharpness sebagai garis pembanding;
- warna chart yang mengikuti mood suara saat ini.
Aplikasi membuat Emotion Timeline dari seluruh sesi. Setiap bagian timeline memiliki warna berdasarkan mood yang terdeteksi pada bagian tersebut.
Contohnya, sesi dapat terlihat seperti:
tenang ─ tenang ─ tegang ─ tenang ─ antisipasi
hijau hijau merah hijau oranye
Aplikasi juga menampilkan ringkasan yang lebih mudah dipahami, misalnya:
Karakter suaramu terdengar tenang dan cukup stabil, dengan kecenderungan positif ringan. Ada perubahan singkat menuju antisipasi.
- Analisis suara real-time.
- Live audio chart menggunakan Swift Charts.
- Emotion timeline setelah sesi selesai.
- Session summary berupa energi rata-rata, peak, valence, arousal, mood dominan, dan mood sekunder.
- Replay sesi secara lokal.
- Speech Recognition untuk membuat transcript sementara.
- Analisis AI dan roasting opsional setelah sesi selesai.
- Penyimpanan audio sementara di RAM dengan batas buffer.
- Adaptive noise floor untuk membantu membaca suara lemah dan kebisingan ruangan.
- Signal-to-noise estimation.
- Tidak membuat file rekaman.
- Tidak mengunggah audio ke server.
- SwiftUI — UI dan layout.
- Swift Charts — live chart dan emotion timeline.
- AVAudioSession — permission dan konfigurasi audio.
- AVAudioEngine — microphone capture dan audio tap.
- AVAudioPCMBuffer — buffer PCM sementara.
- Accelerate/vDSP — windowing, FFT, magnitude, spectral sharpness, dan spectral flux.
- AVAudioPlayerNode — replay audio dari buffer RAM.
- Swift concurrency dan MainActor — pengiriman state ke UI.
- Speech — transcript suara sementara.
- URLSession — request ke endpoint OpenAI-compatible 9Router.
Mengukur kekuatan suara dari setiap buffer PCM.
rms = sqrt(sum(sample²) / jumlah sample)
Nilai ini memengaruhi energy, tinggi grafik, brightness, dan arousal.
Aplikasi memperkirakan baseline noise ketika suara sedang rendah. Baseline tersebut dipakai untuk membedakan sinyal pengguna dari suara ambient ruangan.
signalToNoise = (energy - noiseFloor) / noiseFloor
Ini membantu pada lingkungan seperti kantor atau coffee shop, tetapi tidak dapat memulihkan suara yang sepenuhnya tertutup noise.
FFT mengubah sampel audio dari domain waktu menjadi spektrum frekuensi. Spectral sharpness membantu membaca apakah karakter suara lebih rendah/dull atau lebih tajam/tinggi.
Spectral flux membandingkan spektrum frame sekarang dengan frame sebelumnya. Nilai tinggi menunjukkan perubahan suara yang mendadak dan dapat memengaruhi tension, pulse, atau warna.
Fitur audio yang telah dinormalisasi dan di-smoothing dipetakan ke dua dimensi:
valence: cenderung negatif ↔ positif;arousal: energi rendah ↔ energi tinggi.
Kemudian AffectMapper memilih emotion family seperti Trust, Sadness, Anger, Fear, Joy, Surprise, Disgust, atau Anticipation.
AffectMapper adalah ruleset produk yang dibuat dan diuji di dalam aplikasi. Ini bukan API bawaan iOS dan bukan model machine learning universal.
Setelah sesi dihentikan, aplikasi otomatis mengirim data ringkas berikut ke 9Router dan memasukkan hasil roasting ke kartu SESSION SUMMARY:
- transcript sementara;
- mood dominan dan mood sekunder;
- energi rata-rata dan peak;
- valence dan arousal;
- durasi sesi.
Konfigurasi default:
Base URL: https://9router.103-59-94-121.nip.io/v1
Model: codexCombo
Endpoint: /chat/completions
API key disimpan di file konfigurasi lokal yang di-ignore Git untuk development. Untuk production, pindahkan request ini ke backend agar key tidak dapat diekstrak dari aplikasi iPhone.
Roasting dibuat playful dan tidak boleh menjadi diagnosis psikologis atau mengarang isi ucapan.
Audio diproses secara lokal di perangkat.
- Audio mentah hanya berada sementara di RAM selama sesi.
- Replay hanya dilakukan ketika pengguna menekan Replay.
- Tombol Discard menghapus buffer sesi.
- Tidak ada file audio yang dibuat.
- Tidak ada upload atau transmisi audio mentah.
- Transcript dan ringkasan hanya dikirim ke AI setelah pengguna menekan
Analyze & Roast. - Permission microphone diminta setelah pengguna menekan Start.
ConvertAudioToColor/
├── ContentView.swift
├── Models.swift
├── AudioMath.swift
├── AudioAnalyzer.swift
├── AIAnalysisService.swift
├── AudioServices.swift
├── AffectMapper.swift
├── VoiceVisualizerViewModel.swift
└── ConvertAudioToColorApp.swift
Implementasi saat ini sudah mencakup live audio capture, audio analysis, affect mapping, live chart, emotion timeline, session summary, replay lokal, adaptive noise detection, Speech Recognition, dan integrasi opsional 9Router untuk analisis transcript serta roasting melalui tombol Analyze & Roast setelah sesi dihentikan.
Build aplikasi berhasil dilakukan dengan Xcode. Validasi microphone, speaker, dan kualitas deteksi tetap perlu dilakukan di iPhone fisik karena Simulator tidak mewakili input microphone nyata.
Hasil aplikasi harus dibaca sebagai:
“Karakter suara ini terdengar seperti...”
bukan:
“Pengguna pasti sedang merasakan emosi ini.”
Suara keras belum tentu marah, suara pelan belum tentu sedih, dan warna emosi dapat dipengaruhi konteks, budaya, perangkat, jarak microphone, serta noise ruangan.