50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
import math
|
|
import os
|
|
import sys
|
|
import time
|
|
|
|
import numpy as np
|
|
|
|
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
if PROJECT_ROOT not in sys.path:
|
|
sys.path.insert(0, PROJECT_ROOT)
|
|
|
|
from services.vad import VADService
|
|
|
|
|
|
def main() -> None:
|
|
vad = VADService()
|
|
sr = 16000
|
|
chunk = 512
|
|
|
|
# 1s silence -> 1s speech-like sine -> 1s silence
|
|
t = np.arange(sr, dtype=np.float32) / sr
|
|
speech = 0.20 * np.sin(2 * math.pi * 220 * t).astype(np.float32)
|
|
seq = [np.zeros(sr, dtype=np.float32), speech, np.zeros(sr, dtype=np.float32)]
|
|
stream = np.concatenate(seq)
|
|
|
|
starts = 0
|
|
ends = 0
|
|
first_start_ms = -1
|
|
t0 = time.perf_counter()
|
|
for i in range(0, stream.shape[0] - chunk + 1, chunk):
|
|
evt = vad.push_chunk(stream[i : i + chunk])
|
|
if evt and "start" in evt:
|
|
starts += 1
|
|
if first_start_ms < 0:
|
|
first_start_ms = int((time.perf_counter() - t0) * 1000)
|
|
if evt and "end" in evt:
|
|
ends += 1
|
|
|
|
print("vad.health:", vad.health)
|
|
print("vad.starts:", starts, "vad.ends:", ends, "first_start_ms:", first_start_ms)
|
|
if starts < 1 or ends < 1:
|
|
raise SystemExit("vad check failed: start/end not detected")
|
|
print("vad check: ok")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|