| """Audio preprocessing for DiariZen segmentation model.""" |
|
|
| import numpy as np |
|
|
|
|
| def preprocess_audio( |
| audio: np.ndarray, |
| sample_rate: int, |
| target_sr: int = 16000, |
| duration_s: float = 4.0, |
| eps: float = 1e-5, |
| ) -> np.ndarray: |
| """Resample, trim, and LayerNorm-normalize audio for the CNN NPU frontend. |
| |
| Args: |
| audio: 1-D float32 waveform. |
| sample_rate: Original sample rate. |
| target_sr: Target sample rate (default 16000). |
| duration_s: Window duration in seconds (default 4.0). |
| eps: Epsilon for LayerNorm. |
| |
| Returns: |
| Normalized waveform of shape (1, target_sr * duration_s), float32. |
| """ |
| target_samples = int(target_sr * duration_s) |
|
|
| |
| if sample_rate != target_sr: |
| ratio = target_sr / sample_rate |
| out_len = int(len(audio) * ratio) |
| indices = np.linspace(0, len(audio) - 1, out_len) |
| audio = np.interp(indices, np.arange(len(audio)), audio).astype(np.float32) |
|
|
| |
| if len(audio) < target_samples: |
| audio = np.pad(audio, (0, target_samples - len(audio))) |
| else: |
| audio = audio[:target_samples] |
|
|
| |
| mean = audio.mean() |
| var = ((audio - mean) ** 2).mean() |
| audio_norm = (audio - mean) / np.sqrt(var + eps) |
|
|
| return audio_norm.reshape(1, target_samples).astype(np.float32) |
|
|