testingfaces commited on
Commit
720a256
Β·
verified Β·
1 Parent(s): 88197fc

Update denoiser.py

Browse files
Files changed (1) hide show
  1. 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 RNNoise (best for voice, no musical artifacts) ───────
215
  try:
216
  result = self._rnnoise(audio, sr)
217
- print("[Denoiser] βœ… RNNoise removal done")
218
- return result, "RNNoise"
219
  except Exception as e:
220
- logger.warning(f"[Denoiser] RNNoise unavailable ({e})")
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
- RNNoise β€” Mozilla's RNN-based noise suppressor.
246
- Specifically trained on voice, produces zero musical artifacts.
247
- Requires: pip install rnnoise-python
248
  """
249
- import rnnoise
250
- # RNNoise requires 48kHz mono float32
251
- audio_48k = self._resample(audio, sr, 48000) if sr != 48000 else audio
252
- denoised = rnnoise.reduce_noise(audio_48k, 48000)
253
- # Resample back to original SR
254
- result = self._resample(denoised, 48000, sr) if sr != 48000 else denoised
 
 
 
 
 
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):