import tkinter as tk
from tkinter import simpledialog, filedialog, messagebox
from pydub import AudioSegment
from pydub.generators import Sine
# Функция для создания звукового сигнала "бип"
def generate_beep(duration_ms):
# Генерируем звуковой сигнал с заданной длительностью и частотой
return Sine(1000).to_audio_segment(duration=duration_ms).apply_gain(-20)
# Функция-заглушка для распознавания речи
def dummy_speech_recognition(audio_chunk, words_to_filter):
return [i for i in range(0, len(audio_chunk), 5000) if "запрещенное слово" in words_to_filter]
class AudioFilterApp(tk.Tk):
def __init__(self):
super().__init__()
self.title('Аудио Фильтратор')
self.initialize_ui()
self.audio_file = None
self.words_to_filter = []
def initialize_ui(self):
self.filename_entry = tk.Entry(self, width=50)
self.filename_entry.grid(row=0, column=1)
self.load_button = tk.Button(self, text="Выбрать аудио файл", command=self.load_file)
self.load_button.grid(row=0, column=2)
self.filter_mode_var = tk.StringVar(value="bleep")
self.bleep_radio = tk.Radiobutton(self, text="Запикать слова", variable=self.filter_mode_var, value="bleep")
self.bleep_radio.grid(row=1, column=0)
self.cut_radio = tk.Radiobutton(self, text="Вырезать слова", variable=self.filter_mode_var, value="cut")
self.cut_radio.grid(row=1, column=1)
self.words_list_button = tk.Button(self, text="Редактировать список слов", command=self.edit_words_list)
self.words_list_button.grid(row=2, column=0, columnspan=3)
self.filter_button = tk.Button(self, text="Отфильтровать аудио файл и сохранить", command=self.filter_audio)
self.filter_button.grid(row=3, column=0, columnspan=3)
def load_file(self):
file_path = filedialog.askopenfilename()
if file_path:
self.filename_entry.delete(0, tk.END)
self.filename_entry.insert(0, file_path)
try:
self.audio_file = AudioSegment.from_file(file_path)
messagebox.showinfo("Загрузка", "Файл успешно загружен!")
except Exception as e:
messagebox.showerror("Ошибка", f"Не удалось загрузить файл: {e}")
self.audio_file = None
def edit_words_list(self):
words_string = simpledialog.askstring("Список слов", "Введите слова для фильтрации через запятую:")
if words_string:
self.words_to_filter = [word.strip().lower() for word in words_string.split(',')]
def filter_audio(self):
if not self.audio_file:
messagebox.showerror("Ошибка", "Аудиофайл не загружен!")
return
# Получаем индексы начала запрещенных слов
indexes_to_filter = dummy_speech_recognition(self.audio_file, self.words_to_filter)
# Создаем новый аудиофайл
new_audio = AudioSegment.empty()
last_index = 0
beep = generate_beep(1000) # Длительность "бип" - 1000 мс
for index in indexes_to_filter:
new_audio += self.audio_file[last_index:index]
if self.filter_mode_var.get() == "bleep":
new_audio += beep
last_index = index + 5000 # Предполагаемая длительность запрещенного слова
new_audio += self.audio_file[last_index:] # Добавляем оставшуюся часть аудио
save_path = filedialog.asksaveasfilename(defaultextension=".mp3", filetypes=[("MP3 files", "*.mp3")])
if save_path:
new_audio.export(save_path, format="mp3")
messagebox.showinfo("Сохранение", "Файл успешно сохранен!")
if __name__ == "__main__":
app = AudioFilterApp()
app.mainloop()