data-gathering / app.py
deepsync's picture
Update app.py
5f1d785 verified
import os
import json
import random
import pymongo
import requests
import gradio as gr
from collections import defaultdict
from uuid import uuid4
DB_CONN = pymongo.MongoClient(os.environ.get("DB_URL"))
line_details = {l["source_id"]:l for l in list(DB_CONN['vo_data_dump']['qa_video_dump'].find()) if l.get("done") is not True}
videos_list = defaultdict(list)
for line_detail in line_details.values():
videos_list[line_detail["video_id"]].append(line_detail)
# Functions
def render_video_details(video_id):
video_detail = videos_list[video_id]
video_title = video_detail[0]["video_title"]
source_language = video_detail[0]["source_language"]
target_language = video_detail[0]["target_language"]
video_duration = video_detail[0]["video_duration"]
line_ids = [v["source_id"] for v in video_detail if v.get("done") is not True]
video_link = video_detail[0]["video_link"]
html = f"""<iframe width="560" height="315" src="{video_link.replace('watch?v=', 'embed/')}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>"""
if video_link.startswith("gs://"):
video_html_embed, video_streamable_url = None, requests.post(os.environ["CF_URL"], params={"url": video_link}).text
else:
video_html_embed, video_streamable_url = html, None
return video_title, source_language, target_language, video_duration, gr.Dropdown.update(choices=line_ids, value=line_ids[0]), video_html_embed, video_streamable_url
def render_line_details(line_id):
line_detail = line_details[line_id]
source_transcript = line_detail["source_transcript"]
translation = line_detail["translator_translated_text"]
response = requests.post(os.environ["CF_URL"], params={"url": line_detail["source_audio_url"]})
signed_uri = response.text
audio_response = requests.get(signed_uri).content
return audio_response, source_transcript, translation
def dump_data_db(line_id, video_type, video_subject, video_topics, video_tone, gender, demography, total_time, source_language, target_language, comments, accent, source_transcript, translation, speaker_gender):
line_detail = line_details[line_id]
video_id = line_detail["video_id"]
line_data = {
"line_id": line_id,
"video_id": video_id,
"src_text": source_transcript,
"intermediate_text": line_detail["english_transcript"],
"tgt_text": translation,
"accent": accent,
"speaking_rate": round(len(translation.split()) / line_detail["line_duration"], 3),
"src_time": line_detail["line_duration"],
"gender": speaker_gender,
"version": "v1",
"done": True
}
video_data = {
"video_id": video_id,
"type": video_type,
"src_lang": source_language,
"tgt_lang": target_language,
"subject": video_subject,
"topics": video_topics,
"tone": video_tone,
"gender": gender,
"demography": demography,
"total_time": float(total_time),
"comments": comments
}
video_data_collection = DB_CONN['vo_data_dump']['video_data']
video_data_collection.update_one({'video_id': video_id}, {"$set": video_data}, upsert=True)
line_data_collection = DB_CONN['vo_data_dump']['line_data']
line_data_collection.update_one({'line_id': line_id}, {"$set": line_data}, upsert=True)
DB_CONN['vo_data_dump']['qa_video_dump'].update_one({'source_id': line_id}, {"$set": {"done": True}}, upsert=True)
# Delete video
i = -1
for i in range(len(videos_list[video_id])):
if videos_list[video_id][i]["source_id"] == line_id:
del videos_list[video_id][i]
break
if len(videos_list[video_id]):
source_ids = [v["source_id"] for v in videos_list[video_id]]
return gr.Dropdown.update(choices=source_ids, value=source_ids[i]), video_id
else:
del videos_list[video_id]
new_video_id = random.choice(list(videos_list.values()))[0]['video_id']
source_ids = [v["source_id"] for v in videos_list[new_video_id] if v.get('done') is not True]
return gr.Dropdown.update(choices=source_ids, value=source_ids[0]), gr.Dropdown.update(choices=list(videos_list.keys()), value=new_video_id)
# UI
with gr.Blocks() as demo:
gr.Markdown("## Data Aggregation")
with gr.Row():
video_id_dropdown = gr.Dropdown(list(videos_list.keys()), label="Video IDs")
video_title_text = gr.Textbox(label="Video Title", interactive=False)
with gr.Row():
video_html = gr.HTML(label="Video")
video_playable = gr.Video(label="Video")
gr.Markdown("""Please ensure to fill these sections and do not leave them empty. An example of how to update `Video Type`, `Video Subject` and `Video Topics`:
- If the video is of a `Biology lecture`, **Video Type**: _learning_, **Video Subject**: _science_, **Video Topics**: _biology_
- If the video is of `Cooking`, **Video Type**: _cooking_, **Video Subject**: _cooking_, **Video Topics**: _indian recipe_""")
with gr.Row():
video_type_dropdown = gr.Dropdown(["learning", "audiobook", "podcast", "vlog", "news", "cooking", "review"], label="Video Type", value="learning", allow_custom_value=True, info="Feel free to add new item if none of them is right.")
video_subject_dropdown = gr.Dropdown(["tech", "science", "lifestyle", "cooking", "travel", "finance", "politics"], label="Video Subject", value="tech", allow_custom_value=True, info="Feel free to add new item if none of them is right.")
video_topics_text = gr.Textbox(label="Video Topics")
with gr.Row():
video_tone_dropdown = gr.Dropdown(["casual", "semi-formal", "formal"], label="Video Tone", value="semi-formal", info="Tone used in the video.")
gender_dropdown = gr.Dropdown(["male", "female", "non-binary"], label="Gender", value="female", info="Gender used by the speaker in the video as whole.")
demography_text = gr.Textbox(label="Demography", info="Demography like normal, old, young, toddler, etc.")
with gr.Row():
source_language_text = gr.Textbox(label="Source Language", interactive=False, visible=False)
target_language_text = gr.Textbox(label="Target Language", interactive=False, visible=False)
with gr.Row():
total_time_text = gr.Textbox(label="Video Duration", interactive=False)
comments_text = gr.Textbox(label="Comments", info="Any extra comments regarding the nature of video.")
gr.Markdown("Video Line Information")
line_id_dropdown = gr.Dropdown([], label="Line IDs")
with gr.Row():
audio_item = gr.Audio(label="Source Audio", type="filepath")
accent_text = gr.Textbox(label="Accent", value="indian", info="Accent of the person speaking. For example, indian, american, british.")
speaker_gender_dropdown = gr.Dropdown(["female", "male"], label="Audio Gender", value="female", info="Gender of the speaker")
with gr.Row():
source_transcript_text = gr.Textbox(label="Source Transcript", info="Transcription of the above rendered audio. Please ensure correct punctuations based on the audio.")
translation_text = gr.Textbox(label="Translation", interactive=False, visible=False)
update_button = gr.Button("Update")
# Actions
video_id_dropdown.change(render_video_details, video_id_dropdown, [video_title_text, source_language_text, target_language_text, total_time_text, line_id_dropdown, video_html, video_playable])
line_id_dropdown.change(render_line_details, line_id_dropdown, [audio_item, source_transcript_text, translation_text])
update_button.click(dump_data_db, [line_id_dropdown, video_type_dropdown, video_subject_dropdown, video_topics_text, video_tone_dropdown, gender_dropdown, demography_text, total_time_text, source_language_text, target_language_text, comments_text, accent_text, source_transcript_text, translation_text, speaker_gender_dropdown], [line_id_dropdown, video_id_dropdown])
if __name__=="__main__":
demo.queue().launch(auth=(os.environ.get("USERNAME"), os.environ.get("PASSWORD")))