見出し画像

ローカルLLMで音声合成


StableTTSという音声合成ライブラリを使って、llama3.2が生成したテキストを喋らせてみました。


準備

llama3.2はオリジナルモデルをollamaを使って実行します。
StableTTSは事前学習モデルを使用して、推論のみを行います。
モデルファイルは事前にダウンロードしておきます。

Ollamaのhostとモデルファイルのパスは実行中の環境に合わせて変更してください。

from IPython.display import Audio, display
import torch
from api import StableTTSAPI
from ollama import Client
device = 'cuda' if torch.cuda.is_available() else 'cpu'

client = Client(host='xxx.xxx.xxx.xxx:11434')
ollama_model = 'llama3.2'

tts_model_path = './checkpoints/checkpoint_0.pt' # path to StableTTS checkpoint
vocoder_model_path = './vocoders/pretrained/firefly-gan-base-generator.ckpt'
vocoder_type = 'ffgan'

model = StableTTSAPI(tts_model_path, vocoder_model_path, vocoder_type)
model.to(device)
tts_param, vocoder_param = model.get_params()
print(f'tts_param: {tts_param}, vocoder_param: {vocoder_param}')

テキスト生成

prompt = '''
日本について知っていることを3つ教えてください。
'''
generated = client.generate(model=ollama_model, prompt=prompt)
generated['response']

音声合成

StableTTSで音声合成するには、サンプル音声が必要になります。
サンプル音声の長さは30秒程度あった方がよさそうです。また、拡散モデルを活用した音声合成なのでstepsは大きい方が精度は高いようです。

text = generated['response']
ref_audio = 'path/to/refs/audio/sample.wav'

language = 'japanese' # support chinese, japanese and english
solver = 'euler' # recommend using euler, midpoint or dopri5
steps = 30
cfg = 2 # recommend 1-4

audio_output, mel_output = model.inference(text, ref_audio, language, steps, 1, 1, solver, cfg)

# display(Audio(ref_audio))
display(Audio(audio_output, rate=model.mel_config.sample_rate))

実行結果について

StableTTSは日本語が生成できるとライブラリに記載されていますが、結果は日本語が上手な外国人が喋っているような音声が生成されました。
cfgは大きい方がサンプル音声に近づいているようですが大きくするとノイズや音割れが発生していました。一方でstepsを大きくすることでノイズや音割れを抑えることができていました。
より自然な日本語音声合成のためには、ファインチューニングを行う必要がありそうです。

いいなと思ったら応援しよう!