작업 목록으로

YouTube Translate & STS

데스크톱

외국어 YouTube 영상을 한국어 음성으로 듣기 위한 데스크톱 도구입니다. 번역과 음성 생성은 로컬에서 실행합니다. 번역문과 음성을 구간별로 확인하고 필요한 부분을 고칠 수 있도록 개발하고 있습니다.

영상의 구간에 맞춰 나란히 놓인 음성 파형과 편집용 연필을 그린 일러스트

번역한 내용을 자연스럽게 듣기

영상의 시간에 맞춰 말하기

한국어로 번역하면 문장 길이가 달라져 원본 영상의 짧은 발화 구간에 음성을 맞추기 어려워집니다. 문장을 압축해 다시 번역하고 음성의 재생 속도를 보정하면서, 내용과 듣는 흐름 사이의 균형을 다듬고 있습니다.

필요한 부분을 다시 만들기

번역문이나 타이밍을 고친 뒤 필요한 단계만 다시 실행할 수 있도록, 단계별 결과를 버전으로 남기는 구조를 만들고 있습니다. 입력이 바뀌면 영향을 받는 후속 결과를 표시하고, 사람이 확인한 구간과 수정 내용을 재실행 과정에서 보존하도록 설계했습니다.

설계와 구현단계별 산출물 · 버전과 검수 · 로컬 모델

구성과 데이터 흐름

영상 수집 → 발화·자막 분석 → 번역 → 음성 생성 → 구간 검토 → 내보내기

데스크톱과 검수 화면이 로컬 서버에 작업을 요청하고, 진행 상황을 받아 표시합니다. 내부 작업은 10개 실행 단계로 나눴습니다. 각 단계는 입력 버전과 결과를 파일 저장소에 남기므로, 중간 결과를 확인하고 필요한 지점부터 다시 작업할 수 있습니다.

파일 버전과 현재 선택한 결과를 분리하기

산출물에는 버전·해시·입력 자료의 버전을 기록하고, 현재 사용할 결과는 별도 포인터로 선택합니다. 이 포인터가 바뀌면 영향을 받는 후속 단계에 재검토가 필요하다고 표시합니다. 전체를 다시 만드는 비용은 줄지만, 결과 파일과 단계 간 의존 규칙을 함께 관리해야 합니다.

사람이 고친 결과도 작업 이력으로

번역문 수정도 새 산출물 버전으로 저장하고, 구간별 재생성을 지원합니다. 수동 수정·승인·잠금한 내용은 기본적으로 재실행에서 보호합니다. 검수 화면은 편집 기준 버전을 함께 보내므로 오래된 화면의 수정은 충돌로 처리하고, 잠긴 구간은 변경을 막습니다. 원본이 바뀐 뒤 보호된 결과가 여전히 유효한지는 사람이 다시 판단해야 합니다.

로컬 모델의 준비와 실행을 구분하기

번역은 TranslateGemma와 llama.cpp, 음성 생성은 Supertonic ONNX 런타임을 로컬에서 실행하는 경로를 갖췄습니다. 모델 파일 설치와 실행 준비 상태를 따로 확인합니다. 번역은 요청 사이의 상태가 섞이지 않도록 단발 실행을 기본으로 두었고, 그만큼 초기 실행 비용을 감수합니다.

처리 완료와 듣기 좋은 결과를 구분하기

자막과 발화가 어긋난 구간, 원문보다 길어진 번역을 검토 대상으로 남깁니다. 예상 발화 길이와 실제 생성된 음성 길이를 기록하고, 구간 수정·재합성 뒤 내보내기 조건을 다시 확인합니다. 길이가 넘치는 모든 구간을 자동으로 해결하는 단계까지 완성한 것은 아닙니다.

버전 변경·수정 충돌·재실행 보호를 확인하는 테스트와 실제 모델 검증을 나눴습니다. 개발용 대체 출력으로 흐름만 확인하는 경우를 구분하고, 실제 모델 검증에서는 대체 출력을 허용하지 않습니다. 영상별 싱크·의미·발음의 최종 청취와 배포본의 로컬 실행은 계속 검증할 항목입니다.

지금까지와 다음 단계

자막 번역과 음성 재생에서 출발해, 현재는 구간별 검수와 재처리 기능을 개발하고 있습니다. 로컬 번역·음성 모델과 음성 인식, 발화 구간 탐지 경로를 연결하고 있습니다.

실제 영상으로 번역의 의미, 발음과 싱크를 확인하는 과정이 남아 있습니다. 배포용 앱에서 모델을 준비하고 실행하는 과정도 검증할 항목입니다.

TypeScript, Electron, llama.cpp, ONNX Runtime을 사용합니다.

프로젝트 회고 · 비공개