fix(onnx): исключены некорректные VAD-сегменты

- Зачем:
  - закрыты замечания независимого review по воспроизводимости и VAD-приёмке.
- Что:
  - рабочая версия Python точно зафиксирована на 3.13.13.
  - нулевые и обратные VAD-сегменты исключены из результата.
  - в README записаны наблюдаемые скорости новых моделей с указанием CPU.
- Проверка:
  - uv run pytest -q: 224 passed, 1 skipped.
  - ограниченная проверка Ruff и uv lock --check завершены успешно.
This commit is contained in:
Dmitriy Dementiev
2026-08-11 13:21:45 +03:00
parent 0af2dbdd17
commit 7392d72bca
4 changed files with 34 additions and 6 deletions
+1 -1
View File
@@ -1 +1 @@
3.13
3.13.13
+6 -3
View File
@@ -280,11 +280,14 @@ language = "en"
| Модель | Размер (int8) | RTFx CPU | Языки | Пунктуация |
|--------|--------------|----------|-------|-----------|
| `gigaam-v3` | ~300 MB | 17-29× | ru | ❌ |
| `gigaam-multilingual-ctc` | ~300 MB | не измерено | ru, en, kk, ky, uz | ❌ |
| `gigaam-v3-e2e-ctc` | ~300 MB | не измерено | ru | ✅ |
| `gigaam-v3-e2e-rnnt` | ~300 MB | не измерено | ru | ✅ |
| `gigaam-multilingual-ctc` | ~300 MB | 10,5×* | ru, en, kk, ky, uz | ❌ |
| `gigaam-v3-e2e-ctc` | ~300 MB | 12,3×* | ru | ✅ |
| `gigaam-v3-e2e-rnnt` | ~300 MB | 11,7×* | ru | ✅ |
| `parakeet-v3` | ~600 MB | 12-20× | 25 языков | ✅ |
\* Наблюдение на AMD Ryzen 7 8845H, Windows, `int8`, запись 14:51. Это не
приёмочный замер для целевого Intel Core i5.
> **Рекомендация**: для русского по-прежнему используйте проверенный `gigaam-v3`
> (см. [ADR-006](docs/adr/006-onnx-asr-backend.md)). E2E-модели добавляют
> пунктуацию и нормализацию, но их скорость на слабых CPU не измерялась;
+6 -2
View File
@@ -169,9 +169,13 @@ class OnnxAsrBackend:
for vad_seg in model.recognize(
audio_array, sample_rate=16000, language=language
):
start = max(0.0, vad_seg.start)
end = max(0.0, vad_seg.end)
if end <= start:
continue
seg = Segment(
start=max(0.0, vad_seg.start),
end=max(0.0, vad_seg.end),
start=start,
end=end,
text=vad_seg.text,
)
if on_segment is not None:
+21
View File
@@ -328,6 +328,27 @@ class TestTranscribe:
assert result.language == "unknown"
assert result.duration == 1.0
def test_transcribe_skips_zero_length_vad_segments(self, monkeypatch, tmp_path):
wav_file = tmp_path / "test.wav"
wav_file.write_bytes(b"fake audio")
def fake_decode_audio(path, sampling_rate=16000):
import numpy as np
return np.array([0.0] * 16000, dtype=np.float32)
class FakeModel:
def recognize(self, waveform, sample_rate, language=None):
yield FakeVadSegment(0.5, 0.5, "нулевой")
yield FakeVadSegment(0.75, 0.5, "обратный")
yield FakeVadSegment(0.5, 1.0, "валидный")
monkeypatch.setattr("faster_whisper.decode_audio", fake_decode_audio)
result = OnnxAsrBackend().transcribe(FakeModel(), wav_file, language=None)
assert result.segments == [Segment(start=0.5, end=1.0, text="валидный")]
class TestBackendRegistration:
def test_get_backend_returns_onnx_backend(self):