169 lines
6.8 KiB
Markdown
169 lines
6.8 KiB
Markdown
# D.Voice: 오픈소스 딥러닝 음성 합성 엔진
|
|
|
|
[[English Guide](./README.md)]
|
|
|
|
D.Voice는 TensorFlow로 구현된 오픈소스 딥러닝 음성 합성 엔진입니다. 이 프로젝트는:
|
|
|
|
- [Deep Voice 2: Multi-Speaker Neural Text-to-Speech](https://arxiv.org/abs/1705.08947)
|
|
- [Listening while Speaking: Speech Chain by Deep Learning](https://arxiv.org/abs/1707.04879)
|
|
- [Tacotron: Towards End-to-End Speech Synthesis](https://arxiv.org/abs/1703.10135)
|
|
|
|
위 세 논문의 모델들의 구현을 포함하고 있습니다. 음성 데모는 [여기](http://carpedm20.github.io/tacotron/)서 들어보실 수 있습니다.
|
|
|
|
![model](./assets/model.png)
|
|
|
|
|
|
## Prerequisites
|
|
|
|
- Python 3.6+
|
|
- [Tensorflow 1.3](https://www.tensorflow.org/install/)
|
|
|
|
|
|
## 사용 방법
|
|
|
|
### 1. 필수 라이브러리 설치
|
|
|
|
[Tensorflow 1.3](https://www.tensorflow.org/install/)를 설치한 후, 아래 명령어로 필수 라이브러리를 설치합니다.
|
|
|
|
pip3 install -r requirements.txt
|
|
|
|
바로 음성을 만들고 싶으면 [2-3. 학습된 모델 다운받기](#2-4-미리-학습된-모델-다운받기)를 따라하시면 됩니다.
|
|
|
|
|
|
### 2-1. 학습할 데이터 준비하기
|
|
|
|
`datasets` 디렉토리는 다음과 같이 구성되어야 합니다:
|
|
|
|
datasets
|
|
├── son
|
|
│ ├── alignment.json
|
|
│ └── audio
|
|
│ ├── 1.mp3
|
|
│ ├── 2.mp3
|
|
│ ├── 3.mp3
|
|
│ └── ...
|
|
└── 아무개
|
|
├── alignment.json
|
|
└── audio
|
|
├── 1.mp3
|
|
├── 2.mp3
|
|
├── 3.mp3
|
|
└── ...
|
|
|
|
그리고 `아무개/alignment.json`는 아래와 같은 포멧으로 `json` 형태로 준비해 주세요.
|
|
|
|
{
|
|
"./datasets/아무개/audio/001.mp3": "존경하는 국민 여러분",
|
|
"./datasets/아무개/audio/002.mp3": "국회의장과 국회의원 여러분",
|
|
"./datasets/아무개/audio/003.mp3": "저는 오늘",
|
|
}
|
|
|
|
`datasets`와 `아무개/alignment.json`가 준비되면, 아래 명령어로 학습 데이터를 만드시면 됩니다:
|
|
|
|
python3 -m datasets.synthesizer_data ./datasets/아무개/alignment.json
|
|
|
|
|
|
### 2-2. {손석희, 문재인, 박근혜} 데이터 만들기
|
|
|
|
만약 음성 데이터가 없으시다면, 3명의 한국인 음성 데이터를 만드실 수 있습니다:
|
|
|
|
1. [손석희](https://ko.wikipedia.org/wiki/%EC%86%90%EC%84%9D%ED%9D%AC)
|
|
2. [박근혜](https://ko.wikipedia.org/wiki/%EB%B0%95%EA%B7%BC%ED%98%9C)
|
|
3. [문재인](https://ko.wikipedia.org/wiki/%EB%AC%B8%EC%9E%AC%EC%9D%B8)
|
|
|
|
각각의 데이터는 아래 스크립트로 만들 수 있으며,
|
|
|
|
./scripts/prepare_son.sh # 손석희
|
|
./scripts/prepare_park.sh # 박근혜
|
|
./scripts/prepare_moon.sh # 문재인
|
|
|
|
|
|
각 스크립트는 아래와 같은 명령어를 실행합니다. (son 기준으로 설명합니다)
|
|
|
|
0. 자동으로 `음성<->텍스트` 페어를 만들기 위해 [구글 음성 인식 API](https://cloud.google.com/speech/)를 사용하며, `GOOGLE_APPLICATION_CREDENTIALS`를 준비해야 합니다. `GOOGLE_APPLICATION_CREDENTIALS`를 얻기 위해서는 [여기](https://developers.google.com/identity/protocols/application-default-credentials)를 참고해 주세요.
|
|
|
|
export GOOGLE_APPLICATION_CREDENTIALS="YOUR-GOOGLE.CREDENTIALS.json"
|
|
|
|
1. 음성(혹은 영상)과 텍스트 데이터를 다운로드 받습니다.
|
|
|
|
python -m datasets.son.download
|
|
|
|
2. 음성을 정적을 기준으로 분리합니다.
|
|
|
|
python -m audio.silence --audio_pattern "./datasets/son/audio/*.wav" --method=pydub
|
|
|
|
3. 작게 분리된 음성들을 [Google Speech Recognition API](https://cloud.google.com/speech/)를 사용해 대략적인 문장들을 예측합니다.
|
|
|
|
python -m recognition.google --audio_pattern "./datasets/son/audio/*.*.wav"
|
|
|
|
4. 기존의 텍스트와 음성 인식으로 예측된 텍스트를 비교해 `음성<->텍스트` 쌍 정보를 `./datasets/son/alignment.json`에 저장합니다. (`moon`과 `park` 데이터셋은 `recognition.json`이 이미 있기 때문에 이 과정은 생략하셔도 됩니다.)
|
|
|
|
python -m recognition.alignment --recognition_path "./datasets/son/recognition.json" --score_threshold=0.5
|
|
|
|
5. 마지막으로 학습에 사용될 numpy 파일들을 만듭니다.
|
|
|
|
python3 -m datasets.generate_data ./datasets/son/alignment.json
|
|
|
|
|
|
자동화 과정이 굉장히 간단하기 때문에, 데이터에 노이즈가 많이 존재합니다. 하지만 오디오와 텍스트가 충분히 많이 있다면 (처음부터 학습시 20시간 이상, 미리 학습된 모델에서 학습시 5+시간 이상) 적당한 퀄리티의 음성 합성을 기대할 수 있습니다.
|
|
|
|
|
|
### 2-4. 미리 학습된 모델 다운받기
|
|
|
|
미리 학습된 모델들을 사용해 음성을 만들거나 모델을 학습시킬 수 있습니다. 아래 모델 중 하나를 다운로드 받으시고:
|
|
|
|
1. 단일 화자 모델 - [손석희](https://ko.wikipedia.org/wiki/%EC%86%90%EC%84%9D%ED%9D%AC)
|
|
|
|
python3 download.py son
|
|
|
|
2. 단일 화자 모델 - [박근혜](https://ko.wikipedia.org/wiki/%EB%B0%95%EA%B7%BC%ED%98%9C)
|
|
|
|
python3 download.py park
|
|
|
|
학습된 모델을 다운받으시고, 아래 명령어로 음성을 만들어 낼 수 있습니다:
|
|
|
|
python3 synthesizer.py --load_path logs/son-20171015 --text "이거 실화냐?"
|
|
python3 synthesizer.py --load_path logs/park-20171015 --text "이거 실화냐?"
|
|
|
|
**주의: 학습된 모델을 연구 이외의 목적으로 사용하는 것을 금지합니다.**
|
|
|
|
|
|
### 3. 모델 학습하기
|
|
|
|
단일 화자 모델을 학습하려면:
|
|
|
|
python3 train.py --data_path=datasets/son
|
|
python3 train.py --data_path=datasets/park --initialize_path logs/son-20171015
|
|
|
|
다중 화자 모델을 학습하려면:
|
|
|
|
python3 train.py --data_path=datasets/son,datasets/park
|
|
|
|
학습 데이터가 좋지 않다면 `--initialize_path`로 이미 학습된 모델의 파라미터로 초기화 해서 학습하시는 것이 좋습니다.
|
|
|
|
|
|
### 4. 음성 만들기
|
|
|
|
모델을 학습시킨 후 웹 데모를 통해 음성을 만들거나:
|
|
|
|
python app.py --load_path logs/park-20171015 --num_speakers=1
|
|
|
|
아래 명령어로 음성을 만들 수 있습니다:
|
|
|
|
python3 synthesizer.py --load_path logs/park-20171015 --text "이거 실화냐?"
|
|
|
|
|
|
## Disclaimer
|
|
|
|
이것은 [데브시스터즈](http://devsisters.com/)의 공식적인 제품이 아닙니다. [데브시스터즈](http://devsisters.com/)는 이 코드를 잘못 사용했을 시 발생한 문제나 이슈에 대한 책임을 지지 않으며 이 소프트웨어의 사용은 사용자 자신에게 전적으로 책임이 있습니다.
|
|
|
|
|
|
## References
|
|
|
|
- [Keith Ito](https://github.com/keithito)'s [tacotron](https://github.com/keithito/tacotron)
|
|
- [DEVIEW 2017 발표 자료](https://www.slideshare.net/carpedm20/deview-2017-80824162)
|
|
|
|
|
|
## Author
|
|
|
|
Taehoon Kim / [@carpedm20](http://carpedm20.github.io/)
|