File size: 13,507 Bytes
a42e958
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9dc000d
a42e958
9dc000d
 
 
 
 
 
a42e958
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0a8591f
a42e958
 
 
 
 
 
 
99b4a41
 
 
 
a42e958
 
f2ea7f6
2bbd3fc
 
 
f2ea7f6
2bbd3fc
 
 
 
 
f2ea7f6
 
2bbd3fc
 
 
a42e958
 
f2ea7f6
a42e958
f2ea7f6
 
 
99b4a41
f2ea7f6
 
ddaffee
 
a42e958
ddaffee
f2ea7f6
a42e958
f2ea7f6
 
 
99b4a41
f2ea7f6
 
ddaffee
 
a42e958
f2ea7f6
 
 
 
affaf39
f2ea7f6
 
 
 
 
 
a42e958
f2ea7f6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a42e958
 
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
import gradio as gr
from pydub import AudioSegment
import numpy as np
import librosa
import soundfile as sf
import os

# Вспомогательная функция для загрузки аудио
def load_audio(audio_path):
    return AudioSegment.from_file(audio_path)

# Вспомогательная функция для сохранения аудио
def save_audio(audio, output_path="output.wav"):
    audio.export(output_path, format="wav")
    return output_path

# 1. Изменение громкости
def change_volume(audio_path, volume_change):
    audio = load_audio(audio_path)
    audio = audio + volume_change
    return save_audio(audio, "output_volume.wav")

# 2. Изменение скорости (исправлено)
def change_speed(audio_path, speed_factor):
    audio = load_audio(audio_path)
    # Изменение скорости с использованием frame_rate
    new_frame_rate = int(audio.frame_rate * speed_factor)
    audio_with_changed_speed = audio._spawn(audio.raw_data, overrides={'frame_rate': new_frame_rate})
    audio_with_changed_speed = audio_with_changed_speed.set_frame_rate(audio.frame_rate)
    return save_audio(audio_with_changed_speed, "output_speed.wav")

# 3. Изменение высоты тона
def change_pitch(audio_path, pitch_change):
    y, sr = librosa.load(audio_path, sr=None)
    y = librosa.effects.pitch_shift(y, sr, pitch_change)
    output_path = "output_pitch.wav"
    sf.write(output_path, y, sr)
    return output_path

# 4. Обрезка аудио
def trim_audio(audio_path, start_time, end_time):
    audio = load_audio(audio_path)
    start_ms = int(start_time * 1000)
    end_ms = int(end_time * 1000)
    trimmed_audio = audio[start_ms:end_ms]
    return save_audio(trimmed_audio, "output_trimmed.wav")

# 5. Добавление эха
def add_echo(audio_path, echo_delay, echo_decay):
    y, sr = librosa.load(audio_path, sr=None)
    delay_samples = int(echo_delay * sr)
    echo = np.zeros_like(y)
    echo[delay_samples:] = y[:-delay_samples] * echo_decay
    y_with_echo = y + echo
    output_path = "output_echo.wav"
    sf.write(output_path, y_with_echo, sr)
    return output_path

# 6. Реверс аудио
def reverse_audio(audio_path):
    audio = load_audio(audio_path)
    reversed_audio = audio.reverse()
    return save_audio(reversed_audio, "output_reversed.wav")

# 7. Нормализация аудио
def normalize_audio(audio_path):
    audio = load_audio(audio_path)
    normalized_audio = audio.normalize()
    return save_audio(normalized_audio, "output_normalized.wav")

# 8. Добавление фонового шума
def add_background_noise(audio_path, noise_level):
    audio = load_audio(audio_path)
    noise = AudioSegment.silent(duration=len(audio)) + noise_level
    noisy_audio = audio.overlay(noise)
    return save_audio(noisy_audio, "output_noisy.wav")

# 9. Фильтр низких частот
def low_pass_filter(audio_path, cutoff_freq):
    y, sr = librosa.load(audio_path, sr=None)
    y = librosa.effects.preemphasis(y, coef=cutoff_freq / sr)
    output_path = "output_lowpass.wav"
    sf.write(output_path, y, sr)
    return output_path

# Функция для очистки результатов
def clear_output():
    return None

# Создание интерфейса Gradio с вкладками
with gr.Blocks() as interface:
    gr.Markdown("## Аудио-редактор (Audio Editor / 音频编辑器)")

    # Общий блок для примеров аудио
    with gr.Row():
        gr.Markdown("### Примеры аудио (Audio Examples / 音频示例)")
        examples = gr.Examples(
            examples=[
                ["https://huggingface.co/spaces/Felguk/Felguk-audio-edit/resolve/main/Varilla%20%26%20DJ%20Elnica%20-%20This%20Is%20How%20We%20Do%20It%20(Original%20Mix).mp3"],
                ["https://huggingface.co/spaces/Felguk/Felguk-audio-edit/resolve/main/LowRaise%20%E2%80%94%20Shake%20The%20Ground%20(www.hotplayer.ru).mp3"]
            ],
            inputs=[gr.Audio(type="filepath", label="Выберите пример аудио (Select an example audio / 选择一个示例音频)")],
            label="Примеры аудио (Audio Examples / 音频示例)"
        )

    # Вкладки с инструментами
    with gr.Tabs():
        # Вкладка 1: Изменение громкости
        with gr.Tab("Изменение громкости (Change Volume / 改变音量)"):
            with gr.Column():
                audio_input_1 = gr.Audio(type="filepath", label="Входное аудио (Input Audio / 输入音频)")
                volume_change = gr.Slider(minimum=-20, maximum=20, step=1, label="Изменение громкости (dB) (Volume Change (dB) / 音量变化 (dB))")
                output_1 = gr.Audio(type="filepath", label="Выходное аудио (Output Audio / 输出音频)")
                with gr.Row():
                    apply_button_1 = gr.Button("Применить (Apply / 应用)")
                    clear_button_1 = gr.Button("Очистить результаты (Clear Results / 清除结果)")
                apply_button_1.click(change_volume, inputs=[audio_input_1, volume_change], outputs=output_1)
                clear_button_1.click(clear_output, inputs=None, outputs=output_1)

        # Вкладка 2: Изменение скорости
        with gr.Tab("Изменение скорости (Change Speed / 改变速度)"):
            with gr.Column():
                audio_input_2 = gr.Audio(type="filepath", label="Входное аудио (Input Audio / 输入音频)")
                speed_factor = gr.Slider(minimum=0.5, maximum=2.0, step=0.1, label="Фактор скорости (Speed Factor / 速度因子)")
                output_2 = gr.Audio(type="filepath", label="Выходное аудио (Output Audio / 输出音频)")
                with gr.Row():
                    apply_button_2 = gr.Button("Применить (Apply / 应用)")
                    clear_button_2 = gr.Button("Очистить результаты (Clear Results / 清除结果)")
                apply_button_2.click(change_speed, inputs=[audio_input_2, speed_factor], outputs=output_2)
                clear_button_2.click(clear_output, inputs=None, outputs=output_2)

        # Вкладка 3: Изменение высоты тона
        with gr.Tab("Изменение высоты тона (Change Pitch / 改变音高)"):
            with gr.Column():
                audio_input_3 = gr.Audio(type="filepath", label="Входное аудио (Input Audio / 输入音频)")
                pitch_change = gr.Slider(minimum=-5, maximum=25, step=1, label="Изменение высоты тона (полутоны) (Pitch Change (semitones) / 音高变化 (半音))")
                output_3 = gr.Audio(type="filepath", label="Выходное аудио (Output Audio / 输出音频)")
                with gr.Row():
                    apply_button_3 = gr.Button("Применить (Apply / 应用)")
                    clear_button_3 = gr.Button("Очистить результаты (Clear Results / 清除结果)")
                apply_button_3.click(change_pitch, inputs=[audio_input_3, pitch_change], outputs=output_3)
                clear_button_3.click(clear_output, inputs=None, outputs=output_3)

        # Вкладка 4: Обрезка аудио
        with gr.Tab("Обрезка аудио (Trim Audio / 裁剪音频)"):
            with gr.Column():
                audio_input_4 = gr.Audio(type="filepath", label="Входное аудио (Input Audio / 输入音频)")
                start_time = gr.Slider(minimum=0, maximum=60, step=1, label="Начальное время обрезки (сек) (Start Time (sec) / 开始时间 (秒))")
                end_time = gr.Slider(minimum=0, maximum=60, step=1, label="Конечное время обрезки (сек) (End Time (sec) / 结束时间 (秒))")
                output_4 = gr.Audio(type="filepath", label="Выходное аудио (Output Audio / 输出音频)")
                with gr.Row():
                    apply_button_4 = gr.Button("Применить (Apply / 应用)")
                    clear_button_4 = gr.Button("Очистить результаты (Clear Results / 清除结果)")
                apply_button_4.click(trim_audio, inputs=[audio_input_4, start_time, end_time], outputs=output_4)
                clear_button_4.click(clear_output, inputs=None, outputs=output_4)

        # Вкладка 5: Добавление эха
        with gr.Tab("Добавление эха (Add Echo / 添加回声)"):
            with gr.Column():
                audio_input_5 = gr.Audio(type="filepath", label="Входное аудио (Input Audio / 输入音频)")
                echo_delay = gr.Slider(minimum=0.1, maximum=1.0, step=0.1, label="Задержка эха (сек) (Echo Delay (sec) / 回声延迟 (秒))")
                echo_decay = gr.Slider(minimum=0.1, maximum=1.0, step=0.1, label="Затухание эха (Echo Decay / 回声衰减)")
                output_5 = gr.Audio(type="filepath", label="Выходное аудио (Output Audio / 输出音频)")
                with gr.Row():
                    apply_button_5 = gr.Button("Применить (Apply / 应用)")
                    clear_button_5 = gr.Button("Очистить результаты (Clear Results / 清除结果)")
                apply_button_5.click(add_echo, inputs=[audio_input_5, echo_delay, echo_decay], outputs=output_5)
                clear_button_5.click(clear_output, inputs=None, outputs=output_5)

        # Вкладка 6: Реверс аудио
        with gr.Tab("Реверс аудио (Reverse Audio / 反转音频)"):
            with gr.Column():
                audio_input_6 = gr.Audio(type="filepath", label="Входное аудио (Input Audio / 输入音频)")
                output_6 = gr.Audio(type="filepath", label="Выходное аудио (Output Audio / 输出音频)")
                with gr.Row():
                    apply_button_6 = gr.Button("Применить (Apply / 应用)")
                    clear_button_6 = gr.Button("Очистить результаты (Clear Results / 清除结果)")
                apply_button_6.click(reverse_audio, inputs=audio_input_6, outputs=output_6)
                clear_button_6.click(clear_output, inputs=None, outputs=output_6)

        # Вкладка 7: Нормализация аудио
        with gr.Tab("Нормализация аудио (Normalize Audio / 标准化音频)"):
            with gr.Column():
                audio_input_7 = gr.Audio(type="filepath", label="Входное аудио (Input Audio / 输入音频)")
                output_7 = gr.Audio(type="filepath", label="Выходное аудио (Output Audio / 输出音频)")
                with gr.Row():
                    apply_button_7 = gr.Button("Применить (Apply / 应用)")
                    clear_button_7 = gr.Button("Очистить результаты (Clear Results / 清除结果)")
                apply_button_7.click(normalize_audio, inputs=audio_input_7, outputs=output_7)
                clear_button_7.click(clear_output, inputs=None, outputs=output_7)

        # Вкладка 8: Добавление фонового шума
        with gr.Tab("Добавление фонового шума (Add Background Noise / 添加背景噪音)"):
            with gr.Column():
                audio_input_8 = gr.Audio(type="filepath", label="Входное аудио (Input Audio / 输入音频)")
                noise_level = gr.Slider(minimum=-20, maximum=20, step=1, label="Уровень шума (dB) (Noise Level (dB) / 噪音水平 (dB))")
                output_8 = gr.Audio(type="filepath", label="Выходное аудио (Output Audio / 输出音频)")
                with gr.Row():
                    apply_button_8 = gr.Button("Применить (Apply / 应用)")
                    clear_button_8 = gr.Button("Очистить результаты (Clear Results / 清除结果)")
                apply_button_8.click(add_background_noise, inputs=[audio_input_8, noise_level], outputs=output_8)
                clear_button_8.click(clear_output, inputs=None, outputs=output_8)

        # Вкладка 9: Фильтр низких частот
        with gr.Tab("Фильтр низких частот (Low Pass Filter / 低通滤波器)"):
            with gr.Column():
                audio_input_9 = gr.Audio(type="filepath", label="Входное аудио (Input Audio / 输入音频)")
                cutoff_freq = gr.Slider(minimum=100, maximum=1000, step=50, label="Частота среза (Гц) (Cutoff Frequency (Hz) / 截止频率 (Hz))")
                output_9 = gr.Audio(type="filepath", label="Выходное аудио (Output Audio / 输出音频)")
                with gr.Row():
                    apply_button_9 = gr.Button("Применить (Apply / 应用)")
                    clear_button_9 = gr.Button("Очистить результаты (Clear Results / 清除结果)")
                apply_button_9.click(low_pass_filter, inputs=[audio_input_9, cutoff_freq], outputs=output_9)
                clear_button_9.click(clear_output, inputs=None, outputs=output_9)

interface.launch()