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

最終更新日:2023年4月14日

はじめに

以前「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 output.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`

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

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公式通りに行っています。

2023年2月11日追記(torch==1.13.1+cu116)

pyopenjtalk==0.3.0ではうまくいきませんでした。

pip install torch==1.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116
pip install espnet==202301
pip install pyopenjtalk==0.2.0
pip install espnet-model-zoo==0.1.7

Ubuntu 20.04 on WSL2のPython3.8とPython3.9で動作確認できました。

2023年4月14日追記(torch==1.13.1+cu117)

Ubuntu 22.04 on WSL2のPython3.10で動作確認できました。
こちらです。

2022年7月12日追記

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