import gradio as gr import pandas as pd import os import random # Path to voice actors folder voice_actors_folder = "tortoise/voices/" # Get the list of voice actors voice_actors = [va for va in os.listdir(voice_actors_folder) if va != "cond_latent_example" and va != ".DS_Store"] male_voice_actors = [va for va in voice_actors if va.endswith(".M")] female_voice_actors = [va for va in voice_actors if va.endswith(".F")] # Function to extract unique speakers from CSV def extract_unique_speakers(csv_file): df = pd.read_csv(csv_file) # Extract unique speakers from "Speaker" column unique_speakers = df["Speaker"].unique().tolist() return unique_speakers # Function to get a random default voice actor for each speaker def get_random_voice_for_speaker_fast(speaker): selected_voice_actors = voice_actors # default to all voice actors if speaker.endswith(".M") and male_voice_actors: selected_voice_actors = male_voice_actors elif speaker.endswith(".F") and female_voice_actors: selected_voice_actors = female_voice_actors elif speaker.endswith(".?"): selected_voice_actors = male_voice_actors + female_voice_actors if not selected_voice_actors: # If list is empty, default to all voice actors selected_voice_actors = male_voice_actors + female_voice_actors return random.choice(selected_voice_actors) # Extract speakers from the CSV file speakers = extract_unique_speakers("book.csv") # Dictionary to store selected voice actors for each speaker selected_voices = {speaker: get_random_voice_for_speaker_fast(speaker) for speaker in speakers} # Function to find and return a sample audio file for the selected voice actor def get_voice_sample(voice_actor): voice_actor_path = os.path.join(voice_actors_folder, voice_actor) # Look for any .wav or .mp3 files in the voice actor's folder for file in os.listdir(voice_actor_path): if file.endswith(".wav") or file.endswith(".mp3"): return os.path.join(voice_actor_path, file) return None # Function to return the voice sample file for a given speaker def play_sample(speaker): selected_voice = selected_voices[speaker] sample_file = get_voice_sample(selected_voice) if sample_file: return sample_file else: return None # Function to update only the voice for a specific speaker and return the updated audio preview def update_voice_and_audio(speaker, selected_voice): selected_voices[speaker] = selected_voice audio_sample = play_sample(speaker) return audio_sample # Creating Gradio interface using Blocks def create_interface(): with gr.Blocks() as demo: for speaker in speakers: with gr.Row(): dropdown = gr.Dropdown(choices=voice_actors, label=f"Select voice actor for {speaker}", value=selected_voices[speaker]) audio = gr.Audio(label=f"Audio preview for {speaker}", type="filepath", value=play_sample(speaker)) # Function to update audio when a new voice actor is selected def update_audio(selected_voice, speaker=speaker): return update_voice_and_audio(speaker, selected_voice) # Connect the dropdown change to the audio preview update dropdown.change(fn=update_audio, inputs=dropdown, outputs=audio) return demo app = create_interface() if __name__ == "__main__": app.launch()