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)
この記事が気に入ったらサポートをしてみませんか?