[Wake/VAD/STT]:完成本地唤醒、人声端点检测与转写入口,包含小杰小杰唤醒、VAD 录音切分、Metadata STT 和 sherpa-onnx 错误边界
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user