inoryQwQ's picture
Super-squash branch 'main' using huggingface_hub
139f25e
Raw
History Blame Contribute Delete
1.37 kB
import numpy as np
DEFAULT_DET_WIN = 3
DET_THRESHOLD_90 = 0.608
DET_THRESHOLD_95 = 0.615
def wake_scores(logits: np.ndarray) -> np.ndarray:
"""(M,2,64) 或 (1,2,64) -> 每窗最后一帧 wake 通道得分 (M,)。"""
a = np.asarray(logits)
if a.ndim == 3:
return a[:, 1, -1].astype(np.float64)
if a.ndim == 4:
return a[:, 0, 1, -1].astype(np.float64)
raise ValueError(f'unexpected logits shape {a.shape}')
def detect(scores: np.ndarray, det_win: int = DEFAULT_DET_WIN, threshold: float = DET_THRESHOLD_95) -> dict:
"""reference 触发逻辑:det_win 帧滑动求和 vs 阈值。"""
s = np.asarray(scores, dtype=np.float64)
if s.ndim != 1:
raise ValueError('scores 应为 (M,) 每帧得分')
kernel = np.ones(det_win)
sums = np.convolve(s, kernel, mode='valid')
return {
'frame_scores': s.tolist(),
'window_sums': sums.tolist(),
'max_score': float(s.max()) if s.size else 0.0,
'max_sum': float(sums.max()) if sums.size else 0.0,
'triggered': bool((sums > threshold).any()),
'threshold': threshold,
'det_win': det_win,
}
def postprocess(*arrays):
"""模型输出 (M,2,64) -> 检测结果 dict。"""
if len(arrays) != 1:
raise ValueError('wakeup 单输出')
scores = wake_scores(arrays[0])
return detect(scores)