지난 글에서 YPUB ZIP을 MyShorts에 불러오고 JavaScript로 만든 장면을 Preview에서 확인하는 단계까지 진행했다. Typecast 음성의 실제 길이로 화면 시간을 보정하는 구조도 마련해 둔 상태였다. 이제 남은 건 그 기능들을 이어서 실제 MP4 한 편을 만드는 작업이었다.
그런데 막상 사용해 보니 영상 파일 하나를 만드는 과정이 생각보다 번거로웠다. WAV를 어느 폴더에 두었는지, 어떤 대사와 연결할지, 시간표를 어떻게 적용할지 사용자가 직접 챙겨야 한다면 자동 제작 프로그램을 만든 의미가 별로 없었다. 내가 원한 건 단순했다. YPUB ZIP을 제출하고, 화면을 확인한 다음, MP4 인코딩 버튼 하나만 누르는 것.
수동 WAV 연결의 불편함
앞서 구현한 JS Preview와 WAV 기반 Timeline Resolver, FFmpeg 렌더링은 각각 동작하고 있었다. 하지만 기능이 존재하는 것과 실제 제작 흐름이 편한 것은 별개의 문제였다. Preview를 확인한 뒤 음성 파일을 직접 연결해야 한다면 매번 같은 일을 반복하게 된다. 이 문제를 해결하기 위해 ChatGPT와 원클릭 제작 흐름을 정리하고 Codex에서 기존 기능을 연결하도록 했다. 패키지 로딩이나 렌더링 엔진을 처음부터 다시 만드는 방향이 아니라, 이미 구현된 기능 사이에서 사용자가 처리하던 단계를 줄이는 방향이었다.
최종적으로 정한 순서는 YPUB 제출 → JS Preview → MP4 인코딩 → WAV 확인 및 필요분 합성 → 실제 음성 시간표 적용 → BGM 믹싱 → MP4 Preview다. 제작 중간에 필요한 작업은 프로그램이 처리하고, 새로 비용이 발생하는 순간에만 내가 승인하도록 했다.
기존 WAV 재사용과 합성 승인
첫 번째 쇼츠 EP.01에는 총 11개의 대사가 있다. 이미 Typecast로 생성하고 확인한 WAV가 있는데, 영상의 제목이나 배경음악을 조정할 때마다 그 음성을 다시 생성할 이유는 없었다. 유료 합성 서비스를 사용하는 만큼 불필요한 재요청을 막는 게 우선이었다. 단순히 WAV 파일이 존재한다고 재사용하는 구조는 아니었다. 같은 대사 ID여도 목소리나 합성 원문, 앞뒤 문맥, 음성 설정이 바뀌면 다른 결과가 나올 수 있다. 그래서 요청 조건과 WAV 파일의 실제 형식·해시가 맞는지 확인한 뒤에만 재사용하고, 없는 부분만 새로 합성하도록 했다.
새로운 Typecast 호출이 필요한 경우에는 기존 WAV 몇 개를 재사용하고 몇 개를 새로 생성할지 보여 준 뒤 승인을 받는다. 취소하면 신규 합성을 시작하지 않는다. 이번 EP.01 검증에서는 기존 WAV 11개를 재사용해 새 유료 합성을 하지 않고 MP4를 제작할 수 있었다. WAV 관리 파일이나 매핑 경로를 매번 사용자가 선택하지 않아도 된다는 점이 가장 큰 변화였다. 애초에 내가 원했던 건 음성 파일 관리 프로그램이 아니라, 쇼츠 제작 프로그램이었으니까.
BGM과 MP4 Preview까지 한 화면에
영상에는 음성만이 아니라 BGM도 필요하다. 음악 파일을 선택하거나 아예 BGM 없이 제작할 수 있도록 하고, 음량은 1~10단계로 조정하도록 했다. 기본값은 5단계다. 이전에 저장해 둔 설정이 있으면 그 값은 그대로 유지한다. 인코딩을 마친 뒤에는 출력 파일명과 길이, BGM 설정, 재사용하거나 생성한 WAV 수, 확인 가능한 Typecast 크레딧 정보를 완료창에서 볼 수 있도록 정리했다. 단순히 파일 생성에 성공했다는 메시지만 띄우는 게 아니라, 그 결과물을 바로 재생하고 일시정지하거나 원하는 시점으로 이동해 확인할 수 있어야 했다.
아래는 실제로 실행한 MyShorts 화면이다. 왼쪽은 WAV 시간표가 적용된 JS Preview, 오른쪽은 생성한 MP4 Preview다. 두 화면이 동시에 열린 모습이지만, 캡처 순간의 장면 위치까지 같다는 뜻은 아니다. 화면에는 WAV 11개 검증 상태와 BGM 5단계, MP4 인코딩 버튼도 함께 보인다.

기능이 연결되고 나니 이번에는 GUI가 눈에 들어왔다. BGM 설정과 완료 정보가 추가되면서 정작 중요한 영상 Preview가 좁아졌고, 두 Preview 영역의 외곽 정렬도 어색했다. 실제 영상을 보려고 만든 프로그램인데 영상이 작게 보이면 곤란하다. 그래서 기본 창 크기와 두 Preview의 가로폭, 9:16 화면 표시 방식을 다시 조정했다. 창 크기를 바꿔도 두 패널이 같은 크기를 유지하고, 영상 자체는 세로 비율을 유지하면서 중앙에 배치되도록 한 것이다. 메타데이터를 접을 수 있게 구성한 것도 영상 확인 공간을 확보하기 위한 조정이었다.
실제 MP4에서 발견한 소제목 가독성
프로그램 화면에서 보기 좋다고 최종 영상까지 보기 좋은 건 아니었다. MP4를 직접 열어보니 상단의 메인 제목은 또렷하게 보이는데, 오른쪽에 표시한 장면별 소제목이 상대적으로 작아 보였다.
메인 제목과 소제목의 역할은 이미 정해져 있었다. 영상 전체에 같은 메인 제목을 고정하고, Scene이 바뀔 때마다 오른쪽 소제목만 변경하는 방식이다. 처음에는 메인 제목 50px, 소제목 30px로 구성했는데, 실제 결과물을 보니 소제목을 조금 더 키우는 편이 낫겠다고 판단했다.
아래 캡처는 보정 전 MP4의 마지막 장면이다. 메인 제목 ‘EP01 - AI 협업의 시작, ChatGPT를 만나다’ 아래에 소제목 ‘LOGON Blog에서 계속’이 오른쪽에 놓여 있다. 위치는 괜찮았지만, 작은 화면에서의 존재감이 아쉬웠다.

ChatGPT와 다시 검토해 소제목을 34px, SemiBold 600으로 조정하기로 했다. 메인 제목 50px과 오른쪽 정렬, 상단 220px 영역은 유지했다. 화면에서 발견한 작은 불편함이었지만, 다음 영상을 만들 때도 반복될 부분이므로 일회성 수정으로 끝내지 않고 MyShorts 제작 SKILL에도 같은 규칙을 반영했다.
콘티는 그대로, JavaScript만 수정
문제는 보정 방식이었다. 이전 YPUB 패키지에는 이미 승인한 대사, GIF, PNG, Scene 순서와 Timeline이 들어 있다. 소제목 크기를 바꾼다고 이미지나 콘티를 새로 만들어 버리면 그동안 검토한 내용까지 다시 확인해야 한다. 그래서 이번에는 수정 범위를 명확하게 지정했다. 이미지를 새로 생성하거나 기존 이미지만 바꾸는 방식이 아니라, 실제 표시를 담당하는 JavaScript를 수정할 것. 그리고 대사와 GIF 등 콘티 구성 자체는 건드리지 않을 것.
기존 v4 패키지를 기준으로 고정 제목과 Scene별 소제목 규칙을 적용하고, 최종적으로 소제목 34px/600을 반영한 v6 패키지를 다시 준비했다. 수정 결과는 JS 파일의 변경 내용과 패키지 내부 자산·대사·시간표를 대조하는 방식으로 확인했다. 이 과정에서 이미지 파일을 다시 그릴 필요는 없었다. 다만 v6 패키지의 변경된 폰트로 MP4를 새로 인코딩해 최종 시청 검수까지 마친 것은 아니다. 지금 확인한 것은 원클릭 인코딩이 실제로 연결되어 동작한다는 점, 그리고 결과물에서 발견한 소제목 가독성 문제를 패키지와 제작 규칙에 반영했다는 점까지다.
다음 영상 제작 전 남은 확인
처음 목표는 Preview 뒤에 남아 있던 수동 작업을 없애는 것이었다. 현재 MyShorts에서는 ZIP을 제출하고 MP4 인코딩을 누르면 기존 WAV를 확인하고, 필요한 처리와 BGM을 거쳐 완성한 영상을 프로그램 안에서 재생할 수 있다. 실제 사용 과정에서 드러난 GUI 크기와 제목 가독성도 다시 조정했다.
이제 새 폰트가 적용된 v6 패키지로 MP4를 다시 만들어 최종 화면과 음성을 확인하면 된다. YouTube 공개 업로드는 아직 구현되지 않았으니, 영상이 만들어졌다는 것과 실제 채널에 게시할 수 있다는 것은 구분해야 한다. 이번에는 일단 쇼츠 제작에서 MP4 결과물을 만들고 직접 검수하는 단계까지 온 셈이다.