-
-
/judge: the original and the kept note on one playhead, with the 13-row NanoCodec token strip, the Hindi transcript and its drift
-
Search in Hindi or English jumps to the segment that holds the word. No account needed: the judge sample is open to everyone
-
/proof: the real Nebius Serverless AI Job behind the sample, with its Job ID, preset (cpu-d3, 4vcpu-16gb) and timings
-
After a verified round trip the original is deleted, and a HEAD on raw/ and originals/ must return 404. The proof shows it
-
One note as it arrived, as kept and as read: 921,658 B in, 3,340 B of NanoCodec codes kept, the transcript searchable
-
Measured on Nebius: 815,423 bytes per hour of voice, 195x smaller than 22.05 kHz 16-bit PCM. Every number links to its file
-
The Job replayed from its own record: queued, provisioning, running, report validated, then the raw audio answers 404
-
Nemotron 3 Super proposes; code decides. A reminder is stamped only if its quote is in the transcript (gate test, written text)
-
What Hearth does not claim: CPU speed is ours, the round trip is lossy (+4.09 WER pts), and Nemotron 3 Super's card lists no Hindi
-
The pitch deck: ten slides, every figure taken from the benchmark of record and the live Job reports
Try it in under a minute, no account: open the judge sample · see the Job proof · code · video · what we learned on Nebius + NVIDIA
Inspiration
A parent sends a Hindi voice note every week. The ask is buried at 0:15 ("send ₹5,000 before Sunday"), the note is megabytes of audio that nobody can search, and when the phone fills up the notes are the first thing deleted, voice and all. It is the one recording of a person you cannot get back. We wanted to keep the voice small and the ask impossible to miss, and to be strict about the word impossible: a reminder that misquotes your mother is worse than no reminder.
That scene is the product's reason, not a testimonial: we have not yet processed a real family's notes (no volunteer has handed us any), and every page says so.
What it does
You forward voice notes. For each one, a Nebius Serverless AI Job transcribes it with NVIDIA Nemotron 3.5 ASR, encodes it with NVIDIA NeMo NanoCodec, decodes it again and transcribes the result. If the round trip holds (no more than 5 % of words drift), Hearth deletes the raw audio after a 24-hour grace period and proves it: a HEAD on the raw object returns 404. If it drifts, the original is kept and the note says so. What stays is the token strip: 13 codebooks × 12.5 frames a second, packed 11 bits each, 815,423 bytes an hour of voice (195× smaller than 22.05 kHz 16-bit PCM), plus the Hindi transcript.
- Hear it: ▶ Original and ▶ Kept sit side by side on one playhead. Kept is NanoCodec's reconstruction decoded from the strip you see, not a copy of the original.
- Find it: search in Hindi or English; Hearth jumps to the segment that holds the word.
- Remember it, carefully: Nemotron 3 Super on Nebius Token Factory reads the transcript (text only, never audio) and proposes promises with a strict
json_schema. Code decides what is shown. A promise survives only if its Devanagari quote is verbatim in the transcript; the amount is parsed from the quote's own number words; the date is resolved from the quote and the note's own date ("रविवार से पहले" becomes a date, "next week" stays date unclear). Hearth counts what the gates dropped. - A calendar feed: reminders are published as a standard RFC 5545 feed with alarms and neutral titles, for a phone's calendar to subscribe to. We have not tested it on a real phone yet, and the page says so.
- Leave with everything: delete-all (the storage listings come back empty) and export (a zip built in your browser with the codes, transcripts, reminders and a
decode.pythat rebuilds the audio with the open NVIDIA model, no Hearth needed: 57.5 dB SNR against the Job's own decode).
How we built it
- App: Next.js 15 (App Router, TypeScript) on Vercel. It stores nothing itself and uses no SQL database; state is JSON in Nebius Object Storage merged with
If-Matchconditional writes. - Worker: one Python file (gzipped, with a launcher and requirements pinned to the benchmarked environment) injected into a stock
python:3.11image and run as a Nebius Serverless AI Job oncpu-d3(4vcpu-16gb, eu-west1). Pipeline: ffmpeg → segments → Nemotron 3.5 ASR (hi-IN, 1.12 s operating point) → NanoCodec encode → 11-bit pack → decode → re-ASR → drift → results PUT to presigned URLs. - Queue: the tenant allows two instances per region, so a third Job is created and then rejected. Hearth counts live Jobs before each create and requeues on
QuotaExceeded; a finished note never holds a slot. - Model on Token Factory:
nvidia/nemotron-3-super-120b-a12b,response_format: json_schemawith enums for every closed vocabulary; strict mode works (requestchatcmpl-86b6920b56793fdf, 5.8 s). - Gates and resolver: TypeScript with a full 0–99 Hindi number table, weekday and qualifier handling, colloquial weekdays and fractions.
- Proof, not claims:
/prooflists the Job IDs, preset, timings, bytes, sha256 of the stored tokens and the raw-key 404. Tests: 457 vitest + 205 pytest at a 100 % coverage gate, 26 Playwright runs (13 tests × desktop and a 375 px phone), all passing; output inevidence/ci-local-2026-10-15-site.txt. - Why these and nothing else: NemoClaw, OpenShell and Hermes Agent are named in the track text and deliberately not used: the one flow needs no agent runtime, and judges could not install them. Tavily is not used either.
How we used NVIDIA and Nebius (the rules ask)
| Surface | What Hearth does with it |
|---|---|
NVIDIA nemo-nano-codec-22khz-1.78kbps-12.5fps — AudioCodecModel.encode / .decode |
the stored format; decode for playback and for the round trip that gates deletion |
NVIDIA nemotron-3.5-asr-streaming-0.6b (hi-IN, att_context_size=[56,13]) |
transcript for search; second pass on the reconstruction as the quality gate |
NVIDIA nemotron-3-super-120b-a12b on Token Factory |
proposes promises, dates and amounts; expands search queries (transcript text only) |
Nebius Serverless AI Jobs (POST /ai/v1/jobs, injected files) |
runs both NVIDIA models on CPU for every upload; requeue on quota |
| Nebius Object Storage (SigV4) | presigned PUT/GET, If-Match merges, DELETE + HEAD 404 proof, expiry rules (7 days for anonymous spaces) |
Measured results (Job aijob-e01y33r8hyfcn7np5v, cpu-d3 4vcpu-16gb; files in bench/results/)
- 815,423 bytes an hour of voice (all 45 clips it kept, 1,950 s of audio).
- Hindi WER 8.74 % → 12.83 % after the codec round trip (+4.09 points) on 20 FLEURS
hi_inclips (lenient text normaliser, the one the app's gates use; strict 11.2 % → 15.1 %); on a disjoint held-out set never used for a decision, 12.42 % → 14.46 %. - ASR real-time factor 0.16 on 4 vCPU; peak memory 6.9 GB; $0.1345 per hour of voice (compute only: whole-pipeline real-time factor 1.02 × the $0.132/h cpu-d3 list price; start-up, install and model load excluded).
- 10 of 10 live keeps through the deployed app: upload → kept p50 394 s, p95 402 s, cold start included.
- An earlier run failed our own round-trip gate (+5.94 points) before we level-normalised the codec input; it is committed beside the passing one.
Challenges we ran into
- Running two NeMo speech models on CPU in a Serverless Job. No custom image (no Docker daemon, no CI minutes): the stock image plus a fast installer, and weights from an in-region bucket. Cold start to a running container is ~164 s; model loading about 140 s. Time to kept is minutes, not seconds, and we say so.
- The 64 KiB injected-file limit applies to all injected files together (base64), not per file as the docs say. We gzip the worker and check the total before calling the API. (Measured; request id in FEEDBACK.md.)
- The prompt-conditioned ASR rejects file paths in
transcribe()(Unknown prompt key: 'None'); numpy arrays work. - NanoCodec on quiet recordings: two very quiet FLEURS clips lost whole sentences in the round trip and failed our first gate run. We normalise input to −20 dBFS speech-active level and store the gain with the codes. It is a better average, not a fix for every clip (one normal-level clip still got worse, 13.0 % → 47.8 %).
- Super's card does not list Hindi. That is the reason for the quote gate and the field gate; we observed it write a Hindi marker into a free-text field, so the weekday and qualifier are now enums.
Accomplishments that we're proud of
- The round trip is checked, not assumed: the raw audio is deleted only after a drift gate, and the deletion is demonstrated with a 404.
- The model proposes, code decides: a verbatim-quote gate and a field gate between Nemotron 3 Super and anything a user sees, shown both ways on the story page (a stamped ₹5,000 and a date removed by code).
- Honest by construction: every figure comes from a committed file; the failed run, the lossy cases, the unmerged Dependabot PRs and the untested phone feed are all stated.
- A pipeline that behaves on a shared tenant: conditional writes for every merge, a Job queue that respects a two-instance quota, and a spend meter with daily caps through judging (a day's slice can be overshot by at most one Job).
What we learned
- On CPU, an NVIDIA streaming ASR runs at a real-time factor of 0.16 on 4 vCPU, and a 1.78 kbps codec round trip costs about four points of Hindi WER on read speech (+4.09 on our 20-clip set, +2.04 on a held-out set): enough to keep a voice in under a megabyte an hour, not enough to throw the original away without a gate.
- For short batch work on Serverless Jobs, container start-up and model load, not compute, are the cost. Full notes, with the Job IDs behind each: FEEDBACK.md.
What's next
- Process real family notes with consent (the sample is FLEURS read speech until an actor-voiced, consented sample is recorded), and have a native Hindi speaker correct the WER references and the consent text.
- Test the calendar feed on real phones; measure the delay.
- Zero Data Retention on the Token Factory organisation (until then, spaces opt in before any transcript text is sent).
- A prebuilt model cache near the VM to cut the ~140 s load.
Honest limits
CPU speed is ours to measure (neither NVIDIA card states CPU support) · time to kept is ~6.6 min · Super's card does not list Hindi · the round trip is lossy · reminders are Hindi-only · no offline claim · Token Factory may keep prompts and outputs for Speculative Decoding (Finland, never trained on) unless Zero Data Retention is confirmed. Details: README "Honest limits".
Built With
- ffmpeg
- nebius-ai-cloud
- nebius-object-storage
- nebius-serverless-ai-jobs
- nebius-token-factory
- nemo-nano-codec
- nemotron-3-super
- next.js
- nvidia-nemo
- nvidia-nemotron
- python
- pytorch
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.