Download segmenter_np.py from FermionResearch/Phonon-2-CoreML: direct link, hf CLI and curl.
- Browser
- Download file 1.82 kB
-
https://huggingface.co/FermionResearch/Phonon-2-CoreML/resolve/main/segmenter_np.py
- Command line
-
hf download hf://FermionResearch/Phonon-2-CoreML/segmenter_np.py
-
curl -L -o segmenter_np.py https://huggingface.co/FermionResearch/Phonon-2-CoreML/resolve/main/segmenter_np.py
1.82 kB
| """Line-for-line port of fermion._speech.segment.plan / is_silent (numpy) for the reference runner; no silence padding anywhere.""" | |
| import numpy as np | |
| SR = 16000; SINGLE_SHOT_MAX_S = 35.0; BAND_MIN_S = 25.0; BAND_MAX_S = 35.0; TARGET_S = 30.0; BLOCK_S = 0.05; NOISE_FLOOR_RMS = 0.004; GATE_RATIO = 0.18 | |
| def is_silent(audio): return audio.size == 0 or float(np.max(np.abs(audio))) < 1e-4 | |
| def plan(audio, sample_rate=SR): | |
| audio = np.asarray(audio, dtype=np.float32).reshape(-1); n = int(audio.size) | |
| if n <= int(SINGLE_SHOT_MAX_S * sample_rate): return [(0, n)] | |
| block = int(BLOCK_S * sample_rate); n_blocks = -(-n // block); padded = np.zeros(n_blocks * block, dtype=np.float32); padded[:n] = audio | |
| rms = np.sqrt(np.mean(padded.reshape(n_blocks, block) ** 2, axis=1)); single = int(SINGLE_SHOT_MAX_S * sample_rate); windows = []; start = 0 | |
| while n - start > single: | |
| lo = start + int(BAND_MIN_S * sample_rate); hi = start + int(BAND_MAX_S * sample_rate); b0 = -(-lo // block); b1 = hi // block | |
| peak = float(rms[start // block:b1].max()) if b1 > start // block else 0.0; gate = max(NOISE_FLOOR_RMS, GATE_RATIO * peak); quiet = rms[b0:b1] <= gate | |
| cut = start + int(TARGET_S * sample_rate) | |
| if quiet.any(): | |
| best = None; i = 0 | |
| while i < quiet.size: | |
| if not quiet[i]: i += 1; continue | |
| j = i | |
| while j < quiet.size and quiet[j]: j += 1 | |
| mid = int(((b0 + i) + (b0 + j)) * block // 2); cand = (j - i, -abs(mid - (start + int(TARGET_S * sample_rate))), mid) | |
| if best is None or cand > best: best = cand | |
| i = j | |
| cut = best[2] | |
| cut = max(lo, min(hi, cut, n)); windows.append((start, cut)); start = cut | |
| windows.append((start, n)); return windows | |