deepsync's picture
Update app.py
1546207 verified
import os
import gradio as gr
import json
import asyncio
import aiohttp
import requests
from tqdm.asyncio import tqdm
API_BASE_URL = os.environ.get("DUBPRO_API_BASE_URL")
def fetch_data_from_db(_id, details="GET_ADVANCE_DETAILS"):
API_URL = f"{API_BASE_URL}/video-service/videos/{_id}/get_details"
headers = {
"Accept": "*/*",
"Authorization": os.environ.get("DUBPRO_API_HEADER_KEY")
}
params = {"type": details}
response = requests.get(API_URL, headers=headers, params=params)
if response.status_code == 200:
data = response.json()
return data["data"]
else:
raise Exception(response.text)
async def generate_audio(session, video_id, segment_id, text, progress_bar):
payload = {"type": "EDIT_TEXT", "updatedText": text}
headers = {"Authorization": os.environ.get("DUBPRO_API_HEADER_KEY")}
API_URL = f"{API_BASE_URL}/video-service/videos/{video_id}/segment/{segment_id}"
async with session.put(API_URL, headers=headers, json=payload) as response:
if response.status != 200:
print(segment_id, text, await response.text())
progress_bar.update(1)
async def generate_audios(video_id, segments=[]):
async with aiohttp.ClientSession() as session:
progress_bar = tqdm(total=len(segments), desc="Generating Audios", unit="segment")
tasks = [
generate_audio(session, video_id, segment["id"], segment["updatedText"], progress_bar)
for segment in segments
]
await asyncio.gather(*tasks)
progress_bar.close()
def perform_generation(video_id, gen_choice, progress_bar=gr.Progress(track_tqdm=True)):
data = fetch_data_from_db(video_id)
segments = data["targetTranscriptData"]
if gen_choice == "Generate only non-generated segments":
segments = [s for s in segments if s["audioUrl"] is None or "updated" not in s["audioUrl"]]
elif gen_choice == "Re-generate generated only segments":
segments = [s for s in segments if s["audioUrl"] is not None and "updated" in s["audioUrl"]]
asyncio.run(generate_audios(video_id, segments=segments))
return "Done"
async def update_tempo(session, video_id, segment_id, tempo):
payload = {"type": "EDIT_SPEED", "tempo": tempo}
headers = {"Authorization": os.environ.get("DUBPRO_API_HEADER_KEY")}
API_URL = f"{API_BASE_URL}/video-service/videos/{video_id}/segment/{segment_id}"
async with session.put(API_URL, headers=headers, json=payload) as response:
if response.status != 200:
print(await response.text())
async def process_segment(session, video_id, segment, progress_bar):
WARNING_BOUNDARY = 0.1
duration = round(segment["endTimestamp"] - segment["startTimestamp"], 3)
if WARNING_BOUNDARY <= abs(duration - segment["audioDuration"]) <= (WARNING_BOUNDARY + 2.5):
if duration - segment["audioDuration"] > 0:
# Gap case
tempo = round(segment["audioDuration"] / duration, 3)
else:
tempo = round(segment["audioDuration"] / (duration + 0.1), 3)
await update_tempo(session, video_id, segment["id"], tempo)
progress_bar.update(1)
async def update_tempos(video_id, segments=[]):
async with aiohttp.ClientSession() as session:
progress_bar = tqdm(total=len(segments), desc="Processing Segments", unit="segment")
tasks = [
process_segment(session, video_id, segment, progress_bar)
for segment in segments
]
await asyncio.gather(*tasks)
progress_bar.close()
def perform_tempo_adjustment(video_id, gen_choice, progress_bar=gr.Progress(track_tqdm=True)):
data = fetch_data_from_db(video_id)
segments = data["targetTranscriptData"]
if gen_choice == "Generate only non-generated segments":
segments = [s for s in segments if s["audioUrl"] is None or "updated" not in s["audioUrl"]]
elif gen_choice == "Re-generate generated only segments":
segments = [s for s in segments if s["audioUrl"] is not None and "updated" in s["audioUrl"]]
asyncio.run(update_tempos(video_id, segments=segments))
return "Done"
def check_details(video_id):
data = fetch_data_from_db(video_id)
segments = data["targetTranscriptData"]
results = json.dumps(segments[0]) + "\n\n" + json.dumps(segments[-1])
return results, gr.update(visible=True)
with gr.Blocks() as demo:
gr.Markdown("# Generate Audio")
video_id_txt = gr.Text(label="Video ID")
gen_choice_radio = gr.Radio(["Generate only non-generated segments", "Re-generate generated only segments", "Generate all the segments"], label="Audio generation style", value="Generate only non-generated segments")
check_settings_btn = gr.Button("Check settings")
logs_txt = gr.Textbox(label="Logs")
generate_btn = gr.Button("Generate audio", visible=False)
check_settings_btn.click(check_details, video_id_txt, [logs_txt, generate_btn])
generate_btn.click(perform_generation, [video_id_txt, gen_choice_radio], logs_txt)
gr.Markdown("## Update Tempo [SAH]")
update_tempo_btn = gr.Button("Adjust tempo")
update_tempo_btn.click(perform_tempo_adjustment, [video_id_txt, gen_choice_radio], logs_txt)
if __name__=="__main__":
demo.queue().launch(auth=(os.environ.get("GRADIO_USERNAME"), os.environ.get("GRADIO_PASSWORD")))