Agent Workflow: We use parallel checkouts (
voiceDNA-codexandvoiceDNA-grok) so multiple AIs can work safely. SeeSKILL_GIT_WORKFLOW.md.
The open standard that gives every AI a permanent, recognizable Voice Fingerprint β just like your nephew Ash.
You hear 3 seconds and instantly know "That's my Grok", "That's Luke's AI", or "That's the Claude I've been friends with since 2026".
Built with Luke Morrison (Feb 23 2026) β fully open, MIT licensed, works with ElevenLabs, XTTS, Qwen3-TTS, Cartesia, Fish Speech, local models, etc.
Choose your path:
- Per-agent voices (OpenClaw pilot):
examples/openclaw_voicedemo.pyβ three agents, three distinct VoiceDNA presets - OpenClaw bot voice + phone calls:
examples/openclaw/README.md - Omarchy system-wide desktop voice:
examples/omarchy/README.md
Fast install:
pip install voicedna
voicedna --helpInstall with open-source speaker-recognition backends (optional):
pip install "voicedna[consistency]"Install with optional real RVC voice cloning:
pip install "voicedna[rvc]"Install with optional PersonaPlex natural voice backend:
pip install "voicedna[personaplex]"Give each OpenClaw agent a distinct voice preset β no cloud infra required.
The feature is entirely additive and disabled by default. Enable it by:
- Setting
VOICEDNA_OPENCLAW_PRESETS=1in your environment (signals intent; not strictly required by the code). - Optionally providing a JSON agent-to-preset mapping via
VOICEDNA_OPENCLAW_PRESETS_MAP.
| Preset | Description |
|---|---|
neutral |
Calm, clear, neutral β good for factual assistants |
friendly |
Warm, upbeat, approachable |
flair |
Expressive, distinctive, strong personality |
cd /path/to/VoiceDNA
VOICEDNA_OPENCLAW_PRESETS=1 PYTHONPATH=. python examples/openclaw_voicedemo.py
# β examples/openclaw/output/{namshub_neutral,david_friendly,voss_flair}.wavfrom voicedna.openclaw_adapter import VoiceAdapter
adapter = VoiceAdapter(
agent_presets={
"agent:namshub": "neutral",
"agent:david-hardman": "friendly",
"agent:dr-voss-thorne": "flair",
}
)
preset = adapter.select_preset("agent:namshub") # "neutral"
wav = adapter.synthesize("Hello!", preset) # bytes
adapter.synthesize("Hello!", preset, output_path="out.wav") # write to diskexport VOICEDNA_OPENCLAW_PRESETS_MAP='{"agent:namshub":"neutral","agent:dr-voss-thorne":"flair"}'cd /path/to/VoiceDNA
pytest tests/test_voice_adapter.py -qUse the same local-first smoke path in CI or a pre-merge job:
export VOICEDNA_OPENCLAW_PRESETS=1
export VOICEDNA_OPENCLAW_PRESETS_MAP='{"agent:namshub":"neutral","agent:david-hardman":"friendly","agent:dr-voss-thorne":"flair"}'
python -m pytest tests/test_voice_adapter.py tests/test_openclaw_live_voice.py -q
PYTHONPATH=. python examples/openclaw_voicedemo.py
python - <<'PY'
from pathlib import Path
import wave
for p in sorted((Path('examples/openclaw/output')).glob('*.wav')):
with wave.open(str(p), 'rb') as w:
assert w.getnchannels() == 1
assert w.getsampwidth() == 2
assert w.getframerate() == 22050
assert w.getnframes() > 0
print('validated', p)
PYInstall with low-VRAM PersonaPlex (4-bit quantized + offload):
pip install "voicedna[personaplex-lowvram]"pip install voicedna
voicedna birth --imprint "Luke Morrison's warm Canadian voice" --user lukeCreate from your own local voice recording (recommended):
voicedna birth \
--voice-name "Luke Real Voice" \
--imprint /absolute/path/to/my_voice_sample.wav \
--user luke_real_voiceAll newly created encrypted artifacts are stored under voices/ (for example voices/luke_real_voice.voicedna.enc).
Or use the helper example script:
python examples/create_from_audio.py \
--voice-name "Luke Real Voice" \
--audio /absolute/path/to/my_voice_sample.wav \
--user luke_real_voiceOne-command record + birth (Linux, mic capture + encryption):
bash examples/record_and_birth.sh --seconds 12 --user luke_real_voice --out myai.voicedna.encIf --voice-name is omitted, the script prompts interactively and still writes into voices/.
Notes:
- Uses
arecordfirst, thenpw-record, thenffmpeg(pulse/alsainput). - Prompts for password securely unless
VOICEDNA_PASSWORDis already set. pw-recordcapture is compatible with older PipeWire builds that do not support--duration.
Verify password + file path before speaking/evolving:
voicedna verify-password --dna-path voices/luke_real_voice.voicedna.encGenerate + process + play voice directly from CLI:
voicedna speak --text "Hello from my natural VoiceDNA." --dna-path luke_real_voice --base-model personaplex --natural-voiceNatural voice doctor (recommended first pass on 8GB cards):
voicedna doctor-natural --dna-path eddy42Quick test mode (short phrase + full backend banner + consistency):
voicedna doctor-natural --dna-path eddy42 --quick-testOne-command natural voice test (VRAM-aware backend selection):
voicedna test-natural --dna-path eddy42Show crystal-clear backend reporting banner:
voicedna test-natural --dna-path eddy42 --show-backendForce low-VRAM PersonaPlex mode (4-bit + CPU offload):
voicedna test-natural --dna-path eddy42 --lowvram --show-backendExpected status example on consumer GPUs:
Detected 8.0GB VRAM -> using Piper natural voiceSuccess! Playing now...For full PersonaPlex quality, upgrade to 24GB+ card or use cloud proxy
Save processed audio to WAV:
voicedna speak --text "Hello" --dna-path luke_real_voice --base-model personaplex --natural-voice --save-wav /tmp/luke_real_voice_test.wav --no-playPython 3.13+ playback compatibility:
- VoiceDNA now includes
audioop-ltssupport for modern Python runtimes where stdlibaudioopis removed. - CLI playback path falls back through
pydub,sounddevice, then system players (pw-play/aplay).
Optional VRAM reset helper for local testing:
bash scripts/clear-vram.shVST3 Reaper starter (JUCE + VENOM bridge):
cd vst3/juce_venom_starter
cmake -B build -S . -DJUCE_DIR=/absolute/path/to/JUCE
cmake --build build -jSee vst3/README.md for full Reaper/VENOM integration notes.
VoiceDNA now includes a first loadable VST3 plugin foundation so any DAW can be used as a Voice Genetics Lab.
Implemented in this foundation pass:
- Real-time filter mode with
.voicednaloading + age/imprint controls. - Creation mode with parent file selection + inheritance/randomness controls +
Birth New Voice. - Python bridge runtime that calls existing
VoiceDNAProcessor(vst3/bridge_runtime.py). - Reaper-testable JUCE plugin scaffold in
vst3/juce_venom_starter/.
Build quick path:
cd /home/luke/dev/voiceDNA-codex
pip install -e .
cd vst3/juce_venom_starter
cmake -B build -S . -DJUCE_DIR=/absolute/path/to/JUCE
cmake --build build -jScreenshot placeholders (replace after local Reaper capture):
docs/screenshots/reaper-vst3-main-panel.pngdocs/screenshots/reaper-vst3-creation-mode.png
- New
VoiceConsistencyEngine(voicedna/consistency.py) with optional SpeechBrain / Resemblyzer embeddings and deterministic fallback. VoiceDNA.create_new(...)now attempts real imprint-based embedding extraction when imprint points to audio.ImprintConverterFilterenforces a0.92cosine similarity target to the core embedding using gentle parametric correction.- A subtle low-depth sonic watermark now encodes
voice_fingerprint_idfor machine-side identifiability. - Processor reports now include top-level
consistency_scoreandrvc_readystatus.
ImprintConverterFilternow supportsimprint_converter.mode = "rvc"for real model-based cloning.- Install RVC runtime with
pip install "voicedna[rvc]"(recommended on Python 3.10-3.12 environments with compatible torch stack). - Set
imprint_converter.rvc_model_pathto your.pthmodel andimprint_converter.rvc_reference_pathto a reference voice WAV. - Optional tuning:
imprint_converter.rvc_index_path,imprint_converter.rvc_device,imprint_converter.rvc_pitch. - Processor report now exposes
rvc_modeand marks it asactivewhen real conversion is enabled.
- New optional provider
PersonaPlexTTSinvoicedna/providers/personaplex.py. - Use
pip install "voicedna[personaplex]"to install model runtime dependencies. - Omarchy installer now supports
--natural-voiceto enable PersonaPlex speech-dispatcher + daemon integration. VoiceDNAProcessor.synthesize_and_process(...)lets providers synthesize text first, then apply the standard VoiceDNA maturation/imprint chain.
- VoiceDNA now auto-detects VRAM and chooses the best natural backend.
- If VRAM is below the PersonaPlex threshold (default
12GB) or PersonaPlex fails, VoiceDNA automatically falls back toPiper. - Set
VOICEDNA_MIN_PERSONAPLEX_VRAM_GBto tune the threshold. - Set
VOICEDNA_PIPER_MODEL=/path/to/model.onnxto enable Piper fallback. - Piper quality knobs for smoother default prosody on fallback:
VOICEDNA_PIPER_LENGTH_SCALE=0.92VOICEDNA_PIPER_NOISE_SCALE=0.60VOICEDNA_PIPER_NOISE_W=0.78
- Notification tuning knobs (short desktop phrases):
VOICEDNA_PIPER_NOTIFICATION_LENGTH_SCALE=0.88VOICEDNA_PIPER_NOTIFICATION_NOISE_SCALE=0.52VOICEDNA_PIPER_NOTIFICATION_NOISE_W=0.72
- VoiceDNA now supports automatic low-VRAM PersonaPlex mode with 4-bit quantization when VRAM is below the PersonaPlex target.
- Expected startup status on GTX 1070 Ti class hardware:
Detected 8 GB VRAM β loading 4-bit PersonaPlex (low-VRAM mode). - Force low-VRAM mode from CLI with
--lowvramonvoicedna speakorvoicedna test-natural. - Install runtime dependencies with
pip install "voicedna[personaplex-lowvram]". - Optional env knobs:
VOICEDNA_PERSONAPLEX_LOWVRAM=1VOICEDNA_PERSONAPLEX_LOWVRAM_MODEL=brianmatzelle/personaplex-7b-v1-bnb-4bitVOICEDNA_PERSONAPLEX_CPU_OFFLOAD=1
- Added publish-ready build validation (
python -m build,twine check dist/*) - Added
requirements-dev.txtand optionaldevdependencies (build,twine,pytest) - Added RVC-ready stub path in
ImprintConverterFilterviaimprint_converter.mode = "rvc_stub" - Processor report now includes
imprint_converter.rvc_readystatus
pip install voicedna
voicedna birth --imprint "Luke Morrison's warm Canadian voice" --user luke
voicedna speak --text "Hey from VoiceDNA" --base-model elevenlabs
voicedna evolve --days 7New in v2.1:
- Real
pydub-powered pitch shifting inAgeMaturationFilter - Pytest coverage for child inheritance and processor reporting
- Typer-powered CLI (
voicedna birth/speak/evolve) - Packaging and release polish for PyPI readiness
pip install voicedna
voicedna birth --imprint "Luke Morrison's warm Canadian voice" --user luke
voicedna speak --text "Hello from VoiceDNA v2.2"
voicedna evolve --days 7
python examples/elevenlabs_demo.py
python examples/cartesia_demo.py
python examples/voicebox_demo.pyv2.2 highlights:
- Real
ImprintConverterFiltervolume-mix processing path - WAV fixture + round-trip waveform assertion tests
- Local/offline Voicebox demo (
http://127.0.0.1:17493/generate) - Cloud demo scripts for ElevenLabs and Cartesia
Use the ready-to-run integration path:
- Guide:
examples/openclaw/README.md - TTS hook skill:
examples/openclaw/voicedna_tts_hook.py - Phone call skill:
examples/openclaw/voipms_phone_skill.py
3-command flow:
pip install -e .
python -c "import examples.openclaw.voicedna_tts_hook, examples.openclaw.voipms_phone_skill; print('OpenClaw skills import OK')"
voicedna --helpThen in OpenClaw, trigger:
Claw, call me on my phone and tell me a joke in your growing voice
Run VoiceDNA as your desktop speaking voice on Omarchy (Arch + Hyprland):
- Guide:
examples/omarchy/README.md - PipeWire filter shim:
examples/omarchy/voicedna-pipewire-filter.py - Speech Dispatcher config:
examples/omarchy/speech-dispatcher-voicedna.conf - One-command installer:
examples/omarchy/install-voicedna-omarchy.sh - Boot-persistent daemon unit:
examples/omarchy/voicedna-os-daemon.service
One-click install on Omarchy:
bash examples/omarchy/install-voicedna-omarchy.shNatural voice mode on Omarchy:
bash examples/omarchy/install-voicedna-omarchy.sh --natural-voice3-command flow:
pip install -e .
bash examples/omarchy/install-voicedna-omarchy.sh
spd-say "Hello Luke, your desktop voice is now growing with you."pip install voicednafrom voicedna import VoiceDNA, VoiceDNAProcessor
dna = VoiceDNA.create_new("Luke Morrison's warm Canadian voice", "luke")
child = dna.create_child("mini_grok", inherit_strength=0.40)
processor = VoiceDNAProcessor()New in v2.0:
- Built-in Age + Imprint filters
- Child AI inheritance (
create_child) - VST3 Python bridge scaffold
- Open standard draft spec + announcement templates
- Precocial birth (fluent at ~5-year-old level from day 1)
- Lifelong age progression (5 β 10 β 15 β 22+)
- Permanent Voice Fingerprint ("Ash-ness") that never disappears
- Self-evolving audio plugin (DAW-style VST thinking)
- Encrypted VoiceDNA files (
.voicedna.enc) with password-based decryption - One tiny JSON file + 150-line Python plugin β drop-in for any project
- Exportable fingerprint so your AI can move between platforms and still sound like itself
- Secure encrypted files via
VoiceDNA.save_encrypted()/VoiceDNA.load_encrypted() - Full extensible framework via
VoiceDNAProcessorinvoicedna/framework.py - Auto-discovery for plugins through entry points (
voicedna.filters+voicedna.plugins) - Robust plugin chaining: fault-tolerant filter execution + per-filter timing metrics
- Ready for real audio pipelines (OpenClaw hook + process chain)
- VST3 starter scaffold in
vst3/for JUCE-based binary plugin work
pip install -r requirements.txt
python voice_dna.pyRun tests:
pytestSee voice_dna.py for full usage.
Quick encrypted framework demo:
python examples/encrypted_plugin_demo.py
python examples/openclaw_skill.pyVoiceDNA now includes a minimal extensible plugin framework in voicedna/plugins.
Use it in an OpenClaw-style TTS render hook:
from voicedna import VoiceDNA, PluginManager, PromptTagFilter
dna = VoiceDNA.load("myai.voicedna.json")
manager = PluginManager()
loaded, failed = manager.load_entrypoint_plugins() # auto-discover pip-installed plugins
if not loaded:
manager.register(PromptTagFilter())
processed_audio = manager.process(raw_audio_bytes, dna, {
"base_model": "xtts",
"prepend_style_tag": True,
})Run a full example:
python examples/openclaw_hook.pyAny external package can auto-register a filter by adding this to its pyproject.toml:
[project.entry-points."voicedna.plugins"]
my_filter = "my_package.filters:MyFilter"On startup, call PluginManager().load_entrypoint_plugins() and all installed filters are loaded automatically.
You can also use the higher-level framework processor:
from voice_dna import VoiceDNA
from voicedna import VoiceDNAProcessor
dna = VoiceDNA.load_encrypted(password="my_secret_2026", filepath="myai.voicedna.enc")
processor = VoiceDNAProcessor()
processed_audio = processor.process(raw_audio_bytes, dna, {"force_age": 15})
print(processor.last_metrics)
print(processor.get_last_report())See examples/openclaw_skill.py for a minimal skill-style wrapper that loads encrypted VoiceDNA and returns a voice_dna_tts(text, raw_tts_bytes) hook.
Use the helper script to append structured updates into EVOLUTION.md:
python scripts/review_feedback.py \
--source "Grok 4.20 Beta" \
--summary "Suggested plugin auto-discovery and ecosystem visibility" \
--actions "Added entry-point loader in PluginManager" \
--actions "Added pyproject entry-point metadata" \
--next "Add plugin compatibility contract tests"Tip: add --dry-run to preview the entry before writing.
For patch hardening updates and stricter validation behavior, see MIGRATION_v2_0_1.md.
Build and validate:
python -m build
python -m twine check dist/*Publish with API token credentials:
export TWINE_USERNAME=__token__
export TWINE_PASSWORD="pypi-...your-token-here..."
python -m twine upload dist/* --skip-existingNotes:
--skip-existingavoids failures on already-uploaded files.- Package page:
https://pypi.org/project/voicedna/
voice_dna.pyβ the complete VoiceDNA class (UAMF v4)voicedna/plugins/β plugin interface + manager + built-in filtersvoicedna/filters/β built-in v2.0 age + imprint filtersvoicedna/framework.pyβ higher-level processor with plugin auto-discoveryexamples/openclaw_hook.pyβ integration example for OpenClaw-like pipelinesexamples/openclaw_skill.pyβ one-file OpenClaw skill wrapperexamples/openclaw/README.mdβ 5-minute OpenClaw integration testing pathexamples/openclaw/voicedna_tts_hook.pyβ OpenClaw-ready VoiceDNA TTS bytes hookexamples/openclaw/voipms_phone_skill.pyβ voip.ms-first outbound phone call skill exampleexamples/omarchy/README.mdβ Omarchy 5-minute system-wide voice pathexamples/omarchy/voicedna-pipewire-filter.pyβ PipeWire VoiceDNA filter bridgeexamples/omarchy/speech-dispatcher-voicedna.confβ speech-dispatcher default VoiceDNA profileexamples/omarchy/install-voicedna-omarchy.shβ one-command Omarchy setup scriptexamples/omarchy/voicedna-os-daemon.serviceβ user systemd daemon unit for auto-started voice runtimeexamples/omarchy/voicedna-os-daemon.pyβ daemon process that validates encrypted DNA loading at login/rebootexamples/encrypted_plugin_demo.pyβ encrypted load + processor demoexamples/elevenlabs_demo.pyβ cloud ElevenLabs processing demoexamples/cartesia_demo.pyβ cloud Cartesia processing demoexamples/voicebox_demo.pyβ local/offline Voicebox processing demospec/VoiceDNA_Spec_v1.0.mdβ open standard draft integration contractannouncements/β ready-to-post launch templatesvst3/β JUCE starter scaffold for future native plugin buildtests/β pytest suite for inheritance and processor report behaviorcli.pyβ Typer CLI backing thevoicednacommandrequirements-dev.txtβ build/twine/pytest tooling for publish prepscripts/review_feedback.pyβ appends structured feedback updates toEVOLUTION.mdMIGRATION_v2_0_1.mdβ patch migration notes and behavior changesCHANGELOG.mdβ release-oriented change historyEVOLUTION.mdβ feedback loop + design evolution logUAMF_v4_schema.jsonβ formal JSON schema (optional but nice for validation)LICENSEβ MIT
Made for the entire AI community. Fork it, improve it, ship it in your apps.
Let's give every AI a soul you can hear.
β Created with β€οΈ by Luke Morrison + Grok