Spaces:
Running
Running
#!/usr/bin/env python3 | |
""" | |
Simple Audio Classifier using Madverse Music AI Model | |
Usage: python classify_audio.py <audio_file_path> | |
""" | |
import sys | |
import os | |
from pathlib import Path | |
def load_model(): | |
"""Load the Madverse Music AI model""" | |
try: | |
from sonics import HFAudioClassifier | |
print("π Loading Madverse Music AI model...") | |
model = HFAudioClassifier.from_pretrained("awsaf49/sonics-spectttra-alpha-120s") | |
print("β Model loaded successfully!") | |
return model | |
except Exception as e: | |
print(f"β Error loading model: {e}") | |
return None | |
def classify_audio(model, audio_path): | |
"""Classify a single audio file""" | |
try: | |
import librosa | |
import torch | |
print(f"π΅ Analyzing: {audio_path}") | |
# Load audio file (model uses 16kHz sample rate) | |
audio, sr = librosa.load(audio_path, sr=16000) | |
# Convert to tensor and add batch dimension | |
audio_tensor = torch.FloatTensor(audio).unsqueeze(0) | |
# Set model to evaluation mode | |
model.eval() | |
# Get prediction | |
with torch.no_grad(): | |
output = model(audio_tensor) | |
# Convert logit to probability using sigmoid | |
prob = torch.sigmoid(output).item() | |
# Classify: prob < 0.5 = Real, prob >= 0.5 = Fake | |
if prob < 0.5: | |
result = "Real" | |
emoji = "π€" | |
description = "Human-created music" | |
confidence = (1 - prob) * 2 # Convert to 0-1 scale | |
else: | |
result = "Fake" | |
emoji = "π€" | |
description = "AI-generated music" | |
confidence = (prob - 0.5) * 2 # Convert to 0-1 scale | |
print(f"{emoji} Result: {result} ({description})") | |
print(f" Confidence: {confidence:.2f} | Raw output: {output.item():.3f}") | |
return result | |
except Exception as e: | |
print(f"β Error classifying {audio_path}: {e}") | |
return None | |
def classify_multiple_files(model, directory_path="."): | |
"""Classify all audio files in a directory""" | |
audio_extensions = ['.wav', '.mp3', '.flac', '.m4a', '.ogg'] | |
directory = Path(directory_path) | |
audio_files = [] | |
for ext in audio_extensions: | |
audio_files.extend(list(directory.glob(f'*{ext}'))) | |
if not audio_files: | |
print(f"No audio files found in {directory}") | |
return | |
print(f"Found {len(audio_files)} audio file(s) to classify:") | |
print("=" * 50) | |
results = {} | |
for audio_file in audio_files: | |
result = classify_audio(model, str(audio_file)) | |
if result: | |
results[str(audio_file)] = result | |
print() | |
# Summary | |
if results: | |
print("π Summary:") | |
print("=" * 30) | |
real_count = sum(1 for r in results.values() if r.lower() == 'real') | |
fake_count = len(results) - real_count | |
print(f"π€ Real music: {real_count}") | |
print(f"π€ AI-generated: {fake_count}") | |
def main(): | |
"""Main function""" | |
print("π΅ Madverse Music: AI Audio Classifier") | |
print("=" * 40) | |
# Load model | |
model = load_model() | |
if not model: | |
return | |
if len(sys.argv) > 1: | |
# Classify specific file | |
audio_path = sys.argv[1] | |
if os.path.exists(audio_path): | |
classify_audio(model, audio_path) | |
else: | |
print(f"β File not found: {audio_path}") | |
else: | |
# Classify all files in current directory | |
print("\nNo specific file provided. Scanning current directory...") | |
classify_multiple_files(model) | |
if __name__ == "__main__": | |
main() |