요약
⏱ 00:001. TTS의 원리와 내 목소리 복제

⏱ 00:00목소리가 TTS 아니냐는 댓글이 가끔 올라오는 것 같습니다. 잘 들어보면 일단 감정 변화가 없고, 말투도 이상하고 톤도 이상하잖아요. 그래서 스트레스받는 분들이 있는 것 같은데, 오히려 코딩 관련 내용을 차분하게 말하면 잠이 오기 때문에 그런 스트레스도 가끔 필요하고요. 아무튼 TTS는 아니고 사람 소리였습니다. 그런데 요즘은 이런 말투도 AI로 재현할 수 있는지 궁금해서 주말에 최신 GPU로 실험을 해 봤습니다.
⏱ 00:31어떻게 했냐면, 요즘 TTS는 디퓨전 모델로 음성을 생성하기도 하고요. 음성을 토큰으로 바꿔서 트랜스포머에 집어넣고 다음 토큰을 예측하는 식으로 만들기도 합니다. 요즘은 그걸 개조해서 경량형 TTS도 만들더라고요. 이런 걸 쓰면 CPU로 빠르게 돌리면서 상당히 자연스러운 목소리를 뽑을 수 있다고 합니다. 하지만 지금 목표에는 이런 건 쓸데가 없고요. 내 목소리를 똑같이 따라 하는 TTS를 만드는 것이 목표이기 때문에 보이스 클로닝 모델을 주로 찾아보면 될 것 같습니다.
⏱ 00:587년 전에 구글이 만든 모델을 보면, 음성을 입력하면 일단 특징을 추출해 줍니다. 그 특징을 문자와 이어 붙여서 멜 스펙트로그램 형태로 음성을 생성하는 모델이고요. 샘플을 들어보면 상당히 괜찮습니다. 하지만 요즘은 음성을 문자처럼 토큰으로 바꿔 트랜스포머에 집어넣는 게 유행이기 때문에, 그런 식으로 구현한 목소리 복제 모델도 있습니다. 이걸로 뽑은 결과를 보면 음성을 넣었을 때 다음 음성을 예측해 주고요. 굉장히 자연스러운 것 같습니다. 학습할 때 톤과 음질까지 배우게 해서 그렇다는 것 같습니다.
⏱ 01:30그럼 이제 AI로 안 되는 게 없다고 하니까 Cursor를 켜서 오디오 LM 모델을 만들어 달라고 하고 학습을 돌리면 될 것 같은데, 일단 음성 데이터를 굉장히 많이 구해 오는 것도 문제입니다. 이런 작은 모델을 만들 때도 8만 시간 분량의 오디오를 학습했다고 하는데, 이런 조그만 GPU로 운동을 시켜 봤자 한참 걸릴 게 분명하거든요. 시간과 돈이 없으면 이미 만들어진 모델을 파인 튜닝하는 게 가장 좋은 방법일 것 같습니다. 그래서 이런 AI 모델을 선택했고, 여기에 파인 튜닝을 해 보려고 합니다. 깃허브 기여자 목록을 보면 애니메이션 프로필 사진을 쓰는 분들이 대부분이라 상당히 신뢰가 가는 것 같습니다. 그런데 이 모델의 동작 방식은 영어로 된 정보가 없어서 GPT에 물어봤더니, 음성에서 특징을 추출한 다음 문자와 함께 토큰으로 바꿔 GPT에 넣고 다음 토큰을 예측하는 모델이라고 합니다. 요즘 스타일이라 품질 좋게 목소리를 복제할 수 있을 것 같습니다.
⏱ 02:252. 실행 환경과 음성 데이터 준비



⏱ 02:25파인 튜닝을 해 보려면 일단 깃허브에 들어가 최근에 배포된 코드를 다운로드하고 압축을 풀면 됩니다. 좀 오래 걸리는 것 같고, 구글 코랩 버전도 있는 것 같습니다. 화면에서 가리키는 파일을 누르면 브라우저에서 UI 버전으로 실행할 수 있을 텐데요. 중국의 애니메이션 프로필 사진을 쓰는 분들이 만들어서 중국어로 되어 있습니다. 다른 언어로 띄우려면 메모장이나 코드 에디터로 화면에서 가리키는 파일을 열고, 보여 주는 방식으로 바꾸면 될 것 같습니다. 바꾼 뒤 저장하고 아까 그 파일을 실행해 보세요. 진행되지 않으면 파이썬도 한번 설치해 보시고요.
⏱ 02:55파일을 실행하면 첫째로 학습시킬 음성 파일을 준비해야 합니다. 짧아도 상관없으니 음질이 좋고 선명하며 다양한 문장을 읽어 주는 음성을 준비하면 될 것 같습니다. 참고로 남의 음성을 가져다가 무단으로 학습하면 나중에 문제가 될 수도 있지 않을까 싶고요. 음성 파일을 아무 폴더에나 넣어 두고 그 폴더 경로를 복사해 오세요. 그다음 화면의 입력란에 폴더 경로를 넣으면 됩니다. 아웃풋 폴더는 기본값으로 두고 큰 버튼을 누르면 음성을 잘게 잘라 줄 거예요.
⏱ 03:24그다음에는 내 음성에 자막을 달아서 라벨링도 해 줘야 합니다. 자막을 달아 주는 기능이 ASR인데, 여기서 다국어를 선택하고 한국어도 선택한 뒤 큰 버튼을 누르면 음성에 자막을 달기 시작합니다. 진행 상황은 터미널에 나올 거고요. 그러면 `.list` 파일이 어딘가에 생성될 텐데, 그걸 사람이 검토할 수도 있습니다. 눌러 보면 약 10초 뒤에 검토 화면이 나옵니다. 여기서 음성을 들어보고 자막이 잘 달렸는지 확인해 수정하고, 어떤 파일을 쓸지 체크하세요. 저장은 화면에서 가리키는 버튼 두 개를 누르면 됩니다.
⏱ 03:55저장한 뒤 화면에서 가리키는 버튼을 눌러 다음 페이지도 계속 검토해 보세요. 완료되면 다음 탭으로 넘어가서 이 자료로 데이터셋을 만듭니다. 여기에 `.list` 파일의 경로를 넣으면 되고요. 그 파일은 아마 다운로드했던 소스 코드 안의 아웃풋 폴더에 기본적으로 저장될 겁니다. 경로를 잘 복사해서 넣었다면, 여기 있는 원클릭 포매팅 버튼을 눌러 보면 될 것 같습니다.
⏱ 04:233. 두 모델의 학습과 음성 생성


⏱ 04:23그다음은 파인 튜닝입니다. SoVITS 모델과 GPT 모델을 각각 차례로 학습시키면 됩니다. 버튼을 누르면 되는데, GPU의 VRAM이 6GB 이하면 배치 사이즈를 1로 설정하라는 말이 있습니다. 실행하면 터미널 창에서 GPU가 운동하는 모습을 볼 수 있고요. SoVITS 학습이 끝나면 그다음에 GPT 모델도 학습시켜 보세요. 그러면 이름이 `weights` 어쩌고로 되어 있는 폴더 안에 학습이 완료된 체크포인트 파일이 생깁니다.
⏱ 04:50그다음에는 인퍼런스 탭으로 들어가 본격적으로 추론할 수 있습니다. 여기서 방금 생성한 체크포인트 파일을 불러오면 되고, 없으면 화면에서 가리키는 버튼을 눌러 보세요. 그다음 추론용 웹 UI를 여는 버튼을 누르면 약 10초 뒤에 새 페이지가 뜹니다. 추론할 때는 일단 아까 생성한 체크포인트 파일부터 잘 고르면 됩니다. 아마 기본 체크포인트 파일도 쓸 수 있는 것 같습니다.
⏱ 05:08그다음에는 레퍼런스 오디오 파일도 올려야 합니다. 내 목소리를 3초에서 10초 사이 분량으로 녹음해서 올리면 되는 거예요. 그리고 레퍼런스 오디오에서 무슨 말을 하는지 문자로 적습니다. 이 파일에 따라 품질이 많이 달라지기 때문에 다양한 버전을 올려 테스트해 보세요. 그러면 설정이 정말 완료됐고요. 아래에 원하는 문자를 입력하면 그 내용을 본인 목소리로 읽어 줄 겁니다.
⏱ 05:48응용하면 ASMR 같은 것도 만들 수 있지 않을까 싶고, 다른 나라 언어로 말하는 것도 가능하지 않을까요? 목소리와 톤은 똑같으니까 되게 재미있습니다. 그런데 중간중간 자연스럽지 않은 부분이 있어서 가챠를 좀 해야 하기 때문에, 그냥 녹음하는 게 시간이 덜 걸릴 것 같습니다. 참고로 온라인 서비스에도 목소리 복제 기능은 있긴 한데요. (TTS) 내가 가진 톤과 말투도 복제하고 싶으면 GPU로 직접 돌려 보면 재미있으니까, 집에 가서 해 보시고요.






