End-to-End音声処理ツールキットESPnetの紹介

# End-to-End音声処理ツールキットESPnetの紹介

> 以下の内容は、2019年12月時点での最新バージョンであるESPnet Version 0.6.0の内容に基づいています。


## はじめに

名古屋大学でポスドクをやりながら、株式会社Human Dataware Labで働いている林知樹 ([@kan-bayashi](https://github.com/kan-bayashi))と申します。
音信号処理に関わる研究をしています。好きなエディタはVim / Neovimです。
今日は、私が開発に参加しているEnd-to-End音声処理ツールキット[ESPnet](https://github.com/espnet/espnet)について簡単に紹介したいと思います。


## ESPnetとは？

[<img src=https://raw.githubusercontent.com/espnet/espnet/master/doc/image/espnet_logo1.png width=500px>](https://github.com/espnet/espnet)

[ESPnet](https://github.com/espnet/espnet)は、End-to-End (Sequecne-to-Sequence)モデルに特化したオープンソースの音声処理ツールキットです。
ジョンズ・ホプキンス大学の[渡部晋治](https://sites.google.com/view/shinjiwatanabe)氏をリーダーとして、様々な大学や研究機関、企業に属する日本人が中心となり開発を進めています。
ありがたいことに、既に様々な海外の研究機関に使っていただけているようで、2019年12月現在[ESPnetの論文の被引用数は110を超えました](https://scholar.google.co.jp/scholar?oi=bibs&hl=ja&cites=7476699918027432808) (2018年9月出版)。
ESPnetはDefine-by-run形式のPytorch/Chainerをニューラルネットワークライブラリとして採用しており、様々な音声処理タスクを手軽に試すことができます。

ESPnetで処理できるタスクは主に以下の4つです。

- **音声認識** (Automatic Speech Recognition: **ASR**): 音声からテキストへのマッピング
- **音声合成** (Text-to-speech: **TTS**): テキストから音声へのマッピング
- **音声翻訳** (Speech Translation: **ST**): 音声から他言語テキストへのマッピング
- **機械翻訳** (Machine Translation: **MT**): テキストから他言語テキストへのマッピング

ESPnetでは、偉大な音声認識ツールキットである[Kaldi](https://github.com/kaldi-asr/kaldi)に習い、これらの全てのタスクが統一されたレシピ形式でまとめられています。

本記事では、主にASRとTTSに焦点を当てたいと思います。


## レシピとは？

ESPnetは、再現性に非常に力を入れています。この高い再現性を実現するためのキーがレシピです。
レシピとは、実験を再現するために必要な手順が全て含まれているスクリプト一式のことを指します。
ここで再現に必要な手順とは、データのダウンロード、前処理、特徴量抽出、モデルの構築、そしてモデルの評価を含みます。
つまり、レシピを実行するだけでユーザーは簡単に最新鋭の結果を再現することが可能です。
また、ほぼ全てのレシピで学習済みモデルを配布しており、学習用のリソースが確保できない方でも推論は試すことができます。

2019/12月現在で、ESPnetは英語、日本語、中国語を含む64個のレシピ (**47**コーパス, **36**言語)をサポートしています。
サポートしているコーパスの一覧は[ここから](https://github.com/espnet/espnet/tree/master/egs)見ることができます

レシピは、Stageと呼ばれる単位で構成されており、異なるタスク間でも統一的なデザインがなされています。
例えば、下記はASRとTTSのレシピの比較です。

**ASRレシピの流れ**
<img src=https://user-images.githubusercontent.com/22779813/70440675-0bb5aa80-1ad6-11ea-9712-65207ba3dfb4.png width=1024px>

**TTSレシピの流れ**
<img src=https://user-images.githubusercontent.com/22779813/70440676-0bb5aa80-1ad6-11ea-9dce-1839ce194c55.png width=1024px>

上記の例では、Stage −1から2のデータのダウンロード/前処理/特徴量抽出/Json形式への変換までは全く同一となっています。
つまり、ASRモデルとTTSモデルの学習に必要なデータフォーマットが完全に統一されているため、簡単にASR用のレシピとTTS用のレシピを相互に変換することもできます。


## サポートしている音声認識 (ASR)モデル

E2E-ASRで利用されるモデルの形式はいくつか存在しますが、ESPnetはほぼ全てをサポートしています。

1. Connectionist Temporal Classification (CTC) [[Graves, 2006]](https://www.cs.toronto.edu/~graves/icml_2006.pdf)
2. Attention-based encoder decoder [[Chorowski+, 2015]](https://arxiv.org/abs/1506.07503)
3. Joint CTC / Attention [[Watanabe+, 2017]](http://www.merl.com/publications/docs/TR2017-190.pdf)
4. RNN Transducer [[Graves, 2012]](https://arxiv.org/abs/1211.3711)
5. Transformer [[Vaswani+, 2017]](https://arxiv.org/abs/1706.03762)

上記のモデルは、レシピの中で`yaml`形式で書かれたconfigを入れ替えるだけ自由に試すことができます。
例えば、[こちら](https://github.com/espnet/espnet/blob/master/egs/librispeech/asr1/conf/tuning/train_pytorch_transformer_large_ngpu4.yaml)はTransformerのconfig、[こちら](https://github.com/espnet/espnet/blob/master/egs/librispeech/asr1/conf/tuning/train_rnn.yaml)はRNNのconfigの例です。

また、上記の発展型としてさらに、

- マルチチャネルビームフォーマーネットワークを統合したencoder-decoderモデル [[Ochiai+, 2017]](https://arxiv.org/abs/1703.04783)
- 複数のエンコーダを備えたMulti-encoderモデル [[Li+, 2019]](https://arxiv.org/abs/1906.08041)
- 複数の発話が混合したMulti-speaker ASR用音源分離統合型encoder-decoderモデル [[Seki+, 2018]](https://openreview.net/forum?id=HJxqMhC5YQ)

も実装されており、このような複雑なモデルもレシピを実行するだけ簡単に試すことが可能です。
さらには、最新のデータ拡張手法Specaug [[Park+, 2019]](https://arxiv.org/abs/1904.08779)もサポートされており、こちらも[config](https://github.com/espnet/espnet/blob/master/egs/librispeech/asr1/conf/specaug.yaml)を指定するだけ利用できます。


## サポートしている音声合成 (TTS)モデル

E2E-TTSは、主に私が開発している部分になります。
E2E-TTSは、主にテキストから音声特徴量 (Mel-spectrogram)を生成するText2Melモデルと、音声特徴量 (Mel-spectrogram)から波形を生成するVocoderモデルに別れます。

現在サポートしているText2Melモデルは主に3つ+その派生型です。

1. Tacotron 2 [[Shen+, 2017]](https://arxiv.org/abs/1712.05884)
2. TTS-Transformer [[Li+, 2018]](https://arxiv.org/abs/1809.08895)
3. FastSpeech [[Liu+, 2019]](https://arxiv.org/abs/1905.09263)
4. Multi-speaker Tacotron 2 with pretrained speaker embedding [[Jia+, 2018]](https://arxiv.org/abs/1806.04558)
5. Multi-speaker Transformer with pretrained speaker embedding

サポートしているVocoderモデルは以下の2つです。

1. WaveNet [[Oord+, 2016]](https://arxiv.org/abs/1609.03499)
2. Parallel WaveGAN [[Yamamoto+, 2019]](https://arxiv.org/abs/1910.11480)

ESPnet-TTSでは既に、最新鋭のNon-autoregressiveモデルであるFastSpeechとParallel WaveGANをサポートしており、簡単にリアルタイム音声合成モデルを構築することが可能です。

Google Colaboratoryで簡単にリアルタイム音声合成デモが試せますので是非どうぞ。
(現在のところ英語/日本語/中国語がデモで利用できます)
[こんな感じ](https://drive.google.com/open?id=1S6Rv_tbjyLL-_Csg1kmTD9ayOMGAobmA)の音声をほぼリアルタイムで生成することができます．
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/espnet/notebook/blob/master/tts_realtime_demo.ipynb)

> 2020/09/19追記
> 新しいバージョンのデモが公開されました。こちらもよろればどうぞ。
[![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)


また、ESPnet-TTSの一部のレシピでは、ASRとの統一的なデザインを活かし、TTSで生成された音声が自動的にASRモデルで評価されるようになっています。
これにより、E2E-TTSで問題となる単語の抜け落ちや繰り返しを客観的指標により評価することができます。


## 他のツールキットの性能比較

### ASR

ここでは、音声認識のベンチマークによく利用されるLibrispeechデータセットの結果を紹介します (2019年9月時点)。
評価指標はWord Error Rate (WER) [%]で、低いほど性能が高いことを示します。

| **Method**            | **dev_clean** | **dev_other** | **test_clean** | **test_other** |
| --------------------- | ------------- | ------------- | -------------- | -------------- |
| [**ESPnet Transformer**](https://github.com/espnet/espnet/blob/master/egs/librispeech/asr1/RESULTS.md#pytorch-large-transformer-with-specaug-4-gpus--large-lm)&emsp;&emsp;| **2.2**       | **5.6**       | 2.6            | **5.7**        |
| [Kaldi](https://github.com/kaldi-asr/kaldi)                 | 3.9           | 10.4          | 4.3            | 10.8           |
| [FAIR wav2letter++](https://arxiv.org/abs/1812.07625)     | 3.1           | 10.1          | 3.4            | 11.2           |
| [RWTH E2E](https://arxiv.org/abs/1905.04226)              | 2.9           | 8.8           | 3.1            | 9.8            |
| [Nvidia Jasper](https://arxiv.org/abs/1904.03288)         | 2.6           | 7.6           | 2.8            | 7.8            |
| [Google SpecAug](https://arxiv.org/abs/1904.08779)        | N/A           | N/A           | **2.5**        | 5.8            |

我々のモデルはGoogleのstate-of-the-artのモデルと同等の性能を達成していることが確認できると思います。
その他のタスクでの性能比較がみたい方は[[Karita+, 2019]](https://arxiv.org/abs/1909.06317)を参照してください。

### TTS

[ここから](https://espnet.github.io/icassp2020-tts/)他のツールキットとの比較音声を聞くことができます (英語/日本語/中国語)。
主観評価の結果が知りたい方は[[Hayashi+, 2019]](https://arxiv.org/abs/1910.10909)を参照してください。


## おわりに

本記事では、End-to-End音声処理ツールキットESPnetに紹介しました。
次の機会があれば、もう少し中身に迫っていきたいと思います。

ESPnetチームは常に開発者を募集しています！
音声認識・音声合成のレッドオーシャンに飛び込みたい人、一緒に最先端の研究開発を進めましょう！
興味がある方は是非[@kan-bayashi](https://github.com/kan-bayashi)に連絡してください。

## 参考リンク

- [ESPnet](https://github.com/espnet/espnet)
- [ESPnet TTS demo](https://colab.research.google.com/github/espnet/notebook/blob/master/tts_realtime_demo.ipynb)
- [ESPnet paper](https://arxiv.org/abs/1804.00015)
- [ESPnet RNN vs Transformer paper](https://arxiv.org/abs/1909.06317)
- [ESPnet-TTS paper](https://arxiv.org/abs/1910.10909)