最近、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に生成させたものを修正して制作しました。
コメント