User Tools

Site Tools


informatica:inteligencia_artificial:tts

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
informatica:inteligencia_artificial:tts [2026/06/26 10:36] – [Entrenar COQUI TTS] joseinformatica:inteligencia_artificial:tts [2026/06/26 18:55] (current) jose
Line 326: Line 326:
 </code> </code>
  
 +====== Entrenar COQUI TTS con VITS ======
 +Necesitamos muchísimas horas de audio y preparar un dataset
 +
 +Creamos la siguiente estructura de ficheros
 +<code>
 +mi_dataset_vits/
 +├── wavs/
 +│   ├── 00001.wav
 +│   ├── 00002.wav
 +│   └── 00003.wav ... (todos tus archivos de audio)
 +└── metadata.csv
 +</code>
 +
 +El archivo metadata.csv tiene que tener el formato:
 +  00001|Hola, esta es la primera frase que grabé para mi modelo.
 +  00002|El entrenamiento de inteligencia artificial requiere paciencia.
 +  00003|Generar voz al vuelo ahora será inmediato.
 +
 +Script entrenamiento
 +
 +  entrenar_vits.py
 +
 +<code>
 +import os
 +from unicodedata import normalize
 +
 +from trainer import Trainer, TrainerArgs
 +
 +from TTS.config import BaseAudioConfig
 +from TTS.tts.configs.shared_configs import BaseDatasetConfig
 +from TTS.tts.configs.vits_config import VitsConfig
 +from TTS.tts.models.vits import CharactersConfig, Vits
 +
 +# 1. Rutas de carpetas
 +PATH_DATASET = "/Users/T054810/Personal/IA/coqui-ai-TTS_beta/mi_dataset_vits"
 +PATH_SALIDA = "/Users/T054810/Personal/IA/coqui-ai-TTS_beta/resultado_entrenamiento"
 +SPANISH_PUNCTUATIONS = "!'(),-.:;? ¡¿"
 +
 +# Incluimos el alfabeto base del español y completamos con cualquier carácter extra presente en el dataset.
 +BASE_SPANISH_CHARACTERS = "abcdefghijklmnopqrstuvwxyzáéíóúüñ0123456789"
 +
 +
 +def build_characters_config(texts: list[str]) -> CharactersConfig:
 +    normalized_text = normalize("NFC", " ".join(texts)).lower()
 +    discovered_characters = sorted(
 +        {
 +            char
 +            for char in normalized_text
 +            if not char.isspace() and char not in SPANISH_PUNCTUATIONS
 +        }
 +    )
 +    characters = "".join(dict.fromkeys(BASE_SPANISH_CHARACTERS + "".join(discovered_characters)))
 +
 +    return CharactersConfig(
 +        characters_class="TTS.tts.models.vits.VitsCharacters",
 +        pad="<PAD>",
 +        eos=None,
 +        bos=None,
 +        blank="<BLNK>",
 +        characters=characters,
 +        punctuations=SPANISH_PUNCTUATIONS,
 +        phonemes=None,
 +        is_unique=False,
 +        is_sorted=True,
 +    )
 +
 +
 +def load_samples(dataset_path: str) -> list[dict]:
 +    samples = []
 +    csv_path = os.path.join(dataset_path, "metadata.csv")
 +
 +    with open(csv_path, "r", encoding="utf-8") as file_handle:
 +        for line in file_handle:
 +            parts = line.strip().split("|")
 +            if len(parts) < 2:
 +                continue
 +
 +            audio_id, text = parts[0], parts[1]
 +            samples.append(
 +                {
 +                    "text": text,
 +                    "audio_file": os.path.join(dataset_path, "wavs", f"{audio_id}.wav"),
 +                    "speaker_name": "mi_voz",
 +                    "language": "es",
 +                    "audio_unique_name": audio_id,
 +                }
 +            )
 +
 +    return samples
 +
 +
 +def main():
 +    samples = load_samples(PATH_DATASET)
 +    if not samples:
 +        raise RuntimeError(f"No se encontraron muestras válidas en {PATH_DATASET}")
 +
 +    characters_config = build_characters_config([sample["text"] for sample in samples])
 +
 +# 2. Configurar el Dataset Base
 +    dataset_config = BaseDatasetConfig(
 +        formatter="ljspeech",
 +        path=PATH_DATASET,
 +        language="es",
 +    )
 +
 +# Configuración estándar de audio para VITS
 +    audio_config = BaseAudioConfig(
 +        sample_rate=22050,
 +        resample=True,
 +    )
 +
 +# 3. Configurar la arquitectura VITS
 +# 3. Configurar la arquitectura VITS (Modo caracteres puros, sin fonemas externos)
 +    config = VitsConfig(
 +        audio=audio_config,
 +        run_name="mi_voz_vits_rapida",
 +        batch_size=16,
 +        eval_batch_size=8,
 +        num_loader_workers=0,
 +        num_eval_loader_workers=0,
 +        run_eval=True,
 +        test_delay_epochs=5,
 +        epochs=100,
 +        text_cleaner="multilingual_cleaners",
 +        use_phonemes=False,
 +        datasets=[dataset_config],
 +        characters=characters_config,
 +        output_path=PATH_SALIDA,
 +    )
 +
 +    # Fuerza la serialización de `characters` para que el tokenizer use este vocabulario desde el config.
 +    config.from_dict(config.to_dict())
 +
 +    train_samples = samples
 +    eval_samples = samples[:1]
 +
 +    model = Vits(config)
 +
 +    trainer = Trainer(
 +        TrainerArgs(),
 +        config,
 +        output_path=PATH_SALIDA,
 +        model=model,
 +        train_samples=train_samples,
 +        eval_samples=eval_samples,
 +    )
 +
 +    print(f"Dataset cargado manualmente con éxito. Muestras encontradas: {len(samples)}")
 +    print(f"Vocabulario de texto preparado con {len(config.characters.characters)} caracteres.")
 +    print("Iniciando entrenamiento del modelo VITS con tu voz...")
 +    trainer.fit()
 +
 +
 +if __name__ == "__main__":
 +    main()
 +</code>
 +
 +Luego lo ejecutamos con (cambiar directorio de entreno):
 +  python entrenar_vits.py --device mps --continue_path resultado_entrenamiento/mi_voz_vits_rapida-June-26-2026_05+24PM-ca2cf515 --epochs 200
 +
 +En mi caso:
 +  python entrenar_vits.py --device mps --continue_path resultado_entrenamiento/entrenamiento1 --epochs 200
 +
 +MAC:
 +
 +Las notas de audio están en
 +  open ~/Library/Group\ Containers/group.com.apple.VoiceMemos.shared
 +
 +
 +
 +====== Gráficas de rendimiento ======
 +Levantamos servidor tensor con:
 +  tensorboard --logdir=/Users/T054810/Personal/IA/coqui-ai-TTS_beta/resultado_entrenamiento/
 +
 +Entramos en: http://localhost:6006/
 +
 +Sacado de chatGPT:
 +<code>
 +oss_disc y loss_gen: Son las gráficas de rendimiento del Discriminador y el Generador de VITS. Verás curvas que van bajando. Cuanto más abajo y estables estén, mejor y más limpia sonará tu voz.
 +
 +loss_mel: Te indica cómo de bien está aprendiendo el modelo a imitar las frecuencias exactas de tu tono de voz.
 +
 +Rendimiento de tiempo: Te muestra cuántos segundos tarda por cada paso de entrenamiento.
 +</code>
informatica/inteligencia_artificial/tts.1782470181.txt.gz · Last modified: by jose