Spaces:
Sleeping
Sleeping
| from utils.bad_words import words | |
| import re | |
| from models.whisper import model | |
| import random | |
| import string | |
| import subprocess | |
| class Wash: | |
| def __init__(self, custom_db = None): | |
| self.db = words | |
| if(custom_db): | |
| self.db = custom_db | |
| def clean(phrase): | |
| return re.sub(r'\s+', ' ', phrase.lower()) | |
| def tokenize(phrase): | |
| with_punctuation = re.sub(r'[^a-zA-Z\s]', '', phrase).split() | |
| without_punctuation = re.sub(r'[^a-zA-Z\s]', '', phrase).split() | |
| return with_punctuation + without_punctuation | |
| def words(self): | |
| return self.db | |
| def check_word(self, word): | |
| word = word.replace(" ", "") | |
| bad_words = self.words() | |
| tokens = self.tokenize(word) | |
| for token in tokens: | |
| if token in bad_words: | |
| return True | |
| return False | |
| def generate_random_name(self, length): | |
| letters = string.ascii_lowercase | |
| return ''.join(random.choice(letters) for _ in range(length)) | |
| def insert_beep(self, itensList, original_file, offset=0): | |
| if not itensList: | |
| return | |
| output = self.generate_random_name(8) + ".wav" | |
| filter_str = "[0]volume=0:enable=\'" | |
| for i, item in enumerate(itensList): | |
| start = item["start"] | |
| end = item["end"] | |
| start_plus_offset = round(start + offset, 2) | |
| end_minus_offset = round(end - offset, 2) | |
| filter_str += f'between(t,{start_plus_offset},{end_minus_offset})' | |
| if i != len(itensList) - 1: | |
| filter_str += '+' | |
| else: | |
| filter_str += "\'" | |
| for item in itensList: | |
| start = round(item["start"], 2) | |
| end = round(item["end"], 2) | |
| start_plus_offset = round(start + offset, 2) | |
| end_minus_offset = round(end - offset, 2) | |
| filter_str += f'[main{start}];' | |
| filter_str += f'sine=d={round(end_minus_offset - start_plus_offset, 2)}:f=1000,adelay={start_plus_offset * 1000}s,pan=stereo|FL=c0|FR=c0[beep{start}];' | |
| filter_str += f'[main{start}][beep{start}]amix=inputs=2:duration=longest' | |
| filter_str = filter_str.rstrip(',') | |
| ffmpeg_cmd = [ | |
| "ffmpeg", | |
| "-i", | |
| original_file, | |
| "-filter_complex", | |
| filter_str, | |
| output | |
| ] | |
| result = subprocess.run(ffmpeg_cmd) | |
| return output | |
| def process_audio(self, audio_path, offset): | |
| bad_time = [] | |
| segments, info = model.transcribe(audio_path, word_timestamps=True, beam_size=1, best_of=1) | |
| for segment in segments: | |
| for word in segment.words: | |
| is_profane = self.check_word(word.word) | |
| if(is_profane): | |
| bad_time.append({ | |
| "start": word.start, | |
| "end": word.end, | |
| }) | |
| result = self.insert_beep(bad_time, audio_path, offset) | |
| if(result): | |
| return result | |
| return audio_path | |
| def check(self, phrase): | |
| cleaned_phrase = self.clean(phrase) | |
| cleaned_phrase = phrase.replace(" ", "") | |
| tokens = self.tokenize(cleaned_phrase) | |
| bad_words = self.words() | |
| for token in tokens: | |
| if token in bad_words: | |
| return True | |
| return False |