대실패? 이후 어떻게 프로젝트를 진행해야 하나 고민 중이었을 때,
tacotron 말고 glow-tts, align-tts 등 다른 음성합성 모델들을 살펴보고 있었다.
다른 모델들과 오픈소스들을 보면서 어떤 것을 선택해서 사용해야 좋은 품질의 음성을 만들 수
있을까 고민하고 있던 중 paperwithcode라는 사이트를 알게 되었다.
간단하게 말하면 논문을 검색하면 논문구현체가 있다면 오픈소스 주소를 알려주는 사이트이다.
여기에서 각종 음성합성 관련 모델을 입력해서 관련 오픈소스들을 구경하고 있었는데
모델을 검색할 때 마다 Coqui-ai/TTS가 검색 결과로 나왔다.
신기해서 한번 github를 들어가 봤는데 선택할 수 있는 acoustic model, vocoder 가 많았고,
coqui tts 에서 한국어를 지원하는지 찾아보았는데 한국어는 지원하지 않았다.
그래서 내가 직접 한국어 지원 기능을 추가하기로 했다!
내가 남의 오픈소스를 뜯어서 내가 필요한 방향으로 바꿀 수 있을지는 잘 모르겠지만 다른 부분의 조건이 매우 좋으므로
도전할 가치가 있다고 판단했다.
한 1~2주일은 오픈소스 이해하고 테스트하는데 시간을 보낸 것 같다.
전에 tacotron2 오픈소스는 그냥 데이터 path에 데이터와 text만 집어넣으면 진행이 되었기에
굳이 소스의 구조를 알 필요는 없다고 판단해서 그냥 사용만 했었지만, 지금은 한글이 적용되도록 해야 하기에
구조를 이해해야 했다.
처음 볼 때는 뭐가 어떻게 돌아가는지 이해가 안 갔지만 함수와 변수의 이름에 주목하고, 봐도 모르겠는 클래스나 함수는
실행시켜보면서 공부를 했다. 이제는 어느 모듈에서 어떤 기능을 하고 어떻게 상호작용하는지 정도는 알 수 있게 되었다.
(coqui-tts내부의 학습된 모델들로 음성을 합성하는 것은 명령어 한 줄로 가능하다. 하지만 자기만의 데이터셋으로 원하는 모델을 선택해서 학습시키려면 구조를 알아야 할 것 같아서도 이유 중 하나이다.)
한글 적용은 tacotron2 소스에서 사용된 korean cleaner를 사용했다.
(Copyright 2020 TensorFlowTTS Team, Jaehyoung Kim(@crux153) and Taehoon Kim(@carpedm20))
적용방법은 coqui-tts내부의 cleaner.py소스에 한국어 cleaner를 삽입하는 방법을 사용했다.
(사실 cleaner의 역할은 문장을 clean하는 것이다. 대충 설명하면 "나는 TV를 본다."를 "나는 티비를 본다."이렇게
바꾸는 역할을 한다. korean cleaner는 위의 작업과 음소화(국 -> ㄱ ㅜ ㄱ)를 동시에 진행한다. coqui-tts에도 음소화 모듈이 있으므로 korean cleaner를 나누어서 음소화 모듈과 클리너에 따로 적용할 생각이지만 테스트 용이니 그냥 클리너에 넣었다)
korean cleaner를 cleaners 소스코드에 추가하여 한국어 학습이 가능하도록 했었다.
하지만 cleaner는 원래 text를 clean하게 해주는 역할인데(대소문자 통일, 좌우공백 제거 등등)
한국어 지원을 위해서 cleaner를 수정한다는 것이 역할에 맞지 않았고,
coqui tts가 일본어, 중국어, 프랑스어 등은 지원하는데 한국어만 지원안한다는 것이 뭔가 마음에 안들었다.
따라서 한국어를 지원하는 소스를 만들어서 PR하기로 결심했다.
(정확히는 한국어 phonemizer를 제작하기로)
처음에는 위의 korean cleaner를 변형하여 PR을 했었다.
답변이 올라왔는데, phonemizer는 단순히 단어를 나누는 것이 아닌, 음소화를 해야 한다는 피드백이 왔다.
"신림" 을 "실림"으로 변형해야 한다는 뜻이였다.
따라서 korean cleaner는 사용할 수 없었다.
답변을 준 사람이 g2pk라는 음소화 기능이 있는 라이브러리를 사용할 것을 제안했다.
하지만 윈도우에서는 지원하지 않는 이슈가 있다고 했다.
(g2pk에 사용되는 python-mecab-ko가 윈도우에서 지원X)
따라서 나는 g2pk를 윈도우 환경에서도 사용가능하도록 g2pkk를 만들었다.
그리고 pypi에 라이브러리로 배포하였다.(requirements.txt에 추가하려고)
https://pypi.org/project/g2pkk/
korean phonemizer를 추가하고, 다른 phonemizer와 형식에 맞게 소스코드를 작성했다.
그밖에 필요한 것들도 추가하고..(test case 등)
다른 이슈들도 많았지만 coqui의 contributor분들의 조언을 참고하여 해결했다.
이렇게 해서 한국어 지원 기능을 PR했다.
이 과정으로 coqui tts는 한국어를 지원하게 되었고, 다중언어 기능 지원은 원래 했으니,
한국어, 일본어 multilingual 학습이 가능하게 되었다!!
합성에 사용할 데이터는 전에 사용하던 것을 그대로 사용하면 되기 때문에 데이터셋을 특별히 더 건드릴 필요는 없었고, 환경 세팅도 끝났으니 합성을 한 번 해봤다. 데이터는 kss데이터만 사용했고, batch size는 16, glow-tts를 사용했고
vocoder는 따로 세팅하지 않았다. 학습횟수는 100k.
결과는 나쁘지 않았다. 전의 소스에서의 kss학습결과와 비슷하게 나왔다.
이제 캐릭터 데이터와 kss데이터로 multi-speaker로 학습을 하려고 했는데 vits라는 모델이 눈에 들어왔다.
multi-speaker와 multilingual를 지원하고, 적은 양의 데이터로 확실히 뛰어난 결과를 배출한다고 한다.
그리고 end-to-end모델이라 acoustic -> vocoder과정을 거칠 필요 없이 vits모델 학습으로 바로 음성이 나온다고 한다.
저 설명을 듣고 바로 vits로 갈아탔다. 적은 데이터로 합성 된다는데... 다른 모델을 쓸 이유가 없지.
이렇게 음성합성 성공해서 프로젝트 성공이면 문제가 없겠지만
vits모델을 사용하여 합성을 진행할 때, 엄청난 문제를 발견했다.
이 모델은 GPU메모리를 엄청 심하게 잡아먹어서 내 노트북으로는 batch size를 4밖에 못 잡는 것이다.
일반적으로 음성합성에서 최적의 batch size를 32~64로 잡고 있다. batch size가 크고 작음에 따른 장단점이
확 나뉘기에 중간값인 32, 64 정도를 추천한다. 그런데 batch size가 4면 장단점은 둘째치고 학습이 너무 느리다.
batch size가 32일 때와 4일 때 1 iteration에 걸리는 시간이 8배 차이가 난다면 이러한 고민은 안 해도 될 것이다.
환경에 따라 다르겠지만 나의 경우는 2배 차이가 안 났었다.
batch size를 4로 잡고 학습을 진행하면 500epoch돌린다고 가장하면 약 1달이 걸린다.
말이 1달이지 노트북 내가 사용할 때나, 노트북 쉬게 해 주는 시간까지 계산하면 1달보다 훨씬 더 오래 걸릴 것이다.
이 문제를 어떻게 해결할까 고민하던 중
캐릭터 음성을 가지고 STT작업을 할 때 클라우드, api를 사용해서 해결했던 것이 생각났다.
이 gpu문제도 클라우드를 이용해서 해결할 수 있지 않을까?라는 생각이 머리를 스쳤다.
마침 구글 클라우드에서 신규 이용자에게 3달 동안 300$ 의 크레딧을 무료로 지급한다고 한다.
그래서 클라우드 서비스를 한번 이용해서 이 문제를 해결해보기로 했다.
'프로젝트 > 음성합성(tts)' 카테고리의 다른 글
캐릭터 보이스 만들기#10-최종결과 (6) | 2022.09.21 |
---|---|
캐릭터 보이스 만들기#9-google cloud platform (0) | 2022.08.02 |
캐릭터 보이스 만들기#7-중간 결과 (0) | 2022.07.13 |
음성 합성 데이터 셋 제작 툴 (0) | 2022.05.19 |
캐릭터 보이스 만들기#6-학습 진행 (0) | 2022.05.03 |