feat(tools-pve/asr-pipeline): multi-backend ASR web app with LiteLLM routing
This commit is contained in:
@@ -22,6 +22,7 @@ import re
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
VOICEPRINT_HDR = re.compile(r"^<!--\s*voiceprint_session:")
|
||||
PROVIDER_HDR = re.compile(r"^<!--\s*asr_provider:\s*(\S+)(?:\s+model:\s*(\S+))?\s*-->")
|
||||
SEGMENT_BANNER = re.compile(r"^---\s*第\d+段.*---\s*$")
|
||||
TURN_TAG = re.compile(r"^【([^】]+)】\s*(.*)$", re.S)
|
||||
VIBE_TAG = re.compile(r"^\[(\d{1,2}:\d{2})\]\s*(S\d+)\s*[::]\s*(.*)$", re.S)
|
||||
@@ -95,6 +96,11 @@ class Chunk:
|
||||
|
||||
def detect_backend(raw: str) -> str:
|
||||
head = raw[:500]
|
||||
m_prov = PROVIDER_HDR.search(head)
|
||||
if m_prov:
|
||||
prov = m_prov.group(1).strip().lower()
|
||||
if prov in {"qwen3cam", "soniox", "gemini", "openai", "grok", "vibevoice"}:
|
||||
return prov
|
||||
if "CAM++" in head or TURN_TAG.match(raw.strip().splitlines()[-1] if raw.strip() else ""):
|
||||
return "qwen3cam"
|
||||
if re.search(r"^\[\d{1,2}:\d{2}\]\s*S\d+\s*[::]", raw, re.M):
|
||||
@@ -108,7 +114,7 @@ def parse(raw: str) -> tuple[list[Turn], dict]:
|
||||
"""Split a transcript into turns plus header metadata."""
|
||||
meta: dict = {
|
||||
"voiceprint_session": "", "voiceprint_named": {}, "banners": [],
|
||||
"intake": {},
|
||||
"intake": {}, "asr_provider": "", "asr_model": "",
|
||||
}
|
||||
lines = raw.splitlines()
|
||||
body_lines = []
|
||||
@@ -120,6 +126,11 @@ def parse(raw: str) -> tuple[list[Turn], dict]:
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
continue
|
||||
m_prov = PROVIDER_HDR.match(ln)
|
||||
if m_prov:
|
||||
meta["asr_provider"] = m_prov.group(1) or ""
|
||||
meta["asr_model"] = m_prov.group(2) or ""
|
||||
continue
|
||||
if VOICEPRINT_HDR.match(ln):
|
||||
m = re.search(r"voiceprint_session:\s*(\S+)", ln)
|
||||
if m:
|
||||
|
||||
Reference in New Issue
Block a user