File size: 4,513 Bytes
be7f8fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cc25ec3
be7f8fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
from fastapi import FastAPI
from asgiref.wsgi import WsgiToAsgi
from flask import Flask, render_template, request, redirect, url_for
import os
import librosa
import numpy as np
import tensorflow as tf
from sklearn.preprocessing import StandardScaler
import pickle
import subprocess  # Untuk menjalankan perintah FFmpeg
import threading  # Untuk menjalankan penghapusan otomatis file setelah delay
from fastapi.middleware.wsgi import WSGIMiddleware

flask_app = Flask(__name__)

# Path folder untuk menyimpan file yang diunggah
UPLOAD_FOLDER = 'static/uploads'
flask_app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# Load model dan scaler
model = tf.keras.models.load_model('model_code1.keras')
with open('scaler.pkl', 'rb') as f:
    scaler = pickle.load(f)

# Label genre musik
genres = ['blues', 'classical', 'country', 'disco', 'hiphop', 'jazz', 'metal', 'pop', 'reggae', 'rock']

# Fungsi untuk menghapus file setelah delay
def delete_file_after_delay(file_path, delay=3600):
    def delete_file():
        try:
            if os.path.exists(file_path):
                os.remove(file_path)
                print(f"File {file_path} berhasil dihapus setelah {delay} detik.")
        except Exception as e:
            print(f"Gagal menghapus file {file_path}: {e}")

    # Jalankan penghapusan file dalam thread baru
    threading.Timer(delay, delete_file).start()

# Fungsi untuk mengonversi MP3 ke WAV menggunakan FFmpeg
def convert_mp3_to_wav(mp3_path):
    wav_path = mp3_path.replace('.mp3', '.wav')  # Ubah ekstensi ke .wav
    try:
        # Jalankan perintah FFmpeg untuk konversi
        subprocess.run(['ffmpeg', '-i', mp3_path, wav_path], check=True)
        # Hapus file MP3 setelah berhasil dikonversi
        os.remove(mp3_path)
        return wav_path
    except subprocess.CalledProcessError as e:
        print(f"Error converting MP3 to WAV: {e}")
        return None
    except OSError as e:
        print(f"Error deleting MP3 file: {e}")
        return None

# Fungsi untuk ekstraksi fitur dari file musik
def extract_features(file_path):
    try:
        y, sr = librosa.load(file_path, duration=30, sr=22050)

        # Ekstraksi fitur
        mfccs = np.mean(librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13).T, axis=0)
        chroma = np.mean(librosa.feature.chroma_stft(y=y, sr=sr).T, axis=0)
        spectral_contrast = np.mean(librosa.feature.spectral_contrast(y=y, sr=sr).T, axis=0)
        zero_crossings = np.mean(librosa.feature.zero_crossing_rate(y).T, axis=0)
        tempo, _ = librosa.beat.beat_track(y=y, sr=sr)

        # Menggabungkan semua fitur
        features = np.hstack([mfccs, chroma, spectral_contrast, zero_crossings, tempo])
        return features
    except Exception as e:
        print(f"Error extracting features: {e}")
        return None


@flask_app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        # Periksa apakah file diunggah
        if 'file' not in request.files:
            return redirect(request.url)
        file = request.files['file']
        if file.filename == '':
            return redirect(request.url)

        # Simpan file ke folder yang ditentukan
        file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
        file.save(file_path)

        # Periksa format file
        if file.filename.lower().endswith('.mp3'):
            # Konversi MP3 ke WAV
            file_path_wav = convert_mp3_to_wav(file_path)
            if file_path_wav is None:
                return "Konversi MP3 ke WAV gagal. Pastikan file yang diunggah valid."
            file_path = file_path_wav  # Gunakan file WAV untuk proses berikutnya

        # Ekstraksi fitur dari file yang diunggah
        features = extract_features(file_path)
        if features is None:
            return "Ekstraksi fitur gagal. Coba unggah file lain."

        # Normalisasi fitur menggunakan scaler
        features_scaled = scaler.transform([features])

        # Prediksi genre menggunakan model
        prediction = model.predict(features_scaled)
        predicted_genre = genres[np.argmax(prediction)]

        # Hapus file WAV setelah 30 detik
        delete_file_after_delay(file_path, delay=30)

        # Kembalikan hasil prediksi
        return render_template('index.html', file_path=file_path, prediction=predicted_genre)

    return render_template('index.html')


# FastAPI app to mount Flask app
app = FastAPI()

# Mount Flask app inside FastAPI using WSGIMiddleware
app.mount("/", WSGIMiddleware(flask_app))