Spaces:
Runtime error
Runtime error
| 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"))) |