ftiiii commited on
Commit
2e793f5
·
verified ·
1 Parent(s): 85edbc5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +46 -2
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 not file_path:
124
- return "<b style='color:red;'>❌ Chưa có âm thanh.</b>"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)