BARKで始めるAI音声(VoiceClone)
BARKとは?
Barkは、Sunoによって作成されたトランスフォーマーをベースとしたテキストから音声を生成するモデルです。リアルな多言語音声だけでなく、音楽、背景音、単純な効果音など、他のオーディオも生成できます。また、笑ったり、ため息をついたり、泣いたりなどの非言語コミュニケーションも生成することができます。
使ってみましょう
以下のリンクからサンプルを再生することができます。
笑い声や歌い声もあって聞くだけでも楽しいのではないでしょうか?もう少しバリエーションを付けたい方はGoogle Colabから試すことが可能です。
本稿では、上記だとビルトインのモデルしか再生することが出来ないため、自分で用意した音声をベースにクローンした音声の生成方法を書きたいと思います。
Voice Clone
Google Colabを活用して音声のクローンを作成してみましょう。まずは以下のページを開いてください。
基本的には本ファイル(clone_voice.ipynb)をColabで動作させれば完了するのですが、いくつか修正が必要なポイントがありますのでその部分を重点的に示します。
(2023/4/24時点の情報で記載しますが、随時リポジトリが書き換わると思いますので柔軟に対応してください)
前半部分(ファイルの指定とモデル生成(*npz))
Googleドライブにあるwavファイルをクローンする場合の例を説明します。
準備として、クローンしたい音声のwavファイルを自分のGoogleドライブ直下に格納しておいてください。
まずは、ライブラリのインストールが必要ですので、冒頭に以下のコードを挿入してください。
# install bark as well as pytorch nightly to get blazing fast flash-attention
!pip install git+https://github.com/suno-ai/bark.git && \
pip uninstall -y torch torchvision torchaudio && \
pip install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu118
続いて、Googleドライブに格納したwavファイルを指定します。
以下のコードをコピーして当該コードに上書きしてください。
なお、コード例はGoogleドライブ直下にwavファイル(myidol.wav)を格納している例ですので、必要に応じて書き換えてください。
また、実行直後はGoogleドライブにアクセス権限付与するように求められるため、ビックリしないようにしてください。
# Google drive accessibility
from google.colab import drive
drive.mount('/content/drive')
# Load and pre-process the audio waveform
audio_filepath = '/content/drive/MyDrve/myidol.wav' # the audio you want to clone (will get truncated so 5-10 seconds is probably fine, existing samples that I checked are around 7 seconds)
device = 'cuda' # or 'cpu'
wav, sr = torchaudio.load(audio_filepath)
wav = convert_audio(wav, sr, model.sample_rate, model.channels)
wav = wav.unsqueeze(0).to(device)
次は、wavファイルでクローンしたい音声が喋っている文章でアップデートしてください。もちろん日本語で構いません。
前半最後になりますが、モデルファイルの格納場所の指定です。
以下のコードをコピーして当該コードに上書きしてください。
なお、コード書き換える必要性についてですが、現状ではファイル名を{lang_code}_speaker_{0-9}のフォーマットにする必要があるため、"ja_speaker_9"に上書きしてそれを回避しています。
import numpy as np
voice_name = 'ja_speaker_9' # whatever you want the name of the voice to be
output_path = '/usr/local/lib/python3.9/dist-packages/bark/assets/prompts/' + voice_name +'.npz'
np.savez(output_path, fine_prompt=codes, coarse_prompt=codes[:2, :], semantic_prompt=semantic_tokens)
後半部分(モデルを元にした音声の生成)
後半は前半で生成したモデルを元に音声を生成するだけです。
まずは、喋らせたい文章とモデルファイルの指定です。
text_promptとvoice_nameを定義してください。
前者はお好きなもので、後者は前半と合わせて"ja_speaker_9"のモデルファイルを指定します。
from bark.api import generate_audio
from transformers import BertTokenizer
from bark.generation import SAMPLE_RATE, preload_models, codec_decode, generate_coarse, generate_fine, generate_text_semantic
text_prompt = "プロデュサー、こんばんは。今日の営業はどうでしたか。ちゃんと出来ていればよいのですが。"
# Enter your prompt and speaker here
voice_name = "ja_speaker_9" # use your custom voice name here if you have one
# load the tokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-multilingual-cased")
音声の生成部分です。いずれかのコードを実行させればよいでしょう。
なお、text_temp/waveform_tempは生成する音声の揺れを司る部分ですので、色々調整してみるのも面白いかもしれませんね。
最後に、音声の再生と保存部分になります。
出来た音声の出来はいかに?
こちらがVoice Cloneして出来た音声になります。
全然アイドルっぽくないですね…。音声を生成するたびに代わるので何回か生成してみるか、tempのパラメタを弄ってみるのも良いかも知れません。BARKの今後に期待して待つこととしましょう。