ESPnet2で始めるEnd-to-Endテキスト音声合成

# はじめに

こんにちは。株式会社Human Dataware Lab.の林知樹([@kan-bayashi](https://github.com/kan-bayashi))です。
好きなエディタはVim / Neovimです。

今日は、私が開発に参加しているESPnet2を利用したEnd-to-Endテキスト音声合成について簡単に紹介します。

> 以下の内容は2020/09/15現在のESPnet v.0.9.3の内容に基づいています。
> バージョンの更新により、内容が大きく変化する可能性があります。

## 忙しい人向け3行まとめ

- [ESPnet2](https://github.com/espnet/espnet)を使うと簡単に最先端のEnd-to-Endテキスト音声合成モデルで[こんな風に遊べる](https://drive.google.com/file/d/1MrEVDL7-COPIFVb1LIvIRfiIKkVZZeeP/view?usp=sharing)よ
- とにかく動かしたい人は [ESPnet2 real-time TTS demo](https://colab.research.google.com/github/espnet/notebook/blob/master/espnet2_tts_realtime_demo.ipynb) で遊んでみてね
- 開発者を常に募集しているから気軽に開発メンバーに声をかけてね

## ESPnetとは？

[ESPnet](https://github.com/espnet/espnet)とは、End-to-End(E2E)型のモデルの研究を加速させるべく開発された、E2E音声処理のためのオープンソースツールキットです。
詳しくは[コチラの記事](https://qiita.com/kan-bayashi/items/536acaf165344a6d6460)を御覧ください。

## ESPnet2とは？

ESPnet2は、ESPnetの弱点を克服するべく開発された次世代の音声処理ツールキットです。コード自体は[ESPnetのリポジトリ](https://github.com/espnet/espnet)に統合されています。基本的な構成はESPnetと同様ですが、利便性と拡張性を高めるため以下のような拡張が行われています。

- **Task-Design**: [FairSeq](https://github.com/pytorch/fairseq)の方式を参考に、ユーザーが任意の新しい音声処理タスク(例: 音声強調、音声変換)を定義できるように。
- **Chainer-Free**: [Chainer](https://github.com/chainer/chainer)の開発終了に伴い、[Chainer](https://github.com/chainer/chainer)に依存していた部分を改修。
- **Kaldi-Free**: [Kaldi](https://github.com/kaldi-asr/kald)に依存していた特徴量抽出部がPythonライブラリ内に統合。これにより、多くのユーザーが躓きやすいKaldiのコンパイルが不要に。
- **On-the-Fly**: 特徴量抽出やテキストの前処理などがモデル部に統合。学習時や推論時に逐次的に実行されるように。
- **Scalable**: CPUメモリの利用の最適化を行い、数万時間オーダーの超巨大データセットを用いた学習が可能に。さらに、マルチノードマルチGPU方式の分散学習をサポート。

2020年10月時点の最新バージョンv.0.9.3では、音声認識(ASR)、テキスト音声合成(TTS)、そして、音声強調(SE)のタスクがサポートされています。今後は、さらなるタスク(例: 音声翻訳、音声変換)が[サポートされる予定](https://github.com/espnet/espnet/issues/1795)です。この記事では、私がメインで開発しているTTS部分について簡単に紹介したいと思います。

## ESPnet2でサポートされているTTSモデル

E2E-TTSモデルは、一般的にテキストから音響特徴量(メルスペクトログラム)を生成するText2Melモデルと、音響特徴量から波形を生成するMel2Wavモデルで構成されています。ESPnetでは主に、Text2Mel部分の構築を行うことができます。

2020年10月現在、以下のText2Melモデルをサポートしています。

- [Tacotron 2](https://arxiv.org/abs/1712.05884)
- [Transformer-TTS](https://arxiv.org/abs/1809.08895)
- [FastSpeech](https://arxiv.org/abs/1905.09263)
- [FastSpeech2](https://arxiv.org/abs/2006.04558) ([FastPitch](https://arxiv.org/abs/2006.06873))
- [Global style token (GST)](https://arxiv.org/abs/1803.09017)

Mel2Wavモデルとしては、[私が開発しているリポジトリ](https://github.com/kan-bayashi/ParallelWaveGAN)のものと組み合わせることが出来ます。
以下のMel2Wavモデルがサポートされています。

- [Parallel WaveGAN](https://arxiv.org/abs/1910.11480)
- [MelGAN](https://arxiv.org/abs/1910.06711)
- [Multi-band MelGAN](https://arxiv.org/abs/2005.05106)

## 事前学習モデルを利用した推論
ESPnet2では、研究データ共有リポジトリである[Zenodo](https://zenodo.org/)と連携していて、様々な事前学習モデルを簡単に試すことができます。また、試すだけではなく、Zenodoへと登録を行うことで、任意のユーザーが事前学習モデルをアップロードすることも可能です。

以下では、[JSUTコーパス](https://sites.google.com/site/shinnosuketakamichi/publication/jsut)を用いて事前学習されたTTSモデル[FastSpeech2](https://arxiv.org/abs/2006.04558)による推論を実行するPythonコードの例を示します。

```python
from espnet_model_zoo.downloader import ModelDownloader
from espnet2.bin.tts_inference import Text2Speech

# Create E2E-TTS model instance
d = ModelDownloader()
text2speech = Speech2Text(
    # Specify the tag
    d.download_and_unpack("kan-bayashi/jsut_fastspeech2")
)

# Synthesis with a given text
wav, feats, feats_denorm, *_ = text2speech(
	"あらゆる現実を、全て自分の方へねじ曲げたのだ。"
)
```
ここで、`wav`、`feats`、及び`feats_denorm`はそれぞれ生成された波形、統計量で正規化された音響特徴量、及び逆正規化の音響特徴量を表します。デフォルトでは、音響特徴量から波形の変換はGriffin-Limによって行われますが、上記で紹介したMel2Wavモデルと組み合わせることも可能です。

公開されている事前学習モデルの一覧は[ESPnet Model Zoo](https://github.com/espnet/espnet_model_zoo)で見ることができます。

## Colabデモ

環境構築するのが大変だという人向けにGoogle Colabを使ったデモも公開しています。
ブラウザ上で簡単に最先端の音声合成を体験できるので是非試してみてください。
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/espnet/notebook/blob/master/espnet2_tts_realtime_demo.ipynb)
[このような音声](https://drive.google.com/file/d/1MrEVDL7-COPIFVb1LIvIRfiIKkVZZeeP/view?usp=sharing)を自由に生成できます。


## レシピを利用したモデルの構築

ESPnet2では、レシピを利用して自分でモデル構築も行うことができます。
ここでは、詳しく解説しませんので興味がある方は[こちらのページ](https://kan-bayashi.github.io/asj-espnet2-tutorial/)を参考にしてください。


## むすび

本記事では、E2E音声処理ツールキットESPnet2を利用したテキスト音声合成について概説しました。
ESPnetは日本人が中心となって開発を進めており、常に熱意ある開発者を募集しています。
興味のある方は、気軽に開発メンバーに連絡、もしくは、[Github](https://github.com/espnet/espnet)上での議論に参加してください！

## 参考リンク

- [ESPnet](https://github.com/espnet/espnet)
- [ESPnet model zoo](https://github.com/espnet/espnet_model_zoo)
- [ESPnet document](https://espnet.github.io/espnet/)
- [ESPnet2で始めるEnd-to-End音声処理](https://kan-bayashi.github.io/asj-espnet2-tutorial/)