Zonos:高精度な感情表現が可能な音声生成AIを使ってみた (on Paperspace Gradient)

最近、AIによる音声合成技術の進歩が著しく、その中でも注目を集めているのが Zonos というプロジェクトです。Zonosは日本語を含む多言語に対応し、感情や話速などの細かなパラメータを自由にコントロールできる音声生成AIです。今回は、このZonosを実際にPaperspace Gradient上で動かしてみた手順を共有します。


環境構築

Zonosは、色々と情報が見当たらないので、実行に必要な環境が良く分からないです。なので、PyTorchやCUDAなどの環境は、ひとまず最近私が使ってる環境を導入しました。とりあえず動いてるので、問題ないと信じています。

CUDAのインストール(バージョン12.4)

# CUDAをバージョン12.4に変更
!sudo apt-get --purge remove "cuda" -y
!wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
!sudo dpkg -y -i cuda-keyring_1.1-1_all.deb
!sudo apt-get update
!sudo apt-get -y install cuda-toolkit-12-4

必要なPythonライブラリのインストール

音声合成や前処理に必要なライブラリ群をまとめてインストールします:

!pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu124
!pip install bitsandbytes==0.37.0 cached_path click ema_pytorch==0.5.2 inflect==7.5.0 jieba kanjize==1.5.0 librosa matplotlib phonemizer==3.3.0 pydub pypinyin safetensors soundfile==0.13.1 sudachidict-full==20241021 sudachipy==0.6.10 tomli torchdiffeq tqdm==4.65.0 transformers==4.48.1 wandb x_transformers==1.31.14 einops
!apt update && apt install -y espeak-ng
!pip install numpy==1.24.4
!pip install scipy==1.13.3
!pip install scikit-learn==1.6.1
!pip install triton
!pip install gradio

Zonosのクローンと初期化

次に、GitHub上のZonosリポジトリをクローンし、作業ディレクトリに移動します。

%cd /notebooks/
!git clone https://github.com/Zyphra/Zonos
%cd /notebooks/Zonos

音声生成コードの解説

モデルの読み込みと初期化

import torch
import torchaudio
from zonos.model import Zonos
from zonos.conditioning import make_cond_dict
from zonos.utils import DEFAULT_DEVICE as device

model = Zonos.from_pretrained("Zyphra/Zonos-v0.1-transformer", device=device)

話者埋め込み(speaker embedding)の取得

事前に用意した音声(例:assets/exampleaudio.mp3)から話者情報を抽出します。

wav, sampling_rate = torchaudio.load("assets/exampleaudio.mp3")
speaker = model.make_speaker_embedding(wav, sampling_rate)

感情ベクトルの設定

以下の8つの感情要素をベクトルとして与えることができます:

  • Happiness(幸福)
  • Sadness(悲しみ)
  • Disgust(嫌悪)
  • Fear(恐怖)
  • Surprise(驚き)
  • Anger(怒り)
  • Other(その他)
  • Neutral(中立)
emotion_vector = torch.tensor([
0.05, # 幸福
0.35, # 悲しみ
0.05, # 嫌悪
0.15, # 恐怖
0.4, # 驚き
0.05, # 怒り
0.0, # その他
0.0 # 中立
], device=device).unsqueeze(0)

音声条件の設定

読み上げるテキストや、音声を生成する言語、感情ベクトル、ピッチなどのパラメータをセットできるようです。この項目も説明が見当たらなかったので、Gradioのソースに書いてあるパラメータをテキトーに渡してるだけです。

なのでコメントアウトしている変数を入れても動作はしますが、それらのパラメータを入れると生成される音声が変になってる気がするので、ひとまずコメントアウトしてます。

なお、以下のコードにあるパラメータの意味の説明は、Perplexityで検索した項目なので真偽は不明です。

cond_dict = make_cond_dict(
text='''急激な円高ドル安が進んでいます。米中対立が現実なものに。''',
speaker=speaker,
language="ja",
emotion=emotion_vector,
# speaking_rate=15, # 話速:5(遅い)~30(速い)
# pitch_std=-0.0, # ピッチ調整:-1.0~1.0
# fmax=12000, # 最大周波数(音質調整)
# vqscore_8=1.0, # 音質(0.0~1.0)

# dnsmos_ovrl=4.5, # 音声品質を高める設定(0.0~5.0)
# speaker_noised=True, # # ノイズを有効化.音声生成時に微妙な変化を与えるらしい。
)

音声の生成と保存

conditioning = model.prepare_conditioning(cond_dict)
codes = model.generate(conditioning)
wavs = model.autoencoder.decode(codes).cpu()
torchaudio.save("sample.wav", wavs[0], model.autoencoder.sampling_rate)

音声のテスト再生

# Play the generated audio directly in the notebook
from IPython.display import Audio
Audio("sample.wav")

結果

音声生成はできたが、パラメータがありすぎて調整方法はよく分からない。感情パラメータの部分は面白いと思った。パラメータ設定をミスると、日本語(ja)を指定してるにも関わらず韓国語っぽくなったりする気がする。

【Option】Gradioの起動

もし、GUIを使いたいなら、以下を実行すると良い。

!python gradio_interface.py 

おわりに

Zonosは感情表現を詳細にコントロールできる点が非常に魅力的で、研究用途はもちろん、ゲームやナレーションなどの実用分野にも活用できそうです。上記のような手順で比較的簡単に試せるので、興味のある方はぜひGitHubから導入してみてください。

なお、この記事は作成したソースコードに基づきAIに生成させたものを修正して制作しました。

コメント

タイトルとURLをコピーしました