#!/usr/bin/env python3
"""
Fine-tune Coqui TTS Tacotron2-DDC on Rush Limbaugh public audio.
Authority: Joshua Lopez — DCGP.AI
Patent: USPTO 19/555,951
System: ORI™ Oracle Renormalizing Intelligence
"""
import os
from TTS.tts.configs.tacotron2_config import Tacotron2Config
from TTS.tts.models.tacotron2 import Tacotron2
from TTS.utils.audio import AudioProcessor
from TTS.trainer import Trainer, TrainerArgs

def main():
    output_path = "voice_models/rush_limbaugh_v1"
    os.makedirs(output_path, exist_ok=True)

    config = Tacotron2Config(
        model_name="rush_limbaugh_v1",
        run_name="rush_limbaugh_finetune",
        batch_size=24,
        eval_batch_size=16,
        num_loader_workers=4,
        num_eval_loader_workers=2,
        run_eval=True,
        test_delay_epochs=50,
        epochs=450,
        text_cleaner="english_cleaners",
        use_phonemes=True,
        phoneme_language="en-us",
        phoneme_cache_path=os.path.join(output_path, "phoneme_cache"),
        print_step=25,
        print_eval=True,
        mixed_precision=True,
        output_path=output_path,
        datasets=[{
            "name": "rush_public",
            "path": "datasets/rush_limbaugh_public",
            "meta_file_train": "metadata_train.csv",
            "meta_file_val": "metadata_val.csv",
        }],
    )

    ap    = AudioProcessor.init_from_config(config)
    model = Tacotron2.init_from_config(config)
    model.load_checkpoint(
        config,
        "tts_models/en/ljspeech/tacotron2-DDC/model_file.pth",
        eval=False
    )

    trainer = Trainer(
        TrainerArgs(),
        config,
        output_path,
        model=model,
        train_samples=None,
        eval_samples=None,
        audio_processor=ap,
    )
    trainer.fit()
    model.save_checkpoint(
        os.path.join(output_path, "rush_limbaugh_v1.pth")
    )
    print("Rush voice model saved to voice_models/rush_limbaugh_v1/rush_limbaugh_v1.pth")
    print("Copy to voice_models/rush_limbaugh_v1.pth for the TTS server.")

if __name__ == "__main__":
    main()
