オーディオドラマ自動生成「WavJourney」をEC2で構築する

短いプロンプトを入力するだけで、オーディオドラマなどの音声コンテンツを自動生成できるWavJourneyが発表されました。

https://github.com/Audio-AGI/WavJourney

スクリプトの生成から、Text-to-Speech、Text-to-Audio、Text-to-Musicを使った音声合成まで全自動で行ってくれ、複数話者による音声コンテンツを気軽に作成することができます。

WavJourneyは[Hugging Face](https://huggingface.co/spaces/Audio-AGI/WavJourney)内で試すことが出来る他、開発者向けにDockerコンテナでの実行が出来るようになっています。

しかし、コンテナでの実行のためにはGPUが必要となってくるため、今回はAWSのEC2インスタンス内でDockerコンテナを実行する方法を紹介します。

## GitHub上のDockerfileを編集

上であげたGithub内に、Dockerコンテナ生成用のDockerfileが一応ありますが、EC2上でコンテナが作成できるようにいくつか編集を行います。

以下の通りコピペしてください。

```
FROM nvidia/cuda:11.7.1-cudnn8-devel-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y --no-install-recommends \
    git \
    git-lfs \
    wget \
    curl \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    libncursesw5-dev \
    xz-utils \
    tk-dev \
    libxml2-dev \
    libxmlsec1-dev \
    libffi-dev \
    liblzma-dev \
    ffmpeg \
    libsndfile-dev && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Install miniconda
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
    && bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3 \
    && rm -f Miniconda3-latest-Linux-x86_64.sh

# Set up a new user named "user" with user ID 1000
RUN useradd -m -u 1000 user

# Switch to the "user" user
USER user

# Add conda binary to PATH variable
ENV HOME=/home/user \
    PATH=/opt/miniconda3/bin:/home/user/.local/bin:$PATH \
    CONDA_PREFIX=/opt/miniconda3/envs
RUN mkdir $HOME/app
WORKDIR $HOME/app
COPY --chown=user . $HOME/app

# Conda envs setup 
RUN bash ./scripts/EnvsSetup.sh

# pre-download all models
RUN conda run --live-stream -n WavJourney python scripts/download_models.py
RUN mkdir $HOME/app/services_logs

# WAVJOURNEYサービスの環境変数を設定
ENV WAVJOURNEY_SERVICE_PORT=8021
ENV WAVJOURNEY_SERVICE_URL=127.0.0.1
ENV WAVJOURNEY_MAX_SCRIPT_LINES=999
ENV WAVJOURNEY_OPENAI_KEY=

# entrypoint
ENTRYPOINT bash /home/user/app/scripts/start_service_and_ui.sh

```

一番のハマりポイントとしては、EC2内では、`$HOME/app`内`COPY`する前にそのレポジトリを`mkdir`で作成しておく必要があるということでした。

また、環境変数の`WAVJOURNEY_OPENAI_KEY`には、ご自身のAPIキーを入れてください。

## AWSのEC2インスタンスを作成

ここから、実際にEC2にデプロイしていきます。
WavJourneyの実行にはGPUが必要（CPUでも出来なくはないが実行時間がすごくかかる）なため、EC2インスタンスもGPUをサポートしているものを選ぶ必要があります。
しかしデフォルトではGPUインスタンスを作れないようになっているので、事前に緩和申請を出す必要があります。

#### AWSインスタンス構成
- インスタンスタイプ：g4dn.xlarge
- AMI：Deep Learning Base GPU AMI (Ubuntu 20.04) 
- ストレージ：256GB以上

GPUインスタンスは、一番安いものを選択しています。それでも1日動かすと7USDほどかかるので気をつけてください。
GPUをプログラムから使うにはいくつかドライバが必要となりますが、それをすでにインストールしてくれているAMIを選択します。
WavJourneyのコンテナイメージは50GBほどあるので、ストレージは余裕を持って設定しましょう。

## Dockerコンテナを作成

作成したGPUインスタンスにSSHで入った後、以下のコマンドを実行してGPU関連のドライバが使えるか確認しましょう。
```python
nvidia-smi  ## GPU
nvcc -V  ## CUDA
nvidia-docker info  ## nvidia-docker
```
何かしらの情報が表示されればOKです。

Gitからコードを引っぱってきたら以下のコマンドでDockerイメージを作成し、コンテナを立ち上げましょう。
特にbuildはかなり時間がかかります。

```
docker build .
nvidia-docker run IMAGE_ID
```

ポイントとしては、runするときに、通常の`docker run`ではなく、`nvidia-docker run`を使用することです。そうすることで、Dockerコンテナ内からでもGPUが使えるようになります。

コンテナが立ち上がったら、中に入ってconda環境を作成します。

```python
docker exec -it CONTAINER_ID bash
conda init
exit  ## 一度抜ける
docker exec -it CONTAINER_ID
conda activate WavJourney
```

ここまでで準備は完了です。

## 音声コンテンツを作成する

Githubにもありますが、以下のようなコードで音声コンテンツを作成しましょう。
```python
python wavjourney_cli.py -f --input-text "Generate a one-minute introduction to quantum mechanics" 
```



最後に、WavJourneyの論文を紹介しておきます。どのように音声コンテンツを生成しているかがわかります。

https://arxiv.org/pdf/2307.14335.pdf