File size: 1,801 Bytes
35e1a43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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)