import gradio as gr from datasets import load_dataset # --- Configuration --- DATASET_NAME = "Cnam-LMSSC/vibravox-test" SUBSETS = ["speech_clean", "speech_noisy", "speechless_clean", "speechless_noisy"] SPLITS = ["train", "validation", "test"] TEXT_COLUMN = "raw_text" PHONEMIZED_TEXT_COLUMN = "phonemized_text" GENDER_COLUMN = "gender" AUDIO_COLUMNS = [ "audio.headset_microphone", "audio.throat_microphone", "audio.soft_in_ear_microphone", "audio.rigid_in_ear_microphone", "audio.forehead_accelerometer", "audio.temple_vibration_pickup" ] # --- Main Application Logic --- def load_and_update_all(subset, split): """ Loads a new dataset and returns updates for the entire UI. """ try: dataset = load_dataset(DATASET_NAME, name=subset, split=split) has_text_fields = TEXT_COLUMN in dataset.features sample = dataset[0] sentence = sample.get(TEXT_COLUMN) phonemized_text = sample.get(PHONEMIZED_TEXT_COLUMN) gender = sample.get(GENDER_COLUMN) raw_audio_data = [ (sample[col]['sampling_rate'], sample[col]['array']) for col in AUDIO_COLUMNS ] # --- THE FIX IS HERE --- # We add a condition to handle datasets with only one row. dataset_len = len(dataset) if dataset_len <= 1: # If there's only one item, hide the slider as it's not needed. slider_update = gr.update(visible=False) else: # Otherwise, show and configure the slider as normal. slider_update = gr.update(maximum=dataset_len - 1, value=0, visible=True, interactive=True) # -------------------- return ( dataset, slider_update, # Use the new slider_update variable here gr.update(value=sentence, visible=has_text_fields), gr.update(value=phonemized_text, visible=has_text_fields), gr.update(value=gender, visible=has_text_fields), *raw_audio_data, gr.update(value="", visible=False) ) except Exception as e: error_message = f"Failed to load {subset}/{split}. Error: {e}" empty_audio = (None, None) return ( None, gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), gr.update(visible=False), *[empty_audio] * len(AUDIO_COLUMNS), gr.update(value=error_message, visible=True) ) def get_audio_row(dataset, index): """ Fetches a new row from the currently loaded dataset when the slider moves. """ if dataset is None: return [None] * (3 + len(AUDIO_COLUMNS)) index = int(index) sample = dataset[index] has_text_fields = TEXT_COLUMN in dataset.features sentence = sample.get(TEXT_COLUMN) phonemized_text = sample.get(PHONEMIZED_TEXT_COLUMN) gender = sample.get(GENDER_COLUMN) raw_audio_data = [ (sample[col]['sampling_rate'], sample[col]['array']) for col in AUDIO_COLUMNS ] return [sentence, phonemized_text, gender] + raw_audio_data # --- Build the Gradio Interface (No changes needed here) --- with gr.Blocks(css="footer {display: none !important}") as demo: gr.Markdown("# Vibravox Viewer") loaded_dataset_state = gr.State(None) with gr.Row(): subset_dropdown = gr.Dropdown(SUBSETS, value="speech_clean", label="Select Subset") split_dropdown = gr.Dropdown(SPLITS, value="train", label="Select Split") error_box = gr.Textbox(visible=False, interactive=False, container=False) with gr.Row(): sentence_output = gr.Textbox(label="Raw Text", interactive=False) phonemized_output = gr.Textbox(label="Phonemized Text", interactive=False) gender_output = gr.Textbox(label="Gender", interactive=False) slider = gr.Slider(label="Select Data Row") with gr.Row(): audio1 = gr.Audio(label="Headset Microphone") audio2 = gr.Audio(label="Laryngophone (Throat Mic)") audio3 = gr.Audio(label="Soft In-Ear Microphone") with gr.Row(): audio4 = gr.Audio(label="Rigid In-Ear Microphone") audio5 = gr.Audio(label="Forehead Accelerometer") audio6 = gr.Audio(label="Temple Vibration Pickup") all_outputs = [loaded_dataset_state, slider, sentence_output, phonemized_output, gender_output, audio1, audio2, audio3, audio4, audio5, audio6, error_box] data_outputs = [sentence_output, phonemized_output, gender_output, audio1, audio2, audio3, audio4, audio5, audio6] demo.load(fn=load_and_update_all, inputs=[subset_dropdown, split_dropdown], outputs=all_outputs) subset_dropdown.change(fn=load_and_update_all, inputs=[subset_dropdown, split_dropdown], outputs=all_outputs) split_dropdown.change(fn=load_and_update_all, inputs=[subset_dropdown, split_dropdown], outputs=all_outputs) slider.change(fn=get_audio_row, inputs=[loaded_dataset_state, slider], outputs=data_outputs) demo.launch()