Felguk's picture
Update app.py
affaf39 verified
Raw
History Blame Contribute Delete
13.5 kB
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()