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=5, 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()