Spaces:
Running
Running
Update denoiser.py
Browse files- denoiser.py +17 -13
denoiser.py
CHANGED
|
@@ -211,13 +211,13 @@ class Denoiser:
|
|
| 211 |
except Exception as e:
|
| 212 |
logger.warning(f"[Denoiser] DeepFilterNet unavailable ({e})")
|
| 213 |
|
| 214 |
-
# ββ Try
|
| 215 |
try:
|
| 216 |
result = self._rnnoise(audio, sr)
|
| 217 |
-
print("[Denoiser] β
|
| 218 |
-
return result, "
|
| 219 |
except Exception as e:
|
| 220 |
-
logger.warning(f"[Denoiser]
|
| 221 |
|
| 222 |
# ββ Fallback: noisereduce with mild settings ββββββββββββββββββ
|
| 223 |
# IMPORTANT: Keep prop_decrease LOW (0.50-0.60) to avoid musical
|
|
@@ -242,16 +242,20 @@ class Denoiser:
|
|
| 242 |
|
| 243 |
def _rnnoise(self, audio, sr):
|
| 244 |
"""
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
Requires: pip install rnnoise-python
|
| 248 |
"""
|
| 249 |
-
import
|
| 250 |
-
#
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 255 |
return result.astype(np.float32)
|
| 256 |
|
| 257 |
def _deepfilter(self, audio, sr):
|
|
|
|
| 211 |
except Exception as e:
|
| 212 |
logger.warning(f"[Denoiser] DeepFilterNet unavailable ({e})")
|
| 213 |
|
| 214 |
+
# ββ Try Wiener filter (scipy β artifact-free, no compilation needed) β
|
| 215 |
try:
|
| 216 |
result = self._rnnoise(audio, sr)
|
| 217 |
+
print("[Denoiser] β
Wiener filter noise removal done")
|
| 218 |
+
return result, "Wiener filter"
|
| 219 |
except Exception as e:
|
| 220 |
+
logger.warning(f"[Denoiser] Wiener filter failed ({e})")
|
| 221 |
|
| 222 |
# ββ Fallback: noisereduce with mild settings ββββββββββββββββββ
|
| 223 |
# IMPORTANT: Keep prop_decrease LOW (0.50-0.60) to avoid musical
|
|
|
|
| 242 |
|
| 243 |
def _rnnoise(self, audio, sr):
|
| 244 |
"""
|
| 245 |
+
Wiener filter via scipy β no compilation needed, works on HF Spaces.
|
| 246 |
+
Much cleaner than noisereduce for voice β no musical artifacts.
|
|
|
|
| 247 |
"""
|
| 248 |
+
from scipy.signal import wiener
|
| 249 |
+
# Wiener filter works best on short frames
|
| 250 |
+
frame_size = int(sr * 0.02) # 20ms frames
|
| 251 |
+
result = np.zeros_like(audio)
|
| 252 |
+
for i in range(0, len(audio) - frame_size, frame_size):
|
| 253 |
+
frame = audio[i:i + frame_size]
|
| 254 |
+
result[i:i + frame_size] = wiener(frame, mysize=7)
|
| 255 |
+
# Handle last chunk
|
| 256 |
+
remainder = len(audio) % frame_size
|
| 257 |
+
if remainder:
|
| 258 |
+
result[-remainder:] = wiener(audio[-remainder:], mysize=7)
|
| 259 |
return result.astype(np.float32)
|
| 260 |
|
| 261 |
def _deepfilter(self, audio, sr):
|