Skip to content

A Python automation tool for translating subtitles with strict metadata preservation. Ensures timestamps and tags remain intact for perfect synchronization.

License

Notifications You must be signed in to change notification settings

lemos999/Sub-Translator-Gemini-API-

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

18 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Context-Aware Subtitle Translator

License: MIT

A stateless subtitle translator powered by the Google Gemini API, meticulously engineered for perfect metadata preservation and translation.

Key Features

  • πŸ–₯️ Stateless & Browser-Based UI: Built with Streamlit, the tool runs in any modern web browser, offering a clean, intuitive interface that works on any operating system.
  • πŸ•’ Perfect Metadata Preservation: At its core, the translator operates on a "Conveyor Belt Architecture," which surgically separates subtitle text from its metadata (timestamps, indices). Only the text is sent for translation, ensuring that timing information remains untouched and perfectly synchronized.
  • πŸ”— Robust AI Communication (ID Anchoring Protocol): We solved the critical "Count Mismatch" problem where LLMs merge or split lines arbitrarily. Every line is anchored with a unique ID, forcing the AI to maintain a 1:1 structural correspondence between the source and translated text. This guarantees that the reassembled subtitle file is never corrupted.
  • 🧠 Context-Aware Engine (In-Progress): The system employs a "Scout-Report-Inject" architecture to analyze the script's genre, tone, and character relationships beforehand. This generated "Context Guide" is injected into every translation request, dramatically improving consistency and tonal accuracy.
    • Note: While the framework for deep context analysis is in place, achieving perfect narrative and emotional context across an entire script is an ongoing challenge and a key area for future improvement. The current implementation provides a significant quality boost but is not yet infallible.
  • πŸš€ Live Execution Dashboard: A visual grid displays the real-time status of each chunk (Waiting, Processing, Success, Error), complemented by a HUD showing elapsed time, average chunk speed, and an estimated time of completion (ETA).
  • πŸ”§ Advanced Control & Tuning:
    • Manual Retry & Emergency Stop: Failed chunks can be retried individually without restarting the entire process. A global stop button allows you to halt the operation at any time.
    • Reasoning Bucket: A toggle to switch the AI into "Max Reasoning" mode, instructing it to perform deeper, step-by-step analysis for higher-quality translation of nuanced dialogue, at the cost of speed.
    • Adjustable Chunk Size: A slider to control the amount of text sent per API call, allowing users to balance speed against stability.

Getting Started (For Developers)

Follow these steps to run the application in your local development environment.

Prerequisites

  • Python 3.9 or higher
  • An active Google API Key with the Gemini API enabled. You can get one from Google AI Studio.

Installation & Execution

  1. Clone the repository:

    git clone https://github.com/your-repo/your-project.git
    cd your-project
  2. (Recommended) Create and activate a virtual environment:

    # For Windows
    python -m venv venv
    .\venv\Scripts\activate
    
    # For macOS/Linux
    python3 -m venv venv
    source venv/bin/activate
  3. Install the required libraries:

    pip install -r requirements.txt
  4. Run the application:

    streamlit run app.py
  5. Your web browser will automatically open with the application running. Enter your Google API Key in the sidebar to begin.

How It Works: The "Conveyor Belt" Architecture

The system's data flow is designed for maximum safety and efficiency, mirroring an industrial conveyor belt.

  1. Deconstruction: The input SRT file is precisely disassembled into two distinct components: Metadata (timestamps) and Data (dialogue text).
  2. Refinement: The Metadata is securely stored locally. Only the pure text data proceeds to the next stage, preventing any possibility of metadata corruption by the AI.
  3. Batch Processing: The text is grouped into manageable chunks according to the user-defined size. These chunks are then formatted into a strict JSON structure using the ID Anchoring protocol.
  4. Reassembly: Once the AI returns the translated JSON, the system validates its integrity, re-sorts it by ID, and meticulously reassembles it with the original, untouched Metadata to produce the final, perfectly synchronized subtitle file.

Core Technology: The AI Communication Protocol

The Breakthrough Solution: "ID Anchoring" with Forced JSON Mode

Our protocol neutralizes the LLM's tendency to alter text structure by combining a logical data structure with a strict API-level command.

  1. ID Anchoring: Enforcing Structural Invariance

    Instead of sending a simple list of strings, which the AI might interpret as a single, malleable block of text, we send an array of objects. Each object is "anchored" with a unique, sequential id.

    Data Structure Sent to AI:

    [
      {"id": 0, "text": "Line 1 text."},
      {"id": 1, "text": "Line 2 text."},
      {"id": 2, "text": "Line 3 text."}
    ]

    This structure acts as a logical "shackle." The AI is instructed via the prompt to preserve the id for each object. This simple rule has profound implications:

    • Merging is impossible: The AI cannot merge line 1 and 2 into a single translated object without either destroying an ID (id: 1) or creating an invalid structure.
    • Splitting is impossible: The AI cannot split line 3 into two translated objects without fabricating a new ID, which violates the instruction.

    This forces a strict 1-to-1 mapping between the input and output objects at a structural level, regardless of the text content. Even if the AI reorders the objects in its response, we can reliably sort them back into the correct sequence using the immutable IDs.

  2. API-Level Forced JSON Mode: Guaranteeing Data Integrity

    While ID Anchoring solves the structural mapping problem, it doesn't prevent the AI from returning a response that isn't valid JSON (e.g., by adding conversational text like "Here is your translation: ..."). To eliminate this, we bypass prompt-level requests entirely.

    We configure the Gemini API call to set the response_mime_type parameter to application/json. This is not a suggestion; it is a system-level command to the API server. It contractually binds the server to return a response that is nothing but a syntactically perfect JSON object. This completely eradicates any possibility of JSONDecodeError and makes the communication pipeline exceptionally robust.

Technology Stack

  • Core & Logic: Python 3.13, Streamlit 1.51.0
  • AI Engine & Communication: google-generativeai, chardet
  • Packaging & Deployment: PyInstaller 6.17.0, UPX 4.2.4


μ»¨ν…μŠ€νŠΈ-인식 μžλ§‰ λ²ˆμ—­κΈ°

License: MIT

Google Gemini APIλ₯Ό 기반으둜, μ™„λ²½ν•œ 메타데이터 보쑴과 λ²ˆμ—­μ„ μœ„ν•΄ μ •λ°€ν•˜κ²Œ μ„€κ³„λœ λΉ„μ €μž₯식 μžλ§‰ λ²ˆμ—­κΈ°μž…λ‹ˆλ‹€.

핡심 κΈ°λŠ₯

  • πŸ–₯️ λΉ„μ €μž₯식 & λΈŒλΌμš°μ € 기반 UI: Streamlit으둜 μ œμž‘λ˜μ–΄ λͺ¨λ“  μ΅œμ‹  μ›Ή λΈŒλΌμš°μ €μ—μ„œ μ‹€ν–‰λ˜λ©°, μ–΄λ–€ μš΄μ˜μ²΄μ œμ—μ„œλ“  κΉ”λ”ν•˜κ³  직관적인 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • πŸ•’ μ™„λ²½ν•œ 메타데이터 보쑴: μ‹œμŠ€ν…œμ˜ ν•΅μ‹¬μ—λŠ” '컨베이어 벨트 μ•„ν‚€ν…μ²˜'κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 κ΅¬μ‘°λŠ” μžλ§‰ ν…μŠ€νŠΈλ₯Ό νƒ€μž„μŠ€νƒ¬ν”„, μΈλ±μŠ€μ™€ 같은 λ©”νƒ€λ°μ΄ν„°λ‘œλΆ€ν„° μ™Έκ³Όμ μœΌλ‘œ λΆ„λ¦¬ν•©λ‹ˆλ‹€. 였직 ν…μŠ€νŠΈλ§Œ λ²ˆμ—­μ„ μœ„ν•΄ μ „μ†‘λ˜λ―€λ‘œ, μ‹œκ°„ μ •λ³΄λŠ” μ ˆλŒ€ ν›Όμ†λ˜μ§€ μ•Šκ³  μ™„λ²½ν•œ 동기화λ₯Ό μœ μ§€ν•©λ‹ˆλ‹€.
  • πŸ”— κ²¬κ³ ν•œ AI 톡신 (ID 액컀링 ν”„λ‘œν† μ½œ): LLM이 μž„μ˜λ‘œ 쀄을 ν•©μΉ˜κ±°λ‚˜ λ‚˜λˆ„λŠ” 치λͺ…적인 '개수 뢈일치' 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  쀄은 고유 ID둜 κ³ μ •λ˜μ–΄, AIκ°€ μ†ŒμŠ€μ™€ λ²ˆμ—­ ν…μŠ€νŠΈ κ°„μ˜ 1:1 ꡬ쑰적 λŒ€μ‘μ„ μœ μ§€ν•˜λ„λ‘ κ°•μ œν•©λ‹ˆλ‹€. μ΄λŠ” 재쑰립된 μžλ§‰ 파일이 μ ˆλŒ€ μ†μƒλ˜μ§€ μ•ŠμŒμ„ 보μž₯ν•©λ‹ˆλ‹€.
  • 🧠 μ»¨ν…μŠ€νŠΈ-인식 μ—”μ§„ (개발 μ§„ν–‰ 쀑): μ‹œμŠ€ν…œμ€ "슀카우트-리포트-μ£Όμž…" μ•„ν‚€ν…μ²˜λ₯Ό μ±„νƒν•˜μ—¬, λ²ˆμ—­ μ „ 슀크립트의 μž₯λ₯΄, 톀, 인물 관계λ₯Ό 미리 λΆ„μ„ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μƒμ„±λœ 'μ»¨ν…μŠ€νŠΈ κ°€μ΄λ“œ'λŠ” λͺ¨λ“  λ²ˆμ—­ μš”μ²­μ— μ£Όμž…λ˜μ–΄ 일관성과 ν†€μ˜ 정확성을 극적으둜 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
    • μ°Έκ³ : 심측 λ¬Έλ§₯ 뢄석을 μœ„ν•œ ν”„λ ˆμž„μ›Œν¬λŠ” λ§ˆλ ¨λ˜μ—ˆμœΌλ‚˜, 슀크립트 전체에 걸쳐 μ™„λ²½ν•œ μ„œμ‚¬μ , 감정적 λ¬Έλ§₯을 λ‹¬μ„±ν•˜λŠ” 것은 μ—¬μ „νžˆ 도전적인 과제이며 ν–₯ν›„ κ°œμ„ μ˜ 핡심 μ˜μ—­μž…λ‹ˆλ‹€. ν˜„μž¬ κ΅¬ν˜„μ€ μƒλ‹Ήν•œ ν’ˆμ§ˆ ν–₯상을 μ œκ³΅ν•˜μ§€λ§Œ, 아직 μ™„λ²½ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
  • πŸš€ μ‹€μ‹œκ°„ μ‹€ν–‰ λŒ€μ‹œλ³΄λ“œ: μ‹œκ°μ  κ·Έλ¦¬λ“œκ°€ 각 청크의 μƒνƒœ(λŒ€κΈ°, 처리 쀑, 성곡, μ‹€νŒ¨)λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ ν‘œμ‹œν•˜λ©°, κ²½κ³Ό μ‹œκ°„, 평균 청크 속도, μ˜ˆμƒ μ™„λ£Œ μ‹œκ°„μ„ λ³΄μ—¬μ£ΌλŠ” HUDκ°€ ν•¨κ»˜ μ œκ³΅λ©λ‹ˆλ‹€.
  • πŸ”§ κ³ κΈ‰ μ œμ–΄ 및 νŠœλ‹:
    • μˆ˜λ™ μž¬μ‹œλ„ & κΈ΄κΈ‰ μ •μ§€: μ‹€νŒ¨ν•œ μ²­ν¬λŠ” 전체 ν”„λ‘œμ„ΈμŠ€λ₯Ό λ‹€μ‹œ μ‹œμž‘ν•  ν•„μš” 없이 κ°œλ³„μ μœΌλ‘œ μž¬μ‹œλ„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ „μ—­ μ •μ§€ λ²„νŠΌμœΌλ‘œ μ–Έμ œλ“ μ§€ μž‘μ—…μ„ 쀑단할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μΆ”λ‘  버킷: AIλ₯Ό 'μ΅œλŒ€ μΆ”λ‘ ' λͺ¨λ“œλ‘œ μ „ν™˜ν•˜λŠ” ν† κΈ€μž…λ‹ˆλ‹€. 속도λ₯Ό ν¬μƒν•˜λŠ” λŒ€μ‹ , λ―Έλ¬˜ν•œ λ‰˜μ•™μŠ€μ˜ λŒ€μ‚¬λ₯Ό μœ„ν•΄ 더 깊고 단계적인 뢄석을 μˆ˜ν–‰ν•˜λ„λ‘ μ§€μ‹œν•˜μ—¬ κ³ ν’ˆμ§ˆ λ²ˆμ—­μ„ μœ λ„ν•©λ‹ˆλ‹€.
    • 청크 크기 쑰절: API ν˜ΈμΆœλ‹Ή μ „μ†‘λ˜λŠ” ν…μŠ€νŠΈ 양을 μ œμ–΄ν•˜λŠ” μŠ¬λΌμ΄λ”λ‘œ, μ‚¬μš©μžκ°€ 속도와 μ•ˆμ •μ„± μ‚¬μ΄μ˜ κ· ν˜•μ„ 맞좜 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‹œμž‘ν•˜κΈ° (개발자용)

둜컬 개발 ν™˜κ²½μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λ €λ©΄ λ‹€μŒ 단계λ₯Ό λ”°λ₯΄μ„Έμš”.

사전 μ€€λΉ„λ¬Ό

  • Python 3.9 이상
  • Gemini APIκ°€ ν™œμ„±ν™”λœ Google API ν‚€. Google AI Studioμ—μ„œ λ°œκΈ‰λ°›μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ„€μΉ˜ 및 μ‹€ν–‰

  1. 리포지토리 클둠:

    git clone https://github.com/your-repo/your-project.git
    cd your-project
  2. (ꢌμž₯) κ°€μƒν™˜κ²½ 생성 및 ν™œμ„±ν™”:

    # Windows
    python -m venv venv
    .\venv\Scripts\activate
    
    # macOS/Linux
    python3 -m venv venv
    source venv/bin/activate
  3. ν•„μš” 라이브러리 μ„€μΉ˜:

    pip install -r requirements.txt
  4. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰:

    streamlit run app.py
  5. μ›Ή λΈŒλΌμš°μ €κ°€ μžλ™μœΌλ‘œ 열리며 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ©λ‹ˆλ‹€. μ‚¬μ΄λ“œλ°”μ— Google API ν‚€λ₯Ό μž…λ ₯ν•˜μ—¬ μ‹œμž‘ν•˜μ„Έμš”.

μž‘λ™ 방식: "컨베이어 벨트" μ•„ν‚€ν…μ²˜

μ‹œμŠ€ν…œμ˜ 데이터 흐름은 μ‚°μ—… ν˜„μž₯의 컨베이어 벨트처럼, 졜고의 μ•ˆμ „μ„±κ³Ό νš¨μœ¨μ„±μ„ μœ„ν•΄ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  1. λΆ„ν•΄: μž…λ ₯된 SRT νŒŒμΌμ€ 메타데이터와 λ°μ΄ν„°λΌλŠ” 두 κ°€μ§€ λ³„κ°œμ˜ ꡬ성 μš”μ†Œλ‘œ μ •λ°€ν•˜κ²Œ λΆ„ν•΄λ©λ‹ˆλ‹€.
  2. μ •μ œ: λ©”νƒ€λ°μ΄ν„°λŠ” λ‘œμ»¬μ— μ•ˆμ „ν•˜κ²Œ λ³΄κ΄€λ©λ‹ˆλ‹€. 였직 μˆœμˆ˜ν•œ ν…μŠ€νŠΈ λ°μ΄ν„°λ§Œμ΄ λ‹€μŒ λ‹¨κ³„λ‘œ μ§„ν–‰λ˜μ–΄, AI에 μ˜ν•œ 메타데이터 μ˜€μ—Ό κ°€λŠ₯성을 μ›μ²œ μ°¨λ‹¨ν•©λ‹ˆλ‹€.
  3. 일괄 처리: ν…μŠ€νŠΈλŠ” μ‚¬μš©μžκ°€ μ •μ˜ν•œ 크기의 청크둜 κ·Έλ£Ήν™”λœ ν›„, ID 액컀링 ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜μ—¬ μ—„κ²©ν•œ JSON ꡬ쑰둜 ν¬λ§·λ©λ‹ˆλ‹€.
  4. 재쑰립: AIκ°€ λ²ˆμ—­λœ JSON을 λ°˜ν™˜ν•˜λ©΄, μ‹œμŠ€ν…œμ€ 데이터 무결성을 κ²€μ¦ν•˜κ³  IDλ₯Ό κΈ°μ€€μœΌλ‘œ μž¬μ •λ ¬ν•œ λ’€, 원본 κ·ΈλŒ€λ‘œ 보쑴된 메타데이터와 κΌΌκΌΌν•˜κ²Œ μž¬κ²°ν•©ν•˜μ—¬ μ™„λ²½ν•˜κ²Œ λ™κΈ°ν™”λœ μ΅œμ’… μžλ§‰ νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.

핡심 기술: AI 톡신 ν”„λ‘œν† μ½œ

돌파ꡬ: 'ID 액컀링'κ³Ό JSON κ°•μ œ λͺ¨λ“œμ˜ κ²°ν•©

우리의 ν”„λ‘œν† μ½œμ€ 논리적 데이터 ꡬ쑰와 μ—„κ²©ν•œ API 레벨 λͺ…령을 κ²°ν•©ν•˜μ—¬ ν…μŠ€νŠΈ ꡬ쑰λ₯Ό λ³€κ²½ν•˜λ €λŠ” LLM의 κ²½ν–₯을 무λ ₯ν™”ν•©λ‹ˆλ‹€.

  1. ID 액컀링: ꡬ쑰적 λΆˆλ³€μ„± κ°•μ œ

    AIκ°€ μˆ˜μ • κ°€λŠ₯ν•œ 단일 ν…μŠ€νŠΈ λΈ”λ‘μœΌλ‘œ 해석할 수 μžˆλŠ” λ‹¨μˆœν•œ λ¬Έμžμ—΄ 리슀트 λŒ€μ‹ , μš°λ¦¬λŠ” κ°μ²΄λ“€μ˜ 배열을 μ „μ†‘ν•©λ‹ˆλ‹€. 각 κ°μ²΄λŠ” κ³ μœ ν•˜κ³  순차적인 id둜 "κ³ μ •"λ©λ‹ˆλ‹€.

    AI에 μ „μ†‘λ˜λŠ” 데이터 ꡬ쑰:

    [
      {"id": 0, "text": "첫 번째 쀄 ν…μŠ€νŠΈ."},
      {"id": 1, "text": "두 번째 쀄 ν…μŠ€νŠΈ."},
      {"id": 2, "text": "μ„Έ 번째 쀄 ν…μŠ€νŠΈ."}
    ]

    이 κ΅¬μ‘°λŠ” 논리적 '쑱쇄' 역할을 ν•©λ‹ˆλ‹€. AIλŠ” ν”„λ‘¬ν”„νŠΈλ₯Ό 톡해 각 객체의 idλ₯Ό λ³΄μ‘΄ν•˜λ„λ‘ μ§€μ‹œλ°›μŠ΅λ‹ˆλ‹€. 이 κ°„λ‹¨ν•œ κ·œμΉ™μ€ λ‹€μŒκ³Ό 같은 μ€‘λŒ€ν•œ κ²°κ³Όλ₯Ό λ‚³μŠ΅λ‹ˆλ‹€.

    • 병합 λΆˆκ°€λŠ₯: AIλŠ” id: 1을 νŒŒκ΄΄ν•˜κ±°λ‚˜ μœ νš¨ν•˜μ§€ μ•Šμ€ ꡬ쑰λ₯Ό λ§Œλ“€μ§€ μ•Šκ³ μ„œλŠ” 1번과 2번 쀄을 단일 λ²ˆμ—­ 객체둜 ν•©μΉ  수 μ—†μŠ΅λ‹ˆλ‹€.
    • λΆ„ν•  λΆˆκ°€λŠ₯: AIλŠ” μƒˆλ‘œμš΄ IDλ₯Ό λ‚ μ‘°ν•˜μ§€ μ•Šκ³ μ„œλŠ” 3번 쀄을 두 개의 λ²ˆμ—­ 객체둜 λ‚˜λˆŒ 수 μ—†μœΌλ©°, μ΄λŠ” μ§€μ‹œ 사항 μœ„λ°˜μž…λ‹ˆλ‹€.

    이것은 ν…μŠ€νŠΈ λ‚΄μš©κ³Ό 관계없이 μž…λ ₯κ³Ό 좜λ ₯ 객체 κ°„μ˜ μ—„κ²©ν•œ 1:1 맀핑을 ꡬ쑰적 μˆ˜μ€€μ—μ„œ κ°•μ œν•©λ‹ˆλ‹€. AIκ°€ μ‘λ‹΅μ—μ„œ 객체의 μˆœμ„œλ₯Ό λ’€μ„žλ”λΌλ„, μš°λ¦¬λŠ” λΆˆλ³€μ˜ IDλ₯Ό μ‚¬μš©ν•˜μ—¬ 항상 μ •ν™•ν•œ μˆœμ„œλ‘œ μ•ˆμ •μ μœΌλ‘œ μž¬μ •λ ¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  2. API 레벨 JSON κ°•μ œ λͺ¨λ“œ: 데이터 무결성 보μž₯

    ID 액컀링이 ꡬ쑰적 λ§€ν•‘ 문제λ₯Ό ν•΄κ²°ν•˜μ§€λ§Œ, AIκ°€ μœ νš¨ν•˜μ§€ μ•Šμ€ JSON을 λ°˜ν™˜ν•˜λŠ” 것(예: "λ²ˆμ—­ κ²°κ³Όμž…λ‹ˆλ‹€: ..."와 같은 λŒ€ν™”μ²΄ ν…μŠ€νŠΈ μΆ”κ°€)을 λ§‰μ§€λŠ” λͺ»ν•©λ‹ˆλ‹€. 이λ₯Ό μ œκ±°ν•˜κΈ° μœ„ν•΄, μš°λ¦¬λŠ” ν”„λ‘¬ν”„νŠΈ μˆ˜μ€€μ˜ μš”μ²­μ„ μ™„μ „νžˆ μš°νšŒν•©λ‹ˆλ‹€.

    Gemini API 호좜 μ‹œ response_mime_type λ§€κ°œλ³€μˆ˜λ₯Ό application/json으둜 μ„€μ •ν•˜λ„λ‘ κ΅¬μ„±ν•©λ‹ˆλ‹€. 이것은 μ œμ•ˆμ΄ μ•„λ‹ˆλΌ API μ„œλ²„ μžμ²΄μ— λŒ€ν•œ μ‹œμŠ€ν…œ 레벨의 λͺ…λ Ήμž…λ‹ˆλ‹€. μ΄λŠ” μ„œλ²„κ°€ λ¬Έλ²•μ μœΌλ‘œ μ™„λ²½ν•œ JSON 객체 μ™Έμ—λŠ” 아무것도 λ°˜ν™˜ν•˜μ§€ μ•Šλ„λ‘ κ³„μ•½μ μœΌλ‘œ κ΅¬μ†ν•©λ‹ˆλ‹€. 이둜써 JSONDecodeError의 κ°€λŠ₯성이 μ™„λ²½ν•˜κ²Œ 제거되고 톡신 νŒŒμ΄ν”„λΌμΈμ€ κ·Ήλ„λ‘œ κ²¬κ³ ν•΄μ§‘λ‹ˆλ‹€.

기술 μŠ€νƒ

  • μ½”μ–΄ & 둜직: Python 3.13, Streamlit 1.51.0
  • AI μ—”μ§„ & 톡신: google-generativeai, chardet
  • νŒ¨ν‚€μ§• & 배포: PyInstaller 6.17.0, UPX 4.2.4

λΌμ΄μ„ μŠ€

This project is licensed under the MIT License.

About

A Python automation tool for translating subtitles with strict metadata preservation. Ensures timestamps and tags remain intact for perfect synchronization.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages