Spaces:
Sleeping
Sleeping
| """ | |
| Модуль предобработки аудио: шумоподавление и нормализация громкости | |
| """ | |
| import os | |
| import librosa | |
| import noisereduce as nr | |
| import numpy as np | |
| from scipy.io import wavfile | |
| def preprocess_audio(file_path: str, output_path: str = None) -> str: | |
| """ | |
| Шумоподавление и нормализация уровня громкости. | |
| Args: | |
| file_path: путь к исходному аудиофайлу | |
| output_path: путь для сохранения обработанного файла | |
| Returns: | |
| путь к обработанному аудиофайлу | |
| """ | |
| print(f" Загрузка аудио: {file_path}") | |
| audio, sr = librosa.load(file_path, sr=None) | |
| # Шумоподавление (первые 0.5 секунды как профиль шума) | |
| noise_sample = audio[:int(sr * 0.5)] | |
| audio_denoised = nr.reduce_noise( | |
| y=audio, | |
| sr=sr, | |
| y_noise=noise_sample, | |
| prop_decrease=0.8 | |
| ) | |
| # Нормализация громкости (максимальная амплитуда = 0.9) | |
| max_val = np.max(np.abs(audio_denoised)) | |
| if max_val > 0: | |
| audio_normalized = audio_denoised / max_val * 0.9 | |
| else: | |
| audio_normalized = audio_denoised | |
| # Преобразование в int16 для сохранения | |
| audio_int16 = (audio_normalized * 32767).astype(np.int16) | |
| # Сохранение (правильная обработка расширения) | |
| if output_path is None: | |
| # Разделяем имя файла и расширение | |
| base, ext = os.path.splitext(file_path) | |
| output_path = f"{base}_processed.wav" | |
| wavfile.write(output_path, sr, audio_int16) | |
| print(f" Предобработка завершена: {output_path}") | |
| return output_path |