fix(cli)!: источник языка в шапке транскрипта на русском
- Зачем: - в одной строке шапки смешивались английские и русские значения, а при неизвестном языке в неё попадало служебное «unknown (не определён)». - Что: - формулировки источника языка вынесены константами в formatter и переведены на русский. - оба бэкенда используют общий признак UNKNOWN_LANGUAGE вместо «auto» и «unknown». - неизвестный язык печатается одной строкой, без служебного значения. - Проверка: - uv run pytest -q: 242 passed, 1 skipped. - ruff check .: 48 замечаний, столько же, сколько до правки. BREAKING CHANGE: в шапке транскрипта значения detected и forced заменены на «определён автоматически» и «задан явно»; при неизвестном языке строка выглядит как «- **Язык**: не определён».
This commit is contained in:
@@ -8,7 +8,7 @@ from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
from local_transcriber.types import Segment, TranscribeResult
|
||||
from local_transcriber.types import UNKNOWN_LANGUAGE, Segment, TranscribeResult
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@@ -216,7 +216,9 @@ class OnnxAsrBackend:
|
||||
|
||||
_notify(on_status, "Транскрибирую (onnx-asr)...")
|
||||
segments: list[Segment] = []
|
||||
result_language = language or _model_language(self._model_spec) or "unknown"
|
||||
result_language = (
|
||||
language or _model_language(self._model_spec) or UNKNOWN_LANGUAGE
|
||||
)
|
||||
|
||||
for vad_seg in model.recognize(
|
||||
audio_array, sample_rate=16000, language=language
|
||||
|
||||
@@ -12,7 +12,7 @@ from typing import Any
|
||||
from huggingface_hub import snapshot_download
|
||||
from huggingface_hub.errors import LocalEntryNotFoundError
|
||||
|
||||
from local_transcriber.types import Segment, TranscribeResult
|
||||
from local_transcriber.types import UNKNOWN_LANGUAGE, Segment, TranscribeResult
|
||||
|
||||
# (model_alias, compute_type) → HF repo
|
||||
MODEL_REPOS: dict[tuple[str, str], str] = {
|
||||
@@ -159,7 +159,7 @@ class OpenVINOBackend:
|
||||
f"Транскрибирую (OpenVINO)... [{len(segments)} сегм.]",
|
||||
)
|
||||
|
||||
detected_language = language or "auto"
|
||||
detected_language = language or UNKNOWN_LANGUAGE
|
||||
language_probability = 1.0 if language else 0.0
|
||||
|
||||
return TranscribeResult(
|
||||
|
||||
@@ -12,6 +12,10 @@ from .config import apply_device_defaults, load_config, resolve_defaults
|
||||
from .context_menu import install_menu as install_context_menu
|
||||
from .context_menu import uninstall_menu as uninstall_context_menu
|
||||
from .formatter import (
|
||||
LANGUAGE_DETECTED,
|
||||
LANGUAGE_FORCED,
|
||||
LANGUAGE_FROM_MODEL,
|
||||
LANGUAGE_UNKNOWN,
|
||||
format_duration,
|
||||
format_timestamp,
|
||||
format_transcript,
|
||||
@@ -30,6 +34,7 @@ from .transcriber import (
|
||||
_transcribe_file,
|
||||
load_model,
|
||||
)
|
||||
from .types import UNKNOWN_LANGUAGE
|
||||
from .utils import (
|
||||
build_output_path,
|
||||
detect_device,
|
||||
@@ -62,12 +67,12 @@ def _format_language_mode(
|
||||
) -> str:
|
||||
"""Описывает источник языка, не выдавая профиль модели за детектор."""
|
||||
if requested_language != "auto":
|
||||
return "forced"
|
||||
return LANGUAGE_FORCED
|
||||
if result.language_probability > 0:
|
||||
return "detected"
|
||||
if result.language not in {"", "auto", "unknown"}:
|
||||
return "из профиля модели"
|
||||
return "не определён"
|
||||
return LANGUAGE_DETECTED
|
||||
if result.language not in {"", UNKNOWN_LANGUAGE}:
|
||||
return LANGUAGE_FROM_MODEL
|
||||
return LANGUAGE_UNKNOWN
|
||||
|
||||
|
||||
def _format_repetition_blocks(
|
||||
|
||||
@@ -10,6 +10,19 @@ from .types import Segment, TranscribeResult
|
||||
_PAUSE_THRESHOLD_S = 2.0 # пауза между сегментами для разбиения на абзацы
|
||||
_MAX_PARAGRAPH_S = 60.0 # максимальная длительность абзаца
|
||||
|
||||
# Источник языка в шапке транскрипта
|
||||
LANGUAGE_FORCED = "задан явно"
|
||||
LANGUAGE_DETECTED = "определён автоматически"
|
||||
LANGUAGE_FROM_MODEL = "из профиля модели"
|
||||
LANGUAGE_UNKNOWN = "не определён"
|
||||
|
||||
LANGUAGE_MODES = (
|
||||
LANGUAGE_FORCED,
|
||||
LANGUAGE_DETECTED,
|
||||
LANGUAGE_FROM_MODEL,
|
||||
LANGUAGE_UNKNOWN,
|
||||
)
|
||||
|
||||
|
||||
@dataclass
|
||||
class _Paragraph:
|
||||
@@ -80,7 +93,7 @@ def format_transcript(
|
||||
source_filename: str,
|
||||
model_name: str,
|
||||
device_info: str,
|
||||
language_mode: str, # detected | forced | из профиля модели | не определён
|
||||
language_mode: str, # см. LANGUAGE_MODES
|
||||
transcription_date: datetime | None = None, # None -> datetime.now()
|
||||
) -> str:
|
||||
"""Собирает markdown-транскрипт: шапка с метаданными + абзацы с таймкодами."""
|
||||
@@ -92,7 +105,10 @@ def format_transcript(
|
||||
lines.append("")
|
||||
lines.append(f"- **Дата транскрипции**: {date.strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
lines.append(f"- **Модель**: {model_name}")
|
||||
lines.append(f"- **Язык**: {result.language} ({language_mode})")
|
||||
if language_mode == LANGUAGE_UNKNOWN:
|
||||
lines.append(f"- **Язык**: {LANGUAGE_UNKNOWN}")
|
||||
else:
|
||||
lines.append(f"- **Язык**: {result.language} ({language_mode})")
|
||||
lines.append(f"- **Длительность**: {format_duration(result.duration)}")
|
||||
if tail_gap(result) > TAIL_GAP_WARN_S:
|
||||
last_end = result.segments[-1].end
|
||||
|
||||
@@ -4,6 +4,9 @@ from collections.abc import Callable
|
||||
from dataclasses import dataclass
|
||||
from typing import Any
|
||||
|
||||
# Единый признак «язык неизвестен» для всех бэкендов
|
||||
UNKNOWN_LANGUAGE = "unknown"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Segment:
|
||||
@@ -15,7 +18,7 @@ class Segment:
|
||||
@dataclass
|
||||
class TranscribeResult:
|
||||
segments: list[Segment]
|
||||
language: str
|
||||
language: str # код языка или UNKNOWN_LANGUAGE, если он неизвестен
|
||||
language_probability: float
|
||||
duration: float # seconds
|
||||
device_used: str # "cpu" / "cuda" / "onnx" / "openvino-gpu" / "openvino-cpu"
|
||||
|
||||
Reference in New Issue
Block a user