Develop/Release

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

퓨림노 2025. 6. 25. 19:57
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
반응형