ownvoice

by rudrendupaul

Not rated
GitHub

About

MCP server wrapping the ownvoice CLI for voice/identity checks.

Details

Author
rudrendupaul
Categories
Developer Tools

Setup

Install ownvoice in your MCP client (Claude Desktop, Cursor, Windsurf, and others).

Repository: https://github.com/rudrendupaul/ownvoice

Follow the installation instructions in the repository README, then restart your MCP client.

1.ownvoice check, the free Day-0 validation

Before recording anything or renting a GPU, confirm that PEFT's LoRA injection actually works against pocket-tts's real model structure. This is entirely free: CPU only, no training, no GPU.

$ ownvoice check ](https://pytorch.org/get-started/locally/)[ownvoice check] PASS: PEFT LoRA injection succeeded against pocket-tts's flow_lm module (target_modules="all-linear").

If it fails, OwnVoice prints the model's real module tree instead of a raw stack trace, so you can see exactly what did not match and report it precisely:

$ ownvoice check [ownvoice check] FAIL: PEFT LoRA injection failed against pocket-tts's flow_lm module structure: <error detail>. Please post an honest blocker (this error plus the module tree above) as a comment on https://github.com/kyutai-labs/pocket-tts/issues/30 rather than working around it silently, that issue is exactly where this gap needs to be visible. Module tree (for debugging / for the issue #30 blocker post): <root>: FlowLMModel input_linear: Linear transformer: StreamingTransformer transformer.layers.0.self_attn.in_proj: Linear transformer.layers.0.self_attn.out_proj: Linear ...

Record 5 to 10 minutes of clean audio of the voice you want to train (your own voice, with your own consent, seeConsent and misuse), split into a few.wavclips in one directory, then point OwnVoice at it:

$ ownvoice train --voice-clips ./my-voice-clips [ownvoice train] USABLE ADAPTER Usable adapter (similarity 0.812 >= 0.75). Try it now: ownvoice infer --adapter ownvoice-adapter/adapter.safetensors --text "This is my own voice, trained with OwnVoice."

Only--voice-clipsis required. Every other flag has a sensible default (see the fullCLI Referencebelow).

A run that finishes but does not clear the similarity bar still exits0. It is a labeled result with a concrete next step, not a crash:

$ ownvoice train --voice-clips ./my-voice-clips [ownvoice train] BELOW THRESHOLD Below threshold (similarity 0.612 < 0.75). The adapter was still saved, try more/cleaner voice clips, more epochs, or a higher --lora-rank, then re-run. You can still listen to it: ownvoice infer --adapter ownvoice-adapter/adapter.safetensors --text "This is my own voice, trained with OwnVoice."

Only a data-loading problem (no usable clips) or a caught PEFT-injection failure exits non-zero. A finished run always writesadapter.safetensorsandmetadata.json(training config, similarity score, a timestamp) to the output directory: two files you keep, with no server round-trip needed to use them again.

$ ownvoice infer --adapter ownvoice-adapter/adapter.safetensors --text "Hello, this is my own voice." [ownvoice infer] Wrote ownvoice-output.wav

Every subcommand also supports--jsonfor a structured, machine-parseable output mode, useful if a script or an agent is callingownvoiceprogrammatically instead of a person reading the terminal:

$ ownvoice check --json {"success": true, "message": "PEFT LoRA injection succeeded against pocket-tts's flow_lm module (target_modules=\"all-linear\").", "module_tree": null}

Reference below is taken directly from each subcommand's real--helpoutput (ownvoice-cli0.1.2 on PyPI).

Free, CPU-only compatibility check: load pocket-tts and dry-run the LoRA injection. No GPU and no training required.

Train a LoRA voice adapter from a directory of.wavvoice clips. Only--voice-clipsis required.

Generate speech in the trained voice from a saved adapter, and save it to a.wavfile.

- A free compatibility check before you spend anything on a GPU.ownvoice checkloads pocket-tts and dry-runs PEFT's LoRA injection against its realflow_lmmodule tree, CPU only, no training. On failure it prints the actual module tree instead of a stack trace, so a real blocker is reportable instead of silent.
- An objective usable/not-usable signal, not a guess.Every training run resamples the generated test utterance to 16kHz mono and scores it against your reference clips with[Resemblyzercosine similarity.0.75or higher is labeledUSABLE ADAPTER; anything lower isBELOW THRESHOLD, a labeled outcome and not a crash, exit code0either way.
- Structured output on every subcommand.check,train, andinferall accept--json, returning one machine-parseable object instead of colored terminal text: confirmed directly,ownvoice check --jsonreturns{"success": true, "message": "...", "module_tree": null}.
- Two files you keep, no server round-trip.A finished training run writesadapter.safetensors(the trained weights, a few megabytes at the default--lora-rank 8) andmetadata.json(the full training config, similarity score, per-epoch loss, and a timestamp) to disk. Load them back any time later withownvoice infer, no network call required.
- One base model, on purpose.OwnVoice wraps pocket-tts only. There is no abstraction layer for a second base model, matching the codebase's own single-target-by-design architecture note: the LoRA injection path (target_modules="all-linear"against pocket-tts's realflow_lmlayers) stays exact instead of generic.

voice clips (wav) | v data.py --validate format/duration--> clean clip set | v train.py --PEFT LoRA (target_modules="all-linear")--> adapter.safetensors + metadata.json | v infer.py --generate test utterance--> synthesized audio | v score.py --resample to 16kHz mono--> Resemblyzer cosine similarity | v CLI report (>= 0.75 = usable adapter, below triggers a labeled next-step message)

ownvoice/data.pyloads and validates the voice-clip directory.ownvoice/train.pyloads pocket-tts's frozen base model, injects a LoRA adapter into itsflow_lmtransformer with PEFT (target_modules="all-linear"), runs the training loop, and saves the adapter plus a manifest.ownvoice/infer.pyloads a saved adapter back onto the base model and generates speech.ownvoice/score.pyresamples audio to 16kHz mono withtorchaudio.transforms.Resampleand scores speaker similarity with Resemblyzer.

OwnVoice is intentionally single-model: it wraps pocket-tts only, with no abstraction layer for a second base model, since none is in scope.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.