【2021年版】yukarinライブラリ Ubuntu Desktop 18.04 LTS 環境構築編

最初に…。
わたしは他のLinuxやPythonは触った事がありますが、Ubuntuに関しては全くのド素人です。
数十回の試行錯誤の上に見つけた、ちゃんと動く環境が作れるパターンを、半分自分用メモとして記しておきます。
それから、これまでは誰にでもと言いつつも、実質技術者にしか難しかった訳ですが、もっと素人の方、あまりIT関係詳しくないVtuberの方にも読んでもらえるように意識して書きました。
一応、偶然行き着いたのでは無く、自分の環境では再現性がある事は確認済みです。

本家様
ディープラーニングの力で結月ゆかりの声になってみた
動画 : http://www.nicovideo.jp/watch/sm32724409
コード : https://github.com/Hiroshiba/become-yukarin

先駆者様
「ディープラーニングの力で結月ゆかりの声になる」ためのLinux環境構築
https://qiita.com/atticatticattic/items/575d71dab4ee716e4969

「ディープラーニングの力で結月ゆかりの声になる」環境構築【Ubuntu Server v18.10】
https://qiita.com/sakamotothogo/items/322012f1a462f27188bf

初めての「誰でも好きなキャラの声になれる」ディープラーニング声質変換環境構築【Ubuntu 18.04LTS】
https://qiita.com/BURI55/items/92ba127c7beb95b2b3f0

『Yukarinライブラリ』ためのLinux環境構築(CUDA10.1)【Ubuntu 18.04 LTS】
https://qiita.com/atticatticattic/items/8826a81badeea21a7175

### 使用ハード
OS : Ubuntu Desktop 18.04.5 LTS
CPU : Intel(R) Core(TM)i5-4670 CPU @ 3.40GHz x 4
GPU : GeForce GTX 1060 6GB/PCIe/SSE2
ストレージ: Intel SSD 80GB

※ CPUは試してみた所、かなり古いもの（貰い物のCore2Duo）でも一段階学習 -> 一段階テスト -> 二段階学習 -> 二段階テストまでできました。（リアルタイム変換は試してない）
※ GPUはGeForce GTXは必須なのです。AMDやCPU内蔵GPUではダメなのです。聞く所によるとGPUメモリ3.7GB以上は必須という事ですが、持ってなければ中古品で十分だと思います。

## １．Ubuntuのインストール
現時点での最新のLTSはUbuntu Desktop 20.04.2.0 LTSですが、18.04.5 LTSを使用します。
ダウンロードサイトはこちらから↓ 
https://releases.ubuntu.com/18.04.5/

ダウンロードしたものをUSBメモリに書き込みます。
書き込みソフトはRufus辺りが有名です↓
https://rufus.ie/ja/

USBメモリからブートして、Ubuntu Desktop 18.04.5 LTS をインストールします。
最初の画面を一番下までスクロールをさせて日本語を選択、あとは各自の環境に合わせて選択してください。
間違えた操作をすると大切な環境を破壊してしまう事もあるので慎重に…。
もし、壊してしまっても責任は持てません。

## ２．Ubuntu基本設定

初回起動すると『Ubuntu 2x.xx.x LTS のアップグレードが利用可能です』というウィンドウが上がってきます。
**`アップグレードしない`**を選択。
更に『Ubuntu 2x.xx.x LTS へのアップグレードを拒絶』と表示。
**`OK`**を選択。
同じ頃に『Ubuntu 18.04のリリース後に、ソフトウェアがアップデートされました。今すぐインストールしますか？』というウィンドウが上がってきます。
こちらは**`今すぐインストールする`**を選択。
パスワードの入力を求められるので、最初のUbuntu自体のインストール時に設定したパスワードを入力。

インストールの進捗状況は横にあるタスクバーの【Ａ】のアイコンを押すと表示されます。

そこそこ時間がかかるので、左下の**`アプリケーションを表示する（白●が３ｘ３の９つ並んだアイコン）-> 設定 -> 電源管理`**を選択し**`ブランクスクリーン`**を**`５分`**から**`しない`**に変更します。

これで、インストール待ちの間に画面が消えて焦ることが無くなります。
この状態でソフトウェアの更新が終わるまで待ちます。
終わったら**`すぐに再起動`**を選択して、**<font color="Red">再起動</font>**します。

再起動が完了したら**`Ctrl＋Alt＋T`**を押します（**`アプリケーションを表示する -> 端末`**を選んでもよい）。
これで**`端末`**（そういうアプリ名）が起動します。
要するに他ではコマンドプロンプトとか、ターミナルと言われているものです。
後々、頻繁に使うのでタスクバーの**`端末`**のアイコンを右クリックして『お気に入りに追加』しておくと良いです。
以下、黒背景の所は**`端末`**に入力するコマンドです。

**`端末`**を起動したら、まず

```bash
sudo apt -y update
```

を実行。
次に

```bash
sudo apt -y upgrade
```

を実行します。
頭に**`sudo`**を付けて実行する場合、パスワードを求められる事があります。
これは管理者権限でプログラムを実行するという事を表します。
以下、パスワードを求められた時についての記述は省略します。
ちなみに**`-y`**はコマンド実行中にy/nの選択が出てきた場合、自動的にyを選択するという意味です。

### 必要なパッケージをインストール
* ドライバのビルドに必要

```bash
sudo apt -y install build-essential
```

* git clone等するのに必要

```bash
sudo apt -y install git
```

* PyAudioに必要

```bash
sudo apt -y install portaudio19-dev
```

* SSHサーバーのインストール（必要な場合）

```bash
sudo apt -y install openssh-server
```

* その他、念の為

```bash
sudo apt -y install ffmpeg
sudo apt -y install sox
```

## ３．nVIDIAドライバのインストール

予め、nVIDIAのサイトからドライバをダウンロードしておきます。
ドライバなどダウンロードしたものは、homeディレクトリ直下の**`ダウンロード`**に保存されてるものとして記事を進めます。
ドライバは以下から入手しました。
今回はバージョン: 418.113を使用します。
https://www.nvidia.com/ja-jp/drivers/unix/linux-amd64-display-archive/

次に最初からインストールされている互換ドライバ（nouveau）を無効化します。

#### nouveau無効化１
『blacklist-nouveau.conf』を編集します。

```bash
sudo nano /etc/modprobe.d/blacklist-nouveau.conf
```

下記の２行を追加。
>blacklist nouveau
>options nouveau modeset=0

nanoエディタの使い方は、
**`Ctrl+O`** -> **`Enter`** で保存。
**`Ctrl+X`** で終了します。
エディタについては色々派閥があるようで、ここは自分の好きなエディタで全然構いません。

#### nouveau無効化２
『nouveau_blacklist.conf』を編集します。

```bash
sudo nano /etc/modprobe.d/nouveau_blacklist.conf
```

下記の１行を追加。
>blacklist nouveau

どちらか、片方でよいと思いますが、どっちが正解かわからないので両方編集します。
編集が終わったら**<font color="Red">再起動</font>**をします。
再起動後、解像度が640x480に変わります。

#### アクセス権変更

```bash
chmod +x ./ダウンロード/NVIDIA-Linux-x86_64-418.113.run
```

#### ドライバのインストールを開始します

```bash
sudo ./ダウンロード/NVIDIA-Linux-x86_64-418.113.run
```

**`Continue installat`**を選択
![1レイヤー 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/ca849368-dce8-8916-4914-07f1a554d91c.png)

**`OK`**を押下
![1レイヤー 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/f80ed0d0-6be1-e197-227b-cd6a3af274b9.png)

**`Install and o`**を選択
![1レイヤー 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/fcc8f4fa-3a4a-0008-06c7-19d144e473db.png)

**`Yes`**を選択
![1レイヤー 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/4b58dbb2-97b5-2bdf-16e2-4fb226834024.png)

**`OK`**を押下

**`端末`**が、入力可能な状態に戻ればドライバのインストール完了です。
**<font color="Red">再起動</font>**をします。
再起動後、解像度が元に戻ります。

**`アプリケーションを表示する -> 設定 -> 詳細 -> このシステムについて`**のグラフィックが変わっている事を確認します。
![3Screenshot from 2021-07-05 17-37-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/50d9e24e-d099-a39c-6025-b653e021a649.png)


```bash
nvidia-smi
```

も実行して、ドライバが正しくインストールされているか確認します。

## ４．CUDAのインストール
nVIDIAのサイトからCUDAをダウンロードします。
https://developer.nvidia.com/cuda-toolkit-archive

今回は**`CUDA Toolkit 10.1 update2`**を使う事前提に記事を進めます。
**`CUDA Toolkit 10.1 update2`**のリンクを開きます。
更に LINUX -> x86_64 -> Ubuntu -> 18.04 -> runfile(local) と開いていきます。

開いた先にある**`wget https://～～～`**の１行を**`端末`**に張り付けて実行。
これでダウンロードが開始されhomeディレクトリに保存されます。
ダウンロードしたファイルを**`ダウンロード`**ディレクトリに移動。

#### アクセス権変更（念の為）

```bash
chmod +x ./ダウンロード/cuda_10.1.243_418.87.00_linux.run
```

#### CUDAのインストールを開始します（nVIDIAのサイトの２行目とほぼ同じ意味）

```bash
sudo ./ダウンロード/cuda_10.1.243_418.87.00_linux.run
```

↓下の画面で**`accept`**と入力して**`Enter`**。
画面が出るまで結構時間がかかります。
![レイヤー 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/5d1c3eb4-a286-0767-2508-9ed8a7c02f26.png)

**`Driver`**のチェックを外して、**`Install`**を押します。
![レイヤー 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/763847ca-bc9c-1ba5-6db2-7cabc6669b82.png)
![レイヤー 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/dc0bd87f-f548-1b21-2c1d-2917db8aeeea.png)

この後も、インストールが完了するまで、かなり時間がかかります。
WARNINGが出て、インストールが完了。
WARNINGですが、インストールは完了しているはずです。
![レイヤー 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/869705ab-3194-9dfc-3e6d-3f6348f7c138.png)

homeディレクトリ直下にある隠しファイル**`.bashrc`**を編集します。

```bash
sudo nano .bashrc
```
↓キーを押し続け、一番最後に以下の文章を追記します。
>export CUDA_PATH=/usr/local/cuda
>export PATH=\$CUDA_PATH/bin:\$PATH
>export CFLAGS=-I/usr/local/cuda/include
>export LDFLAGS=-L/usr/local/cuda/lib64
>export LD_LIBRARY_PATH=/usr/local/cuda/lib64:\$LD_LIBRARY_PATH

編集が完了したら**<font color="Red">再起動</font>**をします。
再起動後、

```bash
nvcc -V
```

を実行してCUDAが正常にインストールされている事を確認します。
![レイヤー 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/d2cff268-e831-22cc-b615-47245fe6fec3.png)

## ５．cuDNNのインストール
nVIDIAのサイトからcuDNNをダウンロードします。
ダウンロードにはデベロッパー登録が必要です。
https://developer.nvidia.com/cudnn-download-survey

ログインすると、ソフトウェア使用許諾契約の条件に同意するか英語で聞いてくるので、チェックを入れて同意します。
チェックを入れるといくつかリンクが表示されるので、**`Archived cuDNN Releases`**を押します。
先の章でCUDA10.1をインストールしたので、CUDAは10.1、tensorflow-2.3を使用したいので、以下のリンク先の表を根拠にcuDNNの7.6系統を選びます。
https://www.tensorflow.org/install/source

**`Download cuDNN v7.6.5 (November 5th, 2019), for CUDA 10.1`**を押します。
リンクを押すと、また大量にリンクが表示されるので**`Library for Windows, Mac, Linux, Ubuntu and RedHat/Centos(x86_64architecture)`**以下の**`cuDNN Runtime Library for Ubuntu18.04 (Deb)`**、**`cuDNN Developer Library for Ubuntu18.04 (Deb)`**、**`cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)`**の３つのファイルをダウンロードします。

ダウンロードしたファイルを何も無し、-dev付き、-doc付きと順番に実行していきます。

```bash
sudo dpkg -i ./ダウンロード/libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
```

```bash
sudo dpkg -i ./ダウンロード/libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
```

```bash
sudo dpkg -i ./ダウンロード/libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb
```

これでインストール完了。

### 動作チェック
サンプルプログラムをHOMEディレクトリにコピーし、コピーしたディレクトリにカレントディレクトリを移動し、ビルドします。

```bash
cp -r /usr/src/cudnn_samples_v7/ $HOME
cd  $HOME/cudnn_samples_v7/mnistCUDNN
make clean && make
```

サンプルプログラムを実行します。

```bash
./mnistCUDNN
```

最後に『Test Passed!』と表示されれば、成功です。
![レイヤー 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939612/6de49143-58b1-e04a-d6d6-77784126e4c2.png)

## ６．node.jsのインストール

先ほどの作業でカレントディレクトリが変わってしまっているので、homeディレクトリに戻します。

```bash
cd ~
```


とりあえず、インストール。

```bash
sudo apt -y install nodejs npm
```

バージョンの確認を確認します。

```bash
nodejs -v
npm -v
```

かなり古いバージョンがインストールされていると思います。

バージョン管理ツールをグローバルにインストール。

```bash
sudo node install -g n
```

**`nodejs`**の最新のLTS版をインストール。

```bash
sudo n lts
```

古い**`nodejs`**はもう使わないのでを削除。

```bash
sudo apt remove --purge nodejs npm
```

削除が終わったら**<font color="Red">再起動</font>**をします。

**`npm`**をアップデート。

```bash
sudo npm install -g npm
```

再びバージョンを確認。

```bash
node -v
npm -v
```

いつ頃、この作業を行なったかによって表示されるバージョンは変わると思います。
とりあえず、最初のバージョンチェックより後のバージョンチェックの方がバージョンが上がっていれば大丈夫だと思います。
最後に関連パッケージのインストールします。

```bash
npm install command-line-args
npm install underscore.string
npm install underscore
npm install fs-extra
npm install ervy
npm install simple-statistics
```

## ７．Python3.7のインストール

Ubuntu Desktop 18.04 LTSにデフォルトでインストールされているのは**`Python3.6`**なので、**`Python3.7`**をインストールします。
あえて、**`Python3.7`**をインストールしましたが、**`Python3.6`**の方がもしかしたら良いかもしれません。

**`Python3.7`**をインストール。

```bash
sudo apt -y install python3.7
```
**`python`**と**`python3`**のシンボリックリンクを一度削除、**`python`**と**`python3`**のシンボリックリンクを両方とも**`Python3.7`**に付け替えます。
その後、**`pip`**と**`python3.7-dev`**をインストールします。

```bash
sudo rm /usr/bin/python /usr/bin/python3
sudo ln -s /usr/bin/python3.7 /usr/bin/python
sudo ln -s /usr/bin/python3.7 /usr/bin/python3
sudo apt -y install python3-pip python3.7-dev
```

**`python3`**のみシンボリックリンク削除、**`python3`**のシンボリックリンクを**`Python3.6`**に付け替えて元の状態に戻す。（**`Python3.6`**がシステムで使用されている為）

```bash
sudo rm /usr/bin/python3
sudo ln -s /usr/bin/python3.6 /usr/bin/python3
```
**※注意 Python3.7のインストール開始から、ここまでの間に、もし、`端末`を閉じてしまった場合、Ubuntu本体や`端末`が起動しなくなる可能性があります。**

**`pip`**の最新版を入手、インストール。

```bash
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
```

**`Python`**と**`pip`**のバージョン確認。

```bash
python -V
pip -V
```

**`pythonは3.7.x`**に、**`pip`**は**`20`**以上のバージョンになっていると思います。
シンボリックリンクの状態を確認。

```bash
ll /usr/bin/py*
```

>/usr/bin/python -> /usr/bin/python3.7
>/usr/bin/python3 -> /usr/bin/python3.6

出てきたリストの中に上記のものがあればＯＫです。

## ８．Pythonパッケージのインストール

```bash
pip install numba==0.48.0
pip install cupy-cuda101==5.4.0
pip install chainer==5.4.0
pip install librosa==0.6.3
pip install pysptk==0.1.18
pip install pyworld==0.3.0
pip install fastdtw==0.3.4
pip install matplotlib==3.1.3
pip install launchpadlib==1.10.6
pip install tensorflow-gpu==2.3.3
pip install tensorboard-chainer==0.5.3
pip install tqdm==4.61.1
pip install PyYAML==3.12
pip install pynput==1.7.3
pip install world4py==0.1.1
pip install PyAudio==0.2.11
pip install Pillow==8.2.0
pip install numpy==1.20.3
```

**`numpy 1.20.3`**を**`tensorflow-gpu 2.3.3`**より後に入れるのがポイントです。
**`tensorflow-gpu 2.3.3`**のインストール条件に**`numpy`** **`1.16.0以上`** **`1.19.0以下`**というものがあり、**`numpy 1.18.5`**が強制的にインストールされてしまいます。
**`numpy 1.20.3`**を後から入れる事により**`numpy 1.18.5`**上書きします。
**`numpy 1.20.3`**インストール時に**`tensorflow-gpu 2.3.3`**のインストール条件を満たさなくなるというエラーは出ますが、うちの環境では問題なく動いています。

## ９．終わりに

以上で環境構築編は終わりです。
後は**`git clone`**でyukarinライブラリを持ってきて、**`PYTHONPATH`**に指定すれば動くはずです。
もしかしたら、音声データ作成編、yukarinライブラリ起動編に続くかもしれません。
最後に……、サンプリングレート22050Hzの使用は、色々とトラブルを引き起こす可能性が高いのでお勧めしません。