로컬에 깐 음성 AI가 안 쓰이는 이유는 성능이 아니라 점유 시간이다
음성 복제 도구를 설치하고도 실무에 못 쓰는 진짜 원인과, 실행 위치를 원격 GPU로 옮겨 해결한 설계를 실측 수치와 함께 정리했습니다.
방구석컴퍼니
혼자 일하는 사람 · 작업 기록

설치는 성공했는데 결국 안 열어보게 되는 도구가 있습니다. 저는 음성 복제 도구가 그랬습니다. 성능이 부족해서가 아니었습니다. 돌리는 동안 작업 기계 전체가 묶이는 게 문제였습니다.
이 글은 음성 복제 도구를 깔아는 봤지만 실제 제작에는 못 쓰고 있는 분을 위한 진단입니다. 따라 하는 절차가 아니라 왜 그렇게 설계했는지를 다룹니다.
설치 성공과 사용 실패는 다른 사건이다
도구 도입을 판단할 때 우리는 보통 두 가지만 봅니다. 돌아가는가, 결과가 쓸 만한가. 둘 다 통과해도 안 쓰게 되는 경우가 있습니다.
제 기록으로는 설치 이후 실제 실행이 세 번이었습니다. 그것도 짧은 문장 시험이었고, 네 번째부터는 열지 않았습니다. 원인은 한 가지였습니다. 원고 한 편 분량을 넣으면 그 시간 동안 다른 작업을 못 합니다. 편집을 걸어두면 화면이 끊기고, 결국 자기 전에 눌러놓고 아침에 확인하는 방식이 됩니다.
그 방식은 지속되지 않습니다. 하루 한 번짜리 도구가 되면 제작 흐름에서 빠집니다.
성능을 올려도 해결되지 않는 이유
그래픽카드를 바꾸면 될 거라고 생각했습니다. 실제로 더 나은 장비를 붙여도 달라지는 건 대기 시간의 길이뿐이었습니다. 점유 자체는 그대로입니다.
여기서 문제 정의가 바뀝니다. 병목은 처리 속도가 아니라 자원 점유입니다. 속도 개선은 점유 시간을 줄일 뿐 점유를 없애지 못합니다. 없애려면 실행 장소를 바꿔야 합니다.
프로그램이 있는 곳과 계산이 일어나는 곳은 분리된다
음성 합성은 모델 가중치와 입력만 있으면 어디서든 같은 결과를 냅니다. 도구가 내 기계에 설치돼 있다는 사실과, 계산이 내 기계에서 일어나야 한다는 요구는 별개입니다. 저는 이 둘을 한 덩어리로 묶어 생각하고 있었습니다.
분리하면 선택지가 생깁니다. 모델을 원격 실행 환경에 올리고 결과 파일만 받아오는 구조입니다. 이때 내 기계가 하는 일은 파일 전송과 상태 확인뿐입니다.
실행 위치를 옮겼을 때의 실측
작업 환경은 데이터 분석용 무료 노트북 서비스를 썼습니다. 주간 한도 안에서 가속 카드를 빌려줍니다.
| 항목 | 로컬 실행 | 원격 실행 |
|---|---|---|
| 작업 기계 점유 | 생성 시간 전체 | 없음(상태 확인만) |
| 24문장 생성 | 장비에 따라 수십 분~수 시간 | 4분 18초 |
| 동시 사용 카드 | 1 | 2 |
| 실패 문장 | — | 0개 |
| 추가 비용 | 전력·장비 | 0원(한도 내) |
같은 원고, 같은 견본, 같은 모델로 비교한 값입니다. 눈여겨볼 건 마지막에서 두 번째 줄입니다. 무료 구간에 카드가 두 장 배정되는데, 문장 목록을 반으로 갈라 동시에 처리하면 두 장의 작업 시간 합계가 실제 경과 시간의 1.94배로 나옵니다. 병렬이 실질적으로 먹었다는 뜻입니다.
왜 견본을 두 벌 만들어 두는가
엔진마다 참조 음성 요구가 반대입니다. 한쪽은 참조가 길수록 말투 재현이 좋아지고, 다른 쪽은 3~10초만 받고 긴 파일을 거부합니다.
설계 선택은 두 가지였습니다. 엔진을 고를 때마다 견본을 다시 만들거나, 처음부터 두 벌을 만들어 두거나. 후자를 택했습니다. 준비 단계 1회 비용으로 이후 모든 실행에서 분기를 없앨 수 있기 때문입니다.
참조 음성과 참조 텍스트가 어긋나면 생기는 일
이 구조에서 가장 자주 무너지는 지점은 모델이 아니라 짝입니다. 모델은 "이 소리가 이 글자"라는 기준을 참조 쌍에서 잡습니다. 쌍이 틀리면 기준부터 틀어집니다.
재연해 봤습니다. 참조 오디오는 그대로 두고 옆에 적힌 글자만 다른 문장으로 바꿔 같은 요청을 넣었습니다.
| 조건 | 결과 길이 |
|---|---|
| 참조 쌍 일치 | 6초, 문장을 끝까지 발화 |
| 참조 쌍 불일치 | 0.24초, 시작도 못 하고 중단 |
과거에 겪었을 때는 무너지는 양상이 달랐습니다. 그때는 알아들을 수 없는 소리로 참조를 흉내 냈습니다. 어느 쪽이든 원인은 같습니다.
그래서 사람이 참조 텍스트를 손으로 적게 두지 않는 쪽으로 설계했습니다. 녹음 파일을 기계가 다시 받아쓰게 하고 그 결과를 쌍으로 씁니다. 받아쓰기가 완벽하지 않아도 됩니다. 여기서 필요한 건 맞춤법이 맞는 문장이 아니라 실제로 그렇게 소리 났다는 기록이기 때문입니다.
귀가 닿지 않는 환경에서 품질을 확인하는 법
원격 실행에는 구조적 제약이 하나 있습니다. 계산은 저쪽에서 일어나고, 나는 파일이 내려오기 전까지 결과를 들을 수 없습니다.
해결은 확인을 실행 환경 안으로 넣는 것이었습니다. 만든 소리를 그 자리에서 다시 글자로 되돌려 원문과 나란히 비교합니다. 실제 사례에서 되돌아온 글자는 원문과 한 글자만 달랐습니다. 발음이 살짝 뭉갠 지점이었습니다.
이 검사가 잡는 것과 못 잡는 것이 분명합니다.
- 잡는 것: 문장이 통째로 빠짐, 크게 뭉개짐, 빈 파일. 앞서 말한 0.24초짜리는 되돌아온 글자가 아예 비어 있었습니다.
- 못 잡는 것: 음색 유사도, 억양의 자연스러움. 이건 결국 귀로 들어야 합니다.
한두 문장이면 검사가 필요 없습니다. 수십 문장을 한꺼번에 돌릴 때 의미가 생깁니다. 뭐가 틀어졌는지 모르는 채 파일만 쌓이는 상황을 막아줍니다.
이 설계가 실제로 실패한 지점
두 번째 엔진을 붙였을 때 결과물이 아니라 오류가 돌아왔습니다. 로그는 231줄이었고 맨 아래 원인 줄은 수치 계산 패키지에 특정 기능이 없다는 내용이었습니다.
여기서 흥미로운 일이 있었습니다. 저는 두 달 전 같은 지점에서 막혀 해결법을 기록해 뒀습니다. 그때 적어둔 처방은 그 패키지를 최신으로 올리라는 것이었고, 이번에도 그대로 했습니다. 그 명령이 이번엔 원인이었습니다.
원인을 되짚으면 순서가 이렇습니다. 실행 환경에는 특정 버전이 기본 설치돼 있습니다. 엔진 설치가 딸려온 의존성 때문에 그걸 구버전으로 끌어내립니다. 그걸 고치겠다고 최신 버전을 위에 얹으면, 파이썬으로 쓰인 겉면만 갈리고 미리 컴파일된 알맹이는 구버전이 남습니다. 최신 겉면이 구버전 알맹이에 없는 기능을 호출하면서 죽습니다.
처방이 뒤집혔습니다. 올리는 게 아니라 원래 버전으로 되돌리는 것이 정답이었습니다. 그리고 버전 숫자를 코드에 박지 않았습니다. 실행 환경이 켜질 때 자기 기본 버전을 직접 읽어 그 값으로 복구합니다. 기본 이미지가 또 바뀌어도 깨지지 않게 하기 위해서입니다.
여기서 얻은 건 오류 해결법이 아닙니다. 기록해 둔 정답에 유효기간이 있다는 사실입니다. 남의 명령어를 외워두는 방식은 오래 못 갑니다.
대가와 한계
솔직하게 적어둘 부분입니다.
- 실행 환경을 새로 올릴 때마다 설치와 모델 내려받기 시간이 붙습니다. 실측 6분 40초 중 상당 부분이 여기였습니다. 그래서 작게 여러 번보다 크게 한 번 묶는 쪽이 유리합니다.
- 감정 지시를 해석하지 못합니다. 말투는 문장부호와 단어 선택으로 밀어야 합니다.
- 주간 사용 한도가 있습니다. 남은 양은 명령으로 조회할 수 있으니 외워둔 숫자에 의존하지 마세요.
- 결과 품질의 상한은 견본이 정합니다. 조용한 곳에서 다시 녹음하는 게 어떤 설정값보다 효과가 큽니다.
정리
병목을 성능으로 진단하면 장비를 사게 되고, 점유로 진단하면 실행 위치를 옮기게 됩니다. 저는 후자였고 장비 구입은 필요 없었습니다.
혹시 설치까지 해놓고 안 열어보게 된 도구가 있으신가요? 그게 느려서인지, 돌리는 동안 다른 걸 못 해서인지 한 번 구분해 보시면 답이 달라질 수 있습니다. 이 작업을 자동화한 스킬 묶음과 전체 과정은 유튜브 방구석컴퍼니와 오픈채팅 방구석모각코에 정리해 뒀습니다.