import gradio as gr import soundfile as sf import datetime import numpy as np import hashlib MAX_LENGTH = 1.5 # in seconds LABLES = ["Hi! Gemtek!", "Hi! Genix!", "Custom"] # Initialize a list to store file paths uploaded_files = [] help_en = f""" ### Usage Instructions: 1. **Select a Label**: Choose a label from the dropdown menu, or select "Custom" to enter your own label. 2. **Enter User Name**: Input your user name, which will be used to generate a unique ID for your recordings. 3. **Record Audio**: Click the "Record Audio" button to start recording. The maximum length for each recording is {MAX_LENGTH} second. 4. **Submit Recording**: After recording, click the "Submit" button to save the recording. 5. **Download Recordings**: Use the provided download links to retrieve all recorded files. """ help_zh_tw = f""" ### 使用流程: 1. **選擇標記**: 從下拉選單中選擇一個標記,或選擇“Custom”以輸入自己的標記。 2. **輸入用戶名稱**: 輸入您的用戶名稱,用於生成錄音唯一ID。 3. **錄製音頻**: 點擊“錄製音頻”按鈕開始錄音。每次錄音的最長時間為{MAX_LENGTH}秒。 4. **提交錄音**: 錄製完成後,點擊“提交”按鈕保存錄音。 5. **下載錄音**: 使用提供的下載鏈接下載所有已錄製的文件。 """ # Function to save audio with label and speaker name def save_audio(audio, dropdown_label, custom_label, speaker_name): global uploaded_files # Determine the final label label = custom_label if dropdown_label == "Custom" else dropdown_label if not label: raise gr.Error("Label cannot be empty 💥!", duration=5) if not speaker_name: raise gr.Error("User name cannot be empty 💥!", duration=5) # Get sample rate and audio data from Gradio sample_rate = audio[0] audio_data = np.array(audio[1]) # Calculate the audio length in seconds audio_length = len(audio_data) / sample_rate # Check if the audio length exceeds MAX_LENGTH second if audio_length > MAX_LENGTH: raise gr.Error(f"Recording is longer than {MAX_LENGTH} second 💥!", duration=5) # Generate speaker_id using a hash function to ensure consistency speaker_id = hashlib.sha256(speaker_name.encode()).hexdigest()[:8] # Generate file name filename = f"{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}_{speaker_id}_{label}.wav" # Save the audio file in wav format sf.write(filename, audio_data, sample_rate) # Add the new file path to the list of uploaded files uploaded_files.append(filename) # Create an info message info_message = f"Recorded audio length: {audio_length:.2f} seconds." # Display the info message using gr.Info gr.Info(info_message, duration=5) # Return the list of all file paths for download return uploaded_files # Interface design using gr.Blocks def create_interface(): with gr.Blocks() as demo: label_dropdown = gr.Dropdown(choices=LABLES, label="Select Label") custom_label = gr.Textbox(label="Enter Custom Label", visible=False) # Initially hidden # Function to show/hide custom label textbox based on dropdown selection def toggle_custom_label(selected_label): return gr.update(visible=True) if selected_label == "Custom" else gr.update(visible=False) label_dropdown.change(toggle_custom_label, inputs=label_dropdown, outputs=custom_label) speaker_name = gr.Textbox(label="Enter User Name") audio = gr.Audio( sources=["microphone", "upload"], type="numpy", label="Record Audio" ) submit_button = gr.Button("Submit") # Create a list to display all uploaded files file_list = gr.Files(label="Download your recordings") # Create an info display area info_display = gr.Info() # Add the info output to display recording length submit_button.click( fn=save_audio, inputs=[audio, label_dropdown, custom_label, speaker_name], outputs=[file_list], ) # Add usage instructions in both English and Chinese gr.Markdown(help_en) gr.Markdown(help_zh_tw) return demo # Launch the interface if __name__ == "__main__": interface = create_interface() interface.launch()