File size: 3,623 Bytes
64a7c78
7e40419
64a7c78
7e40419
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ab5c5ad
 
 
7e40419
 
 
 
65fb3de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7e40419
 
64a7c78
7e40419
64a7c78
7e40419
 
 
6ec68de
7e40419
 
 
ec02525
7e40419
48f249c
 
 
6ec68de
7e40419
 
 
 
 
64a7c78
7e40419
 
f808acc
7e40419
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
import json
import torch
import gradio as gr
from torch import nn
import soundfile as sf

# Định nghĩa lớp mô hình TTS
class TTSModel(nn.Module):
    def __init__(self, config):
        super().__init__()
        # Khởi tạo các lớp của mô hình TTS ở đây
        # Giả định bạn đã xác định cách xây dựng mô hình dựa trên cấu hình
        self.config = config
        # Các thành phần khác của mô hình sẽ được thêm vào đây.

    def forward(self, inputs):
        # Logic của mô hình để chuyển đổi văn bản thành giọng nói
        # Giả định rằng bạn đã thực hiện điều này
        return torch.zeros(22050)  # Trả về một tensor âm thanh giả định

# Hàm tiền xử lý văn bản
def preprocess_text(text):
    # Chuyển đổi văn bản thành dạng số (encoding)
    return text  # Đây chỉ là một ví dụ đơn giản

# Hàm chuyển đổi văn bản thành giọng nói
def text_to_speech(text):
    inputs = preprocess_text(text)

    with torch.no_grad():
        audio_output = model(inputs)
        print(type(audio_output))  # In kiểu dữ liệu
        print(audio_output.shape)   # In kích thước đầu ra
        print(audio_output[:10])    # In 10 giá trị đầu tiên của âm thanh
        
    # Giả sử rằng audio_output là một tensor âm thanh
    return audio_output.numpy()

    
def load_models():
    try:
        duration_net = DurationNet(hps.data.vocab_size, 64, 4).to(device)
        duration_net.load_state_dict(torch.load(duration_model_path, map_location=device))
        duration_net.eval()
        print("DurationNet loaded successfully.")
    except Exception as e:
        print(f"Error loading DurationNet: {e}")
        return None, None

    try:
        generator = SynthesizerTrn(
            hps.data.vocab_size,
            hps.data.filter_length // 2 + 1,
            hps.train.segment_size // hps.data.hop_length,
            **vars(hps.model),
        ).to(device)
        
        del generator.enc_q
        ckpt = torch.load(lightspeed_model_path, map_location=device)
        params = {}
        
        for k, v in ckpt["net_g"].items():
            k = k[7:] if k.startswith("module.") else k
            params[k] = v
        
        generator.load_state_dict(params, strict=False)
        generator.eval()
        print("SynthesizerTrn loaded successfully.")
    except Exception as e:
        print(f"Error loading SynthesizerTrn: {e}")
        return None, None

    return duration_net, generator



    
# Tải cấu hình và trọng số mô hình
config_path = "config.json"
duration_model_path = "vbx_duration_model.pth"
generation_model_path = "gen_619k.pth"

# Tải cấu hình
with open(config_path, 'r') as f:
    config = json.load(f)

# Tạo mô hình
model = TTSModel(config)
model.eval()  # Chuyển mô hình về chế độ đánh giá

# Tải trọng số mô hình
model.load_state_dict(torch.load(duration_model_path, map_location=torch.device('cpu'), weights_only=True), strict=False)
model.load_state_dict(torch.load(generation_model_path, map_location=torch.device('cpu'), weights_only=True), strict=False)


# Xây dựng giao diện Gradio
def infer(text):
    audio = text_to_speech(text)
    sf.write('output.wav', audio, 22050)  # Lưu âm thanh vào tệp WAV
    return 'output.wav'

iface = gr.Interface(fn=infer, inputs="text", outputs="audio", title="Text to Speech",
                     description="Chuyển đổi văn bản tiếng Việt thành giọng nói.")

iface.launch()