Convierte texto a audio con Kokoro-82M

Kokoro-82M es un nuevo modelo de texto a voz que permite fácilmente y con pocos recursos convertir de texto a voz en varios idiomas:

🇪🇸 ‘e’ => Spanish es
🇫🇷 ‘f’ => French fr-fr
🇮🇳 ‘h’ => Hindi hi
🇮🇹 ‘i’ => Italian it
🇧🇷 ‘p’ => Brazilian Portuguese pt-br
🇺🇸 ‘a’ => American English
🇬🇧 ‘b’ => British English
🇯🇵 ‘j’ => Japanese
🇨🇳 ‘z’ => Mandarin Chinese

Entre ellos el español, lo cual no es tan habitual como cabria esperarse por su número de hablantes.

Su uso es realmente sencill, para instalarlo basta con seguir los siguientes pasos.

Lo primero es instalar kokoro y soundfile:

pip install  kokoro soundfile

También necesitaremos instalar espeak-ng, la forma de instarlo variará según el sistema operativo que tengamos:

  • Para Windows podemos descargar la última versión aquí
  • Para Linux eligen según tu distribución:
sudo apt-get install espeak-ng

sudo yum install espeak-ng

sudo pacman -S espeak-ng

Ahora nos queda escribir un poco de código en Python

from kokoro import KPipeline
import soundfile as sf

pipeline = KPipeline(lang_code='es') # lang_code del idioma

text = 'Hola, bienvenidos a construyendo a Chispas.'

# Voces:
# ef_dora Femenino
# em_alex Masculino
# em_santa Masculino
generator = pipeline(
    text, voice='em_santa', # cambia la voz aqui
    speed=1, split_pattern=r'\n+'
)

for i, (gs, ps, audio) in enumerate(generator):
    print(i)    # indice
    print(gs) # grafemas (texto)
    print(ps) # fonemas    
    sf.write(f'{i}.wav', audio, 24000)

También permite generar el audio desde los fonemas:

from kokoro import KPipeline
import soundfile as sf

pipeline = KPipeline(lang_code='es') # lang_code del idioma

phonemes = "ˈola, bjˌembenˈiðos a kˌonstɾujjˈɛndo a ʧˈispas."

# Voces:
# ef_dora Femenino
# em_alex Masculino
# em_santa Masculino
generator = pipeline.generate_from_tokens(
    tokens=phonemes,
    voice="ef_dora",
    speed=1.0
)

for i, (gs, ps, audio) in enumerate(generator):
    print(i)    # indice
    print(gs) # grafemas (texto)
    print(ps) # fonemas    
    sf.write(f'{i}.wav', audio, 24000)

¿Cómo es posible que un modelo tan pequeño funcione relativamente bien? Puedes verlo en el siguiente vídeo.