유튜브 챕터가 사라졌다|자동 번역에서 생긴 예상 밖의 오류들
지난 글에서는 유튜브 업로더가 어떤 일을 하는 프로그램인지, 그리고 구글 클라우드 콘솔에서 무엇을 준비해야 했는지를 소개했습니다.
필요한 준비를 모두 마쳤으니 이제는 프로그램만 잘 조립하면 될 거라고 생각했습니다.
그런데 실제로 사용하기 시작하니 예상하지 못했던 곳에서 하나씩 문제가 생겼습니다.
특히 여러 언어로 제목과 설명을 처리하는 유튜브 자동 번역 기능을 붙이면서 알게 된 것이 하나 있었습니다.
사람에게는 너무나 당연한 구분도 프로그램과 번역 API에는 당연하지 않다는 것이었습니다.
사람이 00:00 The Window Opens를 보면 앞부분은 시간이고 뒷부분은 곡 제목이라는 것을 바로 알아봅니다. 하지만 번역 API에 전달되는 순간 이것들은 모두 하나의 텍스트입니다.
어떤 부분을 번역해야 하고, 어떤 부분은 절대 건드리면 안 되는지 프로그램이 미리 구분해주지 않으면 예상하지 못한 결과가 나올 수 있었습니다.
이번 글에서는 그 과정에서 실제로 겪었던 세 가지 문제와, 하나씩 해결해간 과정을 기록해보려고 합니다.
챕터가 사라졌습니다
유튜브 업로더에는 각 트랙의 길이를 계산해서 자동으로 챕터 타임라인을 만드는 기능이 있습니다.
예를 들면 이런 식입니다.
0:00 The Window Opens2:50 Light Through Glass5:22 Between the Pages
이렇게 만들어진 챕터 목록은 영상 설명의 정해진 위치에 들어가야 합니다.
처음에는 설명문 안에서 챕터가 들어갈 자리를 @@CHAPTERS@@라는 표시로 만들어두었습니다.
프로그램의 동작 방식은 간단했습니다.
먼저 설명문을 번역 API로 보내고, 번역이 끝나면 @@CHAPTERS@@를 찾아 그 자리에 실제 챕터 목록을 넣는 방식이었습니다.
그런데 문제가 생겼습니다.
CHAPTERS도 결국 영어 단어였습니다.
번역 API는 이것을 프로그램이 사용하는 특별한 표시가 아니라 번역해야 할 일반적인 영어 단어로 받아들였습니다.
한국어 번역을 거치면서
@@CHAPTERS@@
가
@@챕터@@
처럼 바뀌어버린 것입니다.
그러자 그다음 단계가 작동하지 않았습니다.
프로그램은 번역된 문장에서 원래 표시인 [CHAPTERS]를 찾아 실제 챕터 목록으로 교체하도록 만들어져 있었는데, 번역기가 이미 그 표시를 @@챕터@@로 바꿔버렸기 때문입니다.
찾아야 할 표시가 사라졌으니 챕터 목록도 들어가지 못했습니다.
결국 실제 유튜브 영상 설명에 @@챕터@@라는 이상한 글자만 그대로 남았습니다.

@@챕터@@가 그대로 노출된 실제 유튜브 화면처음 화면을 봤을 때는 왜 챕터가 통째로 사라졌는지 바로 이해하기 어려웠습니다.
코드를 하나씩 따라가고 나서야 원인이 보였습니다.
번역기가 잘못 번역한 것이 아니라, 번역하면 안 되는 것을 번역기에 그대로 보내버린 프로그램 쪽의 문제였습니다.
이미 만들어둔 해결책이 있었습니다
재미있는 것은 이 문제를 해결할 방법이 프로그램 안에 이미 있었다는 것입니다.
유튜브 제목이나 설명에는 번역되면 안 되는 내용도 있습니다.
Rain on Porcelain 같은 브랜드명이나 앨범 제목, URL처럼 원문 그대로 유지해야 하는 부분입니다.
그래서 프로그램을 만들면서 이런 텍스트는 {{ }}로 감싸 보호하도록 해두었습니다.
예를 들어,
{{Rain on Porcelain}}
처럼 입력하면 번역 과정에서는 보호하고, 최종적으로 유튜브에 등록하기 전에는 바깥의 괄호를 제거해
Rain on Porcelain
만 남기는 방식입니다.
챕터 문제도 결국 같은 종류의 문제였습니다.
그래서 별도의 [CHAPTERS] 표시를 사용하는 대신, 챕터 역시 기존의 {{ }} 보호 방식과 같은 흐름으로 처리하도록 코드를 수정했습니다.
서로 다른 방법을 계속 추가하기보다는 이미 잘 작동하고 있던 한 가지 방식으로 통일한 것입니다.
프로그램을 v1.1로 수정하면서 이 부분을 통합했고, 이후에는 번역 때문에 챕터가 사라지는 문제가 발생하지 않았습니다.

보호 방식을 수정한 뒤 0:00부터 각 트랙의 시간이 클릭 가능한 유튜브 챕터로 정상 표시되었습니다.
그리고 한 가지 다행이었던 점도 있었습니다.
이미 업로드한 영상을 전부 삭제하고 다시 올릴 필요는 없었습니다.
업로더에 저장된 영상 ID를 이용해 기존 영상의 로컬라이제이션, 즉 언어별 제목과 설명 등을 다시 등록할 수 있는 기능을 만들어두었기 때문입니다.
덕분에 문제가 있었던 영상도 재업로드하지 않고 설명과 챕터만 다시 등록해서 수정할 수 있었습니다.
자동화를 만들다 생긴 문제를, 앞서 만들어둔 또 다른 자동화 기능으로 해결한 셈입니다.
이번에는 괄호가 그대로 남았습니다
챕터 문제를 해결하고 나니 이번에는 다른 곳에서 문제가 눈에 들어왔습니다.
{{ }} 방식은 원래부터 브랜드명이나 앨범 제목처럼 번역되면 안 되는 텍스트를 보호하기 위해 사용하고 있었습니다.
번역이 끝난 뒤에는 이 괄호를 제거해서 최종 유튜브 화면에는 원래 텍스트만 표시되도록 만들어두었습니다.
그런데 어느 날 영어 원본 설명을 보다가 이상한 것을 발견했습니다.
{{Rain on Porcelain}}
이 그대로 보이고 있었습니다.

{{Rain on Porcelain}}이 그대로 노출된 실제 유튜브 화면실제로 업로드된 영어 설명입니다. 브랜드명을 보호하기 위해 사용한 {{ }}가 제거되지 않은 채 그대로 노출되어 있었습니다.
더 이상했던 것은 다른 언어에서는 문제가 없는데 영어에서만 이런 현상이 나타났다는 것입니다.
코드를 다시 따라가 보니 이유는 의외로 단순했습니다.
프로그램 안에서 텍스트가 유튜브까지 가는 길이 두 개였던 것입니다.
하나는 번역이 필요한 언어가 지나가는 길이었습니다.
번역 API 호출 → 번역 결과 받기 → 보호용 괄호 제거 → 업로드
다른 하나는 영어 원문이 지나가는 길이었습니다.
영어는 번역할 필요가 없으니 번역 API 자체를 거치지 않았습니다.
문제는 {{ }}를 제거하는 기능을 번역 과정 쪽에만 넣어두었다는 점이었습니다.
번역을 거치는 언어들은 정상적으로 괄호가 제거됐지만, 번역 과정을 통째로 건너뛰는 영어 원문에는 괄호를 제거할 기회가 없었던 것입니다.
결국 괄호를 제거하는 처리를 번역 과정의 일부가 아니라 최종 업로드 전에 모든 언어가 공통으로 거치는 과정으로 옮겼습니다.
번역을 했든 하지 않았든 마지막에는 반드시 한 번 같은 정리 과정을 거치도록 구조를 바꾼 것입니다.
이렇게 수정하고 나서야 영어와 다른 언어 모두 같은 형태로 정상적으로 표시됐습니다.
이 일을 겪으면서 하나를 더 배웠습니다.
같은 결과를 만드는 데이터라도 프로그램 안에서 지나가는 길이 다르면, 각각의 경로를 끝까지 확인해야 한다는 것이었습니다.
유튜브 자동 번역 후 제목이 너무 길어졌습니다
또 하나 예상하지 못했던 문제는 글자 수였습니다.
유튜브에는 제목과 설명에 입력할 수 있는 길이 제한이 있습니다.
처음에는 영어 원문이 제한 안에 들어오는지만 확인했습니다.
영어가 괜찮으니 번역된 문장도 당연히 괜찮을 것이라고 생각했습니다.
하지만 실제로 여러 언어를 자동 등록하기 시작하면서 그렇지 않다는 것을 알게 됐습니다.
같은 뜻의 문장이라도 언어가 달라지면 필요한 글자 수가 달라집니다.
영어에서는 비교적 여유 있게 들어가던 제목이나 문장이 다른 언어로 번역되면서 훨씬 길어지는 경우가 있었습니다.
특히 제목은 사용할 수 있는 글자 수가 짧기 때문에 이런 차이가 바로 문제가 됐습니다.
번역은 제대로 됐는데, 정작 유튜브에 등록하는 단계에서 길이 제한을 넘겨 실패하는 일이 생긴 것입니다.
처음에는 번역 결과가 너무 길면 뒤를 잘라내는 방법도 생각했습니다.
하지만 문장을 기계적으로 잘라버리면 제목이나 설명이 어색하게 끝날 수 있습니다.
그래서 방법을 바꿨습니다.
번역이 끝난 뒤 줄이는 것이 아니라, 영어 원문을 만들 때부터 번역 후 늘어날 공간을 남겨두기로 했습니다.
유튜브가 허용하는 최대 길이를 영어 원문에서 처음부터 꽉 채우지 않고, 여러 언어로 번역했을 때 문장이 길어질 가능성을 고려해 여유 있게 작성하는 것입니다.
설명 역시 같은 이유로 프로그램에서 사용할 영어 원문의 분량을 보수적으로 잡았습니다.
제가 사용한 자동화에서는 대략 800~850자 정도를 하나의 실무 기준으로 삼았습니다. 이것은 유튜브 설명의 최대 글자 수가 850자라는 뜻이 아니라, 여러 언어로 자동 번역하고 등록할 때 안정적으로 운용하기 위해 제가 정한 자체적인 기준입니다.

같은 내용을 번역해도 언어에 따라 문장의 길이가 달라질 수 있다는 점을 보여주기 위한 참고 이미지입니다.
조금 덜 쓰는 대신 자동화가 중간에 멈추지 않는 쪽을 선택한 것입니다.
자동화는 한 번 만들어놓고 끝나는 게 아니었습니다
처음 자동화 프로그램을 만들 때는 반복해서 하던 일을 프로그램이 대신해주면 그것으로 끝이라고 생각했습니다. 하지만 유튜브 자동 번역 기능까지 실제로 사용해보니 오히려 그때부터가 시작이었습니다.
[CHAPTERS]라는 작은 표시 하나 때문에 챕터 전체가 사라졌고, 번역을 하지 않는 영어에서 오히려 보호용 괄호가 남았습니다. 영어에서는 아무 문제가 없던 문장이 다른 언어로 번역되면서 길이 제한을 넘기도 했습니다.
하나하나는 작은 문제였습니다.
하지만 20곡짜리 앨범을 만들고, 제목과 설명을 여러 언어로 번역하고, 각각을 유튜브에 등록하는 과정을 반복하다 보면 이런 작은 문제가 결국 많은 시간을 잡아먹게 됩니다.
그래서 자동화 프로그램은 한 번 완성해서 끝내는 도구라기보다, 실제로 사용하면서 생기는 예외를 하나씩 발견하고 고쳐나가는 도구에 더 가까웠습니다.
그리고 재미있게도 그렇게 문제를 하나씩 고칠 때마다 제가 직접 해야 하는 일은 조금씩 줄어들었습니다.
이런 시행착오를 거치면서 유튜브 자동 번역 기능도 처음보다 훨씬 안정적으로 작동하게 됐습니다.
처음에는 단순히 시간을 아껴보려고 시작한 일이었는데, 어느 순간부터는 제가 음악을 만들고 채널을 운영하는 방식 자체를 조금씩 바꾸고 있었습니다.
다음 이야기
번역과 데이터 문제를 넘기고 나니, 이번에는 인증과 업로드 과정에서 또 다른 문제들이 기다리고 있었습니다.
유튜브 채널 인증 과정에서는 계정을 잘못 선택하는 바람에 처음부터 다시 인증해야 했고, 그 뒤에도 업로드가 제대로 진행되고 있는지 화면에서 확인할 방법이 없어 같은 영상을 여러 번 중복으로 올려버린 일까지 있었습니다.
다음 편에서는 이 인증과 업로드 과정의 시행착오를 기록해보겠습니다.
Rain on Porcelain에서 더 알아보기
구독을 신청하면 최신 게시물을 이메일로 받아볼 수 있습니다.