neuTTS-JP-150m
日本語専用TTSモデルです
トークナイザーを大幅に修正している関係で日本語以外はしゃべません
150Mパラメータでのvoice cloneingを目指しています
ストリーミング再生を意識しており、無音部分としてpaddingトークンを導入しています
推論時はpaddingトークンを無視するか、そこで一区切りさせるなど、工夫を行ってください
インストール
pip install torch torchaudio transformers neucodec pyopenjtalk-plus
推論
from pathlib import Path
import torch
import torchaudio
from torchaudio import transforms as T
from transformers import AutoModelForCausalLM, AutoTokenizer
from neucodec import NeuCodec
# model読み込み
tokenizer = AutoTokenizer.from_pretrained("tsukemono/neuTTS-JP-150m", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("tsukemono/neuTTS-JP-150m")
model.eval()
codec = NeuCodec.from_pretrained("neuphonic/neucodec")
codec = codec.eval()
# 参照音声のエンコード
waveform, sr = torchaudio.load("参照音源.mp3")
if waveform.shape[0] > 1:
waveform = waveform.mean(dim=0, keepdim=True)
if sr != 16_000:
waveform = T.Resample(sr, 16_000)(waveform)
waveform = waveform.unsqueeze(0) # (B, 1, T_16k)
with torch.inference_mode():
ref_codes = codec.encode_code(waveform).flatten().tolist()
# テキストをトークナイズしてプロンプト作成
text_ids = tokenizer(
"ここに作成したいテキストを書いてください",
add_special_tokens=False,
return_attention_mask=False,
return_token_type_ids=False,
)["input_ids"]
eos_id = int(tokenizer.eos_token_id)
input_ids = ref_codes + [eos_id] + text_ids + [eos_id]
input_ids = torch.tensor([input_ids], dtype=torch.long)
# 生成
with torch.inference_mode():
generated = model.generate(
input_ids=input_ids,
repetition_penalty=1.1,
max_new_tokens=1500,
)
# 生成トークンから音声トークンだけ抽出
gen_ids = generated[0, input_ids.shape[1] :]
gen_ids = gen_ids[gen_ids < 65536]
# vocoderで音声作成
with torch.inference_mode():
audio_data = codec.decode_code(gen_ids.unsqueeze(0).unsqueeze(0)).cpu()
torchaudio.save("output.mp3", audio_data[0], 24_000, format="mp3")
サンプル音声
- Downloads last month
- 84
Model tree for tsukemono/neuTTS-JP-150m
Base model
llm-jp/llm-jp-3-150m