Hace unos meses traía el repositorio TorToiSe-TTS que facilitaba muchísmo la generación de voz a partir de texto, aunque solo se disponía de modelos en inglés.

https://theroamingworkshop.cloud/b/2066

Pero el mundo de la IA avanza tan rápido, que hoy os traigo una evolución que desbanca por completo al anterior post, con generación de voces complejas en cuestión de segundos y multilenguaje: Coqui-AI TTS.

https://github.com/coqui-ai/TTS

Versión web

Si tienes prisa y no quieres liarte, puedes usar el espacio gratuito de huggingface, y tendrás tu clonación de voz en pocos segundos:

https://huggingface.co/spaces/coqui/xtts

  1. Escribe el texto a generar
  2. Selecciona el idioma
  3. Sube tu fichero de referencia
  4. Configura el resto de opciones (marca las casillas: Cleanup Reference Voice, Do not use language auto-detect, Agree)
  5. Solicita tu clonación al servidor (Send)

Instalación

En cuanto a la instalación local:

  • Necesitarás python > 3.9, < 3.12.
  • RAM: no necesita tanta como para generación de imágenes. 4GB deberían bastar.
  • Crea una carpeta para el proyecto, por ejemplo "text-2-speech". Usando un terminal de Linux:
    mkdir text-2-speech
  • Es conveniente crear un entorno de python específico para evitar incompatibilidad de paquetes, para lo que debes instalar el paquete python3-venv. Yo crearé el entorno TTSenv:
    cd text-2-speech
    python3 -m venv TTSenv
  • Activa el entorno en el terminal:
    source TTSenv/bin/activate
  • Si solo necesitas generación de voz (sin clonación ni entrenamiento), instala directamente TTS en python:
    pip install TTS
  • Sin embargo, yo instalaré el repositorio completo de Coqui-AI TTS:
    git clone https://github.com/coqui-ai/TTS
    cd TTS
    pip install -e .[all]

Comprobación de modelos de lenguaje y voces

Lo primero que puedes hacer es comprobar los modelos disponibles para transformar tu texto a voz en distintos idiomas.

En el terminal escribe lo siguiente:

tts --list_models

No API token found for 🐸Coqui Studio voices - https://coqui.ai
Visit 🔗https://app.coqui.ai/account to get one.
Set it as an environment variable `export COQUI_STUDIO_TOKEN=`


Name format: type/language/dataset/model
1: tts_models/multilingual/multi-dataset/xtts_v2 [already downloaded]
2: tts_models/multilingual/multi-dataset/xtts_v1.1 [already downloaded]
3: tts_models/multilingual/multi-dataset/your_tts
4: tts_models/multilingual/multi-dataset/bark [already downloaded]
5: tts_models/bg/cv/vits
6: tts_models/cs/cv/vits
7: tts_models/da/cv/vits
8: tts_models/et/cv/vits
9: tts_models/ga/cv/vits
10: tts_models/en/ek1/tacotron2
11: tts_models/en/ljspeech/tacotron2-DDC
12: tts_models/en/ljspeech/tacotron2-DDC_ph
13: tts_models/en/ljspeech/glow-tts
14: tts_models/en/ljspeech/speedy-speech
15: tts_models/en/ljspeech/tacotron2-DCA
16: tts_models/en/ljspeech/vits
17: tts_models/en/ljspeech/vits--neon
18: tts_models/en/ljspeech/fast_pitch
19: tts_models/en/ljspeech/overflow
20: tts_models/en/ljspeech/neural_hmm
21: tts_models/en/vctk/vits
22: tts_models/en/vctk/fast_pitch
23: tts_models/en/sam/tacotron-DDC
24: tts_models/en/blizzard2013/capacitron-t2-c50
25: tts_models/en/blizzard2013/capacitron-t2-c150_v2
26: tts_models/en/multi-dataset/tortoise-v2
27: tts_models/en/jenny/jenny
28: tts_models/es/mai/tacotron2-DDC [already downloaded]
29: tts_models/es/css10/vits [already downloaded]
30: tts_models/fr/mai/tacotron2-DDC
31: tts_models/fr/css10/vits
32: tts_models/uk/mai/glow-tts
33: tts_models/uk/mai/vits
34: tts_models/zh-CN/baker/tacotron2-DDC-GST
35: tts_models/nl/mai/tacotron2-DDC
36: tts_models/nl/css10/vits
37: tts_models/de/thorsten/tacotron2-DCA
38: tts_models/de/thorsten/vits
39: tts_models/de/thorsten/tacotron2-DDC
40: tts_models/de/css10/vits-neon
41: tts_models/ja/kokoro/tacotron2-DDC
42: tts_models/tr/common-voice/glow-tts
43: tts_models/it/mai_female/glow-tts
44: tts_models/it/mai_female/vits
45: tts_models/it/mai_male/glow-tts
46: tts_models/it/mai_male/vits
47: tts_models/ewe/openbible/vits
48: tts_models/hau/openbible/vits
49: tts_models/lin/openbible/vits
50: tts_models/tw_akuapem/openbible/vits
51: tts_models/tw_asante/openbible/vits
52: tts_models/yor/openbible/vits
53: tts_models/hu/css10/vits
54: tts_models/el/cv/vits
55: tts_models/fi/css10/vits
56: tts_models/hr/cv/vits
57: tts_models/lt/cv/vits
58: tts_models/lv/cv/vits
59: tts_models/mt/cv/vits
60: tts_models/pl/mai_female/vits
61: tts_models/pt/cv/vits
62: tts_models/ro/cv/vits
63: tts_models/sk/cv/vits
64: tts_models/sl/cv/vits
65: tts_models/sv/cv/vits
66: tts_models/ca/custom/vits
67: tts_models/fa/custom/glow-tts
68: tts_models/bn/custom/vits-male
69: tts_models/bn/custom/vits-female
70: tts_models/be/common-voice/glow-tts

Name format: type/language/dataset/model
1: vocoder_models/universal/libri-tts/wavegrad
2: vocoder_models/universal/libri-tts/fullband-melgan [already downloaded]
3: vocoder_models/en/ek1/wavegrad
4: vocoder_models/en/ljspeech/multiband-melgan
5: vocoder_models/en/ljspeech/hifigan_v2
6: vocoder_models/en/ljspeech/univnet
7: vocoder_models/en/blizzard2013/hifigan_v2
8: vocoder_models/en/vctk/hifigan_v2
9: vocoder_models/en/sam/hifigan_v2
10: vocoder_models/nl/mai/parallel-wavegan
11: vocoder_models/de/thorsten/wavegrad
12: vocoder_models/de/thorsten/fullband-melgan
13: vocoder_models/de/thorsten/hifigan_v1
14: vocoder_models/ja/kokoro/hifigan_v1
15: vocoder_models/uk/mai/multiband-melgan
16: vocoder_models/tr/common-voice/hifigan
17: vocoder_models/be/common-voice/hifigan
Name format: type/language/dataset/model
1: voice_conversion_models/multilingual/vctk/freevc24 [already downloaded]

O fíltralo según tu idioma con grep, por ejemplo para español:

tts --list_models | grep "/es"

28: tts_models/es/mai/tacotron2-DDC [already downloaded]
29: tts_models/es/css10/vits [already downloaded]

Texto a voz

Con esto ya puedes generar voz a partir de texto en cuestión de segundos y en el idioma que prefieras.

En el terminal, escribe lo siguiente, especificando el modelo adecuado:

tts --text "Ahora puedo hablar en español!" --model_name "tts_models/es/css10/vits" --out_path output/tts-es.wav

Asegúrate de que el directorio de salida existe, y de que eliges el nombre dle modelo correto. La primera vez se descargarán los archivos necesarios y deberás aceptar la licencia de Coqui-AI. Después la generación se realiza en cuestión de segundos:

Clonación de voz

Por último, lo realmente impresionante de este modelo es la clonación de voz a partir de unos pocos segundos de grabación de audio.

Igual que en el post anterior, yo he tomado unos 30 segundos de la voz de Ultrón de escenas de la película Los Vengadores: la era de Ultrón.

Muestra en español:

Muestra en inglés:

Ahora, preparamos un script de python donde parametrizaremos todo lo necesario, que a grandes rasgos hará lo siguiente:

  • Importar torch y TTS
    import torch
    from TTS.api import TTS
  • Definir dispositivo de memoria (cuda o cpu). Con usar cpu sobra. Cuda puede petar.
    device="cpu"
  • Definir el texto a generar.
    txt="Voz generada a partir de texto"
  • Definir la muestra de audio de referencia (archivos .wav de unos 30 segundos)
    sample="/voice-folder/voice.wav"
  • Llamada al modelo TTS
    tts1=TTS("model_name").to(device)
  • Creación del fichero
    tts1.tts_to_file(txt, speaker_wav=sample, language="es", file_path="output-folder/output-file.wav")

Yo lo he llamado TRW-clone.py y queda así:

import torch
from TTS.api import TTS

# Get device ('cuda' or 'cpu')
device="cpu"

#Define text
txt="Bienvenido a este nuevo artículo del blog. Disfruta de tu visita."
#txt="Welcome to this new block post... Enjoy your visit!"

#Define audio sample
sample="../my-voices/ultron-es/mix.wav"
#sample="../my-voices/ultron-en/mix.wav"

#Run cloning
tts1 = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to(device)

tts1.tts_to_file(txt, speaker_wav=sample, language="es", file_path="../output/ultron-es.wav")

Ejecútalo desde la carpeta TTS donde se encuentra el repositorio completo:

cd TTS
python3 TRW-clone.py

Resultados

Aquí te dejo los resultados obtenidos en mis primeras pruebas.

Español:

Inglés:

Con un par de iteraciones podrás obtener resultados realmente espectaculares.

Cualquier duda o comentario aún la puedes dejar en Twitter/X

🐦 @RoamingWorkshop