| """Postprocessing for DiariZen segmentation output.""" |
|
|
| import numpy as np |
|
|
|
|
| def log_probs_to_probs(log_probs: np.ndarray) -> np.ndarray: |
| """Convert log probabilities to probabilities via softmax. |
| |
| Args: |
| log_probs: (1, frames, 11) log-softmax output. |
| |
| Returns: |
| (1, frames, 11) probability distribution. |
| """ |
| max_val = log_probs.max(axis=-1, keepdims=True) |
| exp_vals = np.exp(log_probs - max_val) |
| return exp_vals / exp_vals.sum(axis=-1, keepdims=True) |
|
|
|
|
| def top_speakers_at_frame( |
| log_probs: np.ndarray, |
| frame_idx: int, |
| top_k: int = 3, |
| ) -> list[tuple[int, float]]: |
| """Get top-k speaker class indices and their log-probabilities at a frame. |
| |
| Args: |
| log_probs: (1, frames, 11) output. |
| frame_idx: Frame index. |
| top_k: Number of top classes. |
| |
| Returns: |
| List of (class_index, log_probability) tuples. |
| """ |
| frame = log_probs[0, frame_idx] |
| top_indices = np.argsort(frame)[-top_k:][::-1] |
| return [(int(i), float(frame[i])) for i in top_indices] |
|
|