Views
No views yet
1git clone https://github.com/nguyenhoanganh2002/XTTSv2-Finetuning-for-New-Languages.git
2cd XTTSv2-Finetuning-for-New-Languages
3pip install -r requirements.txt1from huggingface_hub import snapshot_download
2
3snapshot_download(repo_id="anhnh2002/vnTTS",
4 repo_type="model",
5 local_dir="model/")1from pprint import pprint
2import torch
3import torchaudio
4from tqdm import tqdm
5from underthesea import sent_tokenize
6from vinorm import TTSnorm
7from TTS.tts.configs.xtts_config import XttsConfig
8from TTS.tts.models.xtts import Xtts
9
10device = "cuda:0"
11
12xtts_checkpoint = "model/model.pth"
13xtts_config = "model/config.json"
14xtts_vocab = "model/vocab.json"
15
16config = XttsConfig()
17config.load_json(xtts_config)
18XTTS_MODEL = Xtts.init_from_config(config)
19XTTS_MODEL.load_checkpoint(config,
20 checkpoint_path=xtts_checkpoint,
21 vocab_path=xtts_vocab,
22 use_deepspeed=False)
23XTTS_MODEL.to(device)1def preprocess_text(text, language="vi"):
2 if language == "vi":
3 text = TTSnorm(text, unknown=False, lower=False, rule=True)
4
5 # split text into sentences
6 if language in ["ja", "zh-cn"]:
7 sentences = text.split("。")
8 else:
9 sentences = sent_tokenize(text)
10
11 chunks = []
12 chunk_i = ""
13 len_chunk_i = 0
14 for sentence in sentences:
15 chunk_i += " " + sentence
16 len_chunk_i += len(sentence.split())
17 if len_chunk_i > 30:
18 chunks.append(chunk_i.strip())
19 chunk_i = ""
20 len_chunk_i = 0
21
22 if (len(chunks) > 0) and (len_chunk_i < 15):
23 chunks[-1] += chunk_i
24 else:
25 chunks.append(chunk_i)
26
27 return chunks1speaker_audio_file = "model/vi_man.wav"
2
3gpt_cond_latent, speaker_embedding = XTTS_MODEL.get_conditioning_latents(
4 audio_path=speaker_audio_file,
5 gpt_cond_len=XTTS_MODEL.config.gpt_cond_len,
6 max_ref_length=XTTS_MODEL.config.max_ref_len,
7 sound_norm_refs=XTTS_MODEL.config.sound_norm_refs,
8)1def tts(
2 model: Xtts,
3 text: str,
4 language: str,
5 gpt_cond_latent: torch.Tensor,
6 speaker_embedding: torch.Tensor,
7 verbose: bool = False,
8):
9 # preprocess text
10 chunks = preprocess_text(text, language)
11
12 wav_chunks = []
13 for text in tqdm(chunks):
14 if text.strip() == "":
15 continue
16 wav_chunk = model.inference(
17 text=text,
18 language=language,
19 gpt_cond_latent=gpt_cond_latent,
20 speaker_embedding=speaker_embedding,
21 length_penalty=1.0,
22 repetition_penalty=10.0,
23 top_k=10,
24 top_p=0.5,
25 )
26
27 wav_chunk["wav"] = torch.tensor(wav_chunk["wav"])
28
29 wav_chunks.append(wav_chunk["wav"])
30
31 out_wav = torch.cat(wav_chunks, dim=0).unsqueeze(0).cpu()
32
33 return out_wav
34
35from IPython.display import Audio
36
37audio = tts(
38 model=XTTS_MODEL,
39 text="Xin chào, tôi là một hệ thống chuyển đổi văn bản tiếng Việt thành giọng nói.", #Hello, I am a Vietnamese text to speech conversion system.
40 language="vi",
41 gpt_cond_latent=gpt_cond_latent,
42 speaker_embedding=speaker_embedding,
43 verbose=True,
44)
45
46Audio(audio, rate=24000)