From a8865564ae7641dc8fa7a898e6ed71a55269ffe3 Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Sun, 9 Nov 2025 13:16:22 -0500 Subject: [PATCH] Map all available Piper voices and expand Makefile downloads MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added 40+ Piper voice mappings to voice_to_speaker.default.yaml * 20 English US voices (libritts_r speakers + single-speaker models) * 9 English GB voices * All voices use proper naming convention (en_us_*, en_gb_*) * Kept OpenAI-compatible aliases (alloy, echo, fable, onyx, nova, shimmer) - Updated Makefile voices-piper target to download ALL voices: * 20 English US models (amy, arctic, bryce, danny, hfc_female, hfc_male, joe, john, kathleen, kristin, kusal, l2arctic, lessac, libritts, libritts_r, ljspeech, norman, reza_ibrahim, ryan, sam) * 9 English GB models (alan, alba, aru, cori, jenny_dioco, northern_english_male, semaine, southern_english_female, vctk) * Download function with error handling - Updated main 'voices' target to include Silero downloads 🦝 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- Makefile | 63 +++++++++---- voice_to_speaker.default.yaml | 161 ++++++++++++++++++++++++++++++++-- 2 files changed, 202 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index 90c9313..76cd55a 100644 --- a/Makefile +++ b/Makefile @@ -86,25 +86,56 @@ test: @echo "✅ Test complete! Playing audio..." @firefox /tmp/raccoon_test.mp3 || mpv /tmp/raccoon_test.mp3 || echo "Install firefox or mpv to play audio" -voices: voices-piper voices-xtts - @echo "✅ All voices downloaded!" +voices: voices-piper voices-xtts voices-silero + @echo "✅ All voices downloaded (Piper, XTTS, Silero)!" voices-piper: - @echo "🎤 Downloading Piper voices with correct directory structure..." + @echo "🎤 Downloading all Piper voices..." ssh $(REMOTE_USER)@$(REMOTE_HOST) "docker exec $(CONTAINER_NAME) bash -c '\ - mkdir -p /app/voices/en/en_US/libritts_r/medium && \ - cd /app/voices/en/en_US/libritts_r/medium && \ - curl -L https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx -o en_US-libritts_r-medium.onnx && \ - curl -L https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx.json -o en_US-libritts_r-medium.onnx.json && \ - mkdir -p /app/voices/en/en_GB/northern_english_male/medium && \ - cd /app/voices/en/en_GB/northern_english_male/medium && \ - curl -L https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/northern_english_male/medium/en_GB-northern_english_male-medium.onnx -o en_GB-northern_english_male-medium.onnx && \ - curl -L https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/northern_english_male/medium/en_GB-northern_english_male-medium.onnx.json -o en_GB-northern_english_male-medium.onnx.json'" - @echo "📝 Updating voice_to_speaker.yaml with ABSOLUTE paths..." - ssh $(REMOTE_USER)@$(REMOTE_HOST) "docker exec $(CONTAINER_NAME) bash -c '\ - sed -i \"s|model: voices/en_US-libritts_r-medium.onnx|model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx|g\" /app/config/voice_to_speaker.yaml && \ - sed -i \"s|model: voices/en_GB-northern_english_male-medium.onnx|model: /app/voices/en/en_GB/northern_english_male/medium/en_GB-northern_english_male-medium.onnx|g\" /app/config/voice_to_speaker.yaml'" - @echo "✅ Piper voices installed with absolute paths!" + set -e; \ + BASE_URL=\"https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0\"; \ + download_voice() { \ + local path=\"\$$1\"; \ + local name=\"\$$2\"; \ + mkdir -p \"/app/voices/\$$path\"; \ + cd \"/app/voices/\$$path\"; \ + echo \"Downloading \$$name...\"; \ + curl -f -L \"\$$BASE_URL/\$$path/\$$name.onnx\" -o \"\$$name.onnx\" || echo \"Failed to download \$$name.onnx\"; \ + curl -f -L \"\$$BASE_URL/\$$path/\$$name.onnx.json\" -o \"\$$name.onnx.json\" || echo \"Failed to download \$$name.onnx.json\"; \ + }; \ + echo \"=== Downloading English US voices ===\"; \ + download_voice \"en/en_US/libritts_r/medium\" \"en_US-libritts_r-medium\"; \ + download_voice \"en/en_US/amy/medium\" \"en_US-amy-medium\"; \ + download_voice \"en/en_US/arctic/medium\" \"en_US-arctic-medium\"; \ + download_voice \"en/en_US/bryce/medium\" \"en_US-bryce-medium\"; \ + download_voice \"en/en_US/danny/low\" \"en_US-danny-low\"; \ + download_voice \"en/en_US/hfc_female/medium\" \"en_US-hfc_female-medium\"; \ + download_voice \"en/en_US/hfc_male/medium\" \"en_US-hfc_male-medium\"; \ + download_voice \"en/en_US/joe/medium\" \"en_US-joe-medium\"; \ + download_voice \"en/en_US/john/medium\" \"en_US-john-medium\"; \ + download_voice \"en/en_US/kathleen/low\" \"en_US-kathleen-low\"; \ + download_voice \"en/en_US/kristin/medium\" \"en_US-kristin-medium\"; \ + download_voice \"en/en_US/kusal/medium\" \"en_US-kusal-medium\"; \ + download_voice \"en/en_US/l2arctic/medium\" \"en_US-l2arctic-medium\"; \ + download_voice \"en/en_US/lessac/medium\" \"en_US-lessac-medium\"; \ + download_voice \"en/en_US/libritts/high\" \"en_US-libritts-high\"; \ + download_voice \"en/en_US/ljspeech/medium\" \"en_US-ljspeech-medium\"; \ + download_voice \"en/en_US/norman/medium\" \"en_US-norman-medium\"; \ + download_voice \"en/en_US/reza_ibrahim/medium\" \"en_US-reza_ibrahim-medium\"; \ + download_voice \"en/en_US/ryan/high\" \"en_US-ryan-high\"; \ + download_voice \"en/en_US/sam/medium\" \"en_US-sam-medium\"; \ + echo \"=== Downloading English GB voices ===\"; \ + download_voice \"en/en_GB/northern_english_male/medium\" \"en_GB-northern_english_male-medium\"; \ + download_voice \"en/en_GB/alan/medium\" \"en_GB-alan-medium\"; \ + download_voice \"en/en_GB/alba/medium\" \"en_GB-alba-medium\"; \ + download_voice \"en/en_GB/aru/medium\" \"en_GB-aru-medium\"; \ + download_voice \"en/en_GB/cori/medium\" \"en_GB-cori-medium\"; \ + download_voice \"en/en_GB/jenny_dioco/medium\" \"en_GB-jenny_dioco-medium\"; \ + download_voice \"en/en_GB/semaine/medium\" \"en_GB-semaine-medium\"; \ + download_voice \"en/en_GB/southern_english_female/low\" \"en_GB-southern_english_female-low\"; \ + download_voice \"en/en_GB/vctk/medium\" \"en_GB-vctk-medium\"; \ + echo \"=== All Piper voices downloaded! ===\"'" + @echo "✅ All Piper voices downloaded!" voices-xtts: @echo "🎤 Downloading XTTS speaker samples..." diff --git a/voice_to_speaker.default.yaml b/voice_to_speaker.default.yaml index 58bef45..cfbbc3d 100644 --- a/voice_to_speaker.default.yaml +++ b/voice_to_speaker.default.yaml @@ -1,16 +1,11 @@ tts-1: - some_other_voice_name_you_want: - model: voices/choose your own model.onnx - speaker: set your own speaker + # OpenAI-compatible voice aliases (backward compatibility) alloy: model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx speaker: 79 # 64, 79, 80, 101, 130 echo: model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx speaker: 134 # 52, 102, 134 - echo-alt: - model: /app/voices/en_US-ryan-high.onnx - speaker: # default speaker (DISABLED - model not included) fable: model: /app/voices/en/en_GB/northern_english_male/medium/en_GB-northern_english_male-medium.onnx speaker: # default speaker @@ -23,6 +18,160 @@ shimmer: model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx speaker: 163 + + # English US voices - all available Piper models + # libritts_r has 904 speakers (multi-speaker model) + en_us_libritts_r_0: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 0 + en_us_libritts_r_52: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 52 + en_us_libritts_r_55: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 55 + en_us_libritts_r_57: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 57 + en_us_libritts_r_61: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 61 + en_us_libritts_r_64: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 64 + en_us_libritts_r_79: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 79 + en_us_libritts_r_80: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 80 + en_us_libritts_r_90: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 90 + en_us_libritts_r_101: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 101 + en_us_libritts_r_102: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 102 + en_us_libritts_r_107: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 107 + en_us_libritts_r_130: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 130 + en_us_libritts_r_132: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 132 + en_us_libritts_r_134: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 134 + en_us_libritts_r_136: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 136 + en_us_libritts_r_137: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 137 + en_us_libritts_r_150: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 150 + en_us_libritts_r_159: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 159 + en_us_libritts_r_162: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 162 + en_us_libritts_r_163: + model: /app/voices/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx + speaker: 163 + + # Single-speaker Piper voices (to be downloaded) + en_us_amy: + model: /app/voices/en/en_US/amy/medium/en_US-amy-medium.onnx + speaker: # default + en_us_arctic: + model: /app/voices/en/en_US/arctic/medium/en_US-arctic-medium.onnx + speaker: # default + en_us_bryce: + model: /app/voices/en/en_US/bryce/medium/en_US-bryce-medium.onnx + speaker: # default + en_us_danny: + model: /app/voices/en/en_US/danny/low/en_US-danny-low.onnx + speaker: # default + en_us_hfc_female: + model: /app/voices/en/en_US/hfc_female/medium/en_US-hfc_female-medium.onnx + speaker: # default + en_us_hfc_male: + model: /app/voices/en/en_US/hfc_male/medium/en_US-hfc_male-medium.onnx + speaker: # default + en_us_joe: + model: /app/voices/en/en_US/joe/medium/en_US-joe-medium.onnx + speaker: # default + en_us_john: + model: /app/voices/en/en_US/john/medium/en_US-john-medium.onnx + speaker: # default + en_us_kathleen: + model: /app/voices/en/en_US/kathleen/low/en_US-kathleen-low.onnx + speaker: # default + en_us_kristin: + model: /app/voices/en/en_US/kristin/medium/en_US-kristin-medium.onnx + speaker: # default + en_us_kusal: + model: /app/voices/en/en_US/kusal/medium/en_US-kusal-medium.onnx + speaker: # default + en_us_l2arctic: + model: /app/voices/en/en_US/l2arctic/medium/en_US-l2arctic-medium.onnx + speaker: # default (multi-speaker model) + en_us_lessac: + model: /app/voices/en/en_US/lessac/medium/en_US-lessac-medium.onnx + speaker: # default (multi-speaker model) + en_us_libritts: + model: /app/voices/en/en_US/libritts/high/en_US-libritts-high.onnx + speaker: # default (multi-speaker model) + en_us_ljspeech: + model: /app/voices/en/en_US/ljspeech/medium/en_US-ljspeech-medium.onnx + speaker: # default + en_us_norman: + model: /app/voices/en/en_US/norman/medium/en_US-norman-medium.onnx + speaker: # default + en_us_reza_ibrahim: + model: /app/voices/en/en_US/reza_ibrahim/medium/en_US-reza_ibrahim-medium.onnx + speaker: # default + en_us_ryan: + model: /app/voices/en/en_US/ryan/high/en_US-ryan-high.onnx + speaker: # default + en_us_sam: + model: /app/voices/en/en_US/sam/medium/en_US-sam-medium.onnx + speaker: # default + + # English GB voices + en_gb_alan: + model: /app/voices/en/en_GB/alan/medium/en_GB-alan-medium.onnx + speaker: # default + en_gb_alba: + model: /app/voices/en/en_GB/alba/medium/en_GB-alba-medium.onnx + speaker: # default + en_gb_aru: + model: /app/voices/en/en_GB/aru/medium/en_GB-aru-medium.onnx + speaker: # default (multi-speaker model) + en_gb_cori: + model: /app/voices/en/en_GB/cori/medium/en_GB-cori-medium.onnx + speaker: # default (multi-speaker model) + en_gb_jenny_dioco: + model: /app/voices/en/en_GB/jenny_dioco/medium/en_GB-jenny_dioco-medium.onnx + speaker: # default + en_gb_northern_english_male: + model: /app/voices/en/en_GB/northern_english_male/medium/en_GB-northern_english_male-medium.onnx + speaker: # default + en_gb_semaine: + model: /app/voices/en/en_GB/semaine/medium/en_GB-semaine-medium.onnx + speaker: # default + en_gb_southern_english_female: + model: /app/voices/en/en_GB/southern_english_female/low/en_GB-southern_english_female-low.onnx + speaker: # default + en_gb_vctk: + model: /app/voices/en/en_GB/vctk/medium/en_GB-vctk-medium.onnx + speaker: # default (multi-speaker model) tts-1-hd: alloy-alt: model: xtts