File size: 1,968 Bytes
374b25a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from TTS.api import TTS
import tempfile
import os

# Initialize TTS model (only once)
@st.cache_resource
def load_tts_model():
    return TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=True)

tts = load_tts_model()

# App title
st.title("🔊 Voice Cloning with XTTS v2")

# Text input
text_input = st.text_area("Enter the text you want to synthesize", height=150)

# Speaker file uploader
speaker_file = st.file_uploader("Upload a speaker WAV file", type=["wav"])

# Button to generate
if st.button("Generate Speech"):
    if not text_input:
        st.error("Please enter text.")
    elif not speaker_file:
        st.error("Please upload a speaker WAV file.")
    else:
        try:
            with st.spinner("Generating voice..."):
                # Save uploaded speaker audio temporarily
                with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as speaker_temp:
                    speaker_temp.write(speaker_file.read())
                    speaker_path = speaker_temp.name

                # Temporary file to store output
                output_path = os.path.join(tempfile.gettempdir(), "output.wav")

                # Generate speech
                tts.tts_to_file(
                    text=text_input,
                    file_path=output_path,
                    speaker_wav=speaker_path,
                    language="en"
                )

                # Playback
                st.audio(output_path, format="audio/wav")

                # Download link
                with open(output_path, "rb") as f:
                    st.download_button(
                        label="Download Audio",
                        data=f,
                        file_name="cloned_voice.wav",
                        mime="audio/wav"
                    )

                # Clean up
                os.remove(speaker_path)

        except Exception as e:
            st.error(f"An error occurred: {e}")