On this page
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
| Module | Purpose |
|---|---|
| Detector | WAV upload or prefilled Base64 JSON, WAV-to-Base64 converter, verdict and confidence gauge |
| History | Searchable request log with filters, export and details |
| API | Model connection settings, public endpoints, request/response examples |
| Model | ROC and precision-recall curves, confusion matrix, score distribution, monthly trend, model comparison |
| Account | Optional 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:
| Detector | Family |
|---|---|
| Everest (1st) | Galena, client-only histogram gradient boosting |
| Fuji (2nd) | Acoustic combined |
| Mont Blanc (3rd) | Acoustic Hispanic |
| Experimental | Galena 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
| Layer | Choice |
|---|---|
| Framework | TanStack Start (React 19, SSR) + TypeScript + Vite |
| UI | shadcn/ui (Radix) + Tailwind CSS v4 |
| Data fetching | TanStack Query |
| Charts | Recharts |
| Validation | Zod |
| Demo data | Browser storage (history and demo login) |
| Model service | Python + FastAPI + ONNX Runtime |
| Deploy | Site 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
.onnxdetectors in a FastAPI service with/detectand/healthendpoints. - Redefined confidence as confidence in the verdict.
Hackathon deployment
- Connected authentication and detection history to Supabase.
- Added base-path support to serve a separate
/devinstance 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
/healthto 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_DETECTORSand warm-up toggled withGALENA_WARMUP.


Building Galena AI