Building Galena AI

Galena AI (branded in-app as Galenia) is a web dashboard that analyzes phone call audio and decides whether the voice is AI-generated or human. It shows the model’s verdict and confidence, keeps a searchable history of requests, and exposes interactive performance metrics for the six detectors the team trained. Built at HackMTY, then trimmed into a free public demo.

What it does

Detector

Upload a WAV file — the default option — or send the audio as Base64. The JSON payload comes prefilled (call_id, sample_rate, channels), so only the Base64 audio is needed, and a built-in converter turns any uploaded WAV into Base64. The site validates the file in the browser (stereo, 8 kHz, 16-bit PCM, up to ~2 minutes), sends it server-side to the model API, and returns a Human / AI verdict with a confidence gauge (0–1). The detector can be chosen per request.

History

Log-style table of recent detections with search, filters, export, and a detail view — including real request latency. In the demo it is stored in the browser, so no account or database is needed.

API & model pages

ModulePurpose
DetectorWAV upload or prefilled Base64 JSON, WAV-to-Base64 converter, verdict and confidence gauge
HistorySearchable request log with filters, export and details
APIModel connection settings, public endpoints, request/response examples
ModelROC and precision-recall curves, confusion matrix, score distribution, monthly trend, model comparison
AccountOptional demo login (any email, stored locally), profile and preferences

Spanish / English interface with light and dark themes.

Model API

A FastAPI service serves the six ONNX synthetic voice detectors, ranked by average performance on the evaluation call sets:

DetectorFamily
Everest (1st)Galena, client-only histogram gradient boosting
Fuji (2nd)Acoustic combined
Mont Blanc (3rd)Acoustic Hispanic
ExperimentalGalena full (stereo) logistic regression, Galena client-only, acoustic baseline

The browser never talks to the model directly — the site calls it from the server (MODEL_API_URL). confidence is the confidence in the verdict itself: p_synthetic when the call is flagged as synthetic, 1 - p_synthetic when it is human.

Tech stack

LayerChoice
FrameworkTanStack Start (React 19, SSR) + TypeScript + Vite
UIshadcn/ui (Radix) + Tailwind CSS v4
Data fetchingTanStack Query
ChartsRecharts
ValidationZod
Demo dataBrowser storage (history and demo login)
Model servicePython + FastAPI + ONNX Runtime
DeploySite on Vercel (Nitro); model API on Render in Docker, kept awake with UptimeRobot

Development process

Galena AI pairs a TanStack Start frontend with a FastAPI inference service running ONNX Runtime models. The hackathon build used Supabase for auth and history on a VPS; the public demo runs on free tiers without a database.

Frontend shell

  • Scaffolded the dashboard with shadcn/ui, sidebar navigation, and file-based routes for detector, history, API, model, and account pages.
  • Built the detector, history, and metrics screens with mocked predictions so the full UX was navigable before the backend existed.
  • Added charts with Recharts and ES/EN i18n with light/dark themes.

Branding and hosting fixes

  • Removed scaffold tooling and branding, and shipped a new crystal icon as favicon and logo that adapts to the theme.
  • Fixed login and copy-to-clipboard buttons when served over plain HTTP.

Real models

  • Wrapped the team’s six .onnx detectors in a FastAPI service with /detect and /health endpoints.
  • Redefined confidence as confidence in the verdict.

Hackathon deployment

  • Connected authentication and detection history to Supabase.
  • Added base-path support to serve a separate /dev instance on the VPS and recorded real request latency.
  • Made the default detector configurable via environment variable.

Free public demo

  • Moved the site to Vercel: the build detects Vercel and switches Nitro to its preset.
  • Removed Supabase: login became an optional demo login and history moved to browser storage, so the demo needs no keys or accounts.
  • Packaged the model API in Docker for Render’s free tier, which sleeps after 15 minutes idle; UptimeRobot pings /health to keep it awake.

Detector UX and limits

  • Made WAV upload the default input, prefilled the JSON so only Base64 audio is required, and added a WAV-to-Base64 converter.
  • Validated file size in the browser against Vercel’s 4.5 MB request limit, with notes on the WAV format and the slower first request.
  • Measured the model API under free-tier limits (512 MB, 0.1 CPU): numba recompiling librosa functions adds ~4 minutes to each start, so detectors can now be chosen with GALENA_DETECTORS and warm-up toggled with GALENA_WARMUP.

Blog

recent-work

Building Galena AI

Synthetic voice detection dashboard — six ONNX detectors behind a FastAPI service, verdict confidence, call history, and interactive model metrics.

Read more →

Galena AI

Synthetic voice detection dashboard — six ONNX detectors via FastAPI, verdict confidence, call history, and interactive model metrics.

How it was built →
border-home1