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):