File size: 1,904 Bytes
3f53728
a13c70d
11fdcf5
 
 
820c332
29f6b1d
 
820c332
11fdcf5
 
 
 
 
a13c70d
3f53728
a13c70d
820c332
d3b49fc
820c332
29f6b1d
 
 
820c332
d3b49fc
 
 
820c332
d3b49fc
29f6b1d
d3b49fc
29f6b1d
 
d3b49fc
820c332
29f6b1d
 
d3b49fc
820c332
29f6b1d
820c332
 
 
d3b49fc
820c332
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a13c70d
d3b49fc
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
import spaces
import gradio as gr
import torch
from TTS.api import TTS
import os
import json
import scipy.io.wavfile as wavfile
import numpy as np

os.environ["COQUI_TOS_AGREED"] = "1"

device = "cuda"

tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2").to(device)

@spaces.GPU(enable_queue=True)
def clone(text, audio):
    # Generowanie mowy
    wav = tts.tts(text=text, speaker_wav=audio, language="pl")
    
    # Konwersja do numpy array i zapisanie jako plik WAV
    wav_np = np.array(wav)
    wavfile.write("./output.wav", 24000, (wav_np * 32767).astype(np.int16))
    
    # Uzyskanie informacji o fonemach
    phonemes_info = tts.synthesizer.get_phonemes(text, language="pl")
    
    # Przygotowanie informacji o fonemach
    phonemes_data = []
    cumulative_duration = 0
    for phoneme, duration in phonemes_info:
        start_time = cumulative_duration
        end_time = start_time + duration
        phonemes_data.append({
            "phoneme": phoneme,
            "start": float(start_time),
            "end": float(end_time),
            "duration": float(duration)
        })
        cumulative_duration = end_time
    
    # Zapisywanie informacji o fonemach do pliku JSON
    with open("./phonemes_info.json", "w", encoding="utf-8") as f:
        json.dump(phonemes_data, f, ensure_ascii=False, indent=2)
    
    return "./output.wav", "./phonemes_info.json"

# Interfejs Gradio
iface = gr.Interface(
    fn=clone, 
    inputs=[
        gr.Textbox(label='Tekst do syntezy'),
        gr.Audio(type='filepath', label='Plik audio z głosem referencyjnym')
    ], 
    outputs=[
        gr.Audio(type='filepath', label='Zsyntezowana mowa'),
        gr.File(label='Informacje o fonemach (JSON)')
    ],
    title='Klonowanie Głosu z Informacjami o Fonemach',
    theme=gr.themes.Base(primary_hue="teal", secondary_hue="teal", neutral_hue="slate")
)

iface.launch(share=True)