import gradio as gr
import os
import shutil
import subprocess
# Declare the global variable
gradio_input_file = None
def process_ebook(ebook_file):
#This will pre-download the xtts TOS agreed file
import download_tos_agreed_file
import nltk
nltk.download('averaged_perceptron_tagger_eng')
nltk.download('punkt_tab')
#download the en_core_web_sm spacy model
subprocess.run(["python", "-m", "spacy", "download", "en_core_web_sm"])
global gradio_input_file # Use the global variable to store the ebook file path
# Create input_files directory if it doesn't exist
input_dir = "input_files"
if not os.path.exists(input_dir):
os.mkdir(input_dir)
# Copy the uploaded file to input_files folder
input_file_path = os.path.join(input_dir, os.path.basename(ebook_file))
shutil.copy(ebook_file, input_file_path)
# Set the file path to the global variable
gradio_input_file = input_file_path
# Print the name of the uploaded file
ebook_file_name = os.path.basename(ebook_file)
print(f"Uploaded file: {ebook_file_name}")
# Call the Auto_VoxNovel.py script and pass the file path as an argument
try:
process = subprocess.Popen(
["python3", "Auto_VoxNovel.py", gradio_input_file], # Pass gradio_input_file as an argument
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True
)
# Print output in real-time
for line in process.stdout:
print(line, end='')
process.wait()
if process.returncode == 0:
return f"Audiobook is ready! You can now download your files."
else:
return "Error occurred during audiobook processing."
except Exception as e:
return f"Failed to run audiobook script: {str(e)}"
def list_output_files():
# List all files in the output directory for downloading
output_dir = "output_audiobooks"
if os.path.exists(output_dir):
files = [
os.path.join(output_dir, f)
for f in os.listdir(output_dir)
if os.path.isfile(os.path.join(output_dir, f))
]
return files
return []
# Gradio Interface
with gr.Blocks() as gui:
gr.Markdown("### VoxNovel Ebook to Audiobook Converter: Give each character a separate voice.
This interface is based on [VoxNovel](https://github.com/DrewThomasson/VoxNovel).
This version default uses StyleTTS2 for slightly faster voice cloning than XTTS.
This one only works with English txt files sadly. 😔")
with gr.Row():
with gr.Column():
ebook_input = gr.File(
label="Upload your ebook file (epub, pdf, etc.)",
type='filepath' # Specify that we want the file path
)
process_button = gr.Button("Start Processing")
status_output = gr.Textbox(label="Status")
process_button.click(process_ebook, inputs=ebook_input, outputs=status_output)
demo_audio = gr.Audio(label="Play Demo", value="demo.mp3", type="filepath") # Add your demo.mp3 path here
with gr.Column():
gr.Markdown("### Download Generated Audiobook Files")
download_button = gr.Button("Reload Files")
file_output = gr.Files(
label="Generated Audiobook Files",
type='filepath' # Use 'filepath' type for gr.Files component
)
# Update the file_output component with the list of output files
def update_output_files():
files = list_output_files()
return files
download_button.click(fn=update_output_files, inputs=[], outputs=file_output)
gui.launch()