File size: 3,629 Bytes
4eeb5fe
38b7ebd
 
 
00954c4
38b7ebd
 
 
 
 
 
 
 
 
00954c4
78505ef
38b7ebd
 
 
 
 
00954c4
 
 
 
 
 
 
 
 
 
 
 
38b7ebd
 
 
 
 
 
 
00954c4
 
78505ef
38b7ebd
00954c4
38b7ebd
 
 
00954c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38b7ebd
00954c4
 
38b7ebd
00954c4
3182b39
93ff1fe
00954c4
38b7ebd
 
3182b39
00954c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3182b39
00954c4
 
 
3182b39
38b7ebd
00954c4
93ff1fe
c34c848
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import os
import re
import torch
import torchaudio
from huggingface_hub import snapshot_download, hf_hub_download
from TTS.tts.configs.xtts_config import XttsConfig
from TTS.tts.models.xtts import Xtts
from vinorm import TTSnorm

# Cấu hình đường dẫn và tải mô hình
checkpoint_dir = "model/"
repo_id = "capleaf/viXTTS"
use_deepspeed = False

device = "cuda" if torch.cuda.is_available() and "T4" in torch.cuda.get_device_name(0) else "cpu"

# Tạo thư mục nếu chưa tồn tại
os.makedirs(checkpoint_dir, exist_ok=True)

# Kiểm tra và tải các file cần thiết
required_files = ["model.pth", "config.json", "vocab.json", "speakers_xtts.pth"]
files_in_dir = os.listdir(checkpoint_dir)
if not all(file in files_in_dir for file in required_files):
    snapshot_download(
        repo_id=repo_id,
        repo_type="model",
        local_dir=checkpoint_dir,
    )
    hf_hub_download(
        repo_id="coqui/XTTS-v2",
        filename="speakers_xtts.pth",
        local_dir=checkpoint_dir,
    )

# Tải cấu hình và mô hình
xtts_config = os.path.join(checkpoint_dir, "config.json")
config = XttsConfig()
config.load_json(xtts_config)
MODEL = Xtts.init_from_config(config)
MODEL.load_checkpoint(config, checkpoint_dir=checkpoint_dir, use_deepspeed=use_deepspeed)

# Tải mô hình vào thiết bị phù hợp
MODEL.to(device)

# Danh sách ngôn ngữ được hỗ trợ (chỉ tiếng Việt và tiếng Anh)
supported_languages = ["vi", "en"]

def normalize_vietnamese_text(text):
    """
    Chuẩn hóa văn bản tiếng Việt.
    """
    text = (
        TTSnorm(text, unknown=False, lower=False, rule=True)
        .replace("..", ".")
        .replace("!.", "!")
        .replace("?.", "?")
        .replace(" .", ".")
        .replace(" ,", ",")
        .replace('"', "")
        .replace("'", "")
        .replace("AI", "Ây Ai")
        .replace("A.I", "Ây Ai")
    )
    return text

def generate_speech(text, language="vi", speaker_wav=None, normalize_text=True):
    """
    Tạo giọng nói từ văn bản.
    """
    if language not in supported_languages:
        raise ValueError(f"Ngôn ngữ {language} không được hỗ trợ. Chỉ hỗ trợ tiếng Việt (vi) và tiếng Anh (en).")

    if len(text) < 2:
        raise ValueError("Văn bản quá ngắn. Vui lòng nhập văn bản dài hơn.")

    try:
        # Chuẩn hóa văn bản nếu cần
        if normalize_text and language == "vi":
            text = normalize_vietnamese_text(text)

        # Lấy latent và embedding từ file âm thanh mẫu
        with torch.no_grad():  # Tắt tính gradient để tiết kiệm bộ nhớ
            gpt_cond_latent, speaker_embedding = MODEL.get_conditioning_latents(
                audio_path=speaker_wav,
                gpt_cond_len=30 if device == "cuda" else 15,  # Tăng độ dài khi dùng GPU
                gpt_cond_chunk_len=8 if device == "cuda" else 4,
                max_ref_length=60 if device == "cuda" else 30,
            )

            # Tạo giọng nói
            out = MODEL.inference(
                text,
                language,
                gpt_cond_latent,
                speaker_embedding,
                repetition_penalty=5.0,
                temperature=0.75,
                enable_text_splitting=True,
            )

        # Lưu file âm thanh
        output_file = "output.wav"
        torchaudio.save(output_file, torch.tensor(out["wav"]).unsqueeze(0).to("cpu"), 24000)

        return output_file

    except Exception as e:
        raise RuntimeError(f"Lỗi khi tạo giọng nói: {str(e)}")