import math import struct import pytest from hass.vad import VadConfig, VadSegmenter def _sine_frame(sample_rate: int, freq_hz: float, frame_ms: int = 20) -> bytes: samples = int(sample_rate * frame_ms / 1000) values = [ int(10000 * math.sin(2 * math.pi * freq_hz * i / sample_rate)) for i in range(samples) ] return struct.pack("<" + "h" * samples, *values) def _silence_frame(sample_rate: int, frame_ms: int = 20) -> bytes: samples = int(sample_rate * frame_ms / 1000) return b"\x00\x00" * samples @pytest.mark.parametrize("min_silence_ms", [40, 60]) def test_vad_emits_utterance(min_silence_ms: int): config = VadConfig( aggressiveness=1, min_silence_ms=min_silence_ms, max_utterance_ms=2000, sample_rate=16000, ) seg = VadSegmenter(config) utterances = [] for _ in range(6): utterances.extend(seg.feed(_sine_frame(16000, 440.0))) for _ in range(6): utterances.extend(seg.feed(_silence_frame(16000))) assert len(utterances) >= 1 assert len(utterances[0]) > 0