RVC Web-UI を AmazonLinux2023 で構築してみた

# はじめに
[おめシスの動画](https://www.youtube.com/watch?v=pGflRGTXInQ) を見て、「私もボイチェンやってみたい！」と思い、RVC なるツールの Web UI （サーバーサイド）を立ち上げてみました。

:::note warn
この記事の手順で、ひとまず http でアクセスできるところまでは確認できました。しかし、traning したりは試していないので、これで本当に動くかは全く保証がありません。
:::

とりあえず試してみたい人の足掛かりになればなと。フィードバックいただけたら記事を修正するので、あわよくば有識者の方々のご指導をいただきたい気持ちです。

なお、執筆にあたっては以下のサイトを参考にさせていただいています。

https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI

# RVC Web-UI を構築する

## 1. EC2 インスタンスを起動する

ffmpeg のパッケージが AMD ベースのものしか見つからなかったので、EC2 も AMD のプロセッサを採用した [m6a ファミリ](https://aws.amazon.com/jp/blogs/news/new-amazon-ec2-m6a-instances-powered-by-3rd-gen-amd-epyc-processors/) を利用します。
AMI は ID をわざわざ指定しなくても、EC2 インスタンスの起動ウィザードで選択できるやつで大丈夫だと思います。

| 項目 | 設定値 |
|:---|:---|
|インスタンスタイプ|m6a.large|
|リージョン|東京リージョン|
|AMI ID|ami-01b32aa8589df6208|

ちなみに一度 T 系ファミリで試したのですが、poetry か何かのインストールで CPU 100% に張り付いたまま進まなくなったので、諦めました。
上表以外のパラメータは特に気にしていません。（インターネットへの Outbound 通信はできるサブネットで起動してください。）

これ以降の手順では `ec2-user` でログインし、そのホームディレクトリから開始する前提で紹介していきます。

::: note info
私は悪いエンジニアなので、最初は全部 `root` でやっていたんですが、途中で「root だとうまく動かないかも」みたいな warn メッセージに出くわしたので、大人しく `ec2-user` で一からやり直しました。
:::

## 2. 開発関連ツールをインストールする

gcc でコンパイルしているっぽいパートがあるので、予め開発系のパッケージを入れておきます。
わざわざ全部入れなくても絞れるかもしれませんが、Try & Error するのが手間だったのでまとめてインストールします。

```shell-session:開発ツールのインストール
$ sudo yum groupinstall development
```

## 3. python パッケージのインストール

前述の github では python のコマンドが `python3` として登場しますが、下記の手順で python を導入すればデフォルトで `python3` がインストールされるので、 `3` の部分は不要になります。

```shell-session:python のインストール
$ sudo yum install python pip python-devel
```

## 4. Getting Started に従う

ここは言われている通りに。 faiss は MacOS で必要になるようなことが書いてありますが、AmazonLinux でもエラーを吐いたので入れておきます。前述の通り `python` です、 `3` は不要です。

```shell-session:Getting Started に従う
$ pip install torch torchvision torchaudio
$ curl -sSL https://install.python-poetry.org | python -
$ pip install faiss-cpu==1.7.0
```

## 5. コードを Clone してくる

前述のリポジトリを clone してきてから、手順に載っている pip コマンドを実行します。

```shell-session:コードを Clone してからインストール
$ git clone https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git
$ cd Retrieval-based-Voice-Conversion-WebUI/
$ pip install -r requirements.txt
```

## 6. Hugging face から必要なファイルを取得する

手順が雑だったのでコマンドを補完します。
wget を連打していますが、やりたいことは次の 2 ディレクトリ内のファイルを指定のディレクトリにダウンロードしたいだけです。（ディレクトリ指定でスマートにダウンロードできる方法があれば教えて下さい…。）

1. https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/pretrained
2. https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/uvr5_weights

```shell-session:Hugging face から必要なファイルをダウンロード
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt
$ cd pretrained/
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D32k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D40k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/D48k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G32k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G40k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/G48k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D32k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D40k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0D48k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G32k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G40k.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained/f0G48k.pth
$ cd ../uvr5_weights/
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP2-%E4%BA%BA%E5%A3%B0vocals%2B%E9%9D%9E%E4%BA%BA%E5%A3%B0instrumentals.pth
$ wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/uvr5_weights/HP5-%E4%B8%BB%E6%97%8B%E5%BE%8B%E4%BA%BA%E5%A3%B0vocals%2B%E5%85%B6%E4%BB%96instrumentals.pth
```

:::note warn
リストは更新されるかもしれないので、リポジトリを確認して下さい。
:::

## 7. ffmpeg をインストールする

参考にさせてもらったサイトの手順ほぼそのままやったので、ちょっと回りくどいことをしている気がします、このままでも動きますが、気持ち悪い人はアレンジしてください。
取得先のダウンロード URL は [こちらのページ](https://johnvansickle.com/ffmpeg/) で確認しました。

```shell-session:ffmpeg をインストールする
$ cd /usr/local/bin
$ sudo mkdir ffmpeg
$ cd ffmpeg/
$ sudo wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz
$ sudo tar -xf ffmpeg-git-amd64-static.tar.xz
$ sudo ln -s /usr/local/bin/ffmpeg/ffmpeg-git-20230313-amd64-static/ffmpeg /usr/bin/ffmpeg
$ sudo ln -s /usr/local/bin/ffmpeg/ffmpeg-git-20230313-amd64-static/ffprobe /usr/bin/ffprobe
```

## 8. 起動する

最後にもとのディレクトリに移動して起動です。

```shell-session:起動する
$ cd ~/Retrieval-based-Voice-Conversion-WebUI/
$ python infer-web.py
```

# おわりに
冒頭にも記載した通り、これで本当に使えるかはまだ試していないので、この記事の手順はあくまで参考としてください。
また、アクセス時のプロトコルは言うまでもなく `http` なので、通信の安全性も確保されていない点に注意してください。
私は ALB(https) → EC2 にしようと試みましたが、502 エラーになってしまったのでどうしようかな～って感じです。

最後に、EC2 インスタンスを利用しているので、終わった後にはインスタンス停止や削除などをお忘れなく。（忘れてしまうと課金が膨らんでしまうので…。）

以上です、ここまで読んで下さってありがとうございました～。