global-sound / src /audio_processor.py
vinod-anbalagan's picture
Update src/audio_processor.py
664c01d verified
# src/audio_processor.py
import tempfile
import moviepy.editor as mp
import librosa
import noisereduce as nr
import soundfile as sf
import numpy as np
class AudioProcessor:
def __init__(self, target_sr: int = 16000):
self.target_sr = target_sr
# --- UPDATED FUNCTION ---
def extract_and_process_audio(self, video_path: str, apply_noise_reduction: bool, duration_limit_secs: int = None) -> str:
"""
Extracts audio, optionally truncates it, and applies noise reduction.
"""
print("Step 1: Extracting audio from video...")
try:
video_clip = mp.VideoFileClip(video_path)
# --- NEW: Truncate the clip if a duration is specified ---
if duration_limit_secs and video_clip.duration > duration_limit_secs:
print(f"Limiting video duration to {duration_limit_secs} seconds for quick process mode.")
video_clip = video_clip.subclip(0, duration_limit_secs)
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as temp_audio_file:
video_clip.audio.write_audiofile(temp_audio_file.name, fps=self.target_sr, codec='pcm_s16le')
temp_audio_path = temp_audio_file.name
audio, sr = librosa.load(temp_audio_path, sr=self.target_sr)
if apply_noise_reduction:
print("Step 1a: Applying noise reduction...")
audio = nr.reduce_noise(y=audio, sr=self.target_sr)
final_audio_file = tempfile.NamedTemporaryFile(suffix=".wav", delete=False)
sf.write(final_audio_file.name, audio, self.target_sr)
print(f"Audio Processing complete. Saved to: {final_audio_file.name}")
return final_audio_file.name
except Exception as e:
print(f"Error processing audio: {e}")
raise