VALL-E XのOSS実装を試す on Databricks

ようやく試せたので。

# 導入

VALL-E XはマルチリンガルなText-to-Speechのモデルです。[Microsoftの論文](https://arxiv.org/pdf/2303.03926.pdf)で発表されていますが、OSSで実装された方がおり、今回はそれを試してみます。

https://github.com/Plachtaa/VALL-E-X

検証はいつものようにDatabricksで行っていますので、Databricks上で動くやり方で行っています。
クラスタはg4dn.xlarge、DBRは13.3LTS MLです。

# Step1. インストール

githubの[Install](https://github.com/Plachtaa/VALL-E-X#-installation)をベースに、モデルのダウンロードと必要なモジュールをインストールします。

## モデルのダウンロード

以下から、checkpointファイルをダウンロードします。

https://huggingface.co/Plachta/VALL-E-X/resolve/main/vallex-checkpoint.pt

ダウンロード後、Unity Catalogのボリュームにアップしてください。
今回は```/Volumes/training/llm/model_snapshots/vall-e-x```に置いたものとします。

## リポジトリのクローン

ノートブックを作成し、以下のコードを実行してリポジトリをクローンします。
※　本来はReposを使う方がオススメです。今回は試用なのでノートブック上で実行しています。

```python
%sh git clone https://github.com/Plachtaa/VALL-E-X.git
```

必要なモジュールをインストール。

```python
%pip install -r /databricks/driver/VALL-E-X/requirements.txt
```

クローンしたリポジトリにパスを通します。

```python
import sys

sys.path.append("/databricks/driver/VALL-E-X")
```

リポジトリの相対指定でファイルパスが指定されているものがいくつかあるので、ワーキングディレクトリをクローンしたリポジトリのパスに変更します。

```python
import os

os.chdir("/databricks/driver/VALL-E-X")
```

モジュールをロード。
また、モデルのパスをチェックポイントファイルがある場所に変更しておきます。

```python
import utils.generation
from utils.generation import SAMPLE_RATE, generate_audio, preload_models
from scipy.io.wavfile import write as write_wav
from IPython.display import Audio

utils.generation.checkpoints_dir = "/Volumes/training/llm/model_snapshots/vall-e-x"
```

モデルをロード。

```python
# download and load all models
preload_models()
```

# Spte2. TTSを実行

[ここ](https://github.com/Plachtaa/VALL-E-X#-usage-in-python)のサンプルを実行してみます。

```python
# generate audio from text
text_prompt = """
Hello, my name is Nose. And uh, and I like hamburger. Hahaha... But I also have other interests such as playing tactic toast.
"""
audio_array = generate_audio(text_prompt)

# save audio to disk
write_wav("vallex_generation.wav", SAMPLE_RATE, audio_array)

# play text in notebook
Audio(audio_array, rate=SAMPLE_RATE)
```

数秒程度で音声生成ができます。是非実行してみてもらいたいのですが、割と自然な感じで生成されます。
特段指定しない場合は男性声になるのかな。

次は日本語かつ音声プロンプトを変更してみます。
標準で用意されている音声プロンプトの一覧は[こちら](https://github.com/Plachtaa/VALL-E-X/tree/master/presets)。

```python
text_prompt = """
こんにちは！元気ですか？今日は生成AIについて解説しますね。
"""

# prompt引数にpresetの名称を入れると、異なる声色で生成される
audio_array = generate_audio(text_prompt, prompt="rosalia")

# save audio to disk
write_wav("vallex_generation.wav", SAMPLE_RATE, audio_array)

# play text in notebook
Audio(audio_array, rate=SAMPLE_RATE)
```

こちらも問題なく生成できました。
また、女性声のプロンプトを指定したので、少しハスキーな女性声で生成されます。

# Spte3. Voice Cloningを実行

VALL-E Xの目玉(?)機能である、Voice Cloningも試します。
これは3～10秒程度の音声ファイルを基に独自の音声プロンプトを作れる機能です。

下記のコードで数秒で音声プロンプトが作成できます。

```python
from utils.prompt_making import make_prompt

### Use given transcript
make_prompt(
    name="sampel1",
    audio_prompt_path="音声ファイルのパス",
    transcript="音声の中でしゃべっている内容のテキスト",
)
```

音声ファイルはwavだけではなく、mp3とかもいけるみたいでした。
（私はmp3のファイルをアップして試しました）

作成した音声プロンプトは```generate_audio```のprompt引数で指定することで利用できます。

```python
text_prompt = """
こんにちは！元気ですか？今日は生成AIについて解説しますね。
"""
audio_array = generate_audio(text_prompt, prompt="sample1")

write_wav("vallex_generation.wav", SAMPLE_RATE, audio_array)
Audio(audio_array, rate=SAMPLE_RATE)
```

聞いてみないとわからないと思いますが、確かに元の音声に近い内容で生成されます。

# 感想

生成される音声は凄く高品質というわけではないのですが、非常に滑らかな発話で生成されました。
アクセント（イントネーション）がおかしいところがあるのは、従来のTTSと同じ感じかなあ。
ただ、generate_audioの引数でaccent指定もできるので、調整するともっと自然になるのかも。

GPUのVRAMも3～4GB程度の消費量でしたので、品質の割にそこまで重くもなく、使いやすいモジュールかなと思いました。
特に、Voice Cloningがここまで手軽にできるのは凄いと思います。

Presetも豊富に作られているみたいなので、いろいろ試してみようと思います。
ストリーミング用途には難しそうですが、LLMが生成したテキストをしゃべらせるのもおもしろそう。

# まとめ

音声領域も楽しいなあ。（仕事上の利用が難しそうですが。。。）