|
import streamlit as st |
|
import requests |
|
from pytube import YouTube |
|
import os |
|
from twelvelabs.models.task import Task |
|
|
|
|
|
st.title('12 Labs - Interview Insight Analyzer') |
|
|
|
from twelvelabs import TwelveLabs |
|
|
|
client = TwelveLabs(api_key=os.environ.get('TL_API_KEY')) |
|
|
|
|
|
tab1, tab2, tab3, tab4, tab5 = st.tabs(["Project Description", "Video Uploader", "Video Analyzer", "Unique Value Add", "Thanks Team"]) |
|
|
|
with tab1: |
|
st.header("Project Description") |
|
st.write("Here are the elements of our project.") |
|
image_path = 'data/data_projectflow.png' |
|
|
|
|
|
st.image(image_path, caption='Project Flow Diagram') |
|
|
|
|
|
with tab2: |
|
|
|
|
|
|
|
def download_youtube_video(url): |
|
yt = YouTube(url) |
|
stream = yt.streams.filter(file_extension='mp4').first() |
|
video = stream.download() |
|
return video |
|
|
|
st.header('Video Upload and Processing (To Do)') |
|
|
|
|
|
|
|
|
|
|
|
|
|
with st.container(): |
|
st.write("Video Input") |
|
video_file = st.file_uploader("Upload a video file", type=["mp4", "avi"]) |
|
youtube_url = st.text_input("Or paste a YouTube URL here:") |
|
|
|
|
|
with st.container(): |
|
st.write("Video Processing") |
|
|
|
if st.button("Process Video"): |
|
if video_file is not None: |
|
video_path = video_file.name |
|
with open(video_path, mode='wb') as f: |
|
f.write(video_file.getbuffer()) |
|
elif youtube_url: |
|
video_path = download_youtube_video(youtube_url) |
|
else: |
|
st.warning("Please upload a video file or enter a YouTube URL.") |
|
st.stop() |
|
|
|
print(f"Uploading {video_path}") |
|
task = client.task.create(index_id="<YOUR_INDEX_ID>", file=video_path, language="en") |
|
st.success(f"Task id={task.id}") |
|
|
|
|
|
def on_task_update(task: Task): |
|
st.write(f"Status={task.status}") |
|
|
|
task.wait_for_done(callback=on_task_update) |
|
|
|
if task.status != "ready": |
|
st.error(f"Indexing failed with status {task.status}") |
|
else: |
|
st.success(f"Uploaded {video_path}. The unique identifier of your video is {task.video_id}.") |
|
|
|
|
|
with tab3: |
|
|
|
st.header("Video Analyzer") |
|
st.write("Choose the number of issues you like to examine, and get feedback on how to improve for your next job interview.") |
|
|
|
|
|
col1, col2 = st.columns(2) |
|
|
|
|
|
with col1: |
|
youtube_url = "https://www.youtube.com/watch?v=Uo0KjdDJr1c" |
|
st.video(youtube_url) |
|
|
|
|
|
with col2: |
|
|
|
prompt = st.text_input("Enter your prompt:", |
|
"list the top 4 job interview mistakes and how to improve") |
|
|
|
|
|
number = st.slider("Select the number of top mistakes:", min_value=1, max_value=10, value=4) |
|
|
|
|
|
updated_prompt = prompt.replace("4", str(number)) |
|
|
|
|
|
if st.button("Summarize Video"): |
|
BASE_URL = "https://api.twelvelabs.io/v1.2" |
|
api_key = "tlk_3CPMVGM0ZPTKNT2TKQ3Y62TA7ZY9" |
|
data = { |
|
"video_id": "6636cf7fd1cd5a287c957cf5", |
|
"type": "summary", |
|
"prompt": updated_prompt |
|
} |
|
|
|
|
|
response = requests.post(f"{BASE_URL}/summarize", json=data, headers={"x-api-key": api_key}) |
|
|
|
|
|
if response.status_code == 200: |
|
st.text_area("Summary:", response.json()['summary'], height=300) |
|
else: |
|
st.error("Failed to fetch summary: " + response.text) |
|
|
|
|
|
|
|
|
|
with tab4: |
|
st.header("Top 20 - Unique Value Add") |
|
import streamlit as st |
|
|
|
|
|
items = [ |
|
"Standardization and Fairness: Ensuring every candidate is treated equally improves legal compliance and internal fairness.", |
|
"Improved Hiring Decisions: Objective, data-driven assessments lead to better hires, directly impacting organizational performance.", |
|
"Time and Cost Efficiency: Reducing the time and resources required for hiring processes translates directly into cost savings.", |
|
"Scalability: Ability to handle a high volume of interviews efficiently supports rapid scaling, critical for growth phases.", |
|
"Integration with HR Systems: Streamlining recruitment into broader HR workflows enhances overall HR efficiency.", |
|
"Predictive Analytics: Advanced analytics can forecast candidate success, improving long-term job fit and satisfaction.", |
|
"Enhanced Candidate Experience: Providing immediate feedback can enhance reputation and attract quality candidates.", |
|
"Remote Hiring Efficiency: Facilitates global talent acquisition, crucial for companies with a diverse geographic footprint.", |
|
"Accessibility and Inclusiveness: Opens up opportunities for a wider pool of candidates, enhancing diversity.", |
|
"Security and Privacy Compliance: Ensures handling of personal data safely and legally, protecting the company and candidate.", |
|
"Data-Driven Insights: Offers deep insights into candidate behaviors, refining hiring criteria and outcomes.", |
|
"Reduced Interviewer Bias: Minimizes human bias, directly contributing to a more diverse and innovative workforce.", |
|
"Competitive Advantage: Attracting top talent by using cutting-edge technology enhances a company's market positioning.", |
|
"Reduced Administrative Load: Automates tasks such as scheduling, increasing operational efficiency.", |
|
"Continuous Improvement Loop: The system's ability to learn and adapt from each interview boosts long-term effectiveness.", |
|
"Dynamic Questioning: Adapting questions in real-time ensures more relevant and revealing candidate responses.", |
|
"Documentation and Review: Facilitates compliance and quality control in hiring processes.", |
|
"AI-Driven Role Matching: Optimizes talent distribution within the organization by matching candidates to suitable roles.", |
|
"Enhanced Employer Branding: Advances the company's image as innovative and candidate-focused.", |
|
"Speed of Process: Accelerates the recruitment cycle, reducing downtime and improving responsiveness to staffing needs." |
|
] |
|
|
|
|
|
st.text_area("List of Items", "\n".join([f"{i+1}. {item}" for i, item in enumerate(items)]), height=600) |
|
|
|
with tab5: |
|
st.header("Thanks to the Team") |
|
st.write("This tool isn’t just a testament to our technical capabilities—it’s a step forward in transforming how the world approaches recruitment. Thanks to your efforts, we are on the path to making recruitment processes more efficient, fair, and insightful, which will ultimately benefit countless individuals and organizations.") |
|
image_path = 'data/data_ourteam.png' |
|
|
|
|
|
st.image(image_path, caption='Our Team') |
|
|