import torch import os import streamlit as st from TTS.api import TTS from tempfile import NamedTemporaryFile # By using XTTS you agree to CPML license https://coqui.ai/cpml os.environ["COQUI_TOS_AGREED"] = "1" def generate_audio(audio_file, text_input): # Initialize model model = "tts_models/multilingual/multi-dataset/xtts_v2" #coqui/XTTS-v2 device = 'cuda' if torch.cuda.is_available() else 'cpu' tts = TTS(model).to(device) with NamedTemporaryFile(delete=False, suffix='.wav') as tmp_file: output_path = tmp_file.name tts.tts_to_file(text=text_input, speaker_wav=audio_file, language='en', file_path=output_path) return output_path def main(): # Title title = f"""

Voice Clone

""" st.markdown(title, unsafe_allow_html=True) # Subtitle title = f"""

Make your favorite characters say anything!

""" st.markdown(title, unsafe_allow_html=True) sample_files = { '': '', 'Stewie Griffin': 'sample_inputs/stewie.wav', 'Donald Trump': 'sample_inputs/trump.wav', 'Joe Rogan': 'sample_inputs/rogan.wav' } # Upload audio file uploaded_file = st.file_uploader('Add an audio (.wav) file of the voice you want to clone...', type=['wav']) if uploaded_file is None: selected_sample = st.selectbox('Or choose a sample:', list(sample_files.keys())) speaker_file = uploaded_file if uploaded_file is not None else sample_files[selected_sample] if speaker_file: st.header('Reference Audio') st.audio(speaker_file, format='audio/wav') # Input text text_input = st.text_area('What do you want your character to say? Try to keep the prompt around 2 sentences.') if st.button('Synthesize'): if text_input: try: with st.spinner('Synthesizing...'): output_path = generate_audio(speaker_file, text_input) st.header('Synthesized Audio') st.audio(output_path, format='audio/wav') except: st.error('There was an issue synthesizing the text. Please check the input and try again. Try to keep the input around 2 sentences, and less than 200 characters.') else: st.error('Please provide a text input!') if __name__ == '__main__': main()