sukriramli commited on
Commit
149dda1
·
verified ·
1 Parent(s): aa5b724

Upload pipeline.py with huggingface_hub

Browse files
Files changed (1) hide show
  1. pipeline.py +53 -0
pipeline.py ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os, sys, torch, joblib, importlib
2
+ import pandas as pd
3
+ import torchaudio
4
+ import torchaudio.transforms as T
5
+
6
+ class BioacousticEngine:
7
+ def __init__(self, repo_dir="tiny-bird-diffusion"):
8
+ self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
9
+ self.repo_dir = repo_dir
10
+
11
+ # Dynamic path loading
12
+ sys.path.append(os.path.abspath(repo_dir))
13
+ from cvt import cvt13
14
+
15
+ # Standardized audio processor loading
16
+ mel_module = importlib.import_module("mel_spectrogram")
17
+ self.preprocessor = mel_module.MelSpectrogramProcessor(device=self.device)
18
+
19
+ # Initialize architecture and map weights
20
+ self.model = cvt13()
21
+ self.model.load_state_dict(torch.load(f"{repo_dir}/protoclr.pth", map_location="cpu"))
22
+ self.model = self.model.to(self.device).eval()
23
+
24
+ # Load compressed spatial boundaries
25
+ brain_data = joblib.load(f"{repo_dir}/trained_cluster_brain.joblib")
26
+ self.reducer = brain_data['umap']
27
+ self.df = pd.read_csv(f"{repo_dir}/acoustic_atlas_metadata.csv")
28
+
29
+ def process_waveform(self, waveform, sample_rate):
30
+ """Standardizes incoming audio channels and samples."""
31
+ if sample_rate != 16000:
32
+ waveform = T.Resample(orig_freq=sample_rate, new_freq=16000)(waveform)
33
+ if waveform.shape[0] > 1:
34
+ waveform = torch.mean(waveform, dim=0, keepdim=True)
35
+
36
+ # 3-Second peak activity selection
37
+ total_samples = waveform.shape[-1]
38
+ target_samples = 3 * 16000
39
+ if total_samples > target_samples:
40
+ step = 4000
41
+ max_energy = -1
42
+ best_start = 0
43
+ for start in range(0, total_samples - target_samples + 1, step):
44
+ chunk = waveform[:, start:start + target_samples]
45
+ energy = chunk.abs().mean().item()
46
+ if energy > max_energy:
47
+ max_energy = energy
48
+ best_start = start
49
+ waveform = waveform[:, best_start:best_start + target_samples]
50
+
51
+ if waveform.abs().max() > 0.02:
52
+ waveform = waveform / waveform.abs().max()
53
+ return waveform.to(self.device)