| import gradio as gr |
| import pandas as pd |
| import os |
| import random |
|
|
| |
| voice_actors_folder = "tortoise/voices/" |
|
|
| |
| 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")] |
|
|
| |
| def extract_unique_speakers(csv_file): |
| df = pd.read_csv(csv_file) |
| |
| unique_speakers = df["Speaker"].unique().tolist() |
| return unique_speakers |
|
|
| |
| def get_random_voice_for_speaker_fast(speaker): |
| selected_voice_actors = 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: |
| selected_voice_actors = male_voice_actors + female_voice_actors |
| |
| return random.choice(selected_voice_actors) |
|
|
| |
| speakers = extract_unique_speakers("book.csv") |
|
|
| |
| selected_voices = {speaker: get_random_voice_for_speaker_fast(speaker) for speaker in speakers} |
|
|
| |
| def get_voice_sample(voice_actor): |
| voice_actor_path = os.path.join(voice_actors_folder, voice_actor) |
| |
| 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 |
|
|
| |
| 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 |
|
|
| |
| def update_voice_and_audio(speaker, selected_voice): |
| selected_voices[speaker] = selected_voice |
| audio_sample = play_sample(speaker) |
| return audio_sample |
|
|
| |
| 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)) |
|
|
| |
| def update_audio(selected_voice, speaker=speaker): |
| return update_voice_and_audio(speaker, selected_voice) |
|
|
| |
| dropdown.change(fn=update_audio, inputs=dropdown, outputs=audio) |
|
|
| return demo |
|
|
| app = create_interface() |
|
|
| if __name__ == "__main__": |
| app.launch() |
|
|