見出し画像

NVIDIA/tacotron2 で日本語の音声合成を試す (3) - つくよみちゃんコーパスで学習

前回、「JSUT」を使って英語から日本語に転移学習しました。今回はついに、「つくよみちゃんコーパス」で「JSUT」の声から「つくよみちゃん」の声に転移学習に挑戦してみます。

(1) 英語を学習(済) (The LJ Speech Dataset, 13100個)
   ↓
(2) 日本語を学習(済) (JSUT, 7696個)
   ↓
(3) つくよみちゃんの声を学習(つくよみちゃんコーパス, 100個)

前回

1. データセットの準備

今回は「つくよみちゃんコーパス」を利用します。

・つくよみちゃんコーパス Vol.1 声優統計コーパス(JVSコーパス準拠)
 ・01 WAV(収録時の音量のまま
) - wavファイルを保持するフォルダ
  ・VOICEACTRESS100_XXX.wav - wavファイル
      :
 ・02 WAV(+12dB増幅)
- wavファイルを保持するフォルダ
  ・VOICEACTRESS100_XXX.wav - wavファイル
      :
 ・03 ライセンスについて
 ・04 台本と補足資料
  ・★台本テキスト
   ・01 補足なし台本(JSUTコーパス・JVSコーパス版).txt
- wavファイル名とセリフの一覧
   ・02 補足つき台本(つくよみちゃんコーパス版).txt - wavファイル名とセリフの一覧
 ・05 収録・編集方法について

2-1. transcript.txt

つくよみちゃんコーパス」の台本の書式は、次のとおりです。

VOICEACTRESS100_001:また、東寺のように、五大明王と呼ばれる、主要な明王の中央に配されることも多い。
VOICEACTRESS100_002:ニューイングランド風は、牛乳をベースとした、白いクリームスープであり、ボストンクラムチャウダーとも呼ばれる。
    :

これを「NVIDIA/tacotron2」用に変換します。

wav/VOICEACTRESS100_001.wav|mata,toojinoyooni,godaimyooootoyobareru,shuyoonamyoooonochuuoonihaisarerukotomoooi.
wav/VOICEACTRESS100_002.wav|nyuuiNguraNdofuuwa,gyuunyuuobeesUtoshIta,shiroikuriimusuupudeari,bosUtoNkuramuchaudaatomoyobareru.
​    :

(1) 「01 補足なし台本(JSUTコーパス・JVSコーパス版).txt」のファイル名を「transcript_utf8.txt」に変更。
(2) 「Google Colab」でメニュー「編集→ノートブック」で「GPU」を選択。
(3) 以下のコマンドで「pyopenjtalk」をインストール。

# pyopenjtalkのインストール
!mkdir tools && cd tools && git clone https://github.com/r9y9/hts_engine_API.git
!mkdir -p tools/hts_engine_API/src/build && cd tools/hts_engine_API/src/build && \
    cmake -DCMAKE_INSTALL_PREFIX=../.. .. && make -j && make install
!cd tools && git clone https://github.com/r9y9/open_jtalk.git
!mkdir -p tools/open_jtalk/src/build && cd tools/open_jtalk/src/build && \
    cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON \
        -DHTS_ENGINE_LIB=../../../hts_engine_API/lib \
        -DHTS_ENGINE_INCLUDE_DIR=../../../hts_engine_API/include .. && \
    make install
!cp tools/open_jtalk/src/build/*.so* /usr/lib64-nvidia
!cd tools && git clone https://github.com/r9y9/pyopenjtalk.git
!cd tools/pyopenjtalk && pip install .

(4) 「Google Colab」で「wavファイルのパス」「セパレータ(|)」「音素表記」を変換。
「in_path」に入力ファイル、「out_path」の出力ファイルのパスを指定してください。

import os
import pyopenjtalk

# transcript.txtの変換
in_path = 'filelists/transcript_utf8.txt'
out_path = 'filelists/transcript.txt'
output = []
with open(in_path) as f:
    lines = f.readlines()
    for line in lines:
        strs = line.split(':')
        strs[1] = pyopenjtalk.g2p(strs[1], kana=False)
        strs[1] = strs[1].replace('pau',',')
        strs[1] = strs[1].replace(' ','')
        strs[1] = strs[1] + '.'
        output.append('wav/'+strs[0]+'.wav|'+strs[1]+'\n')

with open(out_path, 'w') as f:
    f.writelines(output)

2-2. wav

つくよみちゃんコーパス」のwavのサンプリングレートは96KHzです。これを「NVIDIA/tacotron2」用の22KHzに変換します。

「01 WAV(収録時の音量のまま)」と「02 WAV(+12dB増幅)」がありますが、「01」は音量が小さいので「02」を使います。そして、フォルダ名にスペースがあると面倒なので、「02_WAV(+12dB増幅)」に変更します。

変換スクリプトは、次のとおりです。

$ pip install librosa==0.8.0
$ pip install pysoundfile==0.9.0.post1
import os
import librosa
import soundfile as sf

# パス
in_path = '02_WAV(+12dB増幅)/'
out_path = 'wav/'

# 出力フォルダの準備
os.makedirs(out_path, exist_ok=True)

# wavの変換の関数
filenames = os.listdir(in_path)
for filename in filenames:
    print(in_path+filename)
    y, sr = librosa.core.load(in_path+filename, sr=22050, mono=True)
    sf.write(out_path+filename, y, sr, subtype="PCM_16")

2. 学習

今回も「NVIDIA/tacotron2」を利用して、「Google Colab」で学習します。前回と同様にインストールした後、データセットを配置します。

・work
 ・tacotron2
  ・filelists
   ・transcript.txt ←★ここに配置
  ・wav ←★ここに配置
   ・VOICEACTRESS100_XXX.wav

     :

(2) データセットを学習データと検証データに分割

# 学習データと検証データの分割
!head -n 90 filelists/transcript.txt > filelists/transcript_train.txt
!tail -n 10 filelists/transcript.txt > filelists/transcript_val.txt

(3) 「hparams.py」の編集。
「つくよみちゃんコーパス」は、サンプル数がすくないので、チェックポイント保存タイミング(iters_per_checkpoint)を減らし、エポック数(epochs)を増やしました。

    :
epochs=1000,
iters_per_checkpoint=100,
  :
training_files='filelists/transcript_train.txt',
validation_files='filelists/transcript_val.txt',
text_cleaners=['basic_cleaners'],
  :
batch_size=16,
  :

(4) 学習の実行。
JSUTの13000ステップの学習モデル(checkpoint_13000)から転移学習します。出力フォルダも「outdir2」に変えました。

!python train.py --output_directory=outdir2 --log_directory=logdir -c outdir/checkpoint_13000 --warm_start

4. 推論

前回と同様に推論します。

text = "honnjituwa,seitennnari."

待ちきれず2000ステップで確認したところ、「つくよみちゃん」の声で「本日は晴天なり」を言ってくれました。

◎ JSUT 13000ステップ

◎ つくよみちゃん 2000ステップ

2000ステップだとまだロボっぽいので学習を続けてみます。

【おまけ】 wavのダウンロードと保存

◎ ダウンロード可能なオーディオUI

audio_numpy = audio[0].data.cpu().numpy()
rate = 22050
from IPython.display import Audio
Audio(audio_numpy, rate=rate)

◎ ファイル保存

write("audio.wav", rate, audio_numpy)



この記事が気に入ったらサポートをしてみませんか?