【AI音生成】AudioCraftを用いてテキストから効果音を生成する🎶

# はじめに
今回はMetaのAudioCraftを用いてText to Audioを試してみたいと思います！
ChatGPTを台頭にGAI(General AI)が流行しており，画像や動画，テキスト間で自由に生成をすることが可能になっています．もちろん音もその対象であり，様々なモデルが公開されています．
しかし，調べてみると，意外とText to Speechのものが多く，音楽や効果音を生成するのではなく，テキストの読み上げを行うものが多いです．

:::note warn
このSpeechやAudio(Sound)の定義は曖昧で，モデルによってAudioと書かれていてもSpeechに該当するものなどがあります(ここではAudio = 効果音とします)．
:::

代表的なText-to-Audioツールとして以下のものがあります
- [stale-audio-tools](https://github.com/Stability-AI/stable-audio-tools)
- [AudioLDM2](https://github.com/haoheliu/AudioLDM2)
- [AudioCraft](https://github.com/facebookresearch/audiocraft/tree/main)

stable-audio-toolsはNVIDIAのGPUが必要です．また，2024年の4月現在，学習済みのモデルも出回っていないので，使いづらい部分があります．また，AudioLDM2もAppleシリコン下の環境でうまく動作できませんでした.
そのため，今回はAudioCraftを用います．CPUのみでも動作できたのでぜひ試してみてください！

# AudioCraft
AudioCraftは音生成を行うPyTorchのライブラリです．

https://github.com/facebookresearch/audiocraft/tree/main

詳細を知りたい方は以下のリンク先をご覧ください
- [公式ページ](https://audiocraft.metademolab.com)
- [各モデルの論文](https://ai.meta.com/resources/models-and-libraries/audiocraft/)

以下のモデルを使用します

https://huggingface.co/facebook/audiogen-medium

# 実行環境
OS：macOS Sonoma 14.4.1
Chip：Apple M3 Pro
Python：3.10.4

# 環境構築
それでは，AudioCraftを使用するための環境を構築していきます．
依存するパッケージのバージョン制約が厳しいので，`venv`を用いて仮想環境上で実施します．
仮想環境上でバージョン2.1.0のPyTorchをインストールしたいので，**Python3.10.4**を使用します．対応するバージョンのPythonが入っていない場合は`pyenv`などを用いてインストールしてください．
```shell
python3 -m venv venv
source venv/bin/activate
```
仮想環境に入ったら`python -V`でPythonのバージョンを確認してください．

続いて，依存するライブラリをインストールしていきます．基本的には[公式で書かれている](https://github.com/facebookresearch/audiocraft/tree/main)通りに実施します．
```shell
python -m pip install 'torch==2.1.0'
python -m pip install 'torchvision==0.16.0'
python -m pip install setuptools wheel
python -m pip install -U audiocraft 
python -m pip install -U git+https://git@github.com/facebookresearch/audiocraft#egg=audiocraft
```
公式と違うところは，`torchvision`のバージョンを指定してダウンロードしています．**バージョン0.16.0**以外では依存関係の影響でうまく動作しません．公式レポジトリをクローンしてきて，`python -m pip install -e . `で一括してダウンロードすることもできます(`torchvision`など依存関係の問題があった場合は適宜対応してください)．
また，`ffmpeg`もインストールしておきます．Macだと`brew`でインストールできます．
```
brew install ffmpeg
```

# AudioCraftを試してみる！
テキストから効果音を生成してみましょう！以下のコードを使用します．
```python:text2audio.py
import torchaudio
from audiocraft.models import AudioGen
from audiocraft.data.audio import audio_write
import argparse


""" Input text and convert text to audio """
def text2audio(prompt: str):
    model = AudioGen.get_pretrained('facebook/audiogen-medium')
    model.set_generation_params(duration=5)  # Set duration
    wav = model.generate(prompt) # output: list of torch.Tensor as wav

    for idx, one_wav in enumerate(wav):
        # Will save under {idx}.wav, with loudness normalization at -14 db LUFS.
        audio_write(f'{idx}', one_wav.cpu(), model.sample_rate, strategy="loudness", loudness_compressor=True)
        
def main():
    parser = argparse.ArgumentParser(description='prompt')
    parser.add_argument('-p', type=str, help='Prompt to convert to audio')
    args = parser.parse_args()
    text2audio(args.p)
    print("Audio file saved successfully")
    
if __name__ == "__main__":
    main()
```
実行方法は，`python text2audio.py -p <prompt>`で，`prompt`の部分にテキストを入力します．`duration=5`としているので，5秒のwavファイルが生成されます．`prompt`はリスト形式でも入力でき，その場合は要素の数だけファイルが生成されます．
ローカルのCPUで実行すると，3~5分ほど生成に時間がかかります．

# まとめ
今回はAudioCraftを用いてテキストから効果音を生成してみました！
ローカルで実行すると，時間がかかってしまって実用的ではありません．かといってAWS EC2などのクラウドサービスではコストがかかってしまいます．
[Modal](https://modal.com)というサービスを利用すると，リモートにDockerのようなコンテナを作成することができ，そのコンテナ上でGPUを使用できます．毎月クレジットが配布され，使用料もお手頃なのでオススメです！！
AudioCraftには[音楽を生成するモデル](https://github.com/facebookresearch/audiocraft/blob/main/docs/MUSICGEN.md)もあるので，音楽を生成してみても面白いかもしれません！ぜひ試してみてください✨