블로그에 작성한 개발 경험을 짧은 영상으로 만들기 위해 MyShorts를 구상하면서 처음에는 ChatGPT가 대본부터 이미지, 캐릭터 파츠와 모션까지 제작하는 방식을 생각했다. 실제로 이미지 파츠와 JavaScript를 이용해 5초짜리 로봇 애니메이션을 만드는 실험도 진행했다. 움직이는 캐릭터를 만들 수 있다는 가능성은 확인했지만, 다음 질문이 남았다. 영상마다 새로운 장면과 캐릭터가 등장한다면 제작에 필요한 자료를 매번 같은 방식으로 준비해야 할까?
이미지와 모션 파츠를 AI로 만드는 작업에도 생성 비용과 사용량이 들어간다. 유료 영상 생성 서비스를 추가로 구독하지 않고 영상을 제작하고 싶었던 만큼, ChatGPT가 모든 결과물을 직접 만드는 구조가 적절한지도 따져 볼 필요가 있었다. 그래서 제작 작업을 나누어 보기로 했다. 대본이나 연출처럼 내용을 판단해야 하는 일과, 정해진 내용을 실제 이미지·움직임·음성으로 변환하는 일은 서로 다르다. 후자 중 일부는 Python과 무료 오픈소스가 맡을 수 있지 않을까?
영상 제작 요소와 로컬 처리의 경계
먼저 영상 제작에 필요한 요소를 구분했다. 대본과 장면 연출은 여전히 콘텐츠의 방향을 결정하는 작업이다. 반면 준비된 이미지 파츠를 화면에서 이동시키거나, 정해진 시간에 자막을 표시하고, 영상과 음향을 인코딩하는 일은 프로그램으로 자동화할 여지가 크다. 물론 자동화할 수 있다는 것과 창작물을 동일한 품질로 생성할 수 있다는 것은 다른 문제다.
이미지 파츠를 분리하거나 움직이는 데 Python과 JavaScript를 활용할 가능성은 있지만, 새로운 캐릭터 디자인이나 의도에 맞는 표현까지 일반적인 이미지 처리 코드만으로 대체할 수 있다고 보기는 어렵다. 이전 로봇 애니메이션은 특정 샘플의 성공이지, 어떤 대본이 들어와도 파츠와 움직임을 자동 제작한다는 증거는 아니다. 따라서 이미지와 모션에 관한 결론을 서두르지 않고, 결과를 바로 확인하기 쉬운 음성부터 검증하기로 했다.
한국어 로컬 TTS 실험 환경
ChatGPT가 작성한 대사와 감정 지시만 전달하면, 별도의 유료 음성 서비스 없이 Python이 실제 상황극에 쓸 만한 음성을 만들 수 있을까? 실험 장비는 Mac mini M4 기본형으로, 메모리 16GB와 저장 공간 256GB를 사용한다. 개발 환경은 Python 3.14이고, Apple Silicon용 MLX-Audio와 Qwen3-TTS 1.7B VoiceDesign 6-bit 모델을 사용했다. 처음 받은 모델은 로컬 캐시에서 재사용할 수 있어 대사가 바뀔 때마다 다시 다운로드할 필요도 없다.
ChatGPT는 Python 3.12 버전 사용을 권장했지만, 기존 개발 환경인 3.14에서 먼저 시험해 보기로 했다. 실제로 네 개의 한국어 대사를 WAV 파일로 생성하는 데 성공했다. 적어도 이번 조합과 실험 범위에서는 Python 버전을 낮추지 않아도 음성을 만들 수 있었다.
같은 대사, 다른 감정
이번 실험에서는 음성을 네 가지로 나눴다. 일반적인 개발자의 말투, 화가 난 개발자의 말투, 당황한 AI 로봇의 대사, 그리고 사건을 설명하는 나레이터 음성이다. 특히 첫 번째와 두 번째는 같은 문장인 “아니, 내가 언제 그것까지 하라고 했어?”를 사용했다. 대사는 같게 두고 감정 지시를 달리했을 때 어떤 차이가 나타나는지 확인하기 위해서였다.
나머지 대사도 실제로 만들고 싶은 AI 코딩 사건일지의 분위기에 맞췄다. 로봇은 “네? 정리하라고 하셔서 전부 삭제했는데요?”라고 답하고, 나레이터는 인공지능이 개발자의 말을 완벽하게 이해했다고 주장하는 상황을 설명하도록 했다. 특별한 제작 앱을 조작한 것이 아니라 Python에서 대사와 음성 지시를 전달해 각각의 WAV를 생성한 것이다.
생성된 결과는 일반 개발자 음성 약 4.72초, 화난 개발자 약 3.60초, 로봇 약 3.20초, 나레이터 약 6.40초였다. 같은 대사라도 일반 말투와 화난 말투의 길이와 발화 강도에 차이가 나타났다. 다만 시간과 음량이 달라졌다고 감정 연기가 완벽하다는 뜻은 아니다. 최종적으로 직접 들어본 느낌은 사람과 완전히 같지는 않지만, 짧은 상황극에 활용할 만한 수준이라는 쪽에 가까웠다.
무료 음성 생성과 남은 한계
이번 실험에서 확인한 것은 분명하다. ChatGPT가 대사를 구성하고 Python이 로컬 오픈소스 모델로 한국어 음성을 생성하는 역할 분리가 실제로 가능했다. 새로운 문장을 전달하면 같은 모델로 다시 생성할 수 있으며, 음성 파일을 만들 때마다 별도의 API 호출 요금을 낼 필요도 없다. 기존에 보유한 컴퓨터와 ChatGPT 사용 비용까지 모두 사라진다는 의미는 아니지만, 음성 생성만을 위해 별도 구독을 추가하지 않아도 된다는 점은 의미가 있었다.
그렇다고 MyShorts의 음성 기능이 완성된 것은 아니다. 이번에 생성한 네 가지 음성만으로 동일한 캐릭터가 다음 장면에서도 같은 목소리를 유지할 수 있는지는 확인하지 못했다. 평소 말투에서 분노로 바뀌어도 같은 사람처럼 들려야 하는데, 그 부분은 별도 검증이 필요하다. 감정 표현 역시 대사마다 결과가 달라질 수 있으므로 사용자가 최종 음성을 듣고 선택할 과정이 필요해 보인다. 그리고 영상과의 동기화도 남아 있다. ChatGPT가 대사 길이를 3초로 예상하더라도 실제 생성된 WAV는 더 길거나 짧을 수 있다. 그래서 MyShorts에서는 대본에 적힌 예상 시간과 생성된 음성의 실제 시간을 구분해야 한다. 장면 전환, 캐릭터 움직임, 자막을 같은 시간 기준에 맞추지 못하면 음성만 자연스러워도 완성 영상은 어색해질 수 있다.
이번 실험의 결론은 모든 영상 제작 작업을 무료 오픈소스로 대체할 수 있다는 것이 아니다. 이미지 생성, 파츠 분리, 애니메이션 제작은 각각 별도의 검증이 필요하다. 다만 음성이라는 한 요소에서는 ChatGPT가 콘텐츠를 설계하고 Python이 제작을 담당하는 분리가 가능하다는 것을 실제 결과물로 확인했다.
앞으로는 같은 캐릭터의 목소리를 여러 대사에서 유지할 수 있는지, 감정을 바꿔도 캐릭터의 정체성이 보존되는지부터 확인할 생각이다. 이후 음성과 JavaScript 애니메이션의 시간을 연결하면 된다. 이를 위해 영상 장면, 대사, 화자, 자막과 음성 길이를 하나의 JSON에서 일관되게 관리할 필요도 커졌다. 다만 JSON의 구체적인 스키마와 시간 조정 방식은 아직 정하지 않았다.
첫 단계에서 기대했던 것은 사람과 구별되지 않는 음성이 아니었다. 별도 유료 서비스를 붙이지 않고도 내 컴퓨터에서 원하는 대사를 만들 수 있는지 확인하는 것이었다. 그 질문에는 이번 네 개의 WAV 파일로 답을 얻었다. 이제 이 목소리가 다음 대본에서도 같은 캐릭터로 들리는지 확인할 차례다.