관리 메뉴

솜씨좋은장씨

[음성합성] multi-speaker-tacotron-tensorflow 실행 시 발생 이슈 해결 방법 모음 본문

머신러닝 | 딥러닝

[음성합성] multi-speaker-tacotron-tensorflow 실행 시 발생 이슈 해결 방법 모음

솜씨좋은장씨 2020. 7. 20. 21:22
728x90
반응형

Ai Hub에서 서버를 지원받아 이전에 멀티캠퍼스에서 진행해보았던 음성합성 프로젝트를 계속 진행해보기로 하였습니다.

 

음성합성 프로젝트는 carpedm20(김태훈님)님의 multi-speaker-tacotron-tensorflow 오픈소스를 활용하였습니다.

 

carpedm20/multi-speaker-tacotron-tensorflow

Multi-speaker Tacotron in TensorFlow. Contribute to carpedm20/multi-speaker-tacotron-tensorflow development by creating an account on GitHub.

github.com

이 글에서는 해당 오픈소스를 실행 하면서 마주치는 다양한 이슈들과 그 해결 방법에 대해서 정리해보고자 합니다.

 

1. ImportError: libcusolver.so.8.0: cannot open shared object file: No such file or directory

현재 사용하는 오픈소스는 TensorFlow 1.3.0 버전을 사용합니다.

이 1.3.0 버전은 CUDA 8.0이 필요하나 사용하고 있는 서버의 CUDA 버전이 8.0이 아닐 경우 발생합니다.

해결방법은 다음의 링크를 참고하시기 바랍니다.

 

[TensorFlow] ImportError: libcusolver.so.8.0: cannot open shared object file: No such file or directory 해결 방법

Ai Hub에서 GPU 서버를 지원받아 이전에 멀티캠퍼스에서 Tacotron을 활용한 음성합성을 다시 도전해보기위해서 데이터를 생성하고 학습을 시작하려고하니 ImportError: libcusolver.so.8.0: cannot open shared o..

somjang.tistory.com

 

2. Training non-korean : X use jamo

학습 step 이 계속 진행되다가 중간 중간 위와 같은 오류를 만나는 경우가 있습니다.

이는 학습 시작 전 파라미터를 바꾸어주지 않아 발생하는 오류 입니다.

 

바꾸어야하는 파라미터는 hparams.py의 11번째에 cleaners 입니다.

 8 basic_params = {
 9     # Comma-separated list of cleaners to run on text prior to training and eval. For non-English
 10     # text, you may want to use "basic_cleaners" or "transliteration_cleaners" See TRAINING_DATA.md.
 11     'cleaners': 'english_cleaners', 
 12 }

11 번째 줄 'cleaners' 를 english_cleaners에서 korean_cleaners로 변경합니다.

  8 basic_params = {
  9     # Comma-separated list of cleaners to run on text prior to training and eval. For non-English
 10     # text, you may want to use "basic_cleaners" or "transliteration_cleaners" See TRAINING_DATA.md.
 11     'cleaners': 'korean_cleaners',
 12 }

 

3. jamo.jamo.InvalidJamoError: Could not synthesize characters to Hangul.

학습 스텝이 끝나고 체크포인트 파일을 만들고 wav와 png 파일을 저장하는 과정에서

jamo.jamo.InvalidJamoError: Could not synthesize characters to Hangul.

위와 같은 오류를 만나는 경우가 있습니다.

이를 해결하는 방법은 다음과 같습니다.

 

먼저 datasets 디렉토리 안에 있는 generate_data.py 를 수정합니다.

 39     if config.metadata_path.endswith("json"):
 40         with open(config.metadata_path) as f:
 41             content = f.read()
 42         info = json.loads(content)

40번째 라인의 with open(config.metadata_path) as f: 에 utf-8로 인코딩하도록

아래와 같이 encoding='utf-8'을 추가합니다.

 39     if config.metadata_path.endswith("json"):
 40         with open(config.metadata_path, encoding='utf-8') as f:
 41             content = f.read()
 42         info = json.loads(content)

그 다음 기존에 만들어져있던 datasets/son 안의 data 디렉토리를 삭제한 뒤

$ python3 -m datasets.generate_data ./datasets/son/alignment.json

다시 data를 생성해줍니다.

그 후 다시 학습을 시작해주면 이상없이 학습이 되는 것을 볼 수 있습니다.

 

5. 학습은 진행이 되는 것 같은데 GPU를 사용하지 않고 CPU를 사용해서 학습합니다.

TensorFlow 1.3.0 버전이 CPU 버전으로 설치되었는지 pip list 를 통하여 확인해봅니다.

CPU버전으로 설치되어있다면

$ pip install tesorflow-gpu==1.3.0

으로 gpu버전으로 설치한 뒤 다시 실행해보시기 바랍니다.

 

6. 자동으로 생성되는 그래프나 synthesizer.py를 통해 음성을 생성할때 나오는 그래프의 한글이 깨져서 나옵니다.

이는 plot.py에서 설정해둔 NanumBarunGothic을 찾지 못해 발생하는 오류로 우분투에서 폰트를 설정해주어야합니다.

설정하는 방법은 다음과 같습니다.

먼저 NanumGothic.ttf파일을 다운로드 받아 utils 디렉토리에 넣어줍니다.

 

그 다음 plot.py를 수정합니다.

matplotlib.font_manager._rebuild()
font_path = './utils/NanumGothic.ttf'
font_name = fm.FontProperties(fname=font_path).get_name()
matplotlib.rc('font', family=font_name, size=7)

위의 코드를 추가한 뒤 다시 실행해보면

한국어가 잘 나오는 것을 볼 수 있습니다.

ㅇ ㅗ ㄹ ㅐ ㄴ ㅁ ㅏ ㄴ ㅇ ㅔ 뒤와 Encoder timestep 부분에 내용이 잘리는 것을 더 알아보고 알게되면

적어보려고합니다.

그 외 각종 파라미터 조정 관련 이슈

 

training이 잘 안됩니다. · Issue #4 · carpedm20/multi-speaker-tacotron-tensorflow

샘플로 주신 prepare_jtbc.sh을 실행해 만든 audio data를 가지고 single speaker로 20만 step이상 학습을 진행했는데도, 여전히 음성이 제대로 안 나옵니다. 문제가 뭔지 알 수가 없습니다. 혹시 제대로 음성�

github.com

계속 진행해보면서 발생하는 다른 이슈들 계속 업데이트 하고자합니다.

 

읽어주셔서 감사합니다!

Comments