Update app.py
Browse files
app.py
CHANGED
|
@@ -120,8 +120,52 @@ def bandpass_filter(signal, sr, lowcut=80, highcut=5000, order=4):
|
|
| 120 |
return lfilter(b, a, signal)
|
| 121 |
|
| 122 |
def du_doan(file_path):
|
| 123 |
-
if
|
| 124 |
-
return "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
|
| 126 |
signal, sr = librosa.load(file_path, sr=SAMPLE_RATE, mono=True)
|
| 127 |
signal, _ = librosa.effects.trim(signal)
|
|
|
|
| 120 |
return lfilter(b, a, signal)
|
| 121 |
|
| 122 |
def du_doan(file_path):
|
| 123 |
+
if audio_input is None:
|
| 124 |
+
return "❌ Không có âm thanh.", None, None, None
|
| 125 |
+
|
| 126 |
+
try:
|
| 127 |
+
# Nếu là ghi âm: audio_input là tuple (array, sample_rate)
|
| 128 |
+
if isinstance(audio_input, tuple):
|
| 129 |
+
audio_data, sr = audio_input
|
| 130 |
+
else:
|
| 131 |
+
# Nếu là file: load với librosa
|
| 132 |
+
audio_data, sr = librosa.load(audio_input, sr=16000)
|
| 133 |
+
|
| 134 |
+
# Chuyển về mono nếu cần
|
| 135 |
+
if isinstance(audio_data, np.ndarray) and audio_data.ndim > 1:
|
| 136 |
+
audio_data = np.mean(audio_data, axis=1)
|
| 137 |
+
|
| 138 |
+
# Resample nếu cần
|
| 139 |
+
if sr != 16000:
|
| 140 |
+
audio_data = librosa.resample(audio_data, orig_sr=sr, target_sr=16000)
|
| 141 |
+
sr = 16000
|
| 142 |
+
|
| 143 |
+
# Xử lý NaN, Inf
|
| 144 |
+
audio_data = np.nan_to_num(audio_data, nan=0.0, posinf=0.0, neginf=0.0)
|
| 145 |
+
|
| 146 |
+
# Chuẩn hoá độ dài 16000 mẫu
|
| 147 |
+
if len(audio_data) < 16000:
|
| 148 |
+
audio_data = np.pad(audio_data, (0, 16000 - len(audio_data)))
|
| 149 |
+
else:
|
| 150 |
+
audio_data = audio_data[:16000]
|
| 151 |
+
|
| 152 |
+
# Sinh ảnh (bắt lỗi riêng)
|
| 153 |
+
try:
|
| 154 |
+
waveform_img = generate_waveform(audio_data, sr)
|
| 155 |
+
mel_img = generate_mel(audio_data, sr)
|
| 156 |
+
wavelet_img = generate_wavelet(audio_data)
|
| 157 |
+
except Exception as e:
|
| 158 |
+
return f"❌ Lỗi khi tạo ảnh: {str(e)}", None, None, None
|
| 159 |
+
|
| 160 |
+
# Chuẩn hoá và dự đoán
|
| 161 |
+
X = scaler.transform(audio_data.reshape(1, -1))
|
| 162 |
+
y_pred = model.predict(X)
|
| 163 |
+
label = label_map.get(str(np.argmax(y_pred)), "Không rõ")
|
| 164 |
+
|
| 165 |
+
return f"✅ Dự đoán: {label}", waveform_img, mel_img, wavelet_img
|
| 166 |
+
|
| 167 |
+
except Exception as e:
|
| 168 |
+
return f"❌ Lỗi xử lý âm thanh: {str(e)}", None, None, None
|
| 169 |
|
| 170 |
signal, sr = librosa.load(file_path, sr=SAMPLE_RATE, mono=True)
|
| 171 |
signal, _ = librosa.effects.trim(signal)
|