「Parler-TTS」を試す(日本語モデルも)
日本語に対応したモデルを出された方がいる
が、そもそも本家を触ったことがないので、どういう特徴があるのかを確認すべく、まずは本家を触る。その後、日本語対応モデルを触ることとする。
本家GitHubレポジトリ
Parler-TTS
Parler-TTSは軽量なテキスト音声合成(TTS)モデルで、特定の話者(性別、音程、話し方など)のスタイルに沿った高品質で自然な音声を生成することができます。このモデルは、Stability AIのDan Lyth氏とエディンバラ大学のSimon King氏による論文 "Natural language guidance of high-fidelity text-to-speech with synthetic annotations" の成果を再現したものです。
他のTTSモデルとは異なり、Parler-TTSは完全なオープンソースとして公開されています。データセット、前処理コード、学習用コード、そして学習済みモデルの重みが、すべて寛容なライセンスの下で公開されており、コミュニティがこの成果を基に独自の強力なTTSモデルを開発することが可能です。
このリポジトリには、Parler-TTSの推論コードと学習用コードが含まれています。また、データセットのアノテーションのためのData-Speechリポジトリと連携するよう設計されています。
モデル
デモ
Colaboratoryで。Flash Attention 2に付いて明記されているので、ランタイムはL4で。
GitHubレポジトリからパッケージインストール
!pip install git+https://github.com/huggingface/parler-tts.git
自前で事前ビルドしたFlash Attention 2をインストール(時間がかかるので)
!wget https://github.com/kun432/flash-attention-prebuild-wheels/releases/download/v0.0.0-test/flash_attn-2.6.3+cu121torch2.5-cp310-cp310-linux_x86_64.whl
!pip install --no-dependencies --upgrade flash_attn-2.6.3+cu121torch2.5-cp310-cp310-linux_x86_64.whl
モデルとトークナイザーをロード。まずは"mini"で。
import torch
from parler_tts import ParlerTTSForConditionalGeneration
from transformers import AutoTokenizer
import soundfile as sf
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model = ParlerTTSForConditionalGeneration.from_pretrained("parler-tts/parler-tts-mini-v1").to(device)
tokenizer = AutoTokenizer.from_pretrained("parler-tts/parler-tts-mini-v1")
ではtext-to-speechをやってみる。Parler-TTSでは、プロンプトで音声の発話スタイルを指定でき、
- ランダムな音声を使用
- 特定の音声を使用
の2種類の方法がある。
まずはランダムの場合。
import soundfile as sf
prompt = "Hey, how are you doing today?"
description = "A female speaker delivers a slightly expressive and animated speech with a moderate speed and pitch. The recording is of very high quality, with the speaker's voice sounding clear and very close up."
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)
これで音声ファイルが作成される。ファイルをダウンロードして再生してもよいが、Colaboratoryだと以下のようにすれば、その場でコントロールが表示される。
from IPython.display import Audio
audio = Audio(audio_arr, rate=model.config.sampling_rate)
display(audio)
複数回実行すると、音声が異なっているのがわかる。以下はサンプル。
プロンプトを変えると音声のスタイルが変わる。
(snip)
description = "A male speaker delivers a very expressive speech with a high speed and pitch. The recording is of very bad quality, with the speaker's voice sounding noisy and very far."
(snip)
男性には変わったが、他の部分のプロンプトはあまり違いがわからなかった。
特定の音声の場合。以下の34の音声が用意されている。
Laura, Gary, Jon, Lea, Karen, Rick, Brenda, David, Eileen, Jordan, Mike, Yann, Joy, James, Eric, Lauren, Rose, Will, Jason, Aaron, Naomie, Alisa, Patrick, Jerry, Tina, Jenna, Bill, Tom, Carol, Barbara, Rebecca, Anna, Bruce, Emily.
これをプロンプトで指定すればいいみたい。
(snip)
description="Jon's voice is monotone yet slightly fast in delivery, with a very close recording that almost has no background noise."
(snip)
生成したものはこちら
ただし、あくまでも近いというだけで完全に同じというわけではないみたいで、音声によっては似ているものになりやすい、なりにくいがあり、モデルによっても変わるみたい。詳しくは以下。
また、プロンプトについてはTIPSが記載されている。
- 最高品質の音声を生成するには"very clear audio"、高レベルのバックグラウンドノイズを生成するには"very noisy audio"という用語を含めます。
- 句読点を使用して、韻律を制御することができます。例えば、カンマを使用して、スピーチに小さな区切りを追加できます。
- 残りの音声機能(性別、発話速度、ピッチ、残響)は、プロンプトから直接制御できます。
また、以下にある動画の内容も参考になりそう。
動画で使用されているものはこんな感じだった。
A male speaker delivering his word at a slightly slow pace.
A female speaker with a high-pitched but animated voice speaks slightly fast.
A male speaker with a high-pitched but monotone voice speaks in a very spacious environment with noticeable background noise.
A male speaker with a high-pitched but monotone voice speaks in a very confined space, with very clear audio and no background noise.
A female speaker delivers her words very slowly with a slightly deep voice, in a small and confined space. She has a very animated tone.
ということで、日本語対応モデルを試してみる。現状はβ版という扱いみたいで、正式リリース時に機能やモデルの最適化などが行われるとのこと。
モデルは2つ。miniとlarge。
mini・large共通の注意書き
本モデルは学習データの構成上、男性の声に関するデータが少ないため、男性の声の生成が期待通りに行えない場合があります。特に、自然なイントネーションや音質の調整が難しい場合がありますので、ご了承ください。
largeの注意書き
Japanese Parler-TTS Large は音声表現力が非常に豊かで高品質な音声生成が可能ですが、学習不足のため動作が不安定な場合があります。そのため、安定性を重視する場合は、より軽量で動作が安定している Japanese Parler-TTS Mini の使用を推奨します。
今回はminiの方を試させていただく。Colaboは同じくL4で。基本的に本家とほとんど同じ手順。
レポジトリからパッケージインストール。ここでRubyInserterというのを一緒にインストール。これは漢字にルビを振って発話の安定性を上げるものらしい。ほー、こういう風に学習してあるってことかしら。
pip install git+https://github.com/huggingface/parler-tts.git
pip install git+https://github.com/getuka/RubyInserter.git
Flash Attentionをインストール
!wget https://github.com/kun432/flash-attention-prebuild-wheels/releases/download/v0.0.0-test/flash_attn-2.6.3+cu121torch2.5-cp310-cp310-linux_x86_64.whl
!pip install --no-dependencies --upgrade flash_attn-2.6.3+cu121torch2.5-cp310-cp310-linux_x86_64.whl
モデルとトークナイザーをロード。
import torch
from parler_tts import ParlerTTSForConditionalGeneration
from transformers import AutoTokenizer
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model = ParlerTTSForConditionalGeneration.from_pretrained("2121-8/japanese-parler-tts-mini-bate").to(device)
tokenizer = AutoTokenizer.from_pretrained("2121-8/japanese-parler-tts-mini-bate")
ではTTS。プロンプトにルビを振る以外は全く同じ。
import soundfile as sf
from rubyinserter import add_ruby
prompt = "こんにちは、今日はどのようにお過ごしですか?"
description = "A female speaker with a slightly high-pitched voice delivers her words at a moderate speed with a quite monotone tone in a confined environment, resulting in a quite clear audio recording."
prompt = add_ruby(prompt) # プロンプトにルビを振る
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_japanese_out.wav", audio_arr, model.config.sampling_rate)
from IPython.display import Audio
audio = Audio(audio_arr, rate=model.config.sampling_rate)
display(audio)
生成されたものはこちら。
アニメっぽい感じが出ている。
なお、2024/11/22時点では、特定の音声を指定する方法については準備中となっている。
まとめ
プロンプトを色々試してみたけど、性別や声の高さとかはある程度調整が効くけど、感情的な要素を記述してもあまり変化は見られなかったので、プロンプトで自由に設定できるというわけではなさそう。あと、声の種類については指定したとしても完全な一貫性があるわけではないというところには注意かな。
とはいえ、簡単に使えて、かつとても自然な感じで、最近のやつはとても自然でほんとすごいなと感じた(ただ、自分は一昔前のスマートスピーカーのTTSが基準になってるので隔世の感があるだけかもしれないいけど)。
日本語モデルについても、かなり自然な感じで素晴らしい。Xのポストに記載されているようにアニメ色が強いので、ユースケースは多少選びそう、というか、もっと普通のフラットな音声、例えばアナウンサー的な感じで使いたい場合は、プロンプトを工夫(low-pitchedとかdeep voiceとか)するか、自分でファインチューニングするか、別のTTSを使うか、というところになるかなと思う。
正式リリースに期待したい。
GitHubにはトレーニングについても記載されている。