From ef700613fee5d73852400cdb77952f0734b615ba Mon Sep 17 00:00:00 2001 From: dschlueter Date: Fri, 10 Jul 2026 22:45:03 +0200 Subject: [PATCH] Document the two new CC0-licensed Piper-synthesized reference voices male_thorsten/female_kerstin come from Piper's openly-licensed German voice models, not scraped real-person audio, to avoid cloning someone's voice without consent. Speaker profiles now use distinct voices per speaker instead of everyone defaulting to the owner's own cloned voice. Co-Authored-By: Claude Sonnet 5 --- CLAUDE.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index dcbcef1..757fd5c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -62,7 +62,15 @@ Registered in Open Notebook as `openai_compatible` credentials with `base_url=ht `tts_server.py` resolves the incoming `voice` field via `services/voices/*.wav` (gitignored — personal voice recordings): `.wav` becomes a selectable voice `""`, cloned via chatterbox's `audio_prompt_path`. Unknown/omitted voices fall back to `"default"`; a bare language code (e.g. `"en"`) still works and skips cloning (built-in voice for that language). All cloned voices are generated in German (`CLONE_LANG` in the script) since only German reference clips exist here — add entries to `VOICE_LANG_OVERRIDES` in the script if you add clips in other languages. -`services/voices/default.wav` is a symlink to `~/chatterbox-tts-cli/my_voice_deutsch_60s.wav` (the owner's own voice). All podcast speaker profiles (`business_panel`, `tech_experts`, `solo_expert`, `test_speaker_local`) currently point every speaker at `voice_id: "default"` — there's only one reference clip, so multi-speaker podcasts don't yet sound like distinct people, only the transcript labels differ. To give a speaker their own voice, drop a new `.wav` (~10-30s, clean single-speaker audio) into `services/voices/`, restart `tts_server.py` (voices are scanned once at startup), and set that speaker's `voice_id` to `` via `PUT /api/speaker-profiles/{id}`. +Three reference clips exist in `services/voices/` (gitignored, not committed): + +- `default.wav` — symlink to `~/chatterbox-tts-cli/my_voice_deutsch_60s.wav`, the owner's own voice. +- `male_thorsten.wav` / `female_kerstin.wav` — synthesized with [Piper](https://github.com/rhasspy/piper) using the CC0-licensed `de_DE-thorsten-medium` and `de_DE-kerstin-low` voice models (downloaded from `huggingface.co/rhasspy/piper-voices`). Deliberately **not** real people's recordings scraped from the internet — Piper's voices are explicitly released for this kind of downstream synthesis/cloning use, unlike e.g. Common Voice (consented for ASR training, not cloning) or random web audio (no consent at all). Regenerate with: + ```bash + piper --model de_DE-thorsten-medium.onnx --output_file male_thorsten.wav <<< "some German sentence" + ``` + +Podcast speaker profiles are assigned across these three: `business_panel` (Marcus→male_thorsten, Elena→female_kerstin, Johny→default), `tech_experts` (Alex→male_thorsten, Jamie→female_kerstin), `solo_expert`/`test_speaker_local` (→female_kerstin/Anna). To add another distinct voice, drop a new `.wav` (~10-30s, clean single-speaker audio, licensing-checked) into `services/voices/`, restart `tts_server.py` (voices are scanned once at startup), and set the speaker's `voice_id` to `` via `PUT /api/speaker-profiles/{id}`. ## Secrets