Views
No views yet
pip install torch torchaudio transformers alkana e2k neucodec pyopenjtalk-plus[onnxruntime] miniaudio1from pathlib import Path
2
3import torch
4import torchaudio
5from torchaudio import transforms as T
6from transformers import AutoModelForCausalLM, AutoTokenizer
7from neucodec import NeuCodec
8
9# model読み込み
10tokenizer = AutoTokenizer.from_pretrained("tsukemono/neuTTS-JP-150m", trust_remote_code=True)
11model = AutoModelForCausalLM.from_pretrained("tsukemono/neuTTS-JP-150m")
12model.eval()
13codec = NeuCodec.from_pretrained("neuphonic/neucodec")
14codec = codec.eval()
15
16# 参照音声のエンコード
17waveform, sr = torchaudio.load("参照音源.mp3")
18if waveform.shape[0] > 1:
19 waveform = waveform.mean(dim=0, keepdim=True)
20if sr != 16_000:
21 waveform = T.Resample(sr, 16_000)(waveform)
22waveform = waveform.unsqueeze(0) # (B, 1, T_16k)
23with torch.inference_mode():
24 ref_codes = codec.encode_code(waveform).flatten().tolist()
25
26# テキストをトークナイズしてプロンプト作成
27text_ids = tokenizer(
28 "ここに作成したいテキストを書いてください",
29 add_special_tokens=False,
30 return_attention_mask=False,
31 return_token_type_ids=False,
32)["input_ids"]
33
34eos_id = int(tokenizer.eos_token_id)
35input_ids = ref_codes + [eos_id] + text_ids + [eos_id]
36input_ids = torch.tensor([input_ids], dtype=torch.long)
37
38# 生成
39with torch.inference_mode():
40 generated = model.generate(
41 input_ids=input_ids,
42 repetition_penalty=1.1,
43 max_new_tokens=1500,
44 )
45
46# 生成トークンから音声トークンだけ抽出
47gen_ids = generated[0, input_ids.shape[1] :]
48gen_ids = gen_ids[gen_ids < 65536]
49
50# vocoderで音声作成
51with torch.inference_mode():
52 audio_data = codec.decode_code(gen_ids.unsqueeze(0).unsqueeze(0)).cpu()
53torchaudio.save("output.mp3", audio_data[0], 24_000, format="mp3")