Map all available Piper voices and expand Makefile downloads

- 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 <noreply@anthropic.com>
This commit is contained in:
Russell Ballestrini 2025-11-09 13:16:22 -05:00
parent 01e51b08b5
commit a8865564ae
2 changed files with 202 additions and 22 deletions

View file

@ -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..."

View file

@ -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