From 580f4113293d8520f7d148b26b893d6619846911 Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Mon, 18 Mar 2024 16:51:11 -0500 Subject: [PATCH] Add VOICES.md --- README.md | 2 +- VOICES.md | 258 +++++++++++++++++++++++++++++++++++ script/generate_voices_md.py | 136 ++++++++++++++++++ 3 files changed, 395 insertions(+), 1 deletion(-) create mode 100644 VOICES.md create mode 100644 script/generate_voices_md.py diff --git a/README.md b/README.md index 0987ce0..fb009a5 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Voices are trained with [VITS](https://github.com/jaywalnut310/vits/) and export Our goal is to support Home Assistant and the [Year of Voice](https://www.home-assistant.io/blog/2022/12/20/year-of-voice/). -[Download voices](https://huggingface.co/rhasspy/piper-voices/tree/v1.0.0) for the supported languages: +[Download voices](VOICES.md) for the supported languages: * Arabic (ar_JO) * Catalan (ca_ES) diff --git a/VOICES.md b/VOICES.md new file mode 100644 index 0000000..55826c6 --- /dev/null +++ b/VOICES.md @@ -0,0 +1,258 @@ +# Voices + +* العربية (`ar_JO`, Arabic) + * kareem + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ar/ar_JO/kareem/low/ar_JO-kareem-low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ar/ar_JO/kareem/medium/ar_JO-kareem-medium.onnx?download=true) +* Català (`ca_ES`, Catalan) + * upc_ona + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ca/ca_ES/upc_ona/x_low/ca_ES-upc_ona-x_low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ca/ca_ES/upc_ona/medium/ca_ES-upc_ona-medium.onnx?download=true) + * upc_pau + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ca/ca_ES/upc_pau/x_low/ca_ES-upc_pau-x_low.onnx?download=true) +* Čeština (`cs_CZ`, Czech) + * jirka + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/cs/cs_CZ/jirka/low/cs_CZ-jirka-low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/cs/cs_CZ/jirka/medium/cs_CZ-jirka-medium.onnx?download=true) +* Dansk (`da_DK`, Danish) + * talesyntese + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/da/da_DK/talesyntese/medium/da_DK-talesyntese-medium.onnx?download=true) +* Deutsch (`de_DE`, German) + * eva_k + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/eva_k/x_low/de_DE-eva_k-x_low.onnx?download=true) + * karlsson + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/karlsson/low/de_DE-karlsson-low.onnx?download=true) + * kerstin + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/kerstin/low/de_DE-kerstin-low.onnx?download=true) + * mls + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/mls/medium/de_DE-mls-medium.onnx?download=true) + * pavoque + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/pavoque/low/de_DE-pavoque-low.onnx?download=true) + * ramona + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/ramona/low/de_DE-ramona-low.onnx?download=true) + * thorsten + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/thorsten/low/de_DE-thorsten-low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/thorsten/medium/de_DE-thorsten-medium.onnx?download=true) + * [high](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/thorsten/high/de_DE-thorsten-high.onnx?download=true) + * thorsten_emotional + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/de/de_DE/thorsten_emotional/medium/de_DE-thorsten_emotional-medium.onnx?download=true) +* Ελληνικά (`el_GR`, Greek) + * rapunzelina + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/el/el_GR/rapunzelina/low/el_GR-rapunzelina-low.onnx?download=true) +* English (en_GB) + * alan + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/alan/low/en_GB-alan-low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/alan/medium/en_GB-alan-medium.onnx?download=true) + * alba + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/alba/medium/en_GB-alba-medium.onnx?download=true) + * aru + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/aru/medium/en_GB-aru-medium.onnx?download=true) + * cori + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/cori/medium/en_GB-cori-medium.onnx?download=true) + * [high](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/cori/high/en_GB-cori-high.onnx?download=true) + * jenny_dioco + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/jenny_dioco/medium/en_GB-jenny_dioco-medium.onnx?download=true) + * northern_english_male + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/northern_english_male/medium/en_GB-northern_english_male-medium.onnx?download=true) + * semaine + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/semaine/medium/en_GB-semaine-medium.onnx?download=true) + * southern_english_female + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/southern_english_female/low/en_GB-southern_english_female-low.onnx?download=true) + * vctk + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_GB/vctk/medium/en_GB-vctk-medium.onnx?download=true) +* English (en_US) + * amy + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/amy/low/en_US-amy-low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/amy/medium/en_US-amy-medium.onnx?download=true) + * arctic + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/arctic/medium/en_US-arctic-medium.onnx?download=true) + * danny + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/danny/low/en_US-danny-low.onnx?download=true) + * hfc_female + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/hfc_female/medium/en_US-hfc_female-medium.onnx?download=true) + * hfc_male + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/hfc_male/medium/en_US-hfc_male-medium.onnx?download=true) + * joe + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/joe/medium/en_US-joe-medium.onnx?download=true) + * kathleen + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/kathleen/low/en_US-kathleen-low.onnx?download=true) + * kristin + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/kristin/medium/en_US-kristin-medium.onnx?download=true) + * kusal + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/kusal/medium/en_US-kusal-medium.onnx?download=true) + * l2arctic + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/l2arctic/medium/en_US-l2arctic-medium.onnx?download=true) + * lessac + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/lessac/low/en_US-lessac-low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/lessac/medium/en_US-lessac-medium.onnx?download=true) + * [high](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/lessac/high/en_US-lessac-high.onnx?download=true) + * libritts + * [high](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/libritts/high/en_US-libritts-high.onnx?download=true) + * libritts_r + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/libritts_r/medium/en_US-libritts_r-medium.onnx?download=true) + * ljspeech + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/ljspeech/medium/en_US-ljspeech-medium.onnx?download=true) + * [high](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/ljspeech/high/en_US-ljspeech-high.onnx?download=true) + * ryan + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/ryan/low/en_US-ryan-low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/ryan/medium/en_US-ryan-medium.onnx?download=true) + * [high](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/ryan/high/en_US-ryan-high.onnx?download=true) +* Español (`es_ES`, Spanish) + * carlfm + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_ES/carlfm/x_low/es_ES-carlfm-x_low.onnx?download=true) + * davefx + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_ES/davefx/medium/es_ES-davefx-medium.onnx?download=true) + * mls_10246 + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_ES/mls_10246/low/es_ES-mls_10246-low.onnx?download=true) + * mls_9972 + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_ES/mls_9972/low/es_ES-mls_9972-low.onnx?download=true) + * sharvard + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_ES/sharvard/medium/es_ES-sharvard-medium.onnx?download=true) +* Español (`es_MX`, Spanish) + * ald + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_MX/ald/medium/es_MX-ald-medium.onnx?download=true) + * claude + * [high](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_MX/claude/high/es_MX-claude-high.onnx?download=true) +* فارسی (`fa_IR`, Farsi) + * amir + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fa/fa_IR/amir/medium/fa_IR-amir-medium.onnx?download=true) + * gyro + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fa/fa_IR/gyro/medium/fa_IR-gyro-medium.onnx?download=true) +* Suomi (`fi_FI`, Finnish) + * harri + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fi/fi_FI/harri/low/fi_FI-harri-low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fi/fi_FI/harri/medium/fi_FI-harri-medium.onnx?download=true) +* Français (`fr_FR`, French) + * gilles + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fr/fr_FR/gilles/low/fr_FR-gilles-low.onnx?download=true) + * mls + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fr/fr_FR/mls/medium/fr_FR-mls-medium.onnx?download=true) + * mls_1840 + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fr/fr_FR/mls_1840/low/fr_FR-mls_1840-low.onnx?download=true) + * siwis + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fr/fr_FR/siwis/low/fr_FR-siwis-low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fr/fr_FR/siwis/medium/fr_FR-siwis-medium.onnx?download=true) + * tom + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fr/fr_FR/tom/medium/fr_FR-tom-medium.onnx?download=true) + * upmc + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/fr/fr_FR/upmc/medium/fr_FR-upmc-medium.onnx?download=true) +* Magyar (`hu_HU`, Hungarian) + * anna + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/hu/hu_HU/anna/medium/hu_HU-anna-medium.onnx?download=true) + * berta + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/hu/hu_HU/berta/medium/hu_HU-berta-medium.onnx?download=true) + * imre + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/hu/hu_HU/imre/medium/hu_HU-imre-medium.onnx?download=true) +* íslenska (`is_IS`, Icelandic) + * bui + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/is/is_IS/bui/medium/is_IS-bui-medium.onnx?download=true) + * salka + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/is/is_IS/salka/medium/is_IS-salka-medium.onnx?download=true) + * steinn + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/is/is_IS/steinn/medium/is_IS-steinn-medium.onnx?download=true) + * ugla + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/is/is_IS/ugla/medium/is_IS-ugla-medium.onnx?download=true) +* Italiano (`it_IT`, Italian) + * riccardo + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/it/it_IT/riccardo/x_low/it_IT-riccardo-x_low.onnx?download=true) +* ქართული ენა (`ka_GE`, Georgian) + * natia + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ka/ka_GE/natia/medium/ka_GE-natia-medium.onnx?download=true) +* қазақша (`kk_KZ`, Kazakh) + * iseke + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/kk/kk_KZ/iseke/x_low/kk_KZ-iseke-x_low.onnx?download=true) + * issai + * [high](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/kk/kk_KZ/issai/high/kk_KZ-issai-high.onnx?download=true) + * raya + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/kk/kk_KZ/raya/x_low/kk_KZ-raya-x_low.onnx?download=true) +* Lëtzebuergesch (`lb_LU`, Luxembourgish) + * marylux + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/lb/lb_LU/marylux/medium/lb_LU-marylux-medium.onnx?download=true) +* नेपाली (`ne_NP`, Nepali) + * google + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ne/ne_NP/google/x_low/ne_NP-google-x_low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ne/ne_NP/google/medium/ne_NP-google-medium.onnx?download=true) +* Nederlands (`nl_BE`, Dutch) + * nathalie + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_BE/nathalie/x_low/nl_BE-nathalie-x_low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_BE/nathalie/medium/nl_BE-nathalie-medium.onnx?download=true) + * rdh + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_BE/rdh/x_low/nl_BE-rdh-x_low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_BE/rdh/medium/nl_BE-rdh-medium.onnx?download=true) +* Nederlands (`nl_NL`, Dutch) + * mls + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_NL/mls/medium/nl_NL-mls-medium.onnx?download=true) + * mls_5809 + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_NL/mls_5809/low/nl_NL-mls_5809-low.onnx?download=true) + * mls_7432 + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/nl/nl_NL/mls_7432/low/nl_NL-mls_7432-low.onnx?download=true) +* Norsk (`no_NO`, Norwegian) + * talesyntese + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/no/no_NO/talesyntese/medium/no_NO-talesyntese-medium.onnx?download=true) +* Polski (`pl_PL`, Polish) + * darkman + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/pl/pl_PL/darkman/medium/pl_PL-darkman-medium.onnx?download=true) + * gosia + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/pl/pl_PL/gosia/medium/pl_PL-gosia-medium.onnx?download=true) + * mc_speech + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/pl/pl_PL/mc_speech/medium/pl_PL-mc_speech-medium.onnx?download=true) + * mls_6892 + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/pl/pl_PL/mls_6892/low/pl_PL-mls_6892-low.onnx?download=true) +* Português (`pt_BR`, Portuguese) + * edresson + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/pt/pt_BR/edresson/low/pt_BR-edresson-low.onnx?download=true) + * faber + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/pt/pt_BR/faber/medium/pt_BR-faber-medium.onnx?download=true) +* Português (`pt_PT`, Portuguese) + * tugão + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/pt/pt_PT/tugão/medium/pt_PT-tugão-medium.onnx?download=true) +* Română (`ro_RO`, Romanian) + * mihai + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ro/ro_RO/mihai/medium/ro_RO-mihai-medium.onnx?download=true) +* Русский (`ru_RU`, Russian) + * denis + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx?download=true) + * dmitri + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/dmitri/medium/ru_RU-dmitri-medium.onnx?download=true) + * irina + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/irina/medium/ru_RU-irina-medium.onnx?download=true) + * ruslan + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/ruslan/medium/ru_RU-ruslan-medium.onnx?download=true) +* Slovenčina (`sk_SK`, Slovak) + * lili + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/sk/sk_SK/lili/medium/sk_SK-lili-medium.onnx?download=true) +* Slovenščina (`sl_SI`, Slovenian) + * artur + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/sl/sl_SI/artur/medium/sl_SI-artur-medium.onnx?download=true) +* srpski (`sr_RS`, Serbian) + * serbski_institut + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/sr/sr_RS/serbski_institut/medium/sr_RS-serbski_institut-medium.onnx?download=true) +* Svenska (`sv_SE`, Swedish) + * nst + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/sv/sv_SE/nst/medium/sv_SE-nst-medium.onnx?download=true) +* Kiswahili (`sw_CD`, Swahili) + * lanfrica + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/sw/sw_CD/lanfrica/medium/sw_CD-lanfrica-medium.onnx?download=true) +* Türkçe (`tr_TR`, Turkish) + * dfki + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/tr/tr_TR/dfki/medium/tr_TR-dfki-medium.onnx?download=true) + * fahrettin + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/tr/tr_TR/fahrettin/medium/tr_TR-fahrettin-medium.onnx?download=true) + * fettah + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/tr/tr_TR/fettah/medium/tr_TR-fettah-medium.onnx?download=true) +* украї́нська мо́ва (`uk_UA`, Ukrainian) + * lada + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/uk/uk_UA/lada/x_low/uk_UA-lada-x_low.onnx?download=true) + * ukrainian_tts + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/uk/uk_UA/ukrainian_tts/medium/uk_UA-ukrainian_tts-medium.onnx?download=true) +* Tiếng Việt (`vi_VN`, Vietnamese) + * 25hours_single + * [low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/vi/vi_VN/25hours_single/low/vi_VN-25hours_single-low.onnx?download=true) + * vais1000 + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/vi/vi_VN/vais1000/medium/vi_VN-vais1000-medium.onnx?download=true) + * vivos + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/vi/vi_VN/vivos/x_low/vi_VN-vivos-x_low.onnx?download=true) +* 简体中文 (`zh_CN`, Chinese) + * huayan + * [x_low](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/zh/zh_CN/huayan/x_low/zh_CN-huayan-x_low.onnx?download=true) + * [medium](https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/zh/zh_CN/huayan/medium/zh_CN-huayan-medium.onnx?download=true) diff --git a/script/generate_voices_md.py b/script/generate_voices_md.py new file mode 100644 index 0000000..42fac45 --- /dev/null +++ b/script/generate_voices_md.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +import argparse +import logging +from collections import defaultdict +from dataclasses import dataclass +from pathlib import Path + + +@dataclass +class Voice: + lang_family: str + lang_code: str + dataset: str + quality: str + url: str + + +@dataclass +class Language: + native: str + english: str + country: str + + +_LANGUAGES = { + "ar_JO": Language("العربية", "Arabic", "Jordan"), + "ca_ES": Language("Català", "Catalan", "Spain"), + "cs_CZ": Language("Čeština", "Czech", "Czech Republic"), + "da_DK": Language("Dansk", "Danish", "Denmark"), + "de_DE": Language("Deutsch", "German", "Germany"), + "el_GR": Language("Ελληνικά", "Greek", "Greece"), + "en_GB": Language("English", "English", "Great Britain"), + "en_US": Language("English", "English", "United States"), + "es_ES": Language("Español", "Spanish", "Spain"), + "es_MX": Language("Español", "Spanish", "Mexico"), + "fa_IR": Language("فارسی", "Farsi", "Iran"), + "fi_FI": Language("Suomi", "Finnish", "Finland"), + "fr_FR": Language("Français", "French", "France"), + "is_IS": Language("íslenska", "Icelandic", "Iceland"), + "it_IT": Language("Italiano", "Italian", "Italy"), + "hu_HU": Language("Magyar", "Hungarian", "Hungary"), + "ka_GE": Language("ქართული ენა", "Georgian", "Georgia"), + "kk_KZ": Language("қазақша", "Kazakh", "Kazakhstan"), + "lb_LU": Language("Lëtzebuergesch", "Luxembourgish", "Luxembourg"), + "ne_NP": Language("नेपाली", "Nepali", "Nepal"), + "nl_BE": Language("Nederlands", "Dutch", "Belgium"), + "nl_NL": Language("Nederlands", "Dutch", "Netherlands"), + "no_NO": Language("Norsk", "Norwegian", "Norway"), + "pl_PL": Language("Polski", "Polish", "Poland"), + "pt_BR": Language("Português", "Portuguese", "Brazil"), + "pt_PT": Language("Português", "Portuguese", "Portugal"), + "ro_RO": Language("Română", "Romanian", "Romania"), + "ru_RU": Language("Русский", "Russian", "Russia"), + "sk_SK": Language("Slovenčina", "Slovak", "Slovakia"), + "sl_SI": Language("Slovenščina", "Slovenian", "Slovenia"), + "sr_RS": Language("srpski", "Serbian", "Serbia"), + "sv_SE": Language("Svenska", "Swedish", "Sweden"), + "sw_CD": Language("Kiswahili", "Swahili", "Democratic Republic of the Congo"), + "tr_TR": Language("Türkçe", "Turkish", "Turkey"), + "uk_UA": Language("украї́нська мо́ва", "Ukrainian", "Ukraine"), + "vi_VN": Language("Tiếng Việt", "Vietnamese", "Vietnam"), + "zh_CN": Language("简体中文", "Chinese", "China"), +} + +_QUALITY = {"x_low": 0, "low": 1, "medium": 2, "high": 3} + + +_LOGGER = logging.getLogger() + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument( + "--piper-voices", required=True, help="Path to piper-voices root" + ) + parser.add_argument( + "--url-format", + default="https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/{lang_family}/{lang_code}/{dataset}/{quality}/{lang_code}-{dataset}-{quality}.onnx?download=true", + help="URL format string with lang_family, lang_code, dataset, and quality", + ) + args = parser.parse_args() + logging.basicConfig(level=logging.DEBUG) + + voices_by_lang_code = defaultdict(list) + piper_voices = Path(args.piper_voices) + for onnx_path in piper_voices.rglob("*.onnx"): + _LOGGER.debug(onnx_path) + parts = onnx_path.stem.split("-") + if len(parts) != 3: + _LOGGER.warning("Skipping %s", onnx_path) + continue + + lang_code, dataset, quality = parts + assert lang_code in _LANGUAGES, f"Missing {lang_code}" + lang_family = lang_code.split("_")[0] + url = args.url_format.format( + lang_family=lang_family, + lang_code=lang_code, + dataset=dataset, + quality=quality, + ) + + voices_by_lang_code[lang_code].append( + Voice( + lang_family=lang_family, + lang_code=lang_code, + dataset=dataset, + quality=quality, + url=url, + ) + ) + + print("# Voices") + print("") + + for lang_code in sorted(voices_by_lang_code): + lang_info = _LANGUAGES[lang_code] + if lang_code.startswith("en_"): + print("*", lang_info.native, f"({lang_code})") + else: + print("*", lang_info.native, f"(`{lang_code}`, {lang_info.english})") + + last_dataset = None + for voice in sorted( + voices_by_lang_code[lang_code], + key=lambda v: (v.dataset, _QUALITY[v.quality]), + ): + if voice.dataset != last_dataset: + print(" *", voice.dataset) + last_dataset = voice.dataset + + print(" *", f"[{voice.quality}]({voice.url})") + + +if __name__ == "__main__": + main()