Spaces:
Sleeping
Sleeping
File size: 4,575 Bytes
d5152da bf1a4b4 d5152da bf1a4b4 d5152da bf1a4b4 d5152da bf1a4b4 b5dc88b bf1a4b4 d5152da bf1a4b4 b5dc88b bf1a4b4 d356a41 | 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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | #####################################################################
#This application provides and esample of FASTAPI for
# transcribing an mp4 video and summarizing the transcription
######################################################################
import os
import subprocess
from moviepy.video.io.VideoFileClip import VideoFileClip
from moviepy.audio.io.AudioFileClip import AudioFileClip
import whisper
from openai import OpenAI
from fastapi import FastAPI
from transformers import pipeline
#import os
#os.system("apt-get update && apt-get install -y ffmpeg")
#result = subprocess.run(["ffmpeg", "-version"], capture_output=True, text=True)
#print(result.stdout)
#input_file = "input.mp4"
#output_file = "output.mp3"
#subprocess.run(["ffmpeg", "-i", input_file, output_file])
## create a new FASTAPI app instance
app=FastAPI()
# Initialize the text generation pipeline
#pipe = pipeline("text2text-generation", model="google/flan-t5-small")
# This is default function
@app.get("/")
def home():
return {"message":"Hello World"}
# Define a function to handle the GET request at `/generate`
#
@app.get("/generate")
def generate(text:str):
## use the pipeline to generate text from given input text
output=pipe(text)
## return the generate text in Json reposne
return {"output":output[0]['generated_text']}
# This function
# 1. takes mp4 video as input
# 2. creates mp3 file from mp4 file
# 3. creates wav file from mp3 file
# 4. transcribes to text from the wav file
@app.get("/transcribe")
def get_transcript_mp4(mp4_path):
#path_to_check = r"C:\Program Files\ffmpeg\bin"
#if path_to_check in os.environ["PATH"]:
#print(f"{path_to_check} is in the PATH")
#else:
#print(f"{path_to_check} is NOT in the PATH")
#os.environ["PATH"] += os.pathsep + path_to_check
ffmpeg_version = subprocess.run(["ffmpeg", "-version"], capture_output=True, text=True)
print(ffmpeg_version.stdout)
# Assuming the mp4 file has a transcript available
# This is a placeholder function. You would need to implement actual transcript extraction from mp4.
# For now, we will return a dummy transcript.
if os.path.exists(mp4_path):
print("File exists!: ", mp4_path)
# construct mp3 path
# Replace the .mp4 extension with .mp3
# Get the file name without extension
base_name = os.path.splitext(mp4_path)[0]
mp3_path = f"{base_name}.mp3" # Append .mp3 extension
#construct wav file path
wav_path = f"{base_name}.wav" # Append .mp3 extension
# construct the file to store the transcript
transcript_path = f"{base_name}_transcript.txt"
video = VideoFileClip(mp4_path)
video.audio.write_audiofile(mp3_path)
print("Conversion to mp3 complete!")
audio = AudioFileClip(mp3_path)
audio.write_audiofile(wav_path)
print("Conversion to wav complete!")
# Initialize the Whisper model (small model is a good balance for speed and accuracy)
print("Transcribing audio...")
model = whisper.load_model("tiny.en") # Options: "tiny", "base", "small", "medium", "large"
# Transcribe the audio
result = model.transcribe(wav_path)
print("Transcription completed!")
meet_data=result["text"]
with open(transcript_path, "w") as file:
file.write(meet_data)
print("Txt written to file: ", transcript_path)
return meet_data
else:
print("File NOT found! Check the path for: ", mp4_path)
return "Test summary"
# This function
# 1. takes text as input
# 2. summarizes the input text
@app.get("/summarize")
def summarize_text(text, lang='en'):
OpenAI.api_key = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=OpenAI.api_key)
prompt = f"""
The following text is in its original language. Provide the output in this language: {lang}.
Format the output as follows:
Summary:
short summary of the video
Key Takeaways:
succinct bullet point list of key takeaways
Detailed important points:
succinct bullet point list of feature details
input text: {text}
"""
response = client.chat.completions.create(
messages=[{"role": "user", "content": prompt}],
model="gpt-4o",
temperature=0,
#model="gpt-4-turbo", # better performance, slower inference
)
summary_text = response.to_dict()['choices'][0]['message']['content']
return summary_text
|