こんにちは
AIチームの戸田です
今回は先日HuggingFaceのライブラリとして追加されたParler-TTSを使った音声合成を試してみたいと思います。
Parler-TTS
Parler-TTS は、話者のスタイル (性別、ピッチ、話し方など) をテキストで指定して音声合成(TTS) を行える軽量なモデルを提供してくれるライブラリです。オープンソースで、推論だけでなく、学習や学習のための前処理コードも提供されています。
手法はこちらの論文で提案されたもので、45,000時間のデータセットに対してアノテーションを行うことで様々なアクセントや発声スタイルでの高忠実度の音声生成を実現しています。以前まで話者のスタイルを指定する際は参照音声が必要だったのですが、これによりテキストによる指示のみでスタイルの指示を行うことができるようになりました。
Parler-TTSはMusicGenをベースとした軽量版モデル(parler_tts_mini_v0.1)を提供しており、今回はこちらのモデルを試してみようと思います。
検証
Google Colaboratoryで試したいと思います。まずはParler-TTSをインストールします。
pip install git+https://github.com/huggingface/parler-tts.git
次に必要なライブラリを読み込み、モデルをロードします。
from parler_tts import ParlerTTSForConditionalGeneration
from transformers import AutoTokenizer
import soundfile as sf
import torch
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model = ParlerTTSForConditionalGeneration.from_pretrained("parler-tts/parler_tts_mini_v0.1").to(device)
tokenizer = AutoTokenizer.from_pretrained("parler-tts/parler_tts_mini_v0.1")
これで準備は整いました。まずはライブラリのREADMEにあるサンプルを試してみましょう。
prompt = "Hey, how are you doing today?"
description = "A female speaker with a slightly low-pitched voice delivers her words quite expressively, in a very confined sounding environment with clear audio quality. She speaks very fast."
input_ids = tokenizer(description, return_tensors="pt").input_ids.to(device)
prompt_input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(device)
generation = model.generate(input_ids=input_ids, prompt_input_ids=prompt_input_ids)
audio_arr = generation.cpu().numpy().squeeze()
sf.write("parler_tts_out.wav", audio_arr, model.config.sampling_rate)
音声合成するテキストをprompt、その音声のスタイルをdescriptionとして記述しています。簡単にスタイルを翻訳すると「低めの声で早口の女性がクリアな音質で、感情を込めて話します」でしょうか。
生成された音声がこちらになります。
では、ここからdescriptionを編集してスタイルを色々変えてみたいと思います。
男性の声にする
A female speakerをA male speakerに変更して、声を男性にしてみたいと思います。
男性の声になりました。
ゆっくり話させる
She speaks very fast.をShe speaks very slowly.に変更して話速を遅くしてみます。
再生時間で測ると1秒が3秒になるくらいに遅くなりました。
単調に話させる
もとのdescriptionではher words quite expressivelyと、感情豊かに話すことが指示されていましたが、ここをher words very monotoneと単調に話すように変更します。
ちょっと声のピッチが変わってしまったように聞こえますが、元の発話に比べて、かなり淡々とした話し方になりました。
声のピッチを上げる
元々slightly low-pitchedだった音声のピッチ指定部分をvery high-pitchedとし、高い音声にしてみます。
かなり高い声になりました。
ノイズをのせる
もとのdescriptionではin a very confined sounding environment with clear audio qualityと綺麗な音質であるような指示がありますが、ここを消して、The speaker's voice is quite close-sounding but very noisy.とわざとノイズを乗せてみようと思います。
あまりうまくいかなかったようです。元論文の紹介ページではこのようなdescriptionで上手くノイズが乗っていたので、軽量版だと生成可能な表現が少ないのかもしれません。
おわりに
本記事ではParler-TTSを使ったスタイルを指定した音声合成を試してみました。
参照音声なしにピッチや話速などをテキストベースのみで指示できるのはかなり画期的でした。
私自身が判断できなかったので今回の記事には載せませんでしたが、英語でいうアメリカアクセントやイギリスアクセントなどの訛りのようなものも表現できるようです。
ノイズをのせるのはうまくいきませんでしたが、READMEを見ると今後徐々にスケールアップしていく旨が書かれていたので今後に期待したいと思います。また、学習コードも提供されているので、日本語モデルの学習も試してみたいです。
最後までお読み頂き、ありがとうございました!