개요

최근에 나는 셰이더를 공부하며 좋은 강의를 찾아 다니는 하이애나가 되었다.

그러던 중 조금 시간이 지난 강의지만 훌륭하다고 인정 받은 강의를 하나 찾았고,

그 강의를 듣기 위해 자막 파일을 만들고 번역하는 일을 거쳐야 했다.

비루한 영어 실력 탓에 영어를 해석하며 듣는 피로함과

강의를 듣는 피로함이 합쳐지면 집중 시간이 짧아지기 때문에…

기존까지는 파이썬을 활용해 이런 저런 툴들을 만들어봤지만, 최근에 C#을 경험할 기회가 생겨 C#으로 이번 작은 프로젝트를 진행 해보고자 한다.

자동 완성과 패키지 관리가 조금 더 쉬운 느낌

자막 파일(srt)을 자동으로 번역하는 프로그램을 작성한다.

OpenAI API를 활용해 자막을 한국어로 번역하는 툴이다.

해당 툴 Github

https://github.com/hun1387s/Translator_SRT

.srt 번역 구현

.srt 자막 파일이란

SRT(SubRip Subtitle) 파일은 자막을 저장하는 형식 중 하나이다. 일반적인 SRT 파일 형식은 다음과 같다.

1
00:00:05,000 --> 00:00:10,000
Hello, how are you?

2
00:00:12,000 --> 00:00:15,000
I am fine, thank you.

각 자막 블록은 번호, 타임코드, 자막 내용으로 구성된다.

본 프로그램은 자막 내용을 번역하고, 나머지 구조는 유지한다.

코드 구현

SrtTranslator 클래스

SrtTranslator 클래스는 SRT 파일을 읽고, OpenAI API를 통해 번역한 후, 새로운 SRT 파일을 생성한다.

SRT 파일 읽기

var lines = await File.ReadAllLinesAsync(inputPath, Encoding.UTF8);

SRT 파일을 UTF-8 인코딩으로 한 줄씩 읽어온다.

번역할 텍스트 누적

var textBuffer = new StringBuilder();

여러 줄에 걸친 자막을 저장하기 위한 textBuffer 객체를 생성한다.

SRT 구조 처리

if (Regex.IsMatch(line, @"^\d+$") || line.Contains("-->"))

SRT 파일에서 번호 또는 타임코드(–> 포함)인 경우 번역하지 않고 그대로 저장한다.

번역 실행

string translatedText = await translator.TranslateTextAsync(originalText, "ko");

누적된 텍스트를 OpenAI API를 이용해 번역한다.

결과 저장

await File.WriteAllTextAsync(outputPath, sb.ToString(), Encoding.UTF8);

번역된 자막을 새로운 SRT 파일로 저장한다.

OpenAITranslator 클래스 구현

이 클래스는 OpenAI API를 사용하여 텍스트를 번역하는 기능을 제공한다.

API 요청 데이터 구성

var requestBody = new
{
    model = "gpt-4o",
    messages = new[]
    {
        new { role = "user", content = $"Translate the following text to {targetLanguage}:\n\n{text}" }
    },
    temperature = 0.3
};

번역할 텍스트를 OpenAI API 요청 형식에 맞게 JSON 객체로 변환한다.

HTTP 요청 전송

var response = await client.PostAsync("https://api.openai.com/v1/chat/completions", content);

OpenAI API의 chat/completions 엔드포인트에 HTTP POST 요청을 보낸다.

번역된 텍스트 추출

string translation = result.choices[0].message.content.ToString().Trim();

API 응답에서 번역된 내용을 추출하여 반환한다.

Program 클래스 구현

이 클래스는 프로그램의 진입점이며, API 키를 불러와 번역을 실행한다.

API 키 불러오기

string[] apiKey = await File.ReadAllLinesAsync("../../../APIKEY", Encoding.UTF8);

파일에서 OpenAI API 키를 읽어와 translator 객체를 생성한다.

파일 경로 설정

string fileName = "20";
string path = "D:\\Tutorial\\";

string inputPath = $"{path}{fileName}.srt";
string outputPath = $"{path}kor\\{fileName}kor.srt";

번역할 SRT 파일과 번역된 결과를 저장할 파일의 경로를 설정한다.

번역 실행 및 예외 처리

try
{
    await srtTranslator.TranslateSrtAsync(inputPath, outputPath, translator);
    Console.WriteLine("SRT 번역이 완료되었습니다.");
}
catch (Exception ex)
{
    Console.WriteLine($"에러 발생: {ex.Message}");
}

번역을 실행하며, 오류 발생 시 예외 처리를 수행한다.

실행 예시

입력 파일 (input.srt)

1
00:00:05,000 --> 00:00:10,000
Hello, how are you?

2
00:00:12,000 --> 00:00:15,000
I am fine, thank you.

실행 결과 (output.srt)

1
00:00:05,000 --> 00:00:10,000
안녕하세요, 어떻게 지내세요?

2
00:00:12,000 --> 00:00:15,000
저는 괜찮아요, 감사합니다.

번역 속도

2025_03_13_22_00_03

실제 사용 속도인데, 아무래도 조금 답답한 면은 있다.

비용

image-20250314103616616

약 9분 가량의 자막 파일 번역 시 청구되는 비용이다.

물론 시간에 비해 대사량이 적은 듯하니 참고만 하자.

앞으로 개선사항

  • UI가 없어 배포용으로는 부적합
  • API 진입 장벽
  • 앞 뒤 내용과 이어지지 않는 번역

태그: , ,

카테고리:

업데이트:

댓글남기기