Зачем: - локальным транскриптам нужна структура реплик для конспектов и протоколов. Что: - добавлены пословные таймкоды для всех ASR-бэкендов и сведение с Sherpa-ONNX. - реализованы CLI-флаги, деградация без потери ASR и speaker Markdown. - добавлены проверяемый кеш моделей, тесты и документация. Проверка: - `pytest` — 283 passed, 1 skipped. - `pyright` — 0 errors. - Ruff и `git diff --check` — без ошибок. - выполнены три контрольных прогона на реальных записях.
56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
"""Протокол бэкенда транскрипции."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Callable
|
|
from pathlib import Path
|
|
from typing import Any, Protocol
|
|
|
|
from local_transcriber.types import Segment, TranscribeResult
|
|
|
|
|
|
class Backend(Protocol):
|
|
"""Минимальный интерфейс бэкенда транскрипции.
|
|
|
|
Бэкенды реализуют этот протокол (structural typing) —
|
|
наследование не требуется.
|
|
"""
|
|
|
|
@property
|
|
def word_timestamps_available(self) -> bool:
|
|
"""Гарантирует ли выбранный backend/model пословные таймкоды."""
|
|
...
|
|
|
|
def ensure_model_available(
|
|
self,
|
|
model_name: str,
|
|
compute_type: str,
|
|
on_status: Callable[[str], None] | None = None,
|
|
) -> str:
|
|
"""Гарантирует наличие модели, возвращает путь к файлам."""
|
|
...
|
|
|
|
def create_model(
|
|
self,
|
|
model_path: str,
|
|
device: str,
|
|
compute_type: str,
|
|
cpu_threads: int = 0,
|
|
) -> Any:
|
|
"""Создаёт модель. Возвращает backend-специфичный объект.
|
|
|
|
cpu_threads: число потоков для CPU inference (0 = дефолт библиотеки).
|
|
"""
|
|
...
|
|
|
|
def transcribe(
|
|
self,
|
|
model: Any,
|
|
file_path: Path,
|
|
language: str | None,
|
|
on_segment: Callable[[Segment], None] | None = None,
|
|
on_status: Callable[[str], None] | None = None,
|
|
) -> TranscribeResult:
|
|
"""Транскрибирует файл, возвращает результат."""
|
|
...
|