This repository has been archived on 2025-08-26. You can view files and clone it, but cannot push or open issues or pull requests.
Files
enginex_bi_series-sherpa-onnx/scripts/piper/generate.py
2025-06-30 13:36:29 +08:00

1448 lines
53 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# Copyright 2025 Xiaomi Corp. (authors: Fangjun Kuang)
import argparse
from dataclasses import dataclass
from pathlib import Path
import jinja2
"""
TODO:
- add https://huggingface.co/csukuangfj/vits-piper-en_US-glados
"""
def get_args():
parser = argparse.ArgumentParser()
parser.add_argument(
"--total",
type=int,
default=1,
help="Number of runners",
)
parser.add_argument(
"--index",
type=int,
default=0,
help="Index of the current runner",
)
return parser.parse_args()
@dataclass
class PiperModel:
# For en_GB-semaine-medium
name: str # semaine
kind: str # e.g. medium
sr: int # sample rate
ns: int # number of speakers
lang: str = "" # e.g., en_GB
cmd: str = ""
model_name: str = ""
text: str = ""
index: int = 0
url: str = ""
# arabic
def get_ar_models():
ar_jo = [
PiperModel(name="kareem", kind="low", sr=16000, ns=1),
PiperModel(name="kareem", kind="medium", sr=22050, ns=1),
]
for m in ar_jo:
m.lang = "ar_JO"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = ar_jo
for m in ans:
m.text = "كيف حالك اليوم؟"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# catlan
def get_ca_models():
ca_es = [
PiperModel(name="upc_ona", kind="medium", sr=22050, ns=1),
PiperModel(name="upc_ona", kind="x_low", sr=16000, ns=1),
PiperModel(name="upc_pau", kind="x_low", sr=16000, ns=1),
]
for m in ca_es:
m.lang = "ca_ES"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = ca_es
for m in ans:
m.text = "Si vols estar ben servit, fes-te tu mateix el llit"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# czech
def get_cs_models():
cs_cz = [
PiperModel(name="jirka", kind="low", sr=16000, ns=1),
PiperModel(name="jirka", kind="medium", sr=22050, ns=1),
]
for m in cs_cz:
m.lang = "cs_CZ"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = cs_cz
for m in ans:
m.text = "Co můžeš udělat dnes, neodkládej na zítřek. "
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# welsh
def get_cy_models():
cy_gb = [
PiperModel(name="bu_tts", kind="medium", sr=22050, ns=7),
PiperModel(name="gwryw_gogleddol", kind="medium", sr=22050, ns=1),
]
for m in cy_gb:
m.lang = "cy_GB"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = cy_gb
for m in ans:
m.text = "Ni all y gwynt ei hunan ei ddilyn, ac felly maen rhaid ir gŵyr ddod ir gorwel i weld y llwybr yn gyfarwydd"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# danish
def get_da_models():
da_dk = [
PiperModel(name="talesyntese", kind="medium", sr=22050, ns=1),
]
for m in da_dk:
m.lang = "da_DK"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = da_dk
for m in ans:
m.text = (
"Hvis du går langsomt, men aldrig stopper, når du ender frem til dit mål."
)
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# greek
def get_el_models():
el_gr = [
PiperModel(name="rapunzelina", kind="low", sr=16000, ns=1),
]
for m in el_gr:
m.lang = "el_GR"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = el_gr
for m in ans:
m.text = (
"Όταν το δέντρο είναι μικρό, το στρέβλεις· όταν είναι μεγάλο, το λυγίζεις."
)
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# spanish
def get_es_models():
es_ES = [
PiperModel(name="carlfm", kind="x_low", sr=16000, ns=1),
PiperModel(name="davefx", kind="medium", sr=22050, ns=1),
PiperModel(name="sharvard", kind="medium", sr=22050, ns=2),
]
es_ES.extend(
[
# https://github.com/rhasspy/piper/issues/187#issuecomment-1802216304
# https://drive.google.com/file/d/12tNCCyd0Hf5jsyqCw8828kLSHHx5LOw9/view
PiperModel(
name="glados",
kind="medium",
sr=22050,
ns=1,
cmd="""
wget -qq https://huggingface.co/csukuangfj/vits-piper-es_ES-glados-medium/resolve/main/es_ES-glados-medium.onnx
wget -qq https://huggingface.co/csukuangfj/vits-piper-es_ES-glados-medium/resolve/main/es_ES-glados-medium.onnx.json
wget -qq https://huggingface.co/csukuangfj/vits-piper-es_ES-glados-medium/resolve/main/README.md
""",
url="https://github.com/rhasspy/piper/issues/187#issuecomment-1802216304",
),
]
)
es_MX = [
PiperModel(name="ald", kind="medium", sr=22050, ns=1),
PiperModel(name="claude", kind="high", sr=22050, ns=1),
]
for m in es_ES:
m.lang = "es_ES"
for m in es_MX:
m.lang = "es_MX"
ans = es_ES + es_MX
for m in ans:
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
m.text = "Cuando te encuentres ante una puerta cerrada, no olvides que a veces el destino cierra una puerta para que te desvíes hacia un camino que lleva a una ventana que nunca habrías encontrado por tu cuenta."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# persian
def get_fa_models():
fa_IR = [
PiperModel(name="amir", kind="medium", sr=22050, ns=1),
PiperModel(name="ganji", kind="medium", sr=22050, ns=1),
PiperModel(name="ganji_adabi", kind="medium", sr=22050, ns=1),
PiperModel(name="gyro", kind="medium", sr=22050, ns=1),
PiperModel(name="reza_ibrahim", kind="medium", sr=22050, ns=1),
]
for m in fa_IR:
m.lang = "fa_IR"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = fa_IR
for m in ans:
m.text = "همانطور که کوه ها در برابر باد و باران پایدارند، اما به مرور زمان خرد و پخش می شوند، انسان نیز باید در برابر مشکلات قوی باشد، اما با خرد و خویشتن داری در زندگی به پیش برود."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# finnish
def get_fi_models():
fi_FI = [
PiperModel(name="harri", kind="low", sr=16000, ns=1),
PiperModel(name="harri", kind="medium", sr=22050, ns=1),
]
for m in fi_FI:
m.lang = "fi_FI"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = fi_FI
for m in ans:
m.text = "Sateenkaaren päässä on kultaa, mutta vain ne, jotka siihen uskovat, voivat sen löytää."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# french
def get_fr_models():
fr_FR = [
PiperModel(name="gilles", kind="low", sr=16000, ns=1),
PiperModel(name="siwis", kind="low", sr=16000, ns=1),
PiperModel(name="siwis", kind="medium", sr=22050, ns=1),
PiperModel(name="tom", kind="medium", sr=44100, ns=1),
PiperModel(name="upmc", kind="medium", sr=22050, ns=2),
]
for m in fr_FR:
m.lang = "fr_FR"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = fr_FR
for m in ans:
m.text = "Pas de nouvelles, bonnes nouvelles."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# hungarian
def get_hu_models():
hu_HU = [
PiperModel(name="anna", kind="medium", sr=22050, ns=1),
PiperModel(name="berta", kind="medium", sr=22050, ns=1),
PiperModel(name="imre", kind="medium", sr=22050, ns=1),
]
for m in hu_HU:
m.lang = "hu_HU"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = hu_HU
for m in ans:
m.text = "Ha északról fúj a szél, a lányok nem lógnak együtt."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# icelandic
def get_is_models():
is_IS = [
PiperModel(name="bui", kind="medium", sr=22050, ns=1),
PiperModel(name="salka", kind="medium", sr=22050, ns=1),
PiperModel(name="steinn", kind="medium", sr=22050, ns=1),
PiperModel(name="ugla", kind="medium", sr=22050, ns=1),
]
for m in is_IS:
m.lang = "is_IS"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = is_IS
for m in ans:
m.text = "Farðu með allt, eða farðu ekki."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# italian
def get_it_models():
it_IT = [
PiperModel(name="paola", kind="medium", sr=22050, ns=1),
PiperModel(name="riccardo", kind="x_low", sr=16000, ns=1),
]
for m in it_IT:
m.lang = "it_IT"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = it_IT
for m in ans:
m.text = (
"Se vuoi andare veloce, vai da solo; se vuoi andare lontano, vai insieme."
)
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# georgian
def get_ka_models():
ka_GE = [
PiperModel(name="natia", kind="medium", sr=22050, ns=1),
]
for m in ka_GE:
m.lang = "ka_GE"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = ka_GE
for m in ans:
m.text = "ღვინო თბილისში, საქართველო სამტრედში"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# kazakh
def get_kk_models():
kk_KZ = [
PiperModel(name="iseke", kind="x_low", sr=16000, ns=1),
PiperModel(name="issai", kind="high", sr=22050, ns=6),
PiperModel(name="raya", kind="x_low", sr=16000, ns=1),
]
for m in kk_KZ:
m.lang = "kk_KZ"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = kk_KZ
for m in ans:
m.text = "Әлемнің жұлдыздары сенің көзің, жаным."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# luxembourgish
def get_lb_models():
lb_LU = [
PiperModel(name="marylux", kind="medium", sr=22050, ns=1),
]
for m in lb_LU:
m.lang = "lb_LU"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = lb_LU
for m in ans:
m.text = "Op der Haaptstrooss sinn all Stroossen Brécken, awer d'Dier kann iwwerall erreecht ginn."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# latvian
def get_lv_models():
lv_LV = [
PiperModel(name="aivars", kind="medium", sr=22050, ns=1),
]
for m in lv_LV:
m.lang = "lv_LV"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = lv_LV
for m in ans:
m.text = "Zeme nenes augļus, ja tēvs sēj, bet māte auž."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# malayalam
def get_ml_models():
ml_IN = [
PiperModel(name="arjun", kind="medium", sr=22050, ns=1),
PiperModel(name="meera", kind="medium", sr=22050, ns=1),
]
for m in ml_IN:
m.lang = "ml_IN"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = ml_IN
for m in ans:
m.text = "മണ്ണ് മരിക്കുമ്പോൾ കാട്ടിലെ വെള്ളവും മരിക്കുന്നു."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Nepali
def get_ne_models():
ne_NP = [
PiperModel(name="chitwan", kind="medium", sr=22050, ns=1),
PiperModel(name="google", kind="medium", sr=22050, ns=18),
PiperModel(name="google", kind="x_low", sr=16000, ns=18),
]
for m in ne_NP:
m.lang = "ne_NP"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = ne_NP
for m in ans:
m.text = "घाँसको पातले पहाडलाई अभिवादन गर्दै झुक्छ।"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# dutch
def get_nl_models():
nl_BE = [
PiperModel(name="nathalie", kind="medium", sr=22050, ns=1),
PiperModel(name="nathalie", kind="x_low", sr=16000, ns=1),
]
nl_NL = [
PiperModel(name="pim", kind="medium", sr=22050, ns=1),
PiperModel(name="ronnie", kind="medium", sr=22050, ns=1),
]
for m in nl_BE:
m.lang = "nl_BE"
for m in nl_NL:
m.lang = "nl_NL"
ans = nl_BE + nl_NL
for m in ans:
m.text = "God schiep het water, maar de Nederlander schiep de dijk"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# norwegian
def get_no_models():
no_NO = [
PiperModel(name="talesyntese", kind="medium", sr=22050, ns=1),
]
for m in no_NO:
m.lang = "no_NO"
ans = no_NO
for m in ans:
m.text = "Uskyldig kan stormen veroorzaken"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# polish
def get_pl_models():
pl_PL = [
PiperModel(name="darkman", kind="medium", sr=22050, ns=1),
PiperModel(name="gosia", kind="medium", sr=22050, ns=1),
PiperModel(name="mc_speech", kind="medium", sr=22050, ns=1),
]
for m in pl_PL:
m.lang = "pl_PL"
ans = pl_PL
for m in ans:
m.text = "Nieważne, za kogo walczysz, i tak popełnisz błąd"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Portuguese
def get_pt_models():
pt_BR = [
PiperModel(name="cadu", kind="medium", sr=22050, ns=1),
PiperModel(name="edresson", kind="low", sr=16000, ns=1),
PiperModel(name="faber", kind="medium", sr=22050, ns=1),
PiperModel(name="jeff", kind="medium", sr=22050, ns=1),
]
pt_PT = [
PiperModel(name="tugão", kind="medium", sr=22050, ns=1),
]
for m in pt_BR:
m.lang = "pt_BR"
for m in pt_PT:
m.lang = "pt_PT"
ans = pt_BR + pt_PT
for m in ans:
m.text = "Marinha sem vento, não chega a porto"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Romanian
def get_ro_models():
ro_RO = [
PiperModel(name="mihai", kind="medium", sr=22050, ns=1),
]
for m in ro_RO:
m.lang = "ro_RO"
ans = ro_RO
for m in ans:
m.text = "Un foc fără lemne se stinge, o lume fără poveste moare."
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Russian
def get_ru_models():
ru_RU = [
PiperModel(name="denis", kind="medium", sr=22050, ns=1),
PiperModel(name="dmitri", kind="medium", sr=22050, ns=1),
PiperModel(name="irina", kind="medium", sr=22050, ns=1),
PiperModel(name="ruslan", kind="medium", sr=22050, ns=1),
]
for m in ru_RU:
m.lang = "ru_RU"
ans = ru_RU
for m in ans:
m.text = "Если курица укусит, ей отрубят голову."
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Slovak
def get_sk_models():
sk_SK = [
PiperModel(name="lili", kind="medium", sr=22050, ns=1),
]
for m in sk_SK:
m.lang = "sk_SK"
ans = sk_SK
for m in ans:
m.text = "Kto nepozná strach, nepozná vôľu."
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Slovenian
def get_sl_models():
sl_SI = [
PiperModel(name="artur", kind="medium", sr=22050, ns=1),
]
for m in sl_SI:
m.lang = "sl_SI"
ans = sl_SI
for m in ans:
m.text = "Kto sa nebojí, nie je hlúpy."
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Serbian
def get_sr_models():
sr_RS = [
PiperModel(name="serbski_institut", kind="medium", sr=22050, ns=2),
]
for m in sr_RS:
m.lang = "sr_RS"
ans = sr_RS
for m in ans:
m.text = "Круг не може постојати без свог центра, а нација не може постојати без својих хероја."
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Swedish
def get_sv_models():
sv_SE = [
PiperModel(name="lisa", kind="medium", sr=22050, ns=1),
PiperModel(name="nst", kind="medium", sr=22050, ns=1),
]
for m in sv_SE:
m.lang = "sv_SE"
ans = sv_SE
for m in ans:
m.text = "Liten skog, med många träd"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Swahili
def get_sw_models():
sw_CD = [
PiperModel(name="lanfrica", kind="medium", sr=22050, ns=1),
]
for m in sw_CD:
m.lang = "sw_CD"
ans = sw_CD
for m in ans:
m.text = "Mtu mmoja hawezi kuiba mazingira."
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Turkish
def get_tr_models():
tr_TR = [
PiperModel(name="dfki", kind="medium", sr=22050, ns=1),
PiperModel(name="fahrettin", kind="medium", sr=22050, ns=1),
PiperModel(name="fettah", kind="medium", sr=22050, ns=1),
]
for m in tr_TR:
m.lang = "tr_TR"
ans = tr_TR
for m in ans:
m.text = "Bir evin duvarları, bir adamın sözü, bir kadının gülü kırılmaz"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Ukrainian
def get_uk_models():
uk_UA = [
PiperModel(name="lada", kind="x_low", sr=16000, ns=1),
PiperModel(name="ukrainian_tts", kind="medium", sr=22050, ns=3),
]
for m in uk_UA:
m.lang = "uk_UA"
ans = uk_UA
for m in ans:
m.text = "Ви не можете навчити коня, якщо не відвикнете від годівлі."
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
# Vietnamese
def get_vi_models():
vi_VN = [
PiperModel(name="25hours_single", kind="low", sr=16000, ns=1),
PiperModel(name="vais1000", kind="medium", sr=22050, ns=1),
PiperModel(name="vivos", kind="x_low", sr=16000, ns=65),
]
for m in vi_VN:
m.lang = "vi_VN"
ans = vi_VN
for m in ans:
m.text = "Nước cũ đào gỗ mới, sông cũ chảy nước mới"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
def get_en_models():
en_gb = [
PiperModel(name="alan", kind="low", sr=16000, ns=1),
PiperModel(name="alan", kind="medium", sr=22050, ns=1),
PiperModel(name="alba", kind="medium", sr=22050, ns=1),
PiperModel(name="aru", kind="medium", sr=22050, ns=12),
PiperModel(name="cori", kind="high", sr=22050, ns=1),
PiperModel(name="cori", kind="medium", sr=22050, ns=1),
PiperModel(name="jenny_dioco", kind="medium", sr=22050, ns=1),
PiperModel(name="northern_english_male", kind="medium", sr=22050, ns=1),
PiperModel(name="semaine", kind="medium", sr=22050, ns=4),
PiperModel(name="southern_english_female", kind="low", sr=16000, ns=1),
PiperModel(name="vctk", kind="medium", sr=22050, ns=109),
]
en_us = [
PiperModel(name="amy", kind="low", sr=16000, ns=1),
PiperModel(name="amy", kind="medium", sr=22050, ns=1),
PiperModel(name="arctic", kind="medium", sr=22050, ns=18),
PiperModel(name="bryce", kind="medium", sr=22050, ns=1),
PiperModel(name="danny", kind="low", sr=16000, ns=1),
PiperModel(name="hfc_female", kind="medium", sr=22050, ns=1),
PiperModel(name="hfc_male", kind="medium", sr=22050, ns=1),
PiperModel(name="joe", kind="medium", sr=22050, ns=1),
PiperModel(name="john", kind="medium", sr=22050, ns=1),
PiperModel(name="kathleen", kind="low", sr=16000, ns=1),
PiperModel(name="kristin", kind="medium", sr=22050, ns=1),
PiperModel(name="kusal", kind="medium", sr=22050, ns=1),
PiperModel(name="l2arctic", kind="medium", sr=22050, ns=24),
PiperModel(name="lessac", kind="high", sr=22050, ns=1),
PiperModel(name="lessac", kind="low", sr=16000, ns=1),
PiperModel(name="lessac", kind="medium", sr=22050, ns=1),
PiperModel(name="libritts", kind="high", sr=22050, ns=904),
PiperModel(name="libritts_r", kind="medium", sr=22050, ns=904),
PiperModel(name="ljspeech", kind="high", sr=22050, ns=1),
PiperModel(name="ljspeech", kind="medium", sr=22050, ns=1),
PiperModel(name="norman", kind="medium", sr=22050, ns=1),
PiperModel(name="reza_ibrahim", kind="medium", sr=22050, ns=1),
PiperModel(name="ryan", kind="high", sr=22050, ns=1),
PiperModel(name="ryan", kind="low", sr=16000, ns=1),
PiperModel(name="ryan", kind="medium", sr=22050, ns=1),
PiperModel(name="sam", kind="medium", sr=22050, ns=1),
]
en_gb.extend(
[
PiperModel(
name="southern_english_female",
kind="medium",
sr=22050,
ns=6,
cmd="""
wget -qq https://huggingface.co/csukuangfj/vits-piper-en_GB-southern_english_female-medium/resolve/main/en_GB-southern_english_female-medium.onnx
wget -qq https://huggingface.co/csukuangfj/vits-piper-en_GB-southern_english_female-medium/resolve/main/en_GB-southern_english_female-medium.onnx.json
""",
url="https://huggingface.co/csukuangfj/vits-piper-en_GB-southern_english_female-medium",
),
PiperModel(
name="southern_english_male",
kind="medium",
sr=22050,
ns=8,
cmd="""
wget -qq https://huggingface.co/csukuangfj/vits-piper-en_GB-southern_english_male-medium/resolve/main/en_GB-southern_english_male-medium.onnx
wget -qq https://huggingface.co/csukuangfj/vits-piper-en_GB-southern_english_male-medium/resolve/main/en_GB-southern_english_male-medium.onnx.json
""",
url="https://huggingface.co/csukuangfj/vits-piper-en_GB-southern_english_male-medium",
),
]
)
en_us.extend(
[
# https://github.com/rhasspy/piper/issues/187#issuecomment-1805709037
# https://drive.google.com/file/d/1t2D7zP-e2flduS5duHm__UMB9RjuGqWK/view
PiperModel(
name="glados",
kind="high",
sr=22050,
ns=1,
cmd="""
wget -qq https://huggingface.co/csukuangfj/en_US-glados-high/resolve/main/en_US-glados-high.onnx
wget -qq https://huggingface.co/csukuangfj/en_US-glados-high/resolve/main/en_US-glados-high.onnx.json
wget -qq https://huggingface.co/csukuangfj/en_US-glados-high/resolve/main/README.md
wget -qq https://huggingface.co/csukuangfj/en_US-glados-high/resolve/main/MODEL_CARD
""",
url="https://github.com/rhasspy/piper/issues/187#issuecomment-1805709037",
),
]
)
for m in en_gb:
m.lang = "en_GB"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
for m in en_us:
m.lang = "en_US"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = en_gb + en_us
for m in ans:
m.text = "Friends fell out often because life was changing so fast. The easiest thing in the world was to lose touch with someone."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
def get_de_models():
de_de = [
PiperModel(name="eva_k", kind="x_low", sr=16000, ns=1),
PiperModel(name="karlsson", kind="low", sr=16000, ns=1),
PiperModel(name="kerstin", kind="low", sr=16000, ns=1),
PiperModel(name="pavoque", kind="low", sr=16000, ns=1),
PiperModel(name="ramona", kind="low", sr=16000, ns=1),
PiperModel(name="thorsten", kind="high", sr=22050, ns=1),
PiperModel(name="thorsten", kind="low", sr=16000, ns=1),
PiperModel(name="thorsten", kind="medium", sr=22050, ns=1),
PiperModel(name="thorsten_emotional", kind="medium", sr=22050, ns=8),
# https://github.com/rhasspy/piper/issues/187#issuecomment-2691653607
PiperModel(
name="glados",
kind="high",
sr=22050,
ns=1,
cmd="""
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados/high/de_DE-glados-high.onnx
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados/high/de_DE-glados-high.onnx.json
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados/high/MODEL_CARD
wget -qq https://huggingface.co/csukuangfj/vits-piper-de_DE-glados-high/resolve/main/README.md
""",
url="https://huggingface.co/systemofapwne/piper-de-glados",
),
PiperModel(
name="glados",
kind="low",
sr=16000,
ns=1,
cmd="""
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados/low/de_DE-glados-low.onnx
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados/low/de_DE-glados-low.onnx.json
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados/low/MODEL_CARD
wget -qq https://huggingface.co/csukuangfj/vits-piper-de_DE-glados-low/resolve/main/README.md
""",
url="https://huggingface.co/systemofapwne/piper-de-glados",
),
PiperModel(
name="glados",
kind="medium",
sr=22050,
ns=1,
cmd="""
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados/medium/de_DE-glados-medium.onnx
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados/medium/de_DE-glados-medium.onnx.json
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados/medium/MODEL_CARD
wget -qq https://huggingface.co/csukuangfj/vits-piper-de_DE-glados-medium/resolve/main/README.md
""",
url="https://huggingface.co/systemofapwne/piper-de-glados",
),
PiperModel(
name="glados_turret",
kind="high",
sr=22050,
ns=1,
cmd="""
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados-turret/high/de_DE-glados-turret-high.onnx
mv de_DE-glados-turret-high.onnx de_DE-glados_turret-high.onnx
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados-turret/high/de_DE-glados-turret-high.onnx.json
mv de_DE-glados-turret-high.onnx.json de_DE-glados_turret-high.onnx.json
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados-turret/high/MODEL_CARD
wget https://huggingface.co/csukuangfj/vits-piper-de_DE-glados_turret-high/resolve/main/README.md
""",
url="https://huggingface.co/systemofapwne/piper-de-glados",
),
PiperModel(
name="glados_turret",
kind="low",
sr=16000,
ns=1,
cmd="""
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados-turret/low/de_DE-glados-turret-low.onnx
mv de_DE-glados-turret-low.onnx de_DE-glados_turret-low.onnx
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados-turret/low/de_DE-glados-turret-low.onnx.json
mv de_DE-glados-turret-low.onnx.json de_DE-glados_turret-low.onnx.json
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados-turret/low/MODEL_CARD
wget https://huggingface.co/csukuangfj/vits-piper-de_DE-glados_turret-low/resolve/main/README.md
""",
url="https://huggingface.co/systemofapwne/piper-de-glados",
),
PiperModel(
name="glados_turret",
kind="medium",
sr=22050,
ns=1,
cmd="""
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados-turret/medium/de_DE-glados-turret-medium.onnx
mv de_DE-glados-turret-medium.onnx de_DE-glados_turret-medium.onnx
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados-turret/medium/de_DE-glados-turret-medium.onnx.json
mv de_DE-glados-turret-medium.onnx.json de_DE-glados_turret-medium.onnx.json
wget -qq https://huggingface.co/systemofapwne/piper-de-glados/resolve/main/de/de_DE/glados-turret/medium/MODEL_CARD
wget https://huggingface.co/csukuangfj/vits-piper-de_DE-glados_turret-medium/resolve/main/README.md
""",
url="https://huggingface.co/systemofapwne/piper-de-glados",
),
]
for m in de_de:
m.lang = "de_DE"
if m.model_name == "":
m.model_name = f"{m.lang}-{m.name}-{m.kind}.onnx"
ans = de_de
for m in ans:
m.text = "Alles hat ein Ende, nur die Wurst hat zwei."
code = m.lang[:2]
if m.cmd == "":
m.cmd = f"""
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/{m.model_name}.json
wget -qq https://huggingface.co/rhasspy/piper-voices/resolve/main/{code}/{m.lang}/{m.name}/{m.kind}/MODEL_CARD
"""
if m.url == "":
m.url = f"https://huggingface.co/rhasspy/piper-voices/tree/main/{code}/{m.lang}/{m.name}/{m.kind}"
return ans
def get_all_models():
ans = []
ans += get_ar_models()
ans += get_ca_models()
ans += get_cs_models()
ans += get_cy_models()
ans += get_da_models()
ans += get_de_models()
ans += get_el_models()
ans += get_en_models()
ans += get_es_models()
ans += get_fa_models()
ans += get_fi_models()
ans += get_fr_models()
ans += get_hu_models()
ans += get_is_models()
ans += get_it_models()
ans += get_ka_models()
ans += get_kk_models()
ans += get_lb_models()
ans += get_lv_models()
ans += get_ml_models()
ans += get_ne_models()
ans += get_nl_models()
ans += get_no_models()
ans += get_pl_models()
ans += get_pt_models()
ans += get_ro_models()
ans += get_ru_models()
ans += get_sk_models()
ans += get_sl_models()
ans += get_sr_models()
ans += get_sv_models()
ans += get_sw_models()
ans += get_tr_models()
ans += get_uk_models()
ans += get_vi_models()
for i, m in enumerate(ans):
m.index = i
return ans
def main():
args = get_args()
index = args.index
total = args.total
assert 0 <= index < total, (index, total)
all_model_list = get_all_models()
print(all_model_list)
num_models = len(all_model_list)
num_per_runner = num_models // total
if num_per_runner <= 0:
raise ValueError(f"num_models: {num_models}, num_runners: {total}")
start = index * num_per_runner
end = start + num_per_runner
remaining = num_models - args.total * num_per_runner
print(f"{index}/{total}: {start}-{end}/{num_models}")
d = dict()
d["model_list"] = all_model_list[start:end]
if index < remaining:
s = args.total * num_per_runner + index
d["model_list"].append(all_model_list[s])
print(f"{s}/{num_models}")
filename_list = [
"./generate.sh",
]
for filename in filename_list:
environment = jinja2.Environment()
if not Path(f"{filename}.in").is_file():
print(f"skip {filename}")
continue
with open(f"{filename}.in") as f:
s = f.read()
template = environment.from_string(s)
s = template.render(**d)
with open(filename, "w") as f:
print(s, file=f)
print(f"There are {len(all_model_list)} models")
for m in all_model_list:
print(m.index, m.model_name)
if Path("hf").is_dir():
with open("./generate_samples.py.in") as f:
s = f.read()
template = environment.from_string(s)
for m in all_model_list:
model_dir = f"vits-piper-{m.lang}-{m.name}-{m.kind}"
d = {
"model": f"{model_dir}/{m.model_name}",
"data_dir": f"{model_dir}/espeak-ng-data",
"tokens": f"{model_dir}/tokens.txt",
"text": m.text,
}
for i in range(m.ns):
s = template.render(
**d,
sid=i,
output_filename=f"hf/piper/mp3/{m.lang}/{model_dir}/{i}.mp3",
)
with open(f"generate_samples-{model_dir}-{i}.py", "w") as f:
print(s, file=f)
if __name__ == "__main__":
main()