|
from fastapi import FastAPI, UploadFile |
|
from moviepy.editor import * |
|
from transformers import AutoTokenizer , AutoModelForSeq2SeqLM , pipeline |
|
from transformers import WhisperForConditionalGeneration, WhisperProcessor |
|
from transformers import WhisperFeatureExtractor, WhisperTokenizer |
|
import librosa |
|
import numpy as np |
|
import torch |
|
|
|
|
|
|
|
app = FastAPI() |
|
|
|
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
|
device |
|
|
|
feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-small") |
|
tokenizer = WhisperTokenizer.from_pretrained("openai/whisper-small", language="Swahili", task="transcribe") |
|
processor = WhisperProcessor.from_pretrained("Jayem-11/whisper-small-swahili-3") |
|
asr_model = WhisperForConditionalGeneration.from_pretrained('Jayem-11/whisper-small-swahili-3') |
|
forced_decoder_ids = processor.get_decoder_prompt_ids(language="sw", task="transcribe") |
|
|
|
t5_tokenizer = AutoTokenizer.from_pretrained("google/mt5-small") |
|
summary_model = (AutoModelForSeq2SeqLM.from_pretrained("Jayem-11/mt5-summarize-sw")) |
|
|
|
|
|
@app.get("/") |
|
async def read_root(): |
|
return {"Successful"} |
|
|
|
|
|
|
|
def extract_and_resample_audio(file): |
|
|
|
with open('vid.mp4', 'wb') as f: |
|
|
|
f.write(file) |
|
|
|
video = VideoFileClip("vid.mp4") |
|
|
|
|
|
audio = video.audio |
|
|
|
|
|
audio.write_audiofile("temp_audio.wav") |
|
|
|
|
|
audio_data, sr = librosa.load("temp_audio.wav") |
|
|
|
|
|
audio_resampled = librosa.resample(audio_data, orig_sr = sr, target_sr=16000) |
|
print("Done resampling") |
|
|
|
return audio_resampled |
|
|
|
@app.post("/predict") |
|
async def predict(file: UploadFile): |
|
audio_resampled = extract_and_resample_audio(await file.read()) |
|
|
|
|
|
input_feats = feature_extractor(audio_resampled, sampling_rate = 16000).input_features[0] |
|
|
|
|
|
input_feats = np.expand_dims(input_feats, axis=0) |
|
|
|
|
|
input_feats = torch.from_numpy(input_feats) |
|
|
|
|
|
output = asr_model.generate(input_features=input_feats.to(device),max_new_tokens=255,).cpu().numpy() |
|
|
|
|
|
sample_text = tokenizer.batch_decode(output, skip_special_tokens=True) |
|
|
|
|
|
summarizer = pipeline("summarization", model=summary_model, tokenizer=t5_tokenizer) |
|
|
|
summary = summarizer( |
|
sample_text, |
|
max_length=215, |
|
) |
|
|
|
return {'summary': summary} |
|
|