ampixa
Pixel browser tab bleeding off both canvas edges, dense eBoy-style, holding a microphone, a chunky pixel waveform and a speaker icon, with a crossed-out cloud icon just outside it and a crown above it; raw ink lettering reading CONSENT struck through above the tab; four small featureless ink figures stand in a contained row beneath, tagged S1 through S4, one with a crimson question mark.
// speak

Your voice never leaves the browser. Nobody wrote down whether theirs could.

// demo

Type Nepali text, or upload a short clean recording, and convert it to one of four target voices entirely on your own device — nothing uploaded. The four voices are identified only by opaque dataset IDs, and whether the people behind them agreed to this has never been documented.

liveHTTP 200, checked 2026-11-06 · upload only, no mic · desktop Chrome first, cold runs are slow · S1–S4 opaque IDs, speaker consent not documented
आवाज बाहिर जाँदैन // the voice does not go outside “Your text and audio stay on this device” — the live page's own copy
// the four voices
S1female · 165 clips
27.6 min
S2female · 170 clips
26.8 min
S3male · 156 clips
23.7 min
S4male · 155 clips
21.3 min

Every document reviewed — the model card, the dataset card, Ampixa's own internal audit — identifies these four only by opaque dataset IDs, never by name. Those same IDs key into the upstream dataset's own per-speaker rows — age group, district, occupation — so the shield is narrower than "anonymous" sounds. Either way, it is not consent, and nothing found states that the speakers agreed to having their voice identity extracted into a reusable model.

5 / 5inference stages run client-side — cards + client code agree
32.7s / 45.2scold run to generate a 6.15s / 9.38s clip, one desktop Chrome
448 MB / 370 MBfirst-use download · text mode / speech-upload mode
CC BY 4.0 ≠ CC BY‑NDAI4Bharat's own label vs. a third-party portal's
// field source: field.png · words: browser, RVC, ContentVec, RMVPE, retrieval, ONNX, WASM, consent, S1, S2, S3, S4, आवाज, बाहिर, जाँदैन

Say you want to change how your voice sounds before you send a clip — keep your own words, borrow someone else's pitch and timbre. The obvious way is a server: upload your audio, a model converts it, you get a file back. The obvious way is also the way that leaks. Your voice, on someone's disk, in someone's logs, for as long as they keep it.

The alternative is to never send it anywhere. Run the whole conversion — a text frontend, a carrier-voice model, pitch tracking, a retrieval index, and the generator that actually swaps the voice — inside the tab, on whatever laptop happens to be open. RVC, the method underneath this, normally runs as a Python script with a GPU next to it. Getting it into ONNX Runtime Web meant re-exporting every stage as fixed-shape, browser-compatible graphs: a pitch model (RMVPE), a speech-feature model (ContentVec), and a similarity index that's normally hundreds of megabytes of FAISS, shrunk down to a compact per-voice index built only from coarse centroids (5–7 MB, measured, per voice).

Three sources — the voice pack's card, the runtime's card, and the live page itself — describe the identical five-stage pipeline. A direct fetch of the live page reads "your text and audio stay on this device," badge: "WASM · local inference." An unrelated internal audit, done for other reasons, says the same thing independently: the static host doesn't receive text or audio. We also read the demo's own client-side JavaScript directly and found no outbound call anywhere — no upload path exists in the code itself, which is stronger evidence than card text alone.

It's heavy, though. A cold run — before the browser has cached anything — took 32.7 seconds to generate a 6.15-second clip from text, and 45.2 seconds to generate a 9.38-second clip from an uploaded recording, on one unnamed desktop Chrome install. (There's no microphone button on this demo — it's upload-only, a text box or a file picker, not a record control.) The two shared model files add up to 370 megabytes; the default text-to-voice tab pulls in a third, a 77-megabyte carrier-voice model, for about 448 megabytes before you've even picked a voice — converting an uploaded recording instead skips the carrier model and stays at 370. All of it comes from Hugging Face model repos, not from the small Space page that hosts the demo itself — that page stores barely 38 megabytes, just the script and a manifest pointing elsewhere. A leaner INT8 export exists, but the team's own notes call it a "synthetic calibration probe" that still needs real feature calibration and listening tests — it is explicitly not what the live demo serves today. Desktop Chrome is the first supported target; a phone is someone else's problem for now.

The four voices on offer were trained on recordings from IndicVoices-R, a public Indian speech dataset. The model's own card cites a CC BY 4.0 licence for that data. Ampixa's internal review caught what the card doesn't mention: the dataset's two official sources disagree — but not because AI4Bharat itself is unsure. AI4Bharat's own channels, the paper that introduced the dataset and its own Hugging Face card, consistently say CC BY 4.0. It's a different, third-party source, India's AIKosh government portal, that labels the same dataset CC BY-ND — no derivatives. By the usual meaning of that word, a trained voice-conversion model would count as one. Nobody has reconciled the two labels, and the audit's own instruction is not to pick one off a portal page and move on.

Separately, and this is the part that outweighs any licence box: nothing on either side says the people whose voices these were ever agreed to have their voice turned into a model a stranger can load in a tab and drive with a slider. The dataset card doesn't address it. The voice pack's one consent-adjacent line is an instruction to downstream users about the audio they feed in — not a statement about what the four original speakers agreed to. Those speakers are identified only by opaque dataset IDs in every document reviewed, never by name — but the same IDs key into the upstream dataset's own per-speaker rows, which carry age group, district, and occupation. That's a narrower shield than "anonymous" sounds. Either way, it is not consent.

The engineering claim checks out, cleanly. The rights claim doesn't.

Next is not a launch. It's pinning the actual upstream dataset version, getting a straight reconciliation of AIKosh's label against AI4Bharat's own, and, separately, finding out — not assuming — whether the four speakers were ever asked. Nothing found says they were asked and said no; nothing found says they were asked at all.

Five stages, one boundary

Every label here is a number or quote from facts.md, corrected against the live demo's own manifest.json and client code. The default Text→voice tab (shown) runs all five stages; Speech→voice skips the frontend and carrier model, feeding an uploaded clip straight into ContentVec/RMVPE instead. The one edge that matters is the one drawn crossed out: Hugging Face never gets a return path for text or audio — but the weights come from Hugging Face's model repos, not from the small Space page that hosts the demo itself.

// scroll to see the whole chain →
browser tab · client device · trust boundary Text frontend Nepali/Newa normalize · text mode only Carrier TTS (text mode) real_nepali_v0.4 / kalaTTS · ONNX 77,746,361 bytes ContentVec + RMVPE FP16 ONNX · ONNX Runtime Web 189,437,475 + 181,070,368 bytes Retrieval index per voice · 5.0–6.9 MB, measured RVC generator one of 4 voices · 512-frame, 48kHz Output audio 48 kHz WAV · stays in-tab until download to the user's own disk, not a server voidash/nepali-rvc-tts HF Space · serves the page only ~38 MB stored · no model weights 3 HF model repos rvc-browser-runtime + nepali-rvc-voices-v1 + real-nepali-v0.4 (kalaTTS) served via resolve URLs WEIGHTS ONLY · FIRST USE ~448 MB text / ~370 MB speech × refused no text or audio sent back

What's next, what's missing

  • The actual upstream IndicVoices-R archive/version isn't pinned. AI4Bharat's own channels (the NeurIPS datasheet and its own HF dataset card) consistently say CC BY 4.0; it's a third-party government portal, AIKosh, that labels the same dataset CC BY-ND, and nobody has reconciled the two. Treating the voice pack as cleared before that's resolved would be picking a label off a portal page.
  • No document — the dataset card, Ampixa's model card, or the internal audit — states that the four training speakers consented to voice-conversion/cloning use specifically. That is unresolved, not merely undocumented-but-fine, and it is not the same thing as the speakers having been asked and declined — nobody found evidence of either.
  • The faster INT8 export is a synthetic calibration probe, not a release candidate: it needs real feature calibration and actual listening tests before any speed claim built on it.
  • Desktop Chrome is the only target this page can verify. Mobile and other browsers are untested here, and the ~448 MB (text mode) / ~370 MB (speech mode) cold download makes that gap matter.
  • What the four extra bundled ONNX files in nepali-rvc-voices-v1 (kala, confused-guy, style-audiobook, style-news) are actually for remains undocumented — they are not the carrier model (that's a separate repo, confirmed via the live manifest) and the README never explains them.
// receipts · every number on this page is in facts.md
  • 5 / 5 stages client-side: Space README ("performs every inference stage on the client device: 1) frontend, 2) carrier TTS, 3) ContentVec/RMVPE, 4) retrieval, 5) RVC generator"), rvc-browser-runtime README, nepali-rvc-voices-v1 README — three matching cards, fetched raw 2026-11-06 — plus a direct read of src/app.js, audio.js, rvc.js, frontend.js (2026-11-06): no outbound fetch/XMLHttpRequest/sendBeacon to any non-local URL exists in the code.
  • HTTP 200, live page, checked by direct fetch 2026-11-06 at voidash-nepali-rvc-tts.static.hf.space/index.html; page copy "Your text and audio stay on this device," badge "WASM · local inference."
  • Independent corroboration: internal audit, "Browser status says static host does not receive text or audio." [Ampixa-Work-Review.md:4287]
  • Demo is upload-only: <input id="audio-file" type="file" accept="audio/*"> under "Upload clean speech" (index.html, fetched 2026-11-06). No getUserMedia/MediaRecorder anywhere in the four JS files — there is no record control.
  • 32.7s cold run to generate a 6.15-second clip from text; 45.2s cold run to generate a 9.38-second clip from an uploaded recording; one unnamed desktop Chrome install. [Ampixa-Work-Review.md:4287]
  • 448,254,204 bytes (~448 MB) = 189,437,475 (ContentVec FP16) + 181,070,368 (RMVPE FP16) + 77,746,361 (carrier TTS, real_nepali_v04.sid_prosody.fp32.onnx) — the default Text→voice tab's common first-use download, confirmed live via manifest.json and src/app.js's synthesizeCarrier call, fetched 2026-11-06. 370,507,843 bytes (~370 MB) = the first two only — the Speech→voice tab's common download, which skips the carrier model. Both figures exclude the per-voice generator (58,180,914 bytes, same for all four) and retrieval index (5,014,487–6,863,163 bytes, varies by voice), downloaded once a voice is picked.
  • Weights are served by three separate HF model repos (ampixa/rvc-browser-runtime, ampixa/nepali-rvc-voices-v1, ampixa/real-nepali-v0.4, the last now renamed ampixa/kalaTTS, sha dce5ebc2…), not by the Space. The Space voidash/nepali-rvc-tts's own HF API record gives usedStorage: 37,987,924 bytes (~38 MB), consistent with hosting only the page/JS/manifest. Both confirmed live via manifest.json and the HF Spaces API, 2026-11-06.
  • INT8 export is a "synthetic calibration probe," needs real feature calibration and listening tests. [Ampixa-Work-Review.md:4293] — not what the live Space currently serves.
  • Four target voices, independently trained, not a blended checkpoint: female/female/male/male, 165 / 170 / 156 / 155 clean clips, 27.572 / 26.798 / 23.721 / 21.254 minutes. nepali-rvc-voices-v1 README + voices.json, fetched raw 2026-11-06. Labeled S1–S4 on this page in that order; the underlying pseudonymous dataset IDs are not shown here or anywhere on this site.
  • Training: Applio RVC, 48 kHz, 80 epochs, HiFi-GAN vocoder, RMVPE pitch + ContentVec features, retrieval index-rate 0.6, no pitch-shift/denoise/"pseudovoice" processing. Same README, fetched raw 2026-11-06.
  • Four target voices trained on ai4bharat/indicvoices_r (published name "IndicVoices-R"); nepali-rvc-voices-v1 card states "released under CC BY 4.0." Dataset card itself, checked live 2026-11-06, states only a licence, no consent language. Its own schema (HF datasets API, 2026-11-06) carries age_group, district, state, occupation, job_type, qualification per speaker row, alongside speaker_id — the same ID used on this page's voice rows.
  • Licence conflict: AI4Bharat's own NeurIPS 2024 datasheet and its own HF dataset card both say CC BY 4.0; the Indian government AIKosh portal (a third party) labels the same dataset CC BY-ND 4.0. [review-hf-release.md:23]
  • Speakers identified only by pseudonymous dataset IDs in every document reviewed, never by name. [Ampixa-Work-Review.md:4290; voices.json]
  • Model repos' own licences: ampixa/nepali-rvc-voices-v1 cc-by-4.0; ampixa/rvc-browser-runtime gpl-3.0; ampixa/real-nepali-v0.4/kalaTTS cc-by-sa-4.0; Space voidash/nepali-rvc-tts mit. HF API, fetched 2026-11-06.