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()