Оценка разделения больше не роняет задачу, журнал доступен через API

Полный трейс показал настоящую причину сбоя: падало не распознавание,
а метрика separation_quality из 0.5.0 - она скармливала модели отпечатков
реплики целиком, и на 190-секундной та не выдержала. Теперь берётся кусок
из середины реплики, а сбой оценки лишь обнуляет её, не трогая расшифровку.

Добавлен /v1/logs: последние записи журнала с фильтром по уровню, чтобы
разбирать сбои без копирования консоли вручную.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vladimir Bryzgalov
2026-08-15 23:44:09 +05:00
co-authored by Claude Opus 5
parent f2f266ba1c
commit 710fc8b90b
6 changed files with 174 additions and 7 deletions
+36
View File
@@ -281,3 +281,39 @@ class TestSpawnSafety:
assert main.store is None
assert not (tmp_path / "data" / "jobs.db").exists()
class TestSeparationNeverBreaksJob:
"""Оценка разделения вспомогательная и не должна ронять расшифровку."""
def test_embedding_uses_short_piece(self):
"""Длинный фрагмент модель отпечатков не переваривает."""
from app.pipeline import EMBED_SEC
assert EMBED_SEC <= 10
def test_failure_in_quality_does_not_break_transcribe(self, tmp_path, monkeypatch):
import sys
import types
import numpy as np
for name in ("sherpa_onnx", "onnx_asr", "onnxruntime"):
monkeypatch.setitem(sys.modules, name, types.ModuleType(name))
from app.pipeline import Pipeline
p = Pipeline(models_dir=tmp_path, threads=1,
replacements_path=tmp_path / "r.txt", base_dir=tmp_path)
p._asr = types.SimpleNamespace(recognize=lambda *a, **k: "текст")
monkeypatch.setattr(p, "warmup", lambda: None)
monkeypatch.setattr(p, "_reload_replacements", lambda: None)
monkeypatch.setattr(p, "_diarizer", lambda n: types.SimpleNamespace(
process=lambda s: types.SimpleNamespace(
sort_by_start_time=lambda: [types.SimpleNamespace(start=0.0, end=2.0, speaker=0)])))
monkeypatch.setattr(p, "_separation_quality",
lambda *a: (_ for _ in ()).throw(RuntimeError("модель упала")))
monkeypatch.setattr("app.pipeline.read_wav", lambda _: np.zeros(16000 * 3, dtype=np.float32))
result = p.transcribe(tmp_path / "any.wav")
assert result["stats"]["separation_quality"] == 0.0
assert result["turns"] # расшифровка на месте