ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 어설픈 인공지능 개발자(?)의 TTS 만들기
    Tech/머신러닝 2020. 4. 20. 09:40
    반응형

     텍스트만을 가지고 음성을 합성 해야 하는 일이 생겼다. 아직 인공지능 개발자라고 하기엔 남부끄러운 수준이고, 석사 박사들 처럼 전문가 스럽지 못하기 때문에 이 상황을 어떻게 해야할지 고민이 많아 졌다. 

     Tacotron 2 

     tacotron 이라는 프로젝트가 있다. 간단하게 말하면 오디오 멜스펙토그램을 학습하여 유사한 음파를 합성하여 마치 말하는것과 같은 음성을 보여 주는것이다. 보통 tactron 관련된 블로그를 보면 아래 그림같은것들과 함께 네트워크 모델에 대한 설명들을 기본적으로 하고 있다. 하지만 , 난 솔직히 말하면 음성쪽 전문가가 될 생각도 없고  딱 필요한 부분까지만 사용할 예정이다. 그리고 아직 이 내용들을 이해할 노하우나 지식이 없다. 나중에 좀더 공부를 해야 하겠지만 그건 나중일 인거 같다.  

    딱 ! 필요한것만 먼저 이해하고 습득해서 선진행 후학습 할 생각이다 ! 

     

    일단 가장 그나마 예제가 많은 tacrotrn 1 을 가지고 연구를 시작했고 나름 나쁘지 않은 결과를 만들었고 , 그다음에는 tacotron2 를 이용하여 제대로 진행해 보기로 했다. 

     개인적으로 이 일만 하는것이 아니다보니 손도 발이 모자를 지경이 되었다. tactron1 을 사용하면서 어떻게 진행하면 좋겠다라는 생각은 해두었으나 차마 실행할 엄두가 나지 않았다. 다행히  내 손발이 되줄 사람이 생겨서 그사람의 도움(?) 을 아주 많이 봤다. 지금도 생각해보면 참 고맙다 ! 

     일단 tts 를 시작하기위해선 음성이 필요 하다. 연구 목적을 위해서 일단 기존에 나온 프로젝트를 그대로 활용해 보기로 했다.

     

    http://melonicedlatte.com/machinelearning/2018/07/02/215933.html

     

    인공지능 deep voice를 이용한 TTS(음성합성) 구현하기 _ 손석희 앵커 - Easy is Perfect

     

    melonicedlatte.com

    괜찮은 퀄리티는 아니지만 정확하게 손석희의 음성으로 음성이 조합된다. 하지만 여기서 여러가지 문제점이 생긴다. 

     손석희 데이터 자체의 정확도와 품질이 떨어진다! 

     단순, 연구목적으로 사용해도 되는것이라 그런지 데이터를 하나하나 확인해보면 대본을 잘못 읽은것들이 많고 아무래도 음성을 여러동영상에서 크롤링하여 가져 온것이다 보니 노이즈도 제법있다. 이상태로 학습 시킬경우 정상적인 정답 조차도 오답을 정답으로 인식하여 발음이 뭉게지거나 학습 곡선을 보다보면 loss 율이 많이 떨어진 경우 너무 학습이 잘(?)되서 노이즈마져 학습하는 경우도 있었다. 

    그래서 생각한건 정확한 목소리와 정확한 대본 / 음성을 만들어서 일종의 보상 트레이닝을 해서 진행해 보자는것이 였다. 확실히 한가지의 음성만으로는 한계가 있었고 github 내용을 보면 single speacker 보단 muti speacker 가 훨씬 성능이 좋다고 가이드가 되있기도 하다. 

    https://carpedm20.github.io/tacotron/

     

    Multi-Speaker Tacotron

    Samples (Training data = Son: 15+ hours, Park: 5+ hours, Moon: 2+ hours) Click if you can't hear any sound 제너러티브 어드벌서리얼 네트워크와 베리에셔널 오토 인코더가 핫하다. Seo Son Park 오스트랄로피테쿠스 아파렌시스는 멸종된 사람족 종으로, 현재에는 뼈 화석이 발견되어 있다. Seo Son Park Moon 저는 데브시스터즈에서 머신러닝 엔지니어로 일하고 있는

    carpedm20.github.io

    1. 시작하기 ! 

     일단 github 에서 프로젝트를 받아서 환경 설정 부터 하는게 먼저 이루어 져야 한다. 내가 인공지능을 접하기 시작하면서 가장 힘들었던 부분이 이부분이 였다. 가장 최신 트렌디 한 기술이라고 불리는 부분이지만 굉장히 하드웨어에 영향을 받는 부분은 굉장히 올드한 부분이라고 생각이 든다. 새로움과 올드함이 공존하는 분야라고 할까 ? 

     일단 프로젝트는 cuda 라이브러리 를 사용 해야 하기 때문에 드라이버에 굉장히 민감하다. 버전별 지원하는게 다르기 때문에 잘 보고 설정을 해줘야한다.  그래서 도커를 사용하기로 했고 아래 사항을 도커에 세팅 하였다. 사용 OS 는 일단 흔한 우분투 16.04 버전을 사용 했다. 

    - python 3.6 

    - tensorflow-gpu 1.8.0

    - 패키지 설치 : librosa, tqdm, jamo, matplotlib, inflect, unidecode ,nltk

    - cuda 9.0 

    - cudnn 7

    시작하기전에 그래픽카드는 최소한 2080ti 급을 사용하길 권장한다. 트레이닝을 진행할때 보면 메모리를 거의 풀도 다 사용 하며, 조금만 삐끗하면 바로 메모리가 넘쳐서 죽는경우가 있었다. 확실히 이분야는 장비 투자 비용이 좀 과하다. 

    docker 는 기본적으로 nvidia-docker 를 사용 했다. 생각보다 초반이나 개발 도중에 여러가지로 라이브러리를 교체 하거 새로운걸 적용 해볼경우가 많이 때문에 개인적으로는 docker 를 사용하는걸 추천한다. 

    2. 데이터 셋 준비 

    이 부분이 가장 힘들고 고통스럽고 투자가 많이 되는 부분이다. 다시한번 언급 하지만 일반적으로 공개되있는 음성 데이터들의 품질은 좋지 않다. 당장 트레이닝을해서 합성은 가능하지만 굉장히 음질이 떨어진다. 일단, 음성 녹음을 시작했고 시간 여력상 일주일에 약 2~3시간녹음하여 녹음된 음성중 괜찮을것을 고르고 일부 편집하여 약 30분 분량씩 꾸준히 3달동안 녹음하여 약 4시간 남짓 되는 음성을 만들었다. 

     처음 시작할땐 왜 음성 데이터를 공유 하는곳이 없나라는 생각을 했는데 해보니 알거 같다. 이정도 투자했으면 돈받고 파는게 마땅하다. ( 음성을 구매하는것도 고려해 봤으나 정말.. 비싸다.. ) 손석희 데이터 + 자체 생성 데이터 조합으로 트레이닝을 진행 할 생각이였고 , 그러다보니 사전에 두 데이터의 구조를 맞춰줄 필요가 있다. 손석희 데이터가 품질을 떨어지지만 양자체로 보면 그 어디서 구하기 힘든 데이터량이다. 그러다보니 손석희 데이터 구조를 기준으로 데이터를 생성 하였다. 

    데이터를 생성할때 몇가지 자잘한 유의 사항들이 있다. 일단, 손석희 데이터 자체의 음성 톤이나 음량이 좀 다른부분이 있다. 이건 자체 생성한 음성도 마찬가지다. 자체 생성 음성 경우 사람이다보니 지치면 지칠수록 억양이나 톤이 많이 바뀌고 컨디션이 안좋은날 특히 목이 잠기거나 그럴경우는 더 심하다. 진지하게 정말 제대로 된 음성 합성을 하려면 전문 성우가 필요하단걸 새삼 느낄수 있었다.  아무튼 그렇기 때문에 데이터 생성후 음성, 음량, 톤 등을 일정하게 맞춰줄 필요가 있다. 그래야 트레이닝시 효과가 크다.  

    그리고 꼭 ! 틀린문장은 없는지 확인 해야하며 대본에 대한 검토가 충분히 필요하다. 왜냐하면 쉼표나 마침표에 쉬는 타이밍에 따라 그것마져 학습을 하기 때문에 딕션과 문장읽는 스킬이 필요하다. 이쯤되면 이게 데이터를 생성하는게 목적인지 음성 녹음하는사람 성우 만들기 프로젝트인지 좀 구분이 안간다. 

    음성 데이터는 단순 음성 데이터만 있는게아니라 대본 : 음성데이터 구성으로 만들어지게 되며 트레이닝시 이 음성데이터들을 읽어 들이기 편하도록 위치와 음성/대본간 매칭이되있는 정보를 볼수있는 일종의 Index 같은 파일을 만들어 줘야 한다. 내가 사용한 프로젝트는 이구성을 json 으로 만들어져 있다. 

    3. 트레이닝 준비 

     이미지를 활용한 디텍터를 가지고 처음 인공지능을 공부 했었고 지금 음성을 공부 중이지만 둘다 취급하는 것이나 결과물 자체는 크게 다르지만 생각보다 트레이닝하는 원리나 구성은 유사한 부분이 많다.  트레이닝시에도 전처리가 필요하다 ! 앞서 말했지만 트레이닝 전에 전처리가 필요하고 모델을 사용하여 합성할때도 전처리가 필요하다. 트레이닝시 전처리는 앞서 말한 일종의 음성 normalize 가 필요 하다. 이과정은 필수로 필요한 부분이데 성능에 영향을 많이 끼치게 된다. 

    트레이닝시 텐서보드를 활용하는걸 적극 추천한다. 물론 인공지능 개발자들은 텐서보드를 안쓰는게 더 이상할거 같다. 너무 당연한 이야기라서... 트레이닝은 처음부터 하는 방법과 이어서 하는 방법이 가능하다. 처음에는 어쩔수없이 처음부터 시작하지만 어느정도 성능이 나온 모델이 생기고 그모델을 보강하는 측면에서는 추후 계속 이어서 트레이닝하는 방법을 많이 사용하게 된다. 

    <train_tacotron2.py >
    
    ## 새로 트레이닝
    parser.add_argument('--data_paths', default='.//data//moon,.//data//son')
    parser.add_argument('--load_path', default=None)
    
    ## 이어서 트레이닝
    parser.add_argument('--load_path', default='logdir-tacotron2/moon+son_2019-03-01_10-35-44')

    트레이닝 명령어는 github에 잘 나와 있으니 생략하고 트레니닝이 시작되면 텐서보드를 통해서 해당 진행 상황을 볼수 있다. 

    CUDA_VISIBLE_DEVICES=2 tensorboard --logdir=./logdir-tacotron2/moon+son_2019-03-01_10-35-44

    github 을 보면 알겠지만 트레이닝 결과는 logdir-tacotron2폴더 안에 생기게 되며 구성은 기본적으로 checkpoint, parameter , train 세가지로 로그들이 생성 된다. 

    트레이닝시 하이퍼 파라미터도 신경을 써야 하는데 frame 을 한번에 몇씩 생성 할지와 token ( 초성/중성/종성 ) 최소 값에 대해서 설정을 조금 건들였다. 일단 frame 관련해선 reduction factor 를 2 에서 3으로 조정 했다. 이수치를 조절해서 결과가 좋다는 논문이 있다고는 하는데 실제로는 데이터셋에 따라 그것도 다른것 같다고 한다. 

    token 경우 min_tokens 를 30에서 10으로 min_n_frame 을 30* 50 에서 10*5 로 조정 했다. 이부분은 최소학습될 대본 길이인데 조절 한 이유는 생각보다 짧은 멘트를 생성할경우 가 있을것 같아서 짧은 멘트를 위한 조이 였다. 

    그리고 모든 영문자들은 upper 처리하여 트레이닝 하도록 했다. 참 귀찮은것이 Test , TEst , teSt 등 같은 단어인데 대소문자마다 발음이 달라진다. 아무래도 스펙트럼을 학습하는 구조라 대소문자 자체를 일일히 구분하는거 같았다. 그래서 동일하고 모두 대문자로 !  대부분의 영어 문자는 한글로 바꿔서 트레이닝 하도록 추가도 하였다. 기타 전화번호 처리 , 단위 발음 등 자잘한것들을 조금씩 바꿔 주었다. 

    트레이닝시 마지막으로 test 파일 생성 빈도를 좀 낮춰줄 필요가 있다. 너무 자주 하면 정말 느리다... 아주 느리다 ... 기본적으로 트레이닝에 1~3일까지 걸린다. 이미지 보다는 확실히 오래 걸린다. 그렇기 때문에 적당한 주기로 test 결과 파일을 남기는게 좋다. 기존 500 이였던 수치를 5000 정도로 변경 하였다. 

    반대로 check point 기록 빈도는 좀 높였다. 아직도 이부분이 확인이 필요한 부분이지만 결과가 나오면 일일히 확인하여 좋은 모델을  찾아야한다. 그렇기 때문에 다수의 기록을 남겨야 좋은 모델을 찾을수 있다. 그래서 이부분은 기본 2000 으로 되있던걸 500으로 조절했다. 

    내 손발이 되어 도와준 친구에게 다시한번 고맙다고 전하고 싶다. 덕분에 많은 부분들을 빠르게 진행 할수 있었다. 특히 음성 녹음 하느라 참 고생이 많았는데 정말 정말 수고가 많았다. ! 

    일단 트레이닝하는 부분까지는 여기까지 정리하고 , 다음 글에서는 실제 트레이닝 진행 할때와 트레이닝 이후 API 화 한 부분 그리고 결과물에 대해서 기록하려고 한다. 참 어렵다.. 이분야는 ^^ 

    반응형

    'Tech > 머신러닝' 카테고리의 다른 글

    [딥러닝] (이미지)R-CNN vs Yolo  (3) 2020.02.25
    [ 딥러닝 ](이미지)Object Detector -시작하기  (0) 2020.02.24
Designed by Tistory.