로컬 기반 LLM을 활용한 자막 번역 시스템 구축

반응형
728x90
반응형
gpt4o 생성한 이미지

개요

기존에는 Papago API DeepL과 같은 외부 번역 API를 활용해 자막 파일을 번역해왔습니다. 이들 서비스는 번역 품질이 우수하지만, 대부분 일정량의 무료 크레딧이 일일 혹은 월 단위로 제한되어 있어, 대용량 번역 작업이나 지속적인 사용에는 비용 부담이 발생합니다.

이에 따라 최근에는 로컬(Local) 환경에서 실행 가능한 LLM(Language Model) 기반의 자막 번역 시스템을 구현해보았습니다.

 

 

다운로드 

- update: 2025.06.26

- SUBLLM R01 Download 

 

✅ 로컬 LLM을 사용하는 이유

로컬 LLM을 활용하면, 현재 사용 중인 PC의 리소스를 기반으로 번역 작업을 수행하게 됩니다. 따라서 추가적인 비용 없이 전력 사용량만으로도 충분히 번역 기능을 이용할 수 있다는 장점이 있습니다.
또한, 사용자의 하드웨어 성능, 특히 GPU(VGA) 성능에 따라 다음과 같은 다양한 오픈소스 LLM 모델들을 선택적으로 사용할 수 있습니다:

  • Gemma
  • LLaMA
  • DeepSeek
  • Mistral
  • Falcon
  • Phi
  • Qwen
  • Exaone (국내 개발 모델)
 

💡 향후 활용 방안

이 시스템은 단순히 로컬에서만 작동하는 것이 아니라, 향후 다음과 같은 방향으로 확장 가능합니다:

  • REST API 서버로 구축하여 외부 웹서비스 형태로 제공
    → 번역 기능을 다양한 클라이언트와 연동 가능
  • 개인 맞춤형 번역 도구 오프라인 기반 번역기 형태로 활용
    → 인터넷 연결 없이도 고품질 번역 제공
 

🔒 향후 개선 및 보완할 사항

현재는 자막 파일 내 각 문장을 개별적으로 번역하고 있습니다. 하지만 이 방식은 문맥(Context)을 고려하지 않기 때문에, 자연스러운 번역 결과를 위해 다음과 같은 개선이 필요합니다:

  • 앞/뒤 문맥을 함께 고려한 번역 기능 구현
    → 예: Sliding window 방식의 문장 묶음 번역
  • 자막 시간 정보와 함께 번역 흐름 최적화
    → 영상 내 대화 흐름에 맞춘 자연스러운 결과 도출
 

📝 마무리

이제 누구나 자신의 PC에서 무료로 LLM 기반 자막 번역기를 만들어 활용할 수 있는 시대입니다. 적절한 모델과 환경만 갖춘다면, 기존 유료 API에 의존하지 않고도 높은 수준의 번역 결과를 얻을 수 있습니다. 앞으로도 관련 기능들을 지속적으로 개선하여, 더욱 자연스럽고 실용적인 번역 도구로 발전시켜 나갈 예정입니다.

🧾 전체 요구사항 정리(Python + LLM)

 

📁 0. 개요(목표)

  - LM Studio의 Rest API를 이용하여, python기반 Local LLM을 이용하여 번역 모듈 구성

 

📁 1. 자막 파일 처리 대상

  • subtitles/ 폴더 안의 .srt, .vtt 파일 대상
  • 하위 폴더 포함하여 재귀 탐색 (rglob) 처리
  • 다양한 언어명이 포함된 파일명 처리 (예: English, Dutch, _en, .en 등)
 

🔤 2. 번역 처리

  • LLM(로컬 혹은 OpenAI API) 이용하여 영어 → 한국어 (또는 설정값 기반) 자동 번역
  • LLM은 OpenAI Chat Completion 포맷 사용 (messages 기반)
  • 프롬프트는 외부 텍스트 파일(prompt_template.txt)에서 관리
 

🏷️ 3. 파일명 처리

  • 번역된 파일은 기존 자막 파일명에서 언어표시(English, en, 등)를 제거한 형태로 저장
  • 파일명 정리는 LLM을 이용해 수행하며, 그 프롬프트는 filename_prompt_template.txt에서 관리
  • LLM 응답 후 불필요한 접두어(Output: 등)를 제거하며, Windows 파일 시스템에 허용되지 않는 문자는 제거
 

📂 4. 출력 구조

  • 출력 디렉토리는 .env에서 OUTPUT_PATH로 지정
  • 결과 파일은 output/ 폴더 아래에 subtitles/와 동일한 하위 폴더 구조로 저장
  • 예: subtitles/a/b/video.en.srt → output/a/b/video.ko.srt
# 입력 경로(input path)
📁 subtitles/
 ├── 📁 a/
 │   └── lecture.en.srt
 └── 📁 b/
     └── 📁 b1/
         └── video.en.vtt

# 출력 경로(output path)
📁 output/
 ├── 📁 a/
 │   └── lecture.ko.srt
 └── 📁 b/
     └── 📁 b1/
         └── video.ko.vtt
 

⚙️ 5. 환경 및 설정 관리

  • setting.env 파일로 주요 환경 설정 관리:
LM_API_URL=http://localhost:1234/v1/chat/completions
LM_MODEL=lgai-exaone/exaone-3.5-2.4b-instruct
SOURCE_LANG=en
TARGET_LANG=ko
SEARCH_PATH=./subtitles
OUTPUT_PATH=./output
  • 프롬프트 정의 파일:
    - prompt_template.txt: 자막 번역용
    - filename_prompt_template.txt: 파일명 정리용
  • (옵션) filename_rule.txt: 정규표현식을 통한 후처리 규칙 적용 가능
 

⚙️ 6. 프롬프트(prompt) 설정

  • 사용자 프롬프트를 이용하여 번역 스타일 및 자막파일의 형식을 지정할 수 있도록 함
  • 번역스타일: prompt_template.txt
  • 자막파일 형식: filename_prompt_template.txt
  • prompt_template.txt (예시)
You are a professional subtitle translator.
Translate the following sentence from {SOURCE_LANG} to {TARGET_LANG}.
Only return the translated result without explanation or extra formatting.  

Input:
{text}  

Output:
  • filename_prompt_template.txt  (예시)
You are a filename normalizer.
Your job is to remove only the language indicators such as "English", "Dutch", "Indonesian", or language suffixes like "_en", ".en", "-en" when they appear at the end of a filename — just before the file extension.
Do not remove or change any other part of the filename. Keep all punctuation, numbers, and spacing intact.  

Example 1:
Input: 12 - Creating a Random Subtitle.en
Output: 12 - Creating a Random Subtitle  

Example 2:
Input: 90 - Constructive Feedback Dutch
Output: 90 - Constructive Feedback  

Input: {base_name}
Output:  
 

🧠 6. 향후 확장 고려

  • 변환 실패 항목 로그 저장 (예: error_log.txt)
  • CLI 옵션으로 설정값 오버라이드 (ex. --source-lang en --target-lang ko)

지원 포맷 확장 (.ass, .sbv, .ttml 등)

728x90
반응형

댓글

Designed by JB FACTORY