【ESPnet】【PyTorch】【WSL2】ESPnetを使ってテキストファイルから音声ファイルを作成する

はじめに

以前「Open JTalk」を使って同様のことをしました。
touch-sp.hatenablog.com


今回は「ESPnet」というのを使わせて頂きました。


両者の結果が比較できるようにこの記事の最後に音声ファイルをのせておきます。


良かったら聞き比べてください。

PC環境

RTX 3060 Laptopを搭載したノートPCで動作確認しました。こちらのPCです。


Python3.10ではうまくいきませんでした。

Ubuntu 20.04 on WSL2
Python 3.8.10



Ubuntu内にCUDA 11.3.1をインストールしてtorch==1.11.0+cu113を使っています。


CUDA 11.3.1のインストールはNVIDIA公式通りに行っています。

Python環境構築

CMakeが必要です。
あらかじめUbuntu内にインストールしました。

sudo apt install cmake



おそらくpython3-devも必要です。

sudo apt install python3-dev



Python環境の構築はpipのみで可能でした。
(pipは最新のものにアップデートしておく必要があります)

pip install torch==1.11.0+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
pip install espnet
pip install pyopenjtalk
pip install espnet_model_zoo

Pythonスクリプト

テキストファイルから音声ファイルを作成するために以下のスクリプトを書きました。

import argparse
import numpy as np
import torch
from espnet2.bin.tts_inference import Text2Speech
from espnet2.utils.types import str_or_none

parser = argparse.ArgumentParser()
parser.add_argument('input_filename', help='input text file name')
parser.add_argument('output_filename', help='output wave file name')

args = parser.parse_args()

input_fname = args.input_filename
output_fname = args.output_filename

text2speech = Text2Speech.from_pretrained(
    model_tag=str_or_none('kan-bayashi/jsut_full_band_vits_prosody'),
    vocoder_tag=str_or_none('none'),
    device="cuda"
)

pause = np.zeros(30000, dtype=np.float32)

with open(input_fname, 'r') as f:
    x = f.read()

sentence_list = x.split('<pause>')

wav_list = []

for sentence in sentence_list:
    with torch.no_grad():
        result = text2speech(sentence)["wav"]
        wav_list.append(np.concatenate([result.view(-1).cpu().numpy(), pause]))

final_wav = np.concatenate(wav_list)

from scipy.io.wavfile import write
write(output_fname, rate=text2speech.fs, data=final_wav)

用意するテキストファイル

このようなテキストファイルを用意しました。

首都はキャンベラ。<pause>
世界一のサンゴ礁、グレートバリアリーフが有名。

テキスト中にpauseを挿入するとそこで間をあける(無音をはさむ)ようになっています。

使い方

上記Pythonスクリプトを「tts.py」としています。

python tts.py <テキストファイル名> <出力するファイル名>

例として

python tts.py sample.txt outpu.wav



以下のような警告が出ましたが動作には影響ないようです。

UserWarning: Cython version is not available. Fallback to 'EXPERIMETAL' numba version. If you want to use the cython version, please build it as follows: `cd espnet2/gan_tts/vits/monotonic_align; python setup.py build_ext --inplace`

音声比較

(waveファイルからmp3ファイルに変換しています)

前回作成した音声

「Open JTalk」で作成した音声です。

今回作成した音声

「ESPnet」で作成した音声です。

インストールされたライブラリのバージョン

appdirs==1.4.4
audioread==2.1.9
certifi==2022.6.15
cffi==1.15.1
charset-normalizer==2.1.0
ci-sdr==0.0.0
click==8.1.3
ConfigArgParse==1.5.3
ctc-segmentation==1.7.1
Cython==0.29.30
decorator==5.1.1
Distance==0.1.3
einops==0.4.1
espnet==202205
espnet-model-zoo==0.1.7
espnet-tts-frontend==0.0.3
fast-bss-eval==0.1.3
filelock==3.7.1
g2p-en==2.1.0
h5py==3.7.0
huggingface-hub==0.8.1
humanfriendly==10.0
idna==3.3
inflect==5.6.0
jaconv==0.3
jamo==0.4.1
joblib==1.1.0
kaldiio==2.17.2
librosa==0.9.2
llvmlite==0.38.1
nltk==3.7
numba==0.55.2
numpy==1.22.4
packaging==21.3
pandas==1.4.3
pkg_resources==0.0.0
pooch==1.6.0
pycparser==2.21
pyopenjtalk==0.2.0
pyparsing==3.0.9
pypinyin==0.44.0
python-dateutil==2.8.2
pytorch-wpe==0.0.1
pytz==2022.1
pyworld==0.3.0
PyYAML==6.0
regex==2022.6.2
requests==2.28.1
resampy==0.3.1
scikit-learn==1.1.1
scipy==1.8.1
sentencepiece==0.1.96
six==1.16.0
SoundFile==0.10.3.post1
threadpoolctl==3.1.0
torch==1.11.0+cu113
torch-complex==0.4.3
tqdm==4.64.0
typeguard==2.13.3
typing_extensions==4.3.0
Unidecode==1.3.4
urllib3==1.26.10

2022年7月9日追記①(torch==1.12.0+cu113)

PyTorchを1.11.0+cu113から1.12.0+cu113にアップデートしても問題なく動作しました。

2022年7月9日追記②(torch==1.12.0+cu116)

Ubuntu内のCUDAを11.3.1から11.6.2にアップデートした後にPyTorchを1.12.0+cu113から1.12.0+cu116にアップデートしました。

問題なく動作しました。

CUDAのインストールはNVIDIA公式通りに行っています。

2022年7月12日追記

続きの記事を書きました。
touch-sp.hatenablog.com