audio-explorers-visualization / scripts /neural_separator.py
hedrekao
HF deploy: clean snapshot without local artifacts
a361db3
"""
Advanced source separation using neural networks.
Requires: pip install asteroid-bin pyannote.audio
"""
import soundfile as sf
import os
def separate_with_neural(audio_path: str, output_dir: str, n_sources: int = 6):
"""
Use asteroid or pyannote for better separation.
"""
try:
from asteroid.models import ConvTasNet
print("Using Conv-TasNet for separation...")
model = ConvTasNet.from_pretrained("mpariente/ConvTasNet_WHAM!_sepclean")
audio, sr = sf.read(audio_path)
if audio.ndim > 1:
audio = audio.mean(axis=1)
import torch
audio_tensor = torch.from_numpy(audio).float().unsqueeze(0)
with torch.no_grad():
estimates = model(audio_tensor)
os.makedirs(output_dir, exist_ok=True)
for i in range(min(n_sources, estimates.shape[1])):
source = estimates[0, i].numpy()
sf.write(os.path.join(output_dir, f"neural_source_{i + 1}.wav"), source, sr)
print(f"Saved {min(n_sources, estimates.shape[1])} neural-separated sources")
except ImportError:
print("Neural libraries not available. Install with:")
print(" pip install asteroid-bin pyannote.audio")
audio, sr = sf.read(audio_path)
print(f"\nFallback: Using current ICA separation")
print(f" Audio: {audio_path}")
print(f" Duration: {len(audio) / sr:.1f}s")
return False
return True
if __name__ == "__main__":
import sys
audio_file = sys.argv[1] if len(sys.argv) > 1 else "../data/mixture.wav"
output = sys.argv[2] if len(sys.argv) > 2 else "output_neural"
separate_with_neural(audio_file, output, n_sources=6)