File size: 2,081 Bytes
2afbf1e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b92267f
2afbf1e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from TTS.api import TTS
from bs4 import BeautifulSoup
import requests
import streamlit as st
import tempfile
import os
import json
import datetime

with open('config.json', 'r') as f:
    config = json.load(f)

APP_NAME = config['APP_NAME']
APP_LOGO = config['APP_LOGO']
APP_DESCRIPTION = config['APP_DESCRIPTION']

def contains_only_ascii(input_string):
    return all(ord(char) < 128 for char in input_string)

def create_temp_file(input_wav):
    temp_file = tempfile.NamedTemporaryFile(delete=False)
    temp_file.write(input_wav.read())
    return temp_file

def remove_temp_file(temp_file):
    temp_file.close()
    os.remove(temp_file.name)

def update_progress(percent, text):
    progress_bar.progress(percent)
    status_text.text(text)

st.set_page_config(page_title=APP_NAME)
st.title(APP_NAME)
st.image(APP_LOGO, use_column_width=True)
st.markdown(APP_DESCRIPTION)

input_wav = st.file_uploader("Upload a WAV file with your voice", type=["wav"])
clone_wav = st.file_uploader("Upload a WAV file with voice to clone", type=["wav"])

if input_wav and clone_wav:
    progress_bar = st.progress(0)
    status_text = st.empty()

    current_datetime = datetime.datetime.now()
    formatted_datetime = current_datetime.strftime("%Y-%m-%d_%H%M%S")
    output_filename = f"recording_{formatted_datetime}.wav"

    temp_input_file = create_temp_file(input_wav)
    temp_clone_file = create_temp_file(clone_wav)

    update_progress(0, 'Loading TTS model...')
    api = TTS("voice_conversion_models/multilingual/vctk/freevc24")

    update_progress(50, 'Generating audio...')
    api.voice_conversion_to_file(
        source_wav=temp_input_file.name,
        target_wav=temp_clone_file.name,
        file_path=output_filename
    )

    remove_temp_file(temp_input_file)
    remove_temp_file(temp_clone_file)

    audio_file = open(output_filename, 'rb')
    audio_bytes = audio_file.read()

    update_progress(100, 'Audio generated successfully!')

    st.audio(audio_bytes, format='audio/wav')

    st.download_button('Download WAV', data=audio_bytes, file_name='output.wav')