VoiceToWrite / preprocessing.py
Seicas's picture
Update preprocessing.py
a0cf6b0 verified
import os
from pydub import AudioSegment
import noisereduce as nr
import numpy as np
import librosa
import soundfile as sf
from typing import Optional
def clean_audio(input_file: str, output_file: Optional[str] = None) -> str:
"""
Ses dosyasını temizleyerek gürültüyü azaltır ve kaliteyi artırır
Args:
input_file: Girdi ses dosyasının yolu
output_file: Çıktı ses dosyasının yolu (None ise otomatik oluşturulur)
Returns:
Temizlenmiş ses dosyasının yolu
"""
# Çıktı dosya adını oluştur
if output_file is None:
output_file = input_file.replace('.wav', '_cleaned.wav')
try:
# Ses dosyasını yükle
audio, sr = librosa.load(input_file, sr=None)
# 1. Gürültü azaltma
reduced_noise = nr.reduce_noise(y=audio, sr=sr, stationary=True)
# 2. Ses seviyesi normalizasyonu
normalized = librosa.util.normalize(reduced_noise)
# 3. Sessiz bölümleri kırp
non_silent_intervals = librosa.effects.split(normalized, top_db=30)
if len(non_silent_intervals) > 0:
non_silent_audio = np.concatenate([
normalized[start:end] for start, end in non_silent_intervals
])
# Çok kısa ise orijinali kullan
if len(non_silent_audio) > 0.5 * len(normalized):
normalized = non_silent_audio
# 4. Band-pass filtresi (insan sesi için optimize - 80Hz-8000Hz)
y_filter = librosa.effects.preemphasis(normalized)
# Temizlenmiş sesi kaydet
sf.write(output_file, y_filter, sr)
return output_file
except Exception as e:
print(f"Ses temizleme hatası: {str(e)}")
# Hata durumunda orijinal dosyayı döndür
return input_file
def clean_audio_streaming(input_file: str, output_file: Optional[str] = None, chunk_seconds: int = 30) -> str:
"""Büyük dosyaları parça parça işle"""
if output_file is None:
output_file = input_file.replace('.wav', '_cleaned.wav')
try:
# Temel bilgileri al
y, sr = librosa.load(input_file, sr=None, duration=10) # Sadece örnek rate için
# Çıktı dosyasını hazırla
with sf.SoundFile(output_file, 'w', sr, channels=1) as out_f:
# Dosyayı parça parça işle
for i, (audio_chunk, sr) in enumerate(librosa.stream(input_file,
block_length=chunk_seconds,
frame_length=2048,
hop_length=512)):
# Her parça için gürültü azaltma
reduced_noise = nr.reduce_noise(y=audio_chunk, sr=sr)
# Normalize
normalized = librosa.util.normalize(reduced_noise)
# Yaz
out_f.write(normalized)
return output_file
except Exception as e:
print(f"Ses temizleme hatası: {str(e)}")
return input_file