Felguk commited on
Commit
a42e958
·
verified ·
1 Parent(s): adda8b9

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +181 -0
app.py ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from pydub import AudioSegment
3
+ import numpy as np
4
+ import librosa
5
+ import soundfile as sf
6
+ import os
7
+
8
+ # Вспомогательная функция для загрузки аудио
9
+ def load_audio(audio_path):
10
+ return AudioSegment.from_file(audio_path)
11
+
12
+ # Вспомогательная функция для сохранения аудио
13
+ def save_audio(audio, output_path="output.wav"):
14
+ audio.export(output_path, format="wav")
15
+ return output_path
16
+
17
+ # 1. Изменение громкости
18
+ def change_volume(audio_path, volume_change):
19
+ audio = load_audio(audio_path)
20
+ audio = audio + volume_change
21
+ return save_audio(audio, "output_volume.wav")
22
+
23
+ # 2. Изменение скорости
24
+ def change_speed(audio_path, speed_factor):
25
+ y, sr = librosa.load(audio_path, sr=None)
26
+ y = librosa.effects.time_stretch(y, speed_factor)
27
+ output_path = "output_speed.wav"
28
+ sf.write(output_path, y, sr)
29
+ return output_path
30
+
31
+ # 3. Изменение высоты тона
32
+ def change_pitch(audio_path, pitch_change):
33
+ y, sr = librosa.load(audio_path, sr=None)
34
+ y = librosa.effects.pitch_shift(y, sr, pitch_change)
35
+ output_path = "output_pitch.wav"
36
+ sf.write(output_path, y, sr)
37
+ return output_path
38
+
39
+ # 4. Обрезка аудио
40
+ def trim_audio(audio_path, start_time, end_time):
41
+ audio = load_audio(audio_path)
42
+ start_ms = int(start_time * 1000)
43
+ end_ms = int(end_time * 1000)
44
+ trimmed_audio = audio[start_ms:end_ms]
45
+ return save_audio(trimmed_audio, "output_trimmed.wav")
46
+
47
+ # 5. Добавление эха
48
+ def add_echo(audio_path, echo_delay, echo_decay):
49
+ y, sr = librosa.load(audio_path, sr=None)
50
+ delay_samples = int(echo_delay * sr)
51
+ echo = np.zeros_like(y)
52
+ echo[delay_samples:] = y[:-delay_samples] * echo_decay
53
+ y_with_echo = y + echo
54
+ output_path = "output_echo.wav"
55
+ sf.write(output_path, y_with_echo, sr)
56
+ return output_path
57
+
58
+ # 6. Реверс аудио
59
+ def reverse_audio(audio_path):
60
+ audio = load_audio(audio_path)
61
+ reversed_audio = audio.reverse()
62
+ return save_audio(reversed_audio, "output_reversed.wav")
63
+
64
+ # 7. Нормализация аудио
65
+ def normalize_audio(audio_path):
66
+ audio = load_audio(audio_path)
67
+ normalized_audio = audio.normalize()
68
+ return save_audio(normalized_audio, "output_normalized.wav")
69
+
70
+ # 8. Добавление фонового шума
71
+ def add_background_noise(audio_path, noise_level):
72
+ audio = load_audio(audio_path)
73
+ noise = AudioSegment.silent(duration=len(audio)) + noise_level
74
+ noisy_audio = audio.overlay(noise)
75
+ return save_audio(noisy_audio, "output_noisy.wav")
76
+
77
+ # 9. Изменение баланса каналов
78
+ def change_balance(audio_path, balance):
79
+ audio = load_audio(audio_path)
80
+ left = audio.split_to_mono()[0] - (balance * 6) # Уменьшаем громкость одного канала
81
+ right = audio.split_to_mono()[1] - ((1 - balance) * 6)
82
+ balanced_audio = AudioSegment.from_mono_arrays(
83
+ left.get_array_of_samples(),
84
+ right.get_array_of_samples(),
85
+ frame_rate=audio.frame_rate
86
+ )
87
+ return save_audio(balanced_audio, "output_balanced.wav")
88
+
89
+ # 10. Фильтр низких частот
90
+ def low_pass_filter(audio_path, cutoff_freq):
91
+ y, sr = librosa.load(audio_path, sr=None)
92
+ y = librosa.effects.preemphasis(y, coef=cutoff_freq / sr)
93
+ output_path = "output_lowpass.wav"
94
+ sf.write(output_path, y, sr)
95
+ return output_path
96
+
97
+ # Создание интерфейса Gradio с вкладками
98
+ with gr.Blocks() as interface:
99
+ gr.Markdown("## Аудио-редактор")
100
+ with gr.Tabs():
101
+ # Вкладка 1: Изменение громкости
102
+ with gr.Tab("Изменение громкости"):
103
+ with gr.Column():
104
+ audio_input_1 = gr.Audio(type="filepath", label="Входное аудио")
105
+ volume_change = gr.Slider(minimum=-20, maximum=20, step=1, label="Изменение громкости (dB)")
106
+ output_1 = gr.Audio(type="filepath", label="Выходное аудио")
107
+ gr.Button("Применить").click(change_volume, inputs=[audio_input_1, volume_change], outputs=output_1)
108
+
109
+ # Вкладка 2: Изменение скорости
110
+ with gr.Tab("Изменение скорости"):
111
+ with gr.Column():
112
+ audio_input_2 = gr.Audio(type="filepath", label="Входное аудио")
113
+ speed_factor = gr.Slider(minimum=0.5, maximum=2.0, step=0.1, label="Фактор скорости")
114
+ output_2 = gr.Audio(type="filepath", label="Выходное аудио")
115
+ gr.Button("Применить").click(change_speed, inputs=[audio_input_2, speed_factor], outputs=output_2)
116
+
117
+ # Вкладка 3: Изменение высоты тона
118
+ with gr.Tab("Изменение высоты тона"):
119
+ with gr.Column():
120
+ audio_input_3 = gr.Audio(type="filepath", label="Входное аудио")
121
+ pitch_change = gr.Slider(minimum=-5, maximum=5, step=1, label="Изменение высоты тона (полутоны)")
122
+ output_3 = gr.Audio(type="filepath", label="Выходное аудио")
123
+ gr.Button("Применить").click(change_pitch, inputs=[audio_input_3, pitch_change], outputs=output_3)
124
+
125
+ # Вкладка 4: Обрезка аудио
126
+ with gr.Tab("Обрезка аудио"):
127
+ with gr.Column():
128
+ audio_input_4 = gr.Audio(type="filepath", label="Входное аудио")
129
+ start_time = gr.Slider(minimum=0, maximum=60, step=1, label="Начальное время обрезки (сек)")
130
+ end_time = gr.Slider(minimum=0, maximum=60, step=1, label="Конечное время обрезки (сек)")
131
+ output_4 = gr.Audio(type="filepath", label="Выходное аудио")
132
+ gr.Button("Применить").click(trim_audio, inputs=[audio_input_4, start_time, end_time], outputs=output_4)
133
+
134
+ # Вкладка 5: Добавление эха
135
+ with gr.Tab("Добавление эха"):
136
+ with gr.Column():
137
+ audio_input_5 = gr.Audio(type="filepath", label="Входное аудио")
138
+ echo_delay = gr.Slider(minimum=0.1, maximum=1.0, step=0.1, label="Задержка эха (сек)")
139
+ echo_decay = gr.Slider(minimum=0.1, maximum=1.0, step=0.1, label="Затухание эха")
140
+ output_5 = gr.Audio(type="filepath", label="Выходное аудио")
141
+ gr.Button("Применить").click(add_echo, inputs=[audio_input_5, echo_delay, echo_decay], outputs=output_5)
142
+
143
+ # Вкладка 6: Реверс аудио
144
+ with gr.Tab("Реверс аудио"):
145
+ with gr.Column():
146
+ audio_input_6 = gr.Audio(type="filepath", label="Входное аудио")
147
+ output_6 = gr.Audio(type="filepath", label="Выходное аудио")
148
+ gr.Button("Применить").click(reverse_audio, inputs=audio_input_6, outputs=output_6)
149
+
150
+ # Вкладка 7: Нормализация аудио
151
+ with gr.Tab("Нормализация аудио"):
152
+ with gr.Column():
153
+ audio_input_7 = gr.Audio(type="filepath", label="Входное аудио")
154
+ output_7 = gr.Audio(type="filepath", label="Выходное аудио")
155
+ gr.Button("Применить").click(normalize_audio, inputs=audio_input_7, outputs=output_7)
156
+
157
+ # Вкладка 8: Добавление фонового шума
158
+ with gr.Tab("Добавление фонового шума"):
159
+ with gr.Column():
160
+ audio_input_8 = gr.Audio(type="filepath", label="Входное аудио")
161
+ noise_level = gr.Slider(minimum=-20, maximum=20, step=1, label="Уровень шума (dB)")
162
+ output_8 = gr.Audio(type="filepath", label="Выходное аудио")
163
+ gr.Button("Применить").click(add_background_noise, inputs=[audio_input_8, noise_level], outputs=output_8)
164
+
165
+ # Вкладка 9: Изменение баланса каналов
166
+ with gr.Tab("Изменение баланса каналов"):
167
+ with gr.Column():
168
+ audio_input_9 = gr.Audio(type="filepath", label="Входное аудио")
169
+ balance = gr.Slider(minimum=0.0, maximum=1.0, step=0.1, label="Баланс (0.0 - левый, 1.0 - правый)")
170
+ output_9 = gr.Audio(type="filepath", label="Выходное аудио")
171
+ gr.Button("Применить").click(change_balance, inputs=[audio_input_9, balance], outputs=output_9)
172
+
173
+ # Вкладка 10: Фильтр низких частот
174
+ with gr.Tab("Фильтр низких частот"):
175
+ with gr.Column():
176
+ audio_input_10 = gr.Audio(type="filepath", label="Входное аудио")
177
+ cutoff_freq = gr.Slider(minimum=100, maximum=1000, step=50, label="Частота среза (Гц)")
178
+ output_10 = gr.Audio(type="filepath", label="Выходное аудио")
179
+ gr.Button("Применить").click(low_pass_filter, inputs=[audio_input_10, cutoff_freq], outputs=output_10)
180
+
181
+ interface.launch()