45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
"""Voice Activity Detection (VAD) utilities for VoIdeaAI.
|
|
|
|
Server-side VAD analysis and parameter processing.
|
|
Actual VAD is performed client-side via Web Audio API (getUserMedia).
|
|
"""
|
|
|
|
VAD_DEFAULTS = {
|
|
"enabled": True,
|
|
"noise_threshold": 0.3,
|
|
"silence_timeout_ms": 1500,
|
|
"min_audio_duration_ms": 300,
|
|
}
|
|
|
|
|
|
def validate_vad_params(params: dict | None = None) -> dict:
|
|
"""Validate and return VAD parameters with defaults."""
|
|
if not params:
|
|
return dict(VAD_DEFAULTS)
|
|
result = dict(VAD_DEFAULTS)
|
|
if isinstance(params.get("noise_threshold"), (int, float)):
|
|
result["noise_threshold"] = max(0.0, min(1.0, float(params["noise_threshold"])))
|
|
if isinstance(params.get("silence_timeout_ms"), (int, float)):
|
|
result["silence_timeout_ms"] = max(100, int(params["silence_timeout_ms"]))
|
|
if isinstance(params.get("min_audio_duration_ms"), (int, float)):
|
|
result["min_audio_duration_ms"] = max(50, int(params["min_audio_duration_ms"]))
|
|
if isinstance(params.get("enabled"), bool):
|
|
result["enabled"] = params["enabled"]
|
|
return result
|
|
|
|
|
|
def should_process_audio(
|
|
duration_ms: int | None = None,
|
|
vad_params: dict | None = None,
|
|
) -> tuple[bool, str | None]:
|
|
"""Check if audio should be processed based on VAD parameters.
|
|
|
|
Returns (should_process, reason_if_skipped).
|
|
"""
|
|
params = validate_vad_params(vad_params)
|
|
if not params["enabled"]:
|
|
return True, None
|
|
if duration_ms is not None and duration_ms < params["min_audio_duration_ms"]:
|
|
return False, f"Audio too short: {duration_ms}ms < {params['min_audio_duration_ms']}ms"
|
|
return True, None
|