목록으로

인공지능 음성합성기 구현하기

낱글, 활용
2024. 4. 23. PM 5:47:18

푸딩캠프가 제공하는 컨텐츠 중 음성이 나오는 컨텐츠는 음성합성기(Talk to Speech)로 녹음해요. 언제 녹음해도 늘 일정한 목소리 질을 내기 위해서죠. 그런데 그러면 학습자분들과 접점이 너무 없는 것 같아서 강의자의 목소리로 인공지능을 학습시켜 저희의 목소리로 음성합성기를 구현하자고 결정했어요.

처음엔 좋은 자료를 공유해주신 분이 많아 따라하면 날로 먹을 수 있겠다 생각했어요. 결론부터 말씀드리면, 꽤 만족스러운 결과물을 얻었습니다. 하지만 예상보다 많은 비용이 들었어요. 푸딩캠프의 컨텐츠 계획대로라면 최소한 1년 동안은 목상태 안좋은 시기를 피해서 녹음하면 전혀 지장 없을 것 같은데, 굳이 음성합성기를 구현해 사용해야하나 고민이 들더라고요.

그럼, 어떤 여정을 보냈는지 이야기 풀게요!

우리부터 학습하자

인공지능 모델을 학습시키기에 앞서 먼저 저희가 먼저 학습했어요. 처음 해보는 것이었거든요. 이럴 때 저는 다음 단계를 거치며 새로운 주제를 학습해요.

  1. 만들고 싶은 걸 아이디어 수준보다 좀 더 구체화한다.

  2. 기존 지식을 기반으로 구체화한 구현체 개념을 최대한 쪼갠다.

  3. 각 부분을 구현하는 데 필요한 지식을 아는 선에서 나열한다.

  4. 나열한 것을 내게 익숙한 기술과 방법으로 구현한다. 모르는 부분도 내게 익숙한 방법으로 비슷하게 구현하거나 모사한다.

  5. 내가 구현한 것을 실제로 사용해야 하는 기술이나 방법으로 조금씩 변환한다.

하지만, 이번 경우엔 사전 단계가 있어야 했습니다. 기반 지식이 없어서 1번과 2번 과정이 잘 진행되지 않았거든요.

이 아이디어를 떠올리는 동기였던 책 읽어주는 딥러닝 자료와 누구나 만드는 내 목소리 합성기 (부제: 그게 정말 되나요?) 자료를 봤어요. 두 자료 모두 머리에 쏙쏙 들어오게 발표를 잘 하셨지만, 잘 들어올 뿐 이해하기 어렵더라고요. 용어도 생소하고, 사전 지식도 없으니 그럴 수밖에요. 🥲

사전 단계의 사전 단계가 필요하다는 생각을 해서 머신러닝 입문서를 사서 몇 권 학습했습니다. 읽어도 잘 이해가 안 되어서 용어부터 익숙해지자는 마음으로 아주 빠르게 훑었죠. 그러자 자주 등장하는 용어부터 조금씩 익숙해지고, 익숙해지니 한결 편안하게 읽혔어요. 어느 시점에 이르자 어떻게 하면 될지 대략 감이 왔어요.

다시 1~3단계를 진행했는데, 어떻게 구현할지 계획하는 데 SCE-TTS: 내 목소리로 TTS 만들기 자료가 도움이 됐어요.

사전 준비와 데이터 전처리

음성합성에 필요한 음성을 녹음하는 데 많은 시간이 걸려요. 짧게는 한 시간, 넉넉하게는 여섯 시간에서 여덟 시간 분량이 필요하더라고요. 그래서 Korean Single Speaker Speech Dataset을 음성 데이터로 사용해 시험해보기로 했어요. 전문 성우가 녹음한 한국어 음성 데이터거든요.

구현체는 PyTorch를 사용하는 Korean FastSpeech 2 - Pytorch Implementation을 사용했어요. 모델을 비롯해 KSS 데이터셋을 바로 사용하도록 구성되어 있어 편리하거든요. 물론 문제없이 바로 사용할 순 없었어요. 이 모델은 PyTorch 1.6을 기반으로 하는데, 최신 버전인 PyTorch 2.1에서 일부 API가 변경되어 동작하지 않기도 했고요. 제 PC인 맥 스튜디오엔 nVidia의 CUDA tookkit을 사용할 수 없어서 MPS를 사용하도록 소소한 변경도 해야 했죠(참고 1, 참고 2). PyTorch의 메이저 버전이 다르니 PyTorch에 의존하는 다른 라이브러리도 버전을 맞췄는데, 이 단계가 꽤나 손이 가더라고요.

모델을 훈련하기 전에 데이터를 전처리하는데, 25시간이 걸렸습니다. 중간에 메모리 부족으로 중단되어 다시 진행하느라 실제로는 40시간 걸렸죠.

클라우드로 GPU 장비 대여

이번엔 훈련할 차례. 하지만 실패했습니다. 원인은 간단히 말해서 CUDA가 필요한 것이었죠. MPS로 바꾸면 되지만, 이미 PyTorch와 연관 라이브러리 버전 맞추고, 40시간에 걸쳐 전처리하느라 지친 저희는 맥 스튜디오에서 훈련시키는 걸 포기했어요. 무엇보다 너무 느렸어요. 한 순회(iteration)을 도는 데에 시간으로 훈련 시간을 예상해보니 8일에서 12일이 걸렸거든요.

그래서 클라우드 호스팅 서비스를 이용해 GPU를 빌려쓰기로 했어요. 몇 몇 서비스에서 실험한 후 RunPod를 선택했어요. 시간 당 3.89 USD짜리 인스턴스를 사용했고, 몇 시간 만에 훈련을 무사히 마쳤어요. 아, 진작 이렇게 할 걸. 😭

음성합성 솔루션을 사용하기로 결정하다

푸딩캠프에서 준비하고 있는 컨텐츠에서 음성합성이 동원될 음성 시간을 10시간으로 추정하고, 이 시간을 토대로 월 비용을 예상해봤어요. 클라우드 서비스 이용에만 한 달에 150~200 USD 정도 들어가네요. 이 정도 비용이면 음성합성 솔루션을 사용해도 큰 차이가 없지 않을까 생각이 들었어요.

몇 몇 솔루션을 둘러보니 정말 비슷한 금액이거나 조금 더 저렴했습니다. 게다가 성능이나 기능도 더 좋고, 무엇보다도 필요한 GPU 인스턴스를 확보하는 걸 신경쓰지 않아도 되어 좋았습니다. 모델을 훈련시킬 때, 사용할 H100 장비가 이미 품절(?)되어 예약하고 기다렸거든요.

최종 결정한 솔루션은 네오사피엔스의 타입캐스트예요. 이미 많은 유튜버가 사용하고 있다는 점, API를 제공한다는 점이 선택하는 데 주요하게 영향을 미쳤죠.

험난한 음성 녹음 과정

시작은 좋았어요. 광군절에 슈어 mv7 마이크를 상당히 저렴하게 구매했거든요. 마이크가 배송되는 중에는 발성 연습도 틈틈히 하고요.

첫 녹음 결과물은 역시나 엉망이었어요. 읽을 책이 있어서 겸사 겸사 책을 읽으며 녹음했는데요. 한날이 남성 목소리 ARS를 성대모사하는 것 같더라고요. 발성도 미숙해서 목이 쉰 건 덤. 제가 편안하게 소리낼 대본이 필요했어요. 그래서 Visual Studio Code 입문 과정의 동영상 컨텐츠 제작을 계획보다 앞당겼어요.

몇 차례 시행착오 끝에 마침내 원하는 음성합성 목소리를 도출했어요. 주변에 한날 목소리를 들려주니 한날 목소리라는 걸 눈치채는 사람은 없었지만, 묘하게 한날 억양이나 톤이 있다고 해요. 전달력이 부족해 평소보다 목소리 톤을 높이고, 경쾌하게 진행되는 느낌을 주려고 10% 빠르게 조절했거든요.

마치며

현재는 동영상 컨텐츠를 편집하고 있어요. 영상 따로, 음성 따로 제작한 뒤 합치는데, 어울리게 맞추는 게 어렵더라고요. 머릿 속 시뮬레이션만으로는 어림도 없어요. 😅

원래는 내부 CMS(Content Management System)과 연동하는 계획을 갖고 있었어요. 텍스트 컨텐츠 중간 중간에 동영상용 대본을 작성해놓으면 텍스트와 동영상의 연계성이 좋아지고, 내용을 수정해도 수정한 부분만 음성합성기로 음성을 만들어 바꾸면 되거든요. 음성도 버전 관리를 하려는 거예요.

실제 녹음을 하고, 영상을 만들고, 영상에 합치는 과정을 거쳐보니 예상과 많이 다르다는 걸 체감하고 있어요. 계속 제작해보면 능숙해지겠죠?

푸딩캠프 뉴스레터를 구독하면 학습과 성장, 기술에 관해 요약된 컨텐츠를 매주 편하게 받아보실 수 있습니다.