速くなったオープンソースTTS「Parler-TTS」で自然で高速な音声合成を試す
こんにちは。株式会社IZAIエンジニアチームです。今回はHuggingFace社から2024年にリリースされたParler-TTSの新たなモデル Mini, Large がリリースされたので試してみます。
Parler-TTSについて
Parler-TTS・・・
米HuggingFace社が公開した、音声のスタイル(性別, アクセント、ピッチ, イントネーション)を自然言語で生後可能な軽量なテキスト読み上げ(TTSモデルです。Stability AI のDan Lyth 氏とエディンバラ大学の Simon King 氏による「Natural language guidance of high-fidelity text-to-speech models with synthetic annotations」で提案されたアーキテクチャを採用しています。
BigTechの多くのTTS モデルとは異なり、"完全にオープンソース"で、データセッから前処理、学習時のコード、パラーメータがすべて公開されています。HuggingFace社としては、Parler-TTSを基に各社が独自のTTS を開発することを許可してくれています。大変ありがたいですね
Mini, Largeモデル

2024年3月に公開されたParler-TTSですが、2024年8月に新たにMini(880M), Large(2.3B)モデルが追加されました。
4.5万時間の音声読み上げデータセットで学習されているとのことです。
また、Flash Attention 2 に対応することで、高速な推論を実現しています。
Flash Attention・・・Stanford大学の研究チームによって提案された新しいAttentionアルゴリズム。通常のAttention機構のO(n^2)のGPUメモリ使用量をO(n)に抑える高速化手法。計算自体のオーダーは変化しない。
検証する
■ 検証環境
OS: Windows 11 Pro
CPU: Core™ i9-13900K
GPU: GeForce RTX 3090
1. Parler-TTSをインストール
ターミナルで以下を実行してください。
pip install git+https://github.com/huggingface/parler-tts.git※お使いのGPUによってはSubproccess Error が発生する場合があります。無視して進めましょう
2. main.pyを作成
以下のプログラムを main.py として保存してください。
# main.py
import torch
from parler_tts import ParlerTTSForConditionalGeneration # Parler TTSモデルの生成用
from transformers import AutoTokenizer
import soundfile as sf # オーディオファイルの保存用
# CUDAが利用可能な場合はGPUを使用し、それ以外の場合はCPUを使用します
device = "cuda:0" if torch.cuda.is_available() else "cpu"
# 事前学習済みのParler TTSモデルとTokenizerをロードし、モデルをデバイスに移動します
model = ParlerTTSForConditionalGeneration.from_pretrained("parler-tts/parler-tts-mini-v1").to(device)
tokenizer = AutoTokenizer.from_pretrained("parler-tts/parler-tts-mini-v1")
# 話す内容(英語のみ)
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)
# 音声データをNumPy配列形式で取得し、1次元に変換
audio_arr = generation.cpu().numpy().squeeze()
# wavファイルとして保存(promptとdescriptionの冒頭10文字をファイル名に含める)
filename = f"parler_tts_{prompt[:10].strip().replace(' ', '_')}_{description[:10].strip().replace(' ', '_')}.wav"
sf.write(filename, audio_arr, model.config.sampling_rate)
print(f"音声ファイルが生成されました: {filename}")3. 音声を合成
ターミナルで以下を実行してください。
python main.py結果
スクリプト: "It can convert text into natural and expressive speech."
和訳:テキストを自然で表現力豊かな音声に変換できます。
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."
和訳:女性の話者が、やや表情豊かで生き生きとしたスピーチを、中程度の速度と音程で話します。録音は非常に高品質で、話者の声がクリアで、まるで近くで話しているように聞こえます。
女性の声で音声生成できましたね。
音声生成の実行時間は Flash Attention 無効時で10words 10秒ほどです。
続いて、有名なスティーブ・ジョブズの名言を合成してみましょう
"The only way to do great work is to love what you do."
素晴らしい仕事をする唯一の方法は、真に好きなことをやることだ
description = "A strong and powerful speech by an American male in his 20s, with a passionate and motivational slow tone, and a steady pace. The emphasis should be on ‘love’ and ‘great work’ to inspire listeners."
和訳:20代のアメリカ人男性による、情熱的でやる気を起こさせるスローなトーンで、安定したテンポの力強いスピーチ。聞き手を鼓舞するために「love」と「great work」を強調すること。
女性の声に変えてみましょう。
description = "a cute girl with a soft voice"
和訳:優しい声のかわいい女の子
まとめ
自然文でトーンや話し方を柔軟に変更できる機能は、便利ですね。
今後、カスタマーサービスの自動応答システムや採用面接のサポートツールなど、実務的な場面での応用が期待できそうです。
最後に
IZAIでは自然な音声インターフェースの社会実装を目指して、コールセンター自動化に取り組んでいます。興味をお持ちいただいた方はぜひ以下からお問い合わせください!
参考になった方、興味のある方はぜひ「いいね」をよろしくお願いします。ではまた!
