見出し画像

ESPnet 入門 - 音声合成

ESPnetの音声合成をGoogle Colabで試してみました。

・ESPnet 0.9.5
・ParallelWaveGan 0.4.8

1. ESPnet

ESPnet」は、End-to-End (Sequecne-to-Sequence)モデルに特化したオープンソースの音声処理ツールキットです。

処理できるタスクは、次の4つになります。

・音声認識 (Automatic Speech Recognition: ASR) : 音声からテキストに変換
・音声合成 (Text-to-speech: TTS) : テキストから音声に変換
・音声翻訳 (Speech Translation: ST) : 音声から他言語テキストに変換
・機械翻訳 (Machine Translation: MT) : テキストから他言語テキストに変換

サポートしている日本語の音声合成のコーパスは、次の3つになります。

jnas : ASJ Japanese Newspaper Article Sentences Read Speech Corpus (JNAS)
jsut : Japanese speech corpus of Saruwatari-lab., University of Tokyo
jvs : JVS (Japanese versatile speech) corpus

2. インストール

インストール方法は、次のとおりです。

(1) Google Colabのノートブックを開く。
(2) メニュー「編集→ノートブック→ハードウェアアクセラレータ」で「GPU」を選択。
(3) 以下のコマンドで、「ESPnet」と「ParallelWaveGAN」をインストール。
「Imcompatible Error」が発生しますが、問題ありません。

# ESPnetのインストール
!pip install -q espnet==0.9.5 parallel_wavegan==0.4.8

(4) 以下のコマンドで、「OpenJTalk」のPythonラッパーをインストール。

# OpenJTalkのインストール
!mkdir tools && cd tools && git clone https://github.com/r9y9/hts_engine_API.git
!cd tools/hts_engine_API/src && ./waf configure && ./waf build 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 .. && 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 .

3. モジュールの選択

音声合成は、入力がテキストで出力が音声です。この処理は3つのモジュールで構成されます。

画像3

・テキスト解析器 : テキストから読みやアクセントなど音声合成に必要となる言語特徴量を抽出。
・音響モデル : 言語特徴量を音響特徴量に変換。音響特徴量は、音声の波形を生成するために必要な特徴量。
・ボコーダー : 音響特徴量を音声に変換。

今回は、テキスト解析器として「OpenJTalk」、音響モデルとして「Tacotron2」、ボコーダーとして「ParallelWaveGAN」を選択します。

# モデルの選択
fs, lang = 24000, "Japanese"
tag = "kan-bayashi/jsut_tacotron2"
vocoder_tag = "jsut_parallel_wavegan.v1"

音響モデルとして選択可能なモデルは、次の4つです。

・Tacotron2 (kan-bayashi/jsut_tacotron2)
・TTS-Transformer (kan-bayashi/jsut_transformer)
・FastSpeech (kan-bayashi/jsut_fastspeech)
・FastSpeech2 (kan-bayashi/jsut_fastspeech2)

ボコーダーとして選択可能なモデルは、次の2つです。

・ParallelWaveGAN (jsut_parallel_wavegan.v1)
・Multi-bandMelGAN (jsut_multi_band_melgan.v2)

4. モジュールの準備

モジュールの準備を行います。

# モジュールの準備
import time
import torch
from espnet_model_zoo.downloader import ModelDownloader
from espnet2.bin.tts_inference import Text2Speech
from parallel_wavegan.utils import download_pretrained_model
from parallel_wavegan.utils import load_model
d = ModelDownloader()
text2speech = Text2Speech(
    **d.download_and_unpack(tag),
    device="cuda",
    # Tacotron 2 専用
    threshold=0.5,
    minlenratio=0.0,
    maxlenratio=10.0,
    use_att_constraint=False,
    backward_window=1,
    forward_window=3,
    # FastSpeech & FastSpeech2 専用
    speed_control_alpha=1.0,
)
text2speech.spc2wav = None
vocoder = load_model(download_pretrained_model(vocoder_tag)).to("cuda").eval()
vocoder.remove_weight_norm()

「Permission denied」が原因でダウンロードが失敗することがあります。その場合は、数時間後に再試行してください。

5. 音声合成

音声合成を行います。

# 音声に変換するテキストを入力
print(f"Input your favorite sentence in {lang}.")
x = input()

# 音声合成
with torch.no_grad():
   start = time.time()
   wav, c, *_ = text2speech(x)
   wav = vocoder.inference(c)
rtf = (time.time() - start) / (len(wav) / fs)
print(f"RTF = {rtf:5f}")

# 音声プレイヤーの表示
from IPython.display import display, Audio
display(Audio(wav.view(-1).cpu().numpy(), rate=fs))

テキストボックスが表示されたら音声に変換するテキストを入力してください。

画像1

再生ボタンを押すと音声が再生されます。

画像2

6. 参考



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