[Wake/VAD/STT]:完成本地唤醒、人声端点检测与转写入口,包含小杰小杰唤醒、VAD 录音切分、Metadata STT 和 sherpa-onnx 错误边界

This commit is contained in:
mkbk
2026-06-17 18:18:37 +08:00
parent 90ba2bf3b0
commit 4d6232ed29
6 changed files with 389 additions and 5 deletions
+53
View File
@@ -0,0 +1,53 @@
from __future__ import annotations
from .models import AudioFrame, ErrorCode, ProviderError, WakeEvent
class KeywordWakeWordProvider:
def __init__(self, keyword: str = "小杰小杰", threshold: float = 0.5) -> None:
self.keyword = keyword
self.threshold = threshold
self.loaded = False
def load(self) -> None:
self.loaded = True
def detect(self, frame: AudioFrame) -> WakeEvent | None:
if not self.loaded:
raise ProviderError(
ErrorCode.WAKE_MODEL_LOAD_FAILED,
"wakeword provider is not loaded",
False,
"keyword-wakeword",
"wakeword",
)
metadata = frame.metadata
confidence = float(metadata.get("wake_confidence", 1.0 if metadata.get("wake") else 0.0))
phrase = str(metadata.get("wake_word", metadata.get("text", "")))
matched = bool(metadata.get("wake")) or phrase.strip() == self.keyword
if matched and confidence >= self.threshold:
return WakeEvent(self.keyword, confidence, frame.timestamp_ms)
return None
def reset(self) -> None:
return None
class MissingWakeWordModelProvider:
def __init__(self, model_path: str) -> None:
self.model_path = model_path
def load(self) -> None:
raise ProviderError(
ErrorCode.WAKE_MODEL_MISSING,
f"wakeword model is missing: {self.model_path}",
False,
"wakeword-model",
"wakeword",
)
def detect(self, frame: AudioFrame) -> WakeEvent | None:
return None
def reset(self) -> None:
return None