今期はテキストから音声を生成するモデル"DiffSound"をpretraindeモデルで動作させる方法を記載します。
入力テキストには「Birds and insects make noise during the daytime」のような文章を使用し、その文章に適した音声が生成されるというモデルになります。このモデルはテキストから音声への生成結果が良いだけでなく、生成速度も早く、従来のARデコーダの5倍の生成速度であることが論文内で示されています。
DiffSound作成者が公開しているデモページがあるのでご確認ください。
Diffsound: Discrete Diffusion Model for Text-to-sound Generation | text-to-sound-synthesis-demo
本記事のテーマ
DiffSoundのgithubだけでなく、他のモデルも組み合わせて全体のシステムが作成されているためコードの配置やpretrainモデルを配置することが難しかった。
その方法を紹介する。
論文のAbstract
人間が求める効果音を生成することは、重要なテーマである。しかし、この分野の音生成の研究はほとんどない。本研究では、テキストプロンプトを条件とした音声生成について検討し、テキストエンコーダ、VQ-VAE(Vector Quantized Variational Autoencoder)、デコーダ、ボコーダからなる新しいテキスト-音声生成フレームワークを提案する。このフレームワークは、まずデコーダでテキストエンコーダから抽出したテキスト特徴をVQ-VAEの助けを借りてメルスペクトログラムに転送し、次にボコーダで生成されたメルスペクトログラムを波形に変換するものである。その結果、デコーダが生成性能に大きく影響することがわかった。そこで、本研究では、優れたデコーダの設計に焦点を当てる。まず、従来の音声生成で最先端であることが証明されている自己回帰型復号器について説明します。しかし、ARデコーダは常にメルスペクトログラムのトークンを1つずつ順番に予測するため、一方向の偏りや誤差の累積の問題が発生する。また、ARデコーダでは、音声の長さに比例して音声生成時間が増加する。このようなARデコーダの欠点を克服するために、我々は離散拡散モデルに基づく非自己回帰型デコーダDiffsoundを提案する。具体的には、Diffsoundは1つのステップでmel-spectrogramの全てのトークンを予測し、次のステップで予測されたトークンを洗練させるため、数ステップ後に最良の予測結果を得ることが可能である。実験の結果、提案するDiffsoundはARデコーダと比較して、テキストから音声への生成結果が良好であるだけでなく、生成速度も速く、例えば、MOS: 3.56 v.s 2.786 と、ARデコーダの5倍の生成速度であることが示された。さらに、生成されたサンプルの品質を自動的に評価するために、3つの異なる客観的評価指標(例えば、FID、KL、オーディオキャプションロス)を定義し、生成サンプルの関連性と忠実度を包括的に評価できるようにした。コード、事前学習済みモデル、および生成されたサンプルを公開します 1 。
Translated by DeepL
DiffSoundを動かす
1.コードをCloneする。
git clone https://github.com/yangdongchao/Text-to-sound-Synthesis.git
2.環境構築を行う
Text-to-sound-Synthesis/Diffsound/README.md内のEnviromentに記載されているライブラリをInstallする。
※その他実行中に足りないものが出てきた場合はInstallしてください。
pip install torch==1.9.0 torchvision --no-cache-dir -U | cat
pip install omegaconf pytorch-lightning --no-cache-dir -U | cat
pip install timm==0.3.4 --no-cache-dir -U | cat
pip install tensorboard==1.15.0 --no-cache-dir -U | cat
pip install lmdb tqdm --no-cache-dir -U | cat
pip install einops ftfy --no-cache-dir -U | cat
pip install git+https://github.com/openai/DALL-E.git --no-cache-dir -U | cat
3.pre-trained modelをダウンロードする
Text-to-sound-Synthesis/Diffsound/README.md内のAbout the pre-trained modelに記載されているURLからダウンロードを行う。
4.generate_samples_batch.pyの実行
今回はREADMEのSamplingに記載されているevaluate/generate_samples_batch.pyを実行してDiffSoundを動かす。
動かすためにはスクリプト内に記載されている。Pathを自身のPCと合わせないといけない。その手順を以下に示す。
■evaluate/generate_samples_batch.py
if __name__ == '__main__':
# Note that cap_text.yaml includes the config of vagan, we must choose the right path for it.
config_path = '/work/hiro877/Text-to-sound-Synthesis/Diffsound/evaluation/caps_text.yaml'
#config_path = '/apdcephfs/share_1316500/donchaoyang/code3/VQ-Diffusion/OUTPUT/caps_train/2022-02-20T21-49-16/caps_text256.yaml'
pretrained_model_path = '/work/hiro877/Text-to-sound-Synthesis/Diffsound/OUTPUT/pretrained_model/audioset_pretrain_diffsound.pth'
save_root_ = '/apdcephfs/share_1316500/donchaoyang/code3/DiffusionFast/OUTPUT/caps_train_vgg_pre/2022-05-18T01-00-38'
random_seconds_shift = datetime.timedelta(seconds=np.random.randint(60))
key_words = 'Real_vgg_pre_399'
now = (datetime.datetime.now() - random_seconds_shift).strftime('%Y-%m-%dT%H-%M-%S')
save_root = os.path.join(save_root_, key_words + '_samples_'+now, 'caps_validation')
# print(save_root)
# assert 1==2
os.makedirs(save_root, exist_ok=True)
# val_path = 'data_root/audiocaps/new_val.csv'
val_path = 'data_root/audiocaps/new_mytest.csv'
ckpt_vocoder = 'vocoder/logs/vggsound/'
Diffsound = Diffsound(config=config_path, path=pretrained_model_path, ckpt_vocoder=ckpt_vocoder)
Diffsound.generate_sample(val_path=val_path, truncation_rate=0.85, save_root=save_root, fast=False)
設定するPathは以下の4つ。
・config_path = '/work/hiro877/Text-to-sound-Synthesis/Diffsound/evaluation/caps_text.yaml'
・pretrained_model_path = '/work/hiro877/Text-to-sound-Synthesis/Diffsound/OUTPUT/pretrained_model/audioset_pretrain_diffsound.pth'
・save_root_ = '/apdcephfs/share_1316500/donchaoyang/code3/DiffusionFast/OUTPUT/caps_train_vgg_pre/2022-05-18T01-00-38'
・val_path = 'data_root/audiocaps/new_mytest.csv'
・ckpt_vocoder = 'vocoder/logs/vggsound/'
config_path
・config_path = '/work/hiro877/Text-to-sound-Synthesis/Diffsound/evaluation/caps_text.yaml'
ここはText-to-sound-Synthesis/Diffsound/evaluationのフォルダ内に存在するcaps_text.yamlを指定すればよい。
pretrained_model_path
・pretrained_model_path = '/work/hiro877/Text-to-sound-Synthesis/Diffsound/OUTPUT/pretrained_model/audioset_pretrain_diffsound.pth'
ここは、Downloadしたフォルダ内に存在するaudioset_pretrain_diffsound.pthを配置してPathを設定する
save_root_
・save_root_ = '/apdcephfs/share_1316500/donchaoyang/code3/DiffusionFast/OUTPUT/caps_train_vgg_pre/2022-05-18T01-00-38'
ここは実行後の音声ファイルが保存されるPathであるため任意のPathを指定する。
val_path
・val_path = 'data_root/audiocaps/new_mytest.csv'
ここは元の設定のままで動作する。
このファイルが入力するテキストになるため、ここを編集することで好きな音声を生成することが出来る。
ckpt_vocoder
・ckpt_vocoder = 'vocoder/logs/vggsound/'
ここは元の設定のままで動作する。
ViT-B-32モデルのダウンロード
このまま実行すると"/apdcephfs/share_1316500/donchaoyang/code3/VQ-Diffusion/OUTPUT/pretrained_model/ViT-B-32.pt"が見つかりませんというエラーが発生する。
ViT-B-32.ptをダウンロードするにはDiffSound/sound_synthesis/modeling/modules/clip/clip.pyのload()関数内を少し変更する必要がある。
model_path = _download(_MODELS[name])のコメントアウトを外すことでモデルをダウンロードしてくれる。一度ダウンロードした後は必要ないので再度コメントアウトを行う。
ダウンロード先は_download()関数の中のdownload_targetを変更することで任意の場所に保存できる。また、load()関数内のmodel_pathの方も変更するように注意する。
def load(name: str, device: Union[str, torch.device] = "cuda" if torch.cuda.is_available() else "cpu", jit=True):
"""Load a CLIP model
Parameters
----------
name : str
A model name listed by `clip.available_models()`, or the path to a model checkpoint containing the state_dict
device : Union[str, torch.device]
The device to put the loaded model
jit : bool
Whether to load the optimized JIT model (default) or more hackable non-JIT model.
Returns
-------
model : torch.nn.Module
The CLIP model
preprocess : Callable[[PIL.Image], torch.Tensor]
A torchvision transform that converts a PIL image into a tensor that the returned model can take as its input
"""
if name in _MODELS:
model_path = _download(_MODELS[name]) ☆ここのコメントアウトを外す
# model_path = "/apdcephfs/share_1316500/donchaoyang/code3/VQ-Diffusion/OUTPUT/pretrained_model/ViT-B-32.pt"
※追記:私の使用感として下記リンクのコードからダウンロードしたモデルを使用したほうがテキストに近い音声が生成されることが分かった。
# Download ViT-B-32.pt
# aria2cのインストールが必要
aria2c https://facevcstandard.blob.core.windows.net/t-shuygu/release_model/VQ-Diffusion/pretrained_model/ViT-B-32.pt --auto-file-renaming=false -o OUTPUT/pretrained_model/ViT-B-32.pt
まとめ
これまでの設定を行うことでgenerate_samples_batch.pyが動作すると思う。
もし動かない場合は私の方の記載ミスの可能性もあるためコメント頂けますと幸いです。また、他にもご質問等あれば気軽にコメントください!
最後に、最近StableDiffutionでAIによる画像生成が注目を集めていますが今回のように音声の方の技術も発展してきています。
DiffSoundの他にもDannce Diffutionというモデルも注目を集めています。
私は博士課程として研究をする傍ら、インディーゲーム制作を行っているため、一人では大変な絵の作成や効果音、BGMの作成などをAIが行ってくれると大変助かります。
最近のAIによるクリエーターのサポートについて心配する声をよく聞きますが良い点を見てみると今まで大手企業でしか作れなかった大きなプロジェクトを個人または中小企業で作成できる可能性も広がるため、エンタメ界隈全体が賑わっていくのではないのかとポジティブに私は予想しています。
(もちろん学習データには著作権フリーのものを使うなどが必要ですが。)