Spaces:
Running
Running
File size: 3,080 Bytes
fc7b4a9 7633e2f fc7b4a9 75d43d2 fc7b4a9 75d43d2 fc7b4a9 75d43d2 fc7b4a9 75d43d2 fc7b4a9 75d43d2 fc7b4a9 75d43d2 fc7b4a9 7633e2f fc7b4a9 75d43d2 fc7b4a9 75d43d2 fc7b4a9 75d43d2 fc7b4a9 75d43d2 fc7b4a9 75d43d2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
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 src.utils.dataset import instance_scaler
import joblib
import numpy as np
import pandas as pd
def predict_pipeline(audio_file, lyrics):
"""
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
"""
# 1.) Instantiate LLM2Vec Model
llm2vec_model = load_llm2vec_model()
# 2.) Preprocess both audio and lyrics
audio, lyrics = single_preprocessing(audio_file, lyrics)
# 3.) Call the train method for both models
audio_features = spectttra_predict(audio)
lyrics_features = l2vec_single_train(llm2vec_model, lyrics)
# 4.) Scale the vectors using Z-Score
audio_features, lyrics_features = instance_scaler(audio_features, lyrics_features)
# 5.) Reduce the lyrics using saved PCA model
reduced_lyrics = load_pca_model(lyrics_features)
# 6.) Apply PCA scaler to PCA-reduced lyrics
pca_scaler = joblib.load("models/fusion/pca_scaler.pkl")
reduced_lyrics = pca_scaler.transform(reduced_lyrics)
# 6.) 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)
# 7.) Load trained weights (make sure this path matches where you saved your model)
model_path = "models/mlp/mlp_best.pth"
classifier.load_model(model_path)
classifier.model.eval()
# 8.) Run prediction
probability, prediction, label = classifier.predict_single(results.flatten())
return {"probability": probability, "prediction": prediction, "label": label}
if __name__ == "__main__":
# Example usage (replace with real inputs, place song inside data/raw.)
data = pd.read_csv("data/raw/predict_data_final.csv")
result = []
label = []
for row in data.itertuples():
prediction = predict_pipeline(row.song, row.lyrics)
result.append(
{
"song": row.song,
"label": row.label,
"predicted_label": prediction["label"],
"probability": prediction["probability"],
}
)
for r in result:
print(f"Song: {r['song']}")
print(f"Actual Label: {r['label']}")
print(f"Predicted: {r['predicted_label']}")
print(f"Confidence: {r['probability']: .8f}%")
print("-" * 50)
|