備忘録的な

ゆる〜く技術全般。

Bark with Colab

はじめに

何か業務に活かせないかなぁと生成AI系にアンテナを張っている今日この頃なのですが
最近Barkというtransformerをベースとしたtext-to-audioのモデルが公開されました。 特徴としては、実際の口語に近い雰囲気(棒読みのような単一ではない感じ)をうまく再現できているなと感じました。
日本語も対応していますが、英語圏の人が話す日本語っぽい発音です。「す」が「th」の発音など。

また、プロンプトのテキストにをつけると歌ってくれたり、[laughs]をつけるとテキストの文言に馴染むように笑って発音します。 この辺はREADMEにサンプル音声付きで詳しく書いてあるのでそちらを参照してください。

尚、CC-BY 4.0 NCライセンスですので営利目的での利用はできません。(bark/LICENSE)

この記事でやること。

  • Bark 実行環境 [Google Colab]
  • Bark voice clone [Google Colab]

Bark 実行環境 [Google Colab]

以下をそのままColabに貼り付けて実行すればOKです。UIが立ち上がります。
makawy7/bark-webuiを盛大に参考にしています。

!pip install gradio git+https://github.com/suno-ai/bark.git
import gradio as gr
from bark.generation import SUPPORTED_LANGS
from bark import SAMPLE_RATE, generate_audio
from scipy.io.wavfile import write as write_wav
import os
from datetime import datetime


def generate_text_to_speech(text_prompt, selected_speaker, text_temp, waveform_temp):
    audio_array = generate_audio(text_prompt, selected_speaker, text_temp, waveform_temp)

    now = datetime.now()
    date_str = now.strftime("%m-%d-%Y")
    time_str = now.strftime("%H-%M-%S")

    outputs_folder = os.path.join(os.getcwd(), "outputs")
    if not os.path.exists(outputs_folder):
        os.makedirs(outputs_folder)

    sub_folder = os.path.join(outputs_folder, date_str)
    if not os.path.exists(sub_folder):
        os.makedirs(sub_folder)

    file_name = f"audio_{time_str}.wav"
    file_path = os.path.join(sub_folder, file_name)
    write_wav(file_path, SAMPLE_RATE, audio_array)

    return file_path


speakers_list = []

for lang, code in SUPPORTED_LANGS:
    for n in range(10):
        speakers_list.append(f"{code}_speaker_{n}")

input_text = gr.Textbox(label="Input Text", lines=4, placeholder="Enter text here...")
text_temp = gr.Slider(
    0.1,
    1.0,
    value=0.7,
    step=0.1,
    label="Generation Temperature",
    info="1.0 more diverse, 0.1 more conservative",
)
waveform_temp = gr.Slider(
    0.1,
    1.0,
    value=0.7,
    step=0.1,
    label="Waveform temperature", info="1.0 more diverse, 0.1 more conservative"
)
output_audio = gr.Audio(label="Generated Audio", type="filepath")
speaker = gr.Dropdown(speakers_list, value=speakers_list[60], label="Acoustic Prompt")


interface = gr.Interface(
    fn=generate_text_to_speech,
    inputs=[input_text, speaker, text_temp, waveform_temp],
    outputs=output_audio,
    title="Text-to-Speech using Bark",
    description="A simple Bark TTS Web UI.",
)

interface.launch()

Bark voice clone [Google Colab]

serp-ai/bark-with-voice-clone

こちらはBarkをforkしてクローン音声を生成できるようにしたやつです。
7秒未満の音声とテキストのペアを用いて、音声を複製することができます。つまり、任意の声で文章を読み上げることができます。

こちらはipynbが公開されているので、コピーしてそのまま各自任意のファイルを読み込むように変更するだけで動きます。
Colab環境ですと.npzの生成から音声の生成(generate_audio)まで10分ほどかかります☕

私が試した時には、サンプリング対象を変えたりハイパーパラメータを何度か変更し数時間粘ってみたものの、全く似ていなかったりノイズが混じっていたり文章を適切に読み上げない事が多々ありました。
tempを下げすぎる(4以下とかにする)と原型のないノイズ音のみになるので注意してください。

一応、数時間粘って一番似ていると思った音声を貼っておきます。

触ってみた所感としては

  • 生成される音声が安定してない。
  • けど7秒未満の短い音声サンプルでここまで出来るのは素晴らしい

今後また更新されるようなので、期待ですね。

追記

Hugging Faceというサイトで、様々なmodelやdatasetの公開がされています。 眺めているだけで1日終わりそうです。