Tango TTSをgoogle colabで試してみた。
Tango TTSとは
Tango TTSはlatent diffusionをベースとしてtextから任意のaudioを作成するdiffusion modelです。動物の鳴き声や、人間の出す音、人工音なども結構なクオリティで作成することができるそうです。AudioCaptionのデータセットを学習させているみたいです。
モデルのアーキテクチャについては公式のWebsiteが詳しいですが
音声をMelSpectgramで波形図のヒートマップに変換したのちにStable diffusionのモデル(VAE + Unet)の中にinputしてoutputとして出てきた波形図をHiFiGANで音声にDecodeしているみたいです。Stable diffusionのReverseProcessの中にLLMモデルでDecodeしたText promptをembeddingに直して各ステップの中に埋め込んでいるみたいですね。
今回は触れないですがHiFiGANについては以下のgithubでinference, fine-tuningコードが公開されています。
リンク
準備
Google Colabを開き、メニューから「ランタイム→ランタイムのタイプを変更」でランタイムを「GPU」に変更します。
環境構築
インストール手順は以下の通りです。
!git clone https://github.com/declare-lab/tango/
%cd tango
!pip install transformers==4.27.0 accelerate==0.18.0 datasets==2.1.0 einops==0.6.1 h5py==3.8.0 huggingface_hub==0.13.3 importlib_metadata==6.3.0 omegaconf==2.3.0 packaging==23.1 progressbar33==2.4 protobuf==3.20.* resampy==0.4.2 soundfile==0.12.1 ssr_eval==0.0.6 torchlibrosa==0.1.0 librosa==0.9.2
%cd diffusers
!pip install -e .
本家のinstall手順と変えていますがgoogle colab用(torch2.0.0+cuda11.8)で動かすように変えているためです。
推論
推論させるために本家の通りにやるとgoogle colab上では上手くいかないので少し変えます。
/content/tangoのrepositoryの中でpredict.pyというpythonファイルを作成して以下をコピーしてください。
import soundfile as sf
from tango import Tango
tango_model = Tango("declare-lab/tango")
prompt = "An audience cheering and clapping"
audio = tango_model.generate(prompt)
# save audio for wav format
sf.write(f"{prompt}.wav", audio, samplerate=16000)
print("Audio file: ", f"{prompt}.wav")
それでは推論を実行していきます。
%cd /content/tango
!python predict.py
結果の確認のコードは以下の通りです。
import IPython
# display Audio
IPython.display.Audio(f"{prompt}.wav") # please change wav file
再生する際には自分の与えたpromptのwavファイルを指定してください。
jupyer notebookで音声の結果は確認してください。(Zennって音声埋め込めないの?)
Advanced Application
日本語にも対応させてみました。翻訳機能として以下のモデルを利用しています。
必要なライブラリをインストールします。
!pip install transformers sentencepiece
その後、/content/tangoのrepositoryの中でpredict_jp_pipeline.pyというpythonファイルを作成して以下をコピーしてください。
import soundfile as sf
from tango import Tango
from transformers import pipeline
# load model
je_translator = pipeline("translation", model="staka/fugumt-ja-en")
tango_model = Tango("declare-lab/tango")
# create english prompt
text = "観客が手を叩いて拍手する"
response = je_translator(text)
prompt = response[0]["translation_text"]
audio = tango_model.generate(prompt)
# save audio for wav format
sf.write("japanese.wav", audio, samplerate=16000)
次に推論を実行します。もし別の音声を生成させたい場合はpredict_jp_pipeline.pyの中のtextを編集してください。
%cd /content/tango
# please change text in predict_jp_pipeline.py
!python predict_jp_pipeline.py
音声の結果を確認するコードは以下の通りです。
import IPython
# display Audio
IPython.display.Audio("japanese.wav")
最後に
今回はtext-audio-diffusionモデルであるTango TTSを試してみました。動画のエフェクト音を作る際などかなり有効に活用できそうな感じでした。同じような仕組みでBark TTSもあります。Bark TTSの方はため息や間合い見たいなものも表現できるのでその点が少し異なるかも?です。Bark TTSについても記事に書いていこうと思うのでその際に使用感の違いに触れられればと思っています。
今後ともLLM, Diffusion model, Image Analysis, 3Dに関連する試した記事を投稿していく予定なのでよろしくお願いします。
Discussion