Video-Content-Analyzer / src /audio_processing.py
Sejal Barshikar
Added audio extraction and Whisper transcription
35e1a43
Raw
History Blame Contribute Delete
1.8 kB
import whisper
import os
from pathlib import Path
from typing import Dict, List, Optional
import subprocess
def extract_audio(video_path: str, output_audio_path: str) -> str:
print(f"Extracting audio from {video_path}")
command = [
'ffmpeg',
'-i', video_path,
'-vn',
'-acodec', 'pcm_s16le',
'-ar', '16000',
'-ac', '1',
'-y',
output_audio_path
]
result = subprocess.run(command, capture_output=True, text= True)
if result.returncode != 0:
raise RuntimeError(f"FFmpeg failed: {result.stderr}")
print(f"Audio extracted to {output_audio_path}")
return output_audio_path
class AudioTranscriber:
def __init__(self, model_name:str = 'base'):
print(f"loading Whisper model: {model_name}")
self.model = whisper.load_model(model_name)
def transcribe(self, audio_path: str, language: Optional[str]= None) -> Dict:
print(f"Transcribing {audio_path}")
result = self.model.transcribe(
audio_path,
language = language,
word_timestamps= True,
verbose= False
)
print("Transcription complete!")
print(f"Detected language: {result['language']}")
return result
def format_transcript(self, result: Dict) -> str:
formatted = []
formatted.append(f"Language: {result['language']}\n")
formatted.append("\nFull Text:")
formatted.append(result['text'])
formatted.append("\nTimestamped Segments:")
for segment in result['segments']:
start = segment['start']
end = segment['end']
text = segment['text']
formatted.append(f"[{start:.2f}s - {end:.2f}s]: {text}")
return '\n'.join(formatted)