microsoft/speecht5_ttsを動かして音声合成を行う

初めに

以下のTTSモデルを動かしていきます。音声とテキストの両方のデータを用いた新しい事前学習モデルです

huggingface.co

以下にて記事の内容をリポジトリで公開しています。

github.com

開発環境

環境作成

まずは仮想環境を作成します

uv venv -p 3.11
source venv/bin/activate

次に関連するライブラリを入れます cudaは入っていないので,cpu版を入れていきます

uv pip install transformers sentencepiece datasets torch soundfile

実行

推論方法は,「(TTS) pipeline」を使う方法と「transformers modelling code」を使う方法があります。

TTS pipelineを使う方法

以下のコードで実行できます

from transformers import pipeline
from datasets import load_dataset
import soundfile as sf
import torch

synthesiser = pipeline("text-to-speech", "microsoft/speecht5_tts")

embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation")
speaker_embedding = torch.tensor(embeddings_dataset[7306]["xvector"]).unsqueeze(0)
# You can replace this embedding with your own as well.

speech = synthesiser("Hello, my dog is cooler than you!", forward_params={"speaker_embeddings": speaker_embedding})

sf.write("speech_pipeline.wav", speech["audio"], samplerate=speech["sampling_rate"])

transformers modelling codeを使う方法

以下のコードで実行できます

from transformers import SpeechT5Processor, SpeechT5ForTextToSpeech, SpeechT5HifiGan
from datasets import load_dataset
import torch
import soundfile as sf
from datasets import load_dataset

processor = SpeechT5Processor.from_pretrained("microsoft/speecht5_tts")
model = SpeechT5ForTextToSpeech.from_pretrained("microsoft/speecht5_tts")
vocoder = SpeechT5HifiGan.from_pretrained("microsoft/speecht5_hifigan")

inputs = processor(text="Hello, my dog is cute.", return_tensors="pt")

# load xvector containing speaker's voice characteristics from a dataset
embeddings_dataset = load_dataset("Matthijs/cmu-arctic-xvectors", split="validation")
speaker_embeddings = torch.tensor(embeddings_dataset[7306]["xvector"]).unsqueeze(0)

speech = model.generate_speech(inputs["input_ids"], speaker_embeddings, vocoder=vocoder)

sf.write("speech_modelling.wav", speech.numpy(), samplerate=16000)