티스토리 뷰
[Python] 오프라인 AI 자막 생성기 'K-Sub' - 인터넷 없이 로컬에서 Whisper 음성인식 + 번역 + LLM 후처리
권퓨터: Kwonputer 2026. 2. 5. 12:47
CORE FEATURES
AI 5개 모델 100% 오프라인 완전한 프라이버시
SUMMARY
K-Sub (Kwon-Subtitle)
인터넷 연결 없이 100% 로컬에서 동작하는 AI 자막 생성기입니다.
Whisper 음성 인식 → KE-T5/NLLB 번역 → Qwen LLM 후처리까지 모든 AI가 내 컴퓨터에서 실행되어, 영상 데이터가 외부로 전송되지 않습니다.
주요 기술적 도전: 오프라인 AI 파이프라인 구축, NLLB→KE-T5 2단계 번역, 고유명사 보호 시스템
TABLE OF CONTENTS
목차
왜 오프라인인가? 아키텍처 주요 기능 기술적 도전과 해결 사용 모델
WHY OFFLINE
왜 오프라인 AI인가?
클라우드 서비스의 문제점
프라이버시 우려 — 영상을 외부 서버에 업로드해야 하므로, 민감한 콘텐츠는 사용하기 어렵습니다.
인터넷 의존성 — 네트워크 상태에 따라 속도가 달라지고, 오프라인에서는 사용 불가합니다.
비용 문제 — 대부분의 고품질 서비스는 유료이며, 영상 길이에 따라 비용이 증가합니다.
K-Sub의 해결책: 100% 로컬 AI
완전한 프라이버시 — 모든 처리가 내 컴퓨터에서 이루어지므로, 영상 데이터가 외부로 유출되지 않습니다.
오프라인 동작 — 인터넷 연결 없이도 완벽하게 동작합니다. 비행기 안에서도 자막 작업이 가능합니다.
무료 + 무제한 — 한 번 설치하면 영상 길이와 개수에 상관없이 무료로 사용할 수 있습니다.
일본어/영어 영상에 한국어 자막을 붙이고 싶을 때, 기존 도구들은 고유명사 처리가 엉망이었습니다.
특히 애니메이션이나 드라마의 캐릭터 이름, 특수 용어가 제대로 번역되지 않는 문제가 있었습니다.
그래서 고유명사를 보존하면서도 자연스러운 번역을 생성하고, 프라이버시까지 보장하는 도구를 직접 만들기로 했습니다.
ARCHITECTURE
5단계 오프라인 AI 파이프라인
5개의 AI 모델이 모두 로컬에서 순차적으로 실행됩니다. 인터넷 연결 없이 음성인식부터 품질 평가까지 완전한 파이프라인을 구축했습니다.
영상 파일 (mp4/mkv/avi)
│
▼
┌─────────────────────────────────────┐
│ Step 1. 음성 인식 (Whisper) │ ← 로컬 AI #1
│ - OpenAI Whisper large-v3 │
│ - 장르별 initial prompt │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Step 2. 고유명사 추출 (Qwen 1.5B) │ ← 로컬 AI #2
│ - 인명/지명/조직/용어 JSON 추출 │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Step 3. 번역 │
│ - 일본어→영어: NLLB-200 │ ← 로컬 AI #3
│ - 영어→한국어: KE-T5 │ ← 로컬 AI #4
│ - EntityProtector로 고유명사 보호 │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Step 4. LLM 후처리 (Qwen 3B) │ ← 로컬 AI #5
│ - 고유명사 한국어 변환 │
│ - 품질 점수 계산 (0~100) │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Step 5. SRT 저장 + GUI 편집 │
│ - 원문/번역문 병렬 미리보기 │
│ - 인라인 편집 모드 │
└─────────────────────────────────────┘
※ 모든 AI가 내 컴퓨터에서 실행됩니다.
인터넷 연결 불필요, 데이터 외부 전송 없음.
FEATURES
주요 기능
Whisper 음성 인식 (로컬)
OpenAI Whisper large-v3 — 1550M 파라미터의 최신 음성 인식 모델이 내 컴퓨터에서 직접 실행됩니다.
장르별 initial prompt — 애니메이션/드라마/영화/다큐/뉴스/강의/AV 7가지 장르별 힌트로 인식률 향상
실시간 진행률 — verbose 출력 파싱으로 현재 인식 중인 자막 내용까지 GUI에 표시
번역 엔진 KE-T5 + NLLB (로컬)
영어 → 한국어 — KE-T5 직접 번역으로 자연스러운 한국어 생성
일본어 → 한국어 — NLLB(일→영) + KE-T5(영→한) 2단계 파이프라인으로 품질 향상
EntityProtector — 번역 전 고유명사를 플레이스홀더로 치환하여 보호, 번역 후 복원
LLM 후처리 Qwen2.5 (로컬)
고유명사 추출 — Qwen2.5-1.5B로 캐릭터/장소/조직/용어를 JSON으로 추출
한국어 변환 — Qwen2.5-3B로 일본어/영어 고유명사를 한국어 발음/의미로 변환
품질 점수 — 6가지 기준으로 0~100점 계산, 70점 미만은 "수정 필요" 표시
데스크탑 GUI (tkinter)
실시간 진행률 — 5단계별 프로그레스 바와 현재 처리 중인 자막 내용 표시
자막 미리보기 — 원문/번역문 병렬 표시, 인라인 편집 지원
고유명사 사전 — 작품별 사전 생성/관리/가져오기/내보내기 (JSON)
작업 이어하기 — 중간에 중단한 작업 상태 저장/복원 기능
디바이스 자동 감지
NVIDIA GPU — nvidia-smi로 VRAM 감지, 12GB 이상이면 large-v3 + LLM 추천
Apple Silicon — sysctl로 MPS 감지, 통합 메모리 기반 최적 설정 추천
CPU — 메모리 부족 시 small 모델 + LLM OFF 자동 전환
TROUBLESHOOTING
기술적 도전과 해결
PROBLEM 01
Whisper 취소 불가능 문제
model.transcribe()가 블로킹 함수여서 중간 취소가 불가능했습니다.
24분 영상 처리에 약 50분이 소요되는데, 잘못된 설정으로 시작하면 처음부터 다시 해야 하는 상황이 발생했습니다.
시도 1 — subprocess 분리
별도 프로세스로 분리하려 했으나, PyInstaller 빌드 시 sys.executable이 exe를 가리켜서 실패
SOLUTION — ctypes로 스레드 강제 종료
별도 스레드에서 Whisper를 실행하고, ctypes의 PyThreadState_SetAsyncExc로 SystemExit를 주입하여 강제 종료
# ctypes로 스레드 강제 종료
thread_id = whisper_thread.ident
ctypes.pythonapi.PyThreadState_SetAsyncExc(
ctypes.c_ulong(thread_id),
ctypes.py_object(SystemExit)
)
# 취소 후 GPU 메모리 해제
torch.cuda.empty_cache()
PROBLEM 02
일본어→한국어 직접 번역 품질
오프라인에서 사용 가능한 일→한 직접 번역 모델의 품질이 낮고, 고유명사가 완전히 왜곡되었습니다. 문장 구조도 어색하고 의미가 통하지 않는 경우가 많았습니다.
SOLUTION — NLLB→KE-T5 2단계 파이프라인
영어를 중간 언어로 활용하여 품질을 크게 향상시켰습니다. 두 모델 모두 로컬에서 실행됩니다.
# 일본어 → 한국어 2단계 번역 (모두 로컬)
# Step 1: NLLB (일→영) - 로컬 실행
english = nllb_translate(japanese, "jpn_Jpan", "eng_Latn")
# Step 2: KE-T5 (영→한) - 로컬 실행
korean = ket5_translate(english, "en", "ko")
PROBLEM 03
번역 시 고유명사 파괴
"ルフィ(루피)"가 번역 후 "루피"가 아닌 엉뚱한 텍스트로 변환되는 문제가 있었습니다. 번역 모델이 고유명사를 일반 단어로 인식하여 왜곡시키는 현상이었습니다.
SOLUTION — EntityProtector 패턴
번역 전 고유명사를 플레이스홀더로 치환하고, 번역 후 복원하는 방식으로 해결했습니다.
# EntityProtector 동작 방식
# 보호: "ルフィは悪魔の実を食べた"
# → "ENTITYNAME0はENTITYNAME1を食べた"
# 번역: "ENTITYNAME0이 ENTITYNAME1을 먹었다"
# 복원: "루피가 악마의 열매를 먹었다"
PROBLEM 04
Windows 인코딩 문제
ffprobe subprocess에서 UnicodeDecodeError: 'cp949' 오류가 발생했습니다. Windows의 기본 인코딩이 cp949이기 때문이었습니다.
SOLUTION — UTF-8 명시 + 콘솔 숨김
# Windows subprocess 설정
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
result = subprocess.run(
ffprobe_cmd,
capture_output=True,
encoding='utf-8',
errors='ignore',
startupinfo=startupinfo
)
PROBLEM 05
GUI 응답 없음 (Not Responding)
Whisper가 메인 스레드에서 실행되면 GUI가 완전히 멈춰서 "응답 없음" 상태가 되었습니다. 사용자가 취소 버튼을 누를 수도 없었습니다.
SOLUTION — threading + queue 패턴
작업 스레드에서 queue에 메시지를 push하고, 메인 스레드에서 50ms 간격으로 poll하여 GUI를 업데이트합니다.
# threading + queue 패턴
message_queue = queue.Queue()
def worker_thread():
# 작업 수행 후 결과를 queue에 push
message_queue.put(("progress", 50, "처리 중..."))
def poll_queue():
while not message_queue.empty():
msg_type, *data = message_queue.get()
update_gui(msg_type, data)
root.after(50, poll_queue) # 50ms 후 다시 호출
MODELS
로컬에서 실행되는 5개 AI 모델
Whisper large-v3
음성 인식 | 1550M 파라미터 | OpenAI | 로컬 실행
KE-T5-base
영→한 번역 | ~220M 파라미터 | seongs/ke-t5-base-aihub | 로컬 실행
NLLB-200-distilled
일→영 번역 | 600M 파라미터 | Facebook | 로컬 실행
Qwen2.5-1.5B-Instruct
고유명사 추출 | 1.5B 파라미터 | Alibaba | 로컬 실행
Qwen2.5-3B-Instruct
LLM 후처리 | 3B 파라미터 | Alibaba | 로컬 실행
CONCLUSION
결론
100% 오프라인 동작 — 인터넷 연결 없이 5개의 AI 모델이 모두 내 컴퓨터에서 실행됩니다.
완전한 프라이버시 — 영상 데이터가 외부로 전송되지 않아, 민감한 콘텐츠도 안심하고 처리할 수 있습니다.
NLLB→KE-T5 2단계 번역 — 일→한 직접 번역보다 영어를 중간 언어로 거치는 것이 더 나은 결과를 내는 것을 발견했습니다.
EntityProtector + LLM 후처리 — 이중 안전장치로 고유명사 보존율을 크게 향상시켰습니다.
디바이스 자동 감지 — 사용자 하드웨어에 맞춰 최적 설정을 자동 추천하여 진입 장벽을 최소화했습니다.
긴 글을 읽어주셔서 감사합니다!
처음에는 단순히 "일본어 영상에 한국어 자막을 붙이고 싶다"는 개인적인 필요에서 시작한 프로젝트였습니다.
하지만 기존 클라우드 서비스들은 프라이버시 문제가 있었고, 민감한 콘텐츠는 업로드하기 꺼려졌습니다.
그래서 완전히 오프라인에서 동작하는 AI 자막 생성기를 만들기로 결심했고, Whisper부터 LLM까지 5개의 AI 모델을 로컬에서 실행하는 파이프라인을 완성했습니다.
특히 "일→한 직접 번역보다 영어를 중간 언어로 거치는 2단계 번역이 더 자연스럽다"는 발견은 이 프로젝트의 핵심 인사이트였습니다.
이 도구가 저처럼 프라이버시를 지키면서 외국어 영상에 한국어 자막이 필요하신 분들께 도움이 되었으면 합니다.
- Total
- Today
- Yesterday
- Clean Architecture
- https://www.kwonputer.shop/
- Single Table Design
- riverpod
- Prompt Engineering
- Compose
- dynamodb
- python
- flutter
- AWS CDK
- 자막 생성기
- injectable
- 상태관리
- aws lambda
- 내러티브 게임
- python 기초
- 크로스플랫폼
- https://github.com/kwongeneral/kortfolio.git
- flutter 개발자
- 개발자
- flutter 면접 질문
- kotlin
- TypeScript
- 서버리스 아키텍처
- ai 게임 개발
- KE-T5
- 클린 아키텍처
- OpenAI GPT
- 파이썬
- 파이썬 기초
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |







