from src.preprocessing.preprocessor import single_preprocessing from src.spectttra.spectttra_trainer import spectttra_predict from src.llm2vectrain.model import load_llm2vec_model from src.llm2vectrain.llm2vec_trainer import l2vec_single_train, load_pca_model from src.models.mlp import build_mlp, load_config from pathlib import Path from src.utils.config_loader import DATASET_NPZ from src.utils.dataset import instance_scaler from pathlib import Path import numpy as np import torch def predict_pipeline(audio, lyrics: str): """ Predict script which includes preprocessing, feature extraction, and training the MLP model for a single data sample. Parameters ---------- audio : audio_object Audio object file lyric : string Lyric string Returns ------- prediction : str A string result of the prediction label : int A numerical representation of the prediction """ # Instantiate X and Y vectors X, Y = None, None # Instantiate LLM2Vec Model llm2vec_model = load_llm2vec_model() # Preprocess both audio and lyrics audio, lyrics = single_preprocessing(audio, lyrics) # Call the train method for both models audio_features = spectttra_predict(audio) lyrics_features = l2vec_single_train(llm2vec_model, lyrics) # Reduce the lyrics using saved PCA model reduced_lyrics = load_pca_model(lyrics_features) # Scale the vectors using Z-Score audio_features, reduced_lyrics = instance_scaler(audio_features, reduced_lyrics) # Concatenate the vectors of audio_features + lyrics_features results = np.concatenate([audio_features, reduced_lyrics], axis=1) # ---- Load MLP Classifier ---- config = load_config("config/model_config.yml") classifier = build_mlp(input_dim=results.shape[1], config=config) # Load trained weights (make sure this path matches where you saved your model) model_path = "models/mlp/mlp_multimodal.pth" classifier.load_model(model_path) classifier.model.eval() # Run prediction probability, prediction, label = classifier.predict_single(results) return { "probability": probability, "label": label, "prediction": "AI-Generated" if prediction == 0 else "Human-Composed", } if __name__ == "__main__": # Example usage (replace with real inputs, place song inside data/raw.) audio = "sample" lyrics = "Some lyrics text here" print(predict_pipeline(audio, lyrics))