ESPnet2をUbuntuマシンにインストールする方法

UbuntuマシンにESPnet2(ESPnet)をインストールした際の備忘録です。一度インストールしてしまえば新しい環境でも簡単にインストールできますが最初だと結構躓くこともあると思います。Qiitaは初投稿なので読みにくい点などあるでしょうがご了承ください。
ちなみに当方がインストールを行った際の環境は

* Ubuntu18.04
* GeForce RTX3090
* CUDA 11.1
* cuDNN 8.0
* PyTorch 1.8.1
* ESPnet 0.9.9

です。Ubuntu20.04、RTX2080Ti、PyTorch1.7.1などでもこの通りの方法で成功するのを確認しています。ESPnet0.9.8でも確認していますが0.9.9で学習の高速化が実装されているので新しい方が良いです。
#ESPnet2とは？
ESPnet2はEnd-to-Endの音声処理ツールキットです。音声認識や音声合成など様々なタスクを簡単に、高性能で行うことができます。無印のESPnetと違い、Kaldiなしで実行可能です。
ESPnet2については開発者の方が詳しく書いてくださっています。

[ESPnet2で始めるEnd-to-Endテキスト音声合成](https://qiita.com/kan-bayashi/items/0371e06202641dbfa0ad)
#ESPnet2のインストール
ESPnet2はESPnetの中に含まれており、ESPnetをインストールすることでESPnet2を使うことができます。
インストール方法について、公式のドキュメントもあります。

[Installation](https://espnet.github.io/espnet/installation.html)

しかし、これだけに従ってインストールするのは不慣れな場合難しいと思います。ここでは公式ドキュメントを元にもうちょっとわかりやすく(？)書いていきます。

##必要なツール、ライブラリのインストール
公式ドキュメントに書いてあるように、必要なツールをインストールしていきます。

```
$ sudo apt-get install cmake
$ sudo apt-get install sox
$ sudo apt-get install libsndfile1-dev
$ sudo apt-get install ffmpeg
$ sudo apt-get install flac
```

また、日本語を扱う場合nkfも入れるとよいでしょう。

```
$ sudo apt-get install nkf
```

CUDAが入っていない場合CUDAをインストールします。入っていたとしてもバージョンを合わせないとインストールできません。その場合インストールしなおしてください。
`nvidia-smi`で表示されるCUDAのバージョンは単にドライバに適したCUDAのバージョンです。これは実際に入っているCUDAのバージョンと異なることもありますし、CUDAが入っていなくても表示されます。`nvcc -V`で出てくるのが正しいCUDAのバージョンです。
ESPnet2をAnaconda環境で使う場合[ここ](https://anaconda.org/pytorch/pytorch/files)にあるPyTorchのどれかをインストールするようになっています。
PyTorch、CUDA、cuDNNのバージョンを必ず合わせましょう。下位互換性のため、CUDA11.0対応のPyTorchはCUDA11.1でも入れることができます(この場合インストールの際、指定するバージョンは11.0にします。)。

CUDAはNVIDIAの公式サイトからダウンロードできます。

[CUDA Toolkit | NVIDIA](https://developer.nvidia.com/cuda-toolkit)

環境を選んでいくとインストールするためのコマンドが出てきます。私はrunfileが好きです。

必ず、忘れずPATHも通しましょう。`nvcc -V`コマンドを実行できない状態だと、せっかくGPUがあってもCPU only版のPyTorchがインストールされてしまいます。

次に、cuDNNを入れましょう。cuDNNは

[cuDNN Archive | NVIDIA Developer](https://developer.nvidia.com/rdp/cudnn-archive)

からダウンロードできます。CUDA、PyTorchのバージョンにあったものを入れましょう。PyTorch1.8.1の場合8.0.xか7.6.xです。Runtime LibraryとDeveloper Libraryをインストールしてください。

`python3`コマンドではPythonが実行されるのに`python`コマンドでは実行できない場合Python2がインストールされていません。ESPnetは一部でPython2も使用しているようなのでPython2もインストールしましょう。

```
$ sudo apt install python2
```

これで準備は完了しました。GPUを複数使う場合はNCCLなども適宜インストールしてください。
##ESPnetのインストール
いよいよESPnetをインストールします。まずは使いたいディレクトリの中でGitHubからクローンします。クローン出来たら`espnet/tools`に移動してください。

```
$ git clone https://github.com/espnet/espnet
$ cd espnet/tools
```

無印のESPnetの場合ここでKaldiをインストールしますがESPnet2では必要ありません。Pythonの環境を作っていきます。もともと入っているPythonやAnacondaを使う方法もありますがESPnetの中のAnacondaを使う方法が一番簡単です。もし他のPythonを使う場合ターミナルなど、いくつかデフォルトで入っているPython3で動き、それでしか動かないものがあるので気を付けてください。

```
$ ./setup_anaconda.sh anaconda espnet 3.8
```

この一行でOKです。さて、いよいよインストールします。

```
$ make TH_VERSION=1.8.1 CUDA_VERSION=11.1
```

ここは自分の使うバージョンにしましょう。このオプションを元に[ここ](https://anaconda.org/pytorch/pytorch/files)からPyTorchを選んでいます。ちなみにGPUがRTX30シリーズなど新しい場合PyTorchのバージョンは1.7.1以上にする必要があります。特に理由がなければ新しい方が良いと個人的には思います。

”ft2build.h”がないというエラーが出てインストールに失敗する場合があります。その場合は

```
$ sudo apt-get install libfreetype6 libfreetype6-dev
```

しましょう。これでmakeからやり直せばエラーが出なくなるはずです。
PyTorchのインストールは長いです。気長に待ちましょう。
##ESPnet2の動作確認
ちゃんとインストールできているかどうか簡単なレシピを実行して確認しましょう。`espnet/egs2`の中にESPnet2のレシピが入っています。an4やJSUTなんかが簡単だと思います。実行したいレシピのディレクトリの中に`asr1`(音声認識)や`tts1`(音声合成)などタスクごとのディレクトリがあります。好きなタスクのディレクトリの中で

```
$ ./run.sh
```

を実行します。うまく動きましたか？　お疲れ様です。うまく動いた場合、ここで完了です。あとは好きなレシピを実行したり、レシピを自作したり、使っていきましょう。

ESPnet2の日本語版チュートリアルは

[ESPnet2で始めるEnd-to−End音声処理](https://kan-bayashi.github.io/asj-espnet2-tutorial/)

です。

ft2build.hのエラーに関しては、こちらのサイトを参考に致しました。

[Ubuntu 12.04にpipでmatplotlibを入れようとしたら詰まった件 - ふゆみけ](https://fuyumi3.hatenadiary.org/entry/20130110/1357822922)
#補足(日本語TTSの場合)
[pyopenjtalk](https://r9y9.github.io/pyopenjtalk/)が必要です。

```
$ pip install pyopenjtalk
```

でインストールしましょう。`pip`です。