Spaces:
Running
Running
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() |