hayakoe 시리즈의 첫 번째 본편입니다. 서론 격 글은 hayakoe - 쓰기 편하고 빠른 TTS 라이브러리 만들기 - 서론 에서 보실 수 있습니다.
서론에서 잠깐 다뤘던 부분 중 하나가 “모델부터 다시 골랐다” 는 이야기였습니다. Part 1 에서는 그 과정을 좀 더 풀어 보려 합니다.
크게 세 단계로 나눠 정리하면 다음과 같습니다.
- 다른 라이브러리 후보를 둘러보고 결국 SBV2 로 돌아온 과정
- 데이터셋 구축 (2년 사이에 환경이 꽤 좋아져 있었습니다)
- 학습 설정과 체크포인트 평가
1. 다른 라이브러리도 한 번 둘러보기
2년 전 Bert-VITS2로 나만의 TTS 만들기 글을 쓸 때만 해도, 일본어 TTS 라이브러리 선택지로는 Bert-VITS2 가 거의 유일한 후보였습니다. 그런데 2년이 지난 지금 음성 합성 분야는 그 사이 꽤 많이 발전했더라구요.
어차피 시간 들여 손볼 거라면 다른 후보도 한 번 둘러보는 게 합리적이겠다 싶어, 한국어 지원이 잘 된다는 두 후보를 검수했습니다.
GPT-SoVITS
가장 먼저 살펴본 건 GPT-SoVITS 였습니다. 한국어 / 영어 / 일본어를 모두 지원하고, 사전 학습 모델에 짧은 음성 샘플 (몇 초 정도) 만 넣어주면 그 음성 톤으로 발화를 만들어 주는 제로샷 추론이 가능하다는 점이 매력적이었습니다.
먼저 학습 없이 제로샷으로 사용해 봤는데, 결과는 두 가지 면에서 만족스럽지 않았습니다.
- 발화 자연스러움이 모자람. 합성된 음성의 발화 톤이 평이하고, 감정 / 억양 표현이 매끄럽게 이어지지 않는 부분이 있었습니다.
- 한국어 발화가 어색함. 일본어 화자의 음성 샘플로 한국어를 발화시켜 보면 — “할 수는 있다” 정도지 자연스럽다고 하기는 어려운 결과가 나왔습니다. 일본인이 억지로 한글 발화를 하는 느낌..? 이었습니다.
제로샷에서 이미 마음에 들지 않는 음질이, 학습 한 번 더 한다고 극적으로 좋아질 것 같지는 않았습니다. 어차피 제가 만들고 싶었던 게 한국어 발화가 아니라 일본어 발화였던지라, 다른 후보를 더 살펴보는 게 낫겠다 판단해 학습까지 가지는 않고 다음 후보로 넘어갔습니다.
Qwen-TTS / autoregressive 계열
서론에서 짧게 다뤘듯, autoregressive 계열의 Qwen-TTS 도 후보였습니다. 다만 이쪽은 음질 검증 이전에 연산량 자체가 너무 많아 실시간 사용이 어려운 게 1차 탈락 사유였습니다 (자세한 내용은 서론 글 참고).
음질 측면에서도 그렇게 만족스럽지는 않았습니다. 제로샷이라 그런지 원하는 정도의 디테일이 안 나오더라구요. 대충 오타쿠시면 아시죠?
결국 Style-Bert-VITS2 로
후보들을 둘러본 결과, 결국 음질·속도 균형이 가장 좋았던 Style-Bert-VITS2 (JP-Extra v2.7.0) 로 다시 돌아왔습니다. SBV2 는 Bert-VITS2 의 후속 격이라, 2년 전에 이미 비슷한 흐름으로 학습 / 사용 경험이 있었던 점도 컸습니다.
2. 데이터셋 구축 — 2년 사이 환경이 꽤 좋아졌더군요
데이터셋은 개인적으로 모아둔 음성 데이터셋이 있어 그대로 활용했습니다. 2년 전 글에서 한 번 비슷한 작업을 해 본 적이 있어 큰 흐름은 익숙했고, 자료 정제·품질 검증까지 진행한 결과 약 1,500 샘플 정도가 모였습니다.
다만 2년 사이 음성 처리 도구 환경이 꽤 발전해 있었습니다. 가장 인상 깊었던 건 보컬 분리 (UVR — Ultimate Vocal Remover) 같은 도구가 더는 별도 GUI 프로그램으로 따로 설치할 필요가 없다는 점이었습니다.
2년 전엔 이게 좀 번거로웠습니다. 일단 UVR 이 윈도우 앱이라 그걸 직접 설치해야 했고, 앱 안에서 “모델 다운로드” 버튼을 눌러 모델 파일을 따로 받고 나서야 폴더 단위 배치 처리를 돌릴 수 있었거든요. 지금은 audio-separator 같은 라이브러리를 쓰면, HuggingFace 에서 모델을 받아 Python 코드 한 줄로 돌릴 수 있게 됐습니다.
from audio_separator.separator import Separator
separator = Separator()
separator.load_model("model_bs_roformer_ep_317_sdr_12.9755.ckpt")
separator.separate("input.wav")이게 사소한 차이로 보일 수도 있는데, 데이터셋 1,500 개 단위로 처리할 때는 GUI 클릭 / 폴더 관리 / 진행률 확인 같은 잡일을 줄여주는 게 꽤 큰 차이를 만듭니다. 무엇보다 이걸 그냥 학습 파이프라인 안에 통합해 둘 수 있어서, 새 데이터를 추가할 때도 같은 코드 한 번 더 돌리면 되더군요.
3. Style-Bert-VITS2 학습
학습 자체는 SBV2 가 제공하는 webui 를 그대로 사용했습니다.
- 샘플링 레이트: 44.1 kHz
- batch_size: 2 (RTX 3080 / 10GB VRAM 기준)
- learning rate: 1e-4
- eval_interval: 5,000 step
- 목표 epoch: 500 (실제로는 약 88 epoch 까지 진행 후 중단)
- 학습 데이터: 약 1,500 샘플
500 epoch 까지 다 돌릴 필요는 사실 없었습니다. 일정 step 이후부터는 음질이 더 좋아지지 않거나 오히려 과적합 경향이 보이기 시작해서, 적당한 시점에 멈추고 평가로 넘어갔습니다.
4. 체크포인트 평가 — 그냥 다 들어봤습니다
체크포인트마다 음질이 어떻게 변해가는지를 가장 정확하게 알 수 있는 방법은 결국 직접 들어 보는 것이었습니다. SBV2 도 학습 중에 mel reconstruction loss, KL divergence, duration loss, generator / discriminator loss, WavLM adversarial loss 같은 여러 loss 를 tensorboard 에 찍어주긴 합니다. 다만 이런 수치가 낮아진다고 음성이 자연스럽게 들리는 건 또 별개라서요. 결국 내 귀에 자연스럽게 들리는지가 가장 중요했습니다.
어차피 내가 쓸 모델이니, 평가는 단순하게 갔습니다.
- 5,000 step 부터 50,000 step 까지 5,000 step 단위로 10개 체크포인트 추출
- 짧은 / 중간 / 긴 텍스트 3개를 정해 각 체크포인트로 합성
- 결과 30개 샘플을 HTML matrix 형태로 정리해 한 페이지에서 청감 비교
short medium long
ckpt 5k ▶ wav ▶ wav ▶ wav
ckpt 10k ▶ wav ▶ wav ▶ wav
ckpt 15k ▶ wav ▶ wav ▶ wav
ckpt 20k ▶ wav ▶ wav ▶ wav
...
ckpt 50k ▶ wav ▶ wav ▶ wav각 셀에 합성된 wav 파일이 들어 있어서, 같은 텍스트를 컬럼끼리 / 다른 step 을 음성끼리 비교해 들어 볼 수 있는 구조입니다. 합성에 들어가는 시간만 좀 들었지 평가 자체는 그냥 헤드폰 끼고 차례대로 듣는 단순 작업이었습니다.
직접 다 들어 본 결과, 15,000 step (epoch 약 34) 의 음질이 가장 자연스러웠습니다. 그 이후 step 부터는 음색이 미묘하게 변하거나 발화 톤이 단조로워지는 경향이 있어, 이 시점이 sweet spot 이었던 셈입니다.
이건 어디까지나 제 귀 기준입니다. 다른 분이 평가하면 다른 step 이 더 좋아 보일 수도 있고, 텍스트가 달라지면 결과도 살짝 달라질 수 있습니다. 하지만 어차피 혼자 쓸 모델이니 이 정도면 충분했습니다.
Part 1 마치며
Part 1 에서는 다른 모델 후보들을 둘러본 끝에 결국 Style-Bert-VITS2 (JP-Extra v2.7.0) 로 돌아온 이유, 그리고 그 위에서 데이터셋 / 학습 / 체크포인트 평가까지 어떻게 진행했는지를 정리했습니다.
요약하자면 — 다른 후보 (GPT-SoVITS, Qwen-TTS 등) 들은 제로샷 음질에서 원하는 디테일이 안 나오거나 연산량이 너무 커서 실시간이 어려웠고, 결국 음질·속도·익숙함의 균형이 가장 좋았던 SBV2 로 정착했다는 게 큰 줄거리였습니다.
다만 학습된 SBV2 모델을 그대로 쓰면 RAM 5GB 에 CPU 추론 1.09× 같은 한계가 그대로 남아 있습니다. 다음 글에서는 그 부분을 어떻게 줄였는지를 다뤄 보겠습니다.
Part 2 — 메모리는 절반으로, 속도는 1.5배 빠르게 한 이야기 에서 이어집니다.

Comments