keonlee9420 / Expressive-FastSpeech2

PyTorch Implementation of Non-autoregressive Expressive (emotional, conversational) TTS based on FastSpeech2, supporting English, Korean, and your own languages.
Other
267 stars 46 forks source link

MFA training 방법 #14

Closed Moon-sung-woo closed 2 years ago

Moon-sung-woo commented 2 years ago

안녕하세요. 먼저 FastSpeech관련 코드와 내용 올려주셔서 감사합니다.

한국어에 MFA를 하여 align을 얻는 과정에대해서 여쭤보고 싶은게 있어 이슈를 남기게 되었습니다.

  1. MFA를 하기 위해서는 가지고 있는 데이터에 대해 '한국어 자모' 쌍으로 만들어야 된다고 봤었습니다. 이때 '.?!'와 같은 것들은 제거를 하고 만드는 것 같은데 같이 포함을 하면 안되는 것일까요? '?'와'!'같은 경우에는 음성 합성시에 음을 내리거나 올릴 때 많이 쓰일 것 같아서요.
  2. MFA를 이용하여 align을 얻기 위해서는 1번과 같이 쌍을 만들고 '새롭게 학습'을 진행한다고 봤었습니다. Expressive-FastSpeech2 repo에 올라와 있는 readme.md를 읽어봐도 어떻게 MFA를 학습시키는지 나와있지 않아 어떻게 학습시키는지 모르겠습니다ㅠㅠ 혹시 윈도우 환경에서는 학습이 불가능 한 것인지, 학습은 python코드로 따로 학습을 시키는 것이 아닌지 여쭤보고 싶습니다.
  3. 음성 합성시에 g2pk를 사용하여 phoneme을 학습에 사용하는 것이 좋을지 아님 Grapheme을 사용하는 것과 큰 차이가 없는지 여쭤보고 싶습니다.

감사합니다.

keonlee9420 commented 2 years ago

안녕하세요 @Moon-sung-woo 님, 제 프로젝트에 관심 가져주셔서 감사드립니다. 저의 답변은 아래와 같습니다.

  1. 알고계신대로 punctuation은 각각의 쓰임을 유지하도록 학습할 수 있습니다. 그러나 이 프로젝트에서 external aligner로 채택한 MFA에서는 구조상 모든 구두점을 sp라는 미리 지정된 특수 토큰에만 mapping하도록 제한되어있습니다. 현재 제 프로젝트에서는 MFA를 사용하기 때문에 이러한 한계점을 그대로 갖게 됩니다. 이러한 한계를 없애고 싶으시다면, unsupervised duration modeling을 적용한 저의 또다른 프로젝트를 참고해보시기 바랍니다.
  2. python으로 학습을 시키는 것이 맞습니다만 현재 MFA가 공식 버전이 업데이트되면서 docs도 업데이트 되었습니다. 설치는 이곳을 따라서 진행해주시고 학습은 이곳을 따라서 진행해주시면 동일한 결과를 얻으실 수 있습니다. 한번 살펴보시고 이해가 안되는 부분이 있다면 질문 주시면 최대한 답변 드리도록 하겠습니다.
  3. grapheme을 인풋으로 사용하려면 모델이 각 grapheme의 다양한 phoneme으로의 mapping을 스스로 학습해야 합니다. 이를 따로 분리해 해결한 것이 g2pk이라고 볼 수 있는데, 따라서 g2pk를 활용해 미리 grapheme을 phoneme으로 변환해두고 이를 인풋으로 사용한다면 모델 입장에서 좀 더 수월한 task가 됩니다. 때문에 phoneme을 input으로 넣는 것이 grapheme을 사용하는 것 보다 좋습니다.

도움이 되시길 바랍니다. 감사합니다.

Moon-sung-woo commented 2 years ago

안녕하세요 @keonlee9420 님, 친절한 답변 정말 감사합니다. 조금만 더 질문을 드려도 괜찮을까요??

  1. g2pk를 이용하면 phoneme으로 변환되어 나오는데 한글로 된 phoneme을 사용하는 것도 봤고 한글을 영어 phoneme으로 변환해서 학습에 사용을 하는 방법을 봤었습니다. 두개의 차이가 성능에 큰 영향을 미칠지 궁금합니다.

제 목표는 적은 데이터(약 1시간 정도 단일화자 음성 데이터)로 감정표현이 가능한 합성음을 만드는 것을 목표로 하고 있습니다. 이 때 학습하는 방법에 대한 질문이 이있습니다.

  1. hifi-GAN을 보코더로 사용할 것인데 보코더를 학습 시킬 때 영어로 pre-trained 된 모델과 제가 가지고 있는 적은 데이터로 fine tuning시키는 것이 좋을지, 아님 다화자에 대한 다양한 데이터를 수집하여 처음부터 함께 학습시키는게 좋을지 모르겠습니다.
  2. acoustic 모델 또한 영어로 pre-trained된 모델을 사용해 fine tuning 시키는 것이 좋을지 아님 다른 화자의 데이터를 함께 사용하여 처음부터 학습 시키는 것이 좋은지 모르겠습니다.
  3. 위에서 말씀드린 것처럼 감정표현이 가능한 합성음을 만드는 것이 목표입니다. 공공데이터 중 7개의 감정 표현이 가능한 데이터를 찾아 이를 함께 사용하여 학습을 할 예정입니다. 이 때 공공 데이터를 이용하여 먼저 학습 한 후 제가 가지고 있는 적은 데이터를 튜닝하여 학습시키는 것이 좋을지 아님 처음부터 공공 데이터 + 적은 데이터를 한번에 학습시키는 것이 좋을 지 여쭤보고 싶습니다.

notion을 보면 취업하신 것 같은데 바쁘신데도 답변 달아주셔서 정말 감사합니다. 감사합니다.

keonlee9420 commented 2 years ago

목표로 하시는 것은 충분히 가능할 것으로 보입니다. 그러나 질문주신 내용에 제가 직접 실험해보지 않은 것들이 많아서 개괄적인 답변만 드릴 수 있는 점 미리 양해 바랍니다.

  1. 각 언어는 각자의 phoneme을 따를 때 가장 정확하고 완벽하게 발음을 표현할 수 있습니다. 따라서 특별한 목적의 실험이 아닌 이상 해당 언어의 phoneme set을 사용하지 않을 이유가 없습니다. 다만, 말씀주신 대로 한국어를 영어 phoneme으로, 영어를 한국어 phoneme으로 학습하게 되면 phoneme에 해당하는 언어를 text로 넣어줄 수 있고 그 경우 전자는 한국인이 영어를 발음하는 것 처럼, 그리고 후자는 영어를 모국어로 하는 외국인이 한국어를 발음하는 것 처럼 나올 것입니다.

이어지는 1~3번 질문에 대하여, fine-tuning은 기존의 다른 task에서의 학습 결과를 활용해 현재 task의 성능을 올리는 가장 간결하고 좋은 방법 중 하나입니다. 하지만 서로 다른 두 데이터를 사용하여 한 데이터셋에 먼저 pre-train 후 나머지 데이터셋에 fine-tuning을 하는 것과 두 데이터셋을 함께 학습하는 근본적으로 다른데요, 가장 큰 차이를 꼽자면 overfitting(robustness)입니다. fine-tuning은 단일 데이터셋을 사용했을 때와 동일하므로 현재 task의 데이터셋에 적합한 학습 결과를 보여주지만 overfitting 가능성이 높습니다. 그러나 여러 데이터셋을 한번에 학습한다면 현재 task에서 가장 적합한 결과만을 내놓지는 않겠지만 overfitting 가능성이 훨씬 낮(==새로운 데이터에 대해 robust한 정도가 높)겠습니다. 정도는 데이터셋의 특성에 따라서 매우 상이하므로, 고려중이신 모든 task에 대해 두 학습 방법 - 1. fine-tuning 2. 한번에 학습 - 을 모두 적용해보시는 것을 추천드립니다.

저도 직접 비교한 경우가 흔치 않아 결과가 궁금하네요. 만약 직접 실험하시게 되면 그 결과들을 공유 주신다면 저 포함 비슷한 고민을 하시는 많은 분들께 큰 도움이 될 것입니다.

감사합니다.

Moon-sung-woo commented 2 years ago

안녕하세요. @keonlee9420 님 답변 정말 감사합니다. 많은 도움이 되었습니다. 말씀해주신대로 다 실험을 진행 해 본 후 결과 공유드리도록 하겠습니다. 답변 주셔서 정말 감사합니다.

이슈는 닫도록 하겠습니다.

Moon-sung-woo commented 2 years ago

안녕하세요 @keonlee9420 님 Hi-Fi GAN Fine tuning 방법에 대한 실험 결과 공유드립니다.

영어로 학습된 모델에 한국어를 fine tuning시킬 때 어떤 방법이 더 좋은지에 대해 질문을 남겼었습니다. 결론부터 말씀드리자면 원하는 화자의 목소리만을 이용하여 fine-tuning시키는 것이 더 좋은 결과를 얻을 수 있었습니다.

한국어의 발음에 대해 더욱 뚜렷하게 학습하기 위해 다른 화자의 음성을 함께 학습시켜봤으나 원하는 화자의 목소리만을 사용하여 fine-tuning 시켰을 때 듣기에 더 좋은 성능을 낼 수 있었습니다.

감사합니다.

Moon-sung-woo commented 2 years ago

안녕하세요 @keonlee9420 님 음성합성 기법에 대한 질문이 있어 issue 남기게 되었습니다. fastspeech2를 보면 duration에 일정 값을 곱해 전체 문장의 duration을 조절하는 것으로 알고있습니다.

제 질문은 구글과 같은 음성합성 서비스를 이용할 때 SSML(Speech Synthesis Markup Language)을 이용하여 하나의 문장에서 각 단어를 제어할 수 있는 음성합성 기법이 있는지 궁금합니다.

예를 들어 '안녕하세요? 오늘은 날씨가 정말 좋습니다' 라는 문장이 있을 때 '안녕하세요'는 pitch를 1.2배를 해주고, '날씨가 정말 좋습니다'는 duration을 0.8배 해주는 것과 같이 따로따로 제어할 수 있는 방법이 있는지 여쭤보고 싶습니다.

딥러닝을 사용하지 않은 고전적인 방법으로는 가능한 것으로 알고 있는데 딥러닝을 사용해서는 어떻게 해야할지 정보가 없어 질문 남깁니다.

항상 친절히 답변 달아주셔서 감사합니다. 많은 도움 받고 있습니다. 감사합니다.

keonlee9420 commented 2 years ago

안녕하세요 @Moon-sung-woo 님, 우선 답변이 늦어져 죄송합니다. 실험에 대한 자세한 공유 감사드립니다. 저 포함 많은 분들께 큰 도움이 되리라 생각합니다. 이어진 질문에 대해 답변 드리자면, 현재 제 프로젝트에서도 문장 전체의 duration, pitch, energy 값은 문장 전체 단위로 변경이 가능합니다(이곳 그리고 이곳을 참고하세요). 조금 번거롭지만 이 방식을 이용한다면 문장 단위 뿐 아니라 예시로 들어주신 것 처럼 단어 단위 (더 나아가 phoneme 단위) control도 가능해 질 텐데요, 예를들어 합성 시 각 단어에 해당하는 위치의 variance 값에 원하는 배수를 곱해주면 됩니다. 예를들어 '안녕하세요'의 pitch를 1.2배를 해주고자 할 때 이곳을 다음과 같이 수정해 주면 됩니다: 안녕하세요에 해당하는 phoneme의 위치(범위)를 duration target 값(mfa로 뽑아낸 duration 값) 을 통해 알아내고 그 부분만 control 값을 곱해줍니다. 이런 방식으로 duration도 0.8배를 해주면 원하시는 결과를 얻을 수 있을 것입니다.

Moon-sung-woo commented 2 years ago

안녕하세요 @keonlee9420 님. 큰 도움이 되었으면 좋겠네요! 친절한 답변 정말 감사합니다.

정말 죄송한데 한가지 더 질문드리고 싶은게 있어 다시 글 남깁니다. tacotron2 기반의 모델을 사용하고, 입력 text에 g2pk를 사용하였습니다. 결과를 확인해보니 음성에서 된소리 발음이 잘 나오지 않는것을 확인했습니다. 이런 된소리의 경우 딥러닝 모델의 한계인지 아님 입력 전처리 단계에서의 문제인지를 모르겠어서 질문 남깁니다.

항상 자세하게 답변 달아주셔 큰 도움 되고 있습니다. 감사합니다.

keonlee9420 commented 2 years ago

안녕하세요, 제 답변이 도움이 되어 다행입니다. 아마 g2pk는 https://github.com/Kyubyong/g2pK을 사용하셨을 것으로 보이는데요, 말씀주신 문제는 이 phonemizer의 문제 중 하나라고 저도 알고만 있습니다. 즉, 모델의 한계라기 보다는 input과 output의 mapping을 결정짓는 전처리 단계의 문제라고 이해하시면 좋을 것 같네요. phonemizer는 언어에 따라 다르고, 한국어 버전도 찾아보시면 몇가지 대안이 있으니 한번 issue등을 잘 확인해보시고 적절한 phonemizer로 변경해 전처리 하여 학습하면 도움이 될 것으로 판단됩니다. 여유가 되신다면 실험을 통해 얻게된 insight나 월등했던 phonemizer를 공유해 주신다면 역시 저 포함 여러 분들께 큰 도움이 될 것 같네요.

Moon-sung-woo commented 2 years ago

안녕하세요, 답변 감사합니다. 알려주신대로 적절한 phonemizer를 사용하여 실행해보고 공유 드리도록 하겠습니다.

항상 친절한 답변 감사합니다. 이슈는 닫도록 하겠습니다. 감사합니다.