File size: 3,765 Bytes
c769319
577cd8e
4a7d9b6
c769319
577cd8e
40f31ac
 
0789588
c769319
8d185df
 
 
765c790
 
bfe61b1
a53b35a
 
40f31ac
4a7d9b6
 
 
 
 
 
 
 
 
 
 
 
0789588
40f31ac
b977317
40f31ac
b977317
40f31ac
577cd8e
b977317
40f31ac
b977317
 
 
 
d040eb4
 
 
 
 
 
 
 
40f31ac
d040eb4
40f31ac
577cd8e
40f31ac
0789588
 
c769319
 
 
 
b977317
 
 
 
 
c769319
 
 
 
 
64ece3d
c769319
 
 
b977317
 
 
 
c769319
 
 
ee72c14
c769319
 
 
 
39de50d
b977317
4a7d9b6
b977317
 
 
 
 
 
 
 
c769319
 
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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. <br>This interface is based on [VoxNovel](https://github.com/DrewThomasson/VoxNovel).<br>This version default uses StyleTTS2 for slightly faster voice cloning than XTTS.<br> 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()