From 7392d72bcad6e11e7deafea2972091be7e24a137 Mon Sep 17 00:00:00 2001 From: Dmitriy Dementiev Date: Tue, 11 Aug 2026 13:21:45 +0300 Subject: [PATCH] =?UTF-8?q?fix(onnx):=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BD=D1=8B=D0=B5=20VAD-=D1=81=D0=B5=D0=B3?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - закрыты замечания независимого review по воспроизводимости и VAD-приёмке. - Что: - рабочая версия Python точно зафиксирована на 3.13.13. - нулевые и обратные VAD-сегменты исключены из результата. - в README записаны наблюдаемые скорости новых моделей с указанием CPU. - Проверка: - uv run pytest -q: 224 passed, 1 skipped. - ограниченная проверка Ruff и uv lock --check завершены успешно. --- .python-version | 2 +- README.md | 9 ++++++--- src/local_transcriber/backends/onnx_asr.py | 8 ++++++-- tests/test_onnx_asr.py | 21 +++++++++++++++++++++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/.python-version b/.python-version index 24ee5b1..655354d 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.13 +3.13.13 diff --git a/README.md b/README.md index 522d848..97e4148 100644 --- a/README.md +++ b/README.md @@ -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 не измерялась; diff --git a/src/local_transcriber/backends/onnx_asr.py b/src/local_transcriber/backends/onnx_asr.py index dece5a6..5a3a763 100644 --- a/src/local_transcriber/backends/onnx_asr.py +++ b/src/local_transcriber/backends/onnx_asr.py @@ -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: diff --git a/tests/test_onnx_asr.py b/tests/test_onnx_asr.py index 68938be..f7b9ff2 100644 --- a/tests/test_onnx_asr.py +++ b/tests/test_onnx_asr.py @@ -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):