feat: mvp

This commit is contained in:
h
2026-02-01 16:07:59 +01:00
commit 4ef769597a
20 changed files with 3566 additions and 0 deletions

68
dubbing/models.py Normal file
View File

@@ -0,0 +1,68 @@
from enum import Enum
from pydantic import BaseModel
from pathlib import Path
class Language(str, Enum):
RU = "ru"
EN = "en"
EN_RU = "en_ru" # Chinese -> English -> Russian
class Segment(BaseModel):
start: int
end: int
text: str
class TranslatedSegment(Segment):
translated: str
class Translation(BaseModel):
id: int
translated: str
class TranslationBatch(BaseModel):
translations: list[Translation]
class TTSSegment(TranslatedSegment):
audio_path: Path
audio_duration_ms: float
class ProjectPaths(BaseModel):
root: Path
source_video: Path
source_audio: Path
segments_json: Path
translated_json: Path
tts_dir: Path
dubbed_audio: Path
result_video: Path
model_config = {"arbitrary_types_allowed": True}
@classmethod
def from_project(
cls, project_dir: Path, language: Language = Language.RU
) -> "ProjectPaths":
lang = language.value
return cls(
root=project_dir,
source_video=project_dir / "source.mp4",
source_audio=project_dir / "source.mp3",
segments_json=project_dir / "segments.json",
translated_json=project_dir / f"translated_{lang}.json",
tts_dir=project_dir / f"tts_{lang}",
dubbed_audio=project_dir / f"dubbed_{lang}.mp3",
result_video=project_dir / f"result_{lang}.mkv",
)
class StepStatus(BaseModel):
name: str
cached: bool
output_exists: bool