Voice to Color - Real-time Audio-to-Visual iOS App

Native iPhone app yang mengubah karakter akustik suara menjadi warna, grafik, emotion timeline, dan interpretasi mood secara real-time.

Role
iOS Developer
Ownership
Solo builder: SwiftUI interface, audio capture, DSP feature extraction, affect mapping, visualization, replay, speech recognition, AI integration, dan testing
Company
Personal Project
Client
iPhone users
Team
Solo builder
Period
2026 - present
Focus
iOS, iOS Developer, Swift, Mobile Developer

Overview

Voice to Color adalah aplikasi iPhone yang menganalisis karakter akustik suara dari microphone secara lokal, lalu menerjemahkannya menjadi warna, grafik, dan interpretasi mood. Aplikasi menampilkan live audio chart saat listening, emotion timeline setelah sesi dihentikan, serta session summary berbasis energi, valence, arousal, dan emotion family.

Project ini juga mengeksplorasi replay audio sementara, transcript Speech Recognition, dan analisis AI/roasting opsional setelah pengguna menekan Analyze & Roast. Audio mentah tidak dibuat menjadi file dan tidak diunggah ke server.

Tech & Libraries

Teknologi dan library yang dipakai atau disentuh di project ini:

SwiftSwiftUISwift ChartsAVAudioSessionAVAudioEngineAVAudioPCMBufferAVAudioPlayerNodeAccelerate/vDSPSpeechSwift ConcurrencyMainActorURLSessionOpenAI-compatible 9Router

Problem

Sinyal suara kaya akan informasi seperti energi, perubahan frekuensi, ketajaman, jeda, dan noise, tetapi sulit dipahami pengguna dalam bentuk audio mentah. Tantangannya adalah membuat visualisasi yang terasa real-time dan menarik sambil menjaga interpretasi tetap jujur: warna dan mood harus diposisikan sebagai pembacaan karakter suara, bukan diagnosis atau kepastian emosi.

My Role & Ownership

Solo builder: SwiftUI interface, audio capture, DSP feature extraction, affect mapping, visualization, replay, speech recognition, AI integration, dan testing

Technical Approach

Membangun native iOS app dengan SwiftUI, AVAudioEngine, Accelerate/vDSP, dan Swift Charts. Microphone buffer diproses lokal untuk menghitung RMS energy, adaptive noise floor, signal-to-noise estimation, FFT magnitude, spectral sharpness, dan spectral flux. Fitur yang dinormalisasi dipetakan ke valence serta arousal oleh AffectMapper ruleset, kemudian dirender sebagai live chart, warna, dan timeline sesi.

Speech Recognition membuat transcript sementara; setelah sesi selesai, ringkasan terstruktur dan transcript dapat dikirim ke endpoint OpenAI-compatible 9Router untuk analisis playful yang dibatasi agar tidak menjadi diagnosis psikologis.

Architecture Notes

Aplikasi memisahkan capture audio, temporary RAM storage, analysis, affect mapping, replay, view-model state, dan rendering.

  1. AVAudioSession dan AVAudioEngine menangani permission, microphone input, audio tap, interruption, serta lifecycle start/stop.
  2. AudioMath dan Accelerate/vDSP mengekstrak fitur numerik tanpa mengirim audio mentah keluar perangkat.
  3. AffectMapper adalah ruleset deterministic yang memetakan valence/arousal ke emotion family; ini bukan API emosi bawaan iOS atau model ML universal.
  4. VoiceVisualizerViewModel menjadi boundary state dan MainActor delivery ke SwiftUI.
  5. Swift Charts merender live audio chart dan emotion timeline dari data ringkas, sementara AVAudioPlayerNode mereplay buffer RAM secara bounded.

Trade-offs

Project memilih analisis lokal dan ruleset deterministic agar privacy, latency, dan explainability lebih baik untuk versi awal.

  1. Audio hanya disimpan sementara di RAM; konsekuensinya replay dan sesi dibatasi buffer/duration serta tidak tersedia setelah discard atau app lifecycle berakhir.
  2. Energy-change dipakai sebagai proxy pitch/rhythm pada implementasi saat ini, bukan true pitch tracking atau speech-tempo detection; model yang lebih kaya dapat ditambahkan di fase berikutnya.
  3. 9Router/OpenAI-compatible analysis bersifat opsional dan hanya menerima transcript serta ringkasan setelah consent lewat tombol Analyze & Roast; production sebaiknya memindahkan request ke backend agar API key tidak dapat diekstrak dari aplikasi.

Implementation Highlights

  • Real-time microphone capture dengan AVAudioEngine audio tap dan lifecycle-safe start/stop.
  • RMS energy, adaptive noise floor, signal-to-noise estimation, FFT magnitude, spectral sharpness, dan spectral flux menggunakan Accelerate/vDSP.
  • Deterministic AffectMapper yang memetakan fitur audio ke valence, arousal, emotion family, dan color palette.
  • Swift Charts untuk rolling live audio chart serta emotion timeline per segmen sesi.
  • Bounded in-memory PCM replay memakai AVAudioPlayerNode tanpa membuat file rekaman.
  • Speech Recognition dan optional AI analysis yang hanya berjalan setelah sesi dihentikan dan pengguna menekan Analyze & Roast.
  • SwiftUI/MainActor state boundary melalui VoiceVisualizerViewModel serta focused tests untuk normalization, mapping, replay limits, dan state transitions.

Results

  • Menerjemahkan sinyal audio mentah menjadi pengalaman visual yang dapat dipahami tanpa mengklaim membaca emosi pengguna secara absolut.
  • Live audio capture, feature extraction, affect mapping, live chart, emotion timeline, session summary, local replay, adaptive noise detection, dan Speech Recognition terimplementasi.
  • Audio mentah tetap lokal di perangkat, tidak dibuat menjadi file rekaman, dan tidak diunggah ke server.
  • Interpretasi mood dikomunikasikan sebagai karakter suara yang terdengar, bukan klaim diagnosis psikologis atau pembacaan perasaan absolut.
  • Xcode build berhasil; validasi microphone, speaker, dan kualitas deteksi di iPhone fisik tetap menjadi tahap manual berikutnya.
  • 21 commit pada branch main per 2026-08-12.
  • 15 deklarasi test XCTest terdeteksi pada unit dan UI test target.
  • 1 native iOS app dengan 9 source Swift utama dan 2 file dokumentasi desain.
  • 1 privacy boundary: audio mentah tidak dibuat menjadi file dan tidak ditransmisikan ke server.

Links