feat(tools-pve/asr-pipeline): multi-backend ASR web app with LiteLLM routing
Build image / build (push) Canceled after 0s
Build ASR Pipeline / image (push) Canceled after 0s

This commit is contained in:
Codex
2026-11-01 22:07:57 -08:00
parent d1790a05b0
commit 2367c5eb4e
23 changed files with 2462 additions and 451 deletions
@@ -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: