Felguk's picture
Update app.py
f2ea7f6 verified
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()