feat(stt): bessere Spracherkennung — small-Modell, VAD, feste Sprache
Gegen "Blödsinn", v. a. an Handys: 1) Modell-Default base -> small + compute_type int8 (Benchmark auf der VM: base patzt schon bei sauberem Audio "an Dienstag und 10 Uhr", small korrekt "am Dienstag um 10 Uhr"; ~4 s/6-s-Clip, gecacht). 2) faster_whisper.transcribe mit vad_filter=True (+min_silence 500ms) und condition_on_previous_text=False -> weniger Stille-/Kontext-Halluzinationen. 3) stt_force_language (Default True): WS-Pfad gibt die feste Zielsprache vor statt Auto-Detect -> robust bei kurzen/verrauschten Clips. Auto-Detect + Fremdsprachen-Übersetzung jetzt opt-in (stt_force_language=False). Tests: Config-Defaults + VAD/Language-Durchreichung; test_ws-Übersetzung auf opt-in umgestellt. Suite 253 grün. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
21ab545d8a
commit
f30b9b56c7
5 changed files with 61 additions and 12 deletions
34
tests/test_stt_quality.py
Normal file
34
tests/test_stt_quality.py
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
import app.providers.stt.faster_whisper as fw
|
||||
from app.config import settings
|
||||
|
||||
|
||||
def test_stt_config_defaults():
|
||||
assert settings.faster_whisper_model == "small"
|
||||
assert settings.faster_whisper_compute_type == "int8"
|
||||
assert settings.stt_force_language is True
|
||||
|
||||
|
||||
class _Seg:
|
||||
def __init__(self, text):
|
||||
self.text = text
|
||||
|
||||
|
||||
class _Info:
|
||||
language = "de"
|
||||
|
||||
|
||||
def test_transcribe_passes_vad_and_language(monkeypatch):
|
||||
captured = {}
|
||||
|
||||
class _FakeModel:
|
||||
def transcribe(self, audio, **kw):
|
||||
captured.update(kw)
|
||||
return [_Seg("hallo welt")], _Info()
|
||||
|
||||
monkeypatch.setattr(fw, "_load_model", lambda *a, **k: _FakeModel())
|
||||
prov = fw.FasterWhisperProvider(model_size="small", device="cpu", compute_type="int8")
|
||||
text, detected = prov._transcribe_sync(b"AAAA", "de")
|
||||
assert text == "hallo welt" and detected == "de"
|
||||
assert captured["language"] == "de"
|
||||
assert captured["vad_filter"] is True
|
||||
assert captured["condition_on_previous_text"] is False
|
||||
|
|
@ -179,6 +179,8 @@ def test_ws_voice_translates_foreign_language_to_target(monkeypatch):
|
|||
monkeypatch.setitem(deps.STT_REGISTRY, "ss", lambda s: StubSTT())
|
||||
monkeypatch.setitem(deps.LLM_REGISTRY, "ll", lambda s: StubLLM())
|
||||
monkeypatch.setitem(deps.TTS_REGISTRY, "tt", lambda s: StubTTS())
|
||||
# Übersetzungs-Pfad ist opt-in: feste Sprache abschalten -> Auto-Detect + Übersetzung.
|
||||
monkeypatch.setattr("app.config.settings.stt_force_language", False)
|
||||
opts = {"stt_provider": "ss", "llm_provider": "ll", "tts_provider": "tt",
|
||||
"output_endpoint": "loopback", "language": "de"}
|
||||
with client.websocket_connect("/ws/voice") as ws:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue