File size: 4,429 Bytes
df17f59 3a37e60 df17f59 81fa27b 9ff57ed 81fa27b 061a546 81fa27b 061a546 81fa27b 061a546 81fa27b 061a546 9ff57ed 3a37e60 9ff57ed 3a37e60 df17f59 3a37e60 df17f59 c71f017 061a546 81fa27b c71f017 3a37e60 df17f59 3a37e60 df17f59 9ff57ed 061a546 ad018e7 df17f59 3a37e60 df17f59 3a37e60 81fa27b 3a37e60 9ff57ed ad018e7 061a546 3a37e60 ad018e7 3a37e60 ad018e7 061a546 3a37e60 df17f59 |
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
import gradio as gr
import soundfile as sf
import datetime
import numpy as np
import hashlib
MAX_LENGTH = 1.5 # in seconds
# 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. **選擇標記**: 從下拉選單中選擇一個標記,或選擇“自定義”以輸入自己的標記。
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:
labels = ["Label1", "Label2", "Label3", "Custom"] # Add a "Custom" option for custom label
label_dropdown = gr.Dropdown(choices=labels, 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()
|