File size: 6,328 Bytes
b21ecef
b4cbbec
b21ecef
 
6fd7ef3
 
d70c7fd
cb23f19
b21ecef
 
352eb01
d70c7fd
 
6fd7ef3
b42bc15
6fd7ef3
 
352eb01
 
f1f3adb
352eb01
4d8662a
cb23f19
 
 
 
 
6fd7ef3
b21ecef
cb23f19
749c554
5556030
6fd7ef3
cb23f19
b21ecef
 
 
cb23f19
 
 
6fd7ef3
cb23f19
6fd7ef3
cb23f19
6fd7ef3
 
 
 
 
cb23f19
 
6fd7ef3
 
cb23f19
 
 
 
6fd7ef3
 
 
cb23f19
6fd7ef3
cb23f19
6fd7ef3
 
cb23f19
 
 
 
 
 
 
 
7de403b
6fd7ef3
 
cb23f19
 
 
 
 
6fd7ef3
 
 
749c554
cb23f19
 
 
 
 
 
 
 
 
6fd7ef3
 
 
 
cb23f19
 
 
6fd7ef3
cb23f19
 
 
 
 
 
 
 
 
5556030
 
cb23f19
 
6fd7ef3
5556030
 
b21ecef
cb23f19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b21ecef
7db5fdc
6fd7ef3
 
 
3f43bed
 
 
 
 
6fd7ef3
b21ecef
7ce50df
 
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import gradio
import gradio as gr

from download import download_generator
import anvil.media
import os
import dotenv
from whisper.tokenizer import LANGUAGES, TO_LANGUAGE_CODE

from utils.apis import render_api_elements
from utils.utils import get_args

dotenv.load_dotenv()

anvil.server.connect(os.environ.get('ANVIL_UPLINK_KEY'))
queue_placeholder = None

args = get_args()
gradio_share: bool = args.get("public")
model_size: str = args.get("model")
preload_model: str = args.get("preload")


LANG_CHOICES = sorted([x.capitalize() for x in LANGUAGES.values()])
LANG_CHOICES.insert(0, "Autodetect")


url_input = gr.Textbox(label="Youtube/Twitter/etc video URL (supports many services)", value='https://twitter.com/starsonxh/status/1552945347194142720', lines=1, elem_id="url_input")
# download_status = gr.Textbox(label="Status:", value='', lines=1, elem_id="download_status")
download_status = gr.Checkbox(label="", elem_id="download_status", interactive=False)
translate_action = gr.Checkbox(label="Auto translate to english", elem_id='translate_toggle', interactive=True, value=True)
init_video = gr.Video(label="Upload video manually", visible=True, interactive=True, mirror_webcam=False)
init_audio = gr.Audio(label="Downloaded audio", visible=False)
output_text = gr.Textbox(label="Output text", lines=5, visible=False, max_lines=10, interactive=True, elem_id="output_text")
sub_video = gr.Video(label="Subbed video", visible=False, mirror_webcam=False)


def predownload(url, translate_action, source_language):
  files = []
  for response in download_generator(url, translate_action, source_language):
    updates_object = {}
    updates_object[download_status] = gr.update(label=f"{response.get('message')}")
    meta = response.get('meta')

    if 'video' in response:
      updates_object[init_video] = gr.update(visible=True, value=response["video"],
                                             label=f"Init Video: {meta['id']}.{meta['ext']}")
      updates_object[init_audio] = gr.update(visible=True, value=response["audio"],
                                             label=f"Extracted audio : {meta['id']}.mp3")
      files.append(response["video"])
      files.append(response["audio"])
    if 'whisper_result' in response:
      updates_object[output_text] = gr.update(value=response['whisper_result'].get('srt'), visible=True,
                                              label=f"Subtitles transcribed from {response['whisper_result'].get('language')} (detected language)")
    if 'srt_path' in response:
      files.append(response["srt_path"])

    if 'sub_video' in response:
      updates_object[sub_video] = gr.update(visible=True, value=response["sub_video"],
                                            label=f"Subbed video: {meta['id']}_translated.mp4")
      files.append(response["sub_video"])

    updates_object[output_file] = gr.update(value=files, visible=len(files) > 0, label=f"Output Files")
    yield updates_object

def correct_subtitles(url, output_text):
  for response in download_generator(url, corrected_subtitles=output_text):
    updates_object = {}
    updates_object[download_status] = gr.update(label=f"STATUS: {response.get('message')}")
    if 'sub_video' in response:
      updates_object[sub_video] = gr.update(visible=True, value=response["sub_video"],
                                            label=f"Corrected subtitles")
    yield updates_object


subtitled_video = False

with gr.Blocks(css='@import "file=static/css/main.css";', theme='darkpeach', title='Vid Translator Studio') as demo:
  gr.HTML('<h1 class="main-title">VidTranslator Studio 0.1</h1>')
  gr.HTML("<h2 class='secondary'>Automatic social media video translation from 99 languages</h2>")

  with gr.Row(elem_id="input_row"):
    with gr.Group() as group:
      url_input.render()
      action_btn = gr.Button(elem_id='submit', variant='primary', value="Translate")
      gr.StatusTracker()
      with gr.Row(elem_id="second_row"):
        source_language = gr.Dropdown(choices=LANG_CHOICES,
                                      label="Source Language",
                                      value='Autodetect',
                                      interactive=True, elem_id="source_language")
        download_status.render()
        translate_action.render()

  with gr.Row():
    with gr.Column():
      init_video.render()
      init_audio.render()
      with gr.Row():
          output_file = gr.Files(label="Output Files", visible=False)

    with gr.Column():
      output_text.render()
      correct_btn = gr.Button("Correct subtitles")

    with gr.Column():
      sub_video.render()


  outputs = [download_status, init_video, init_audio, output_text, sub_video, output_file ]
  inputs = [url_input, translate_action, source_language]
  action_btn.click(fn=predownload, inputs=inputs, outputs=outputs, api_name='predownload')
  url_input.submit(fn=predownload, inputs=inputs, outputs=outputs)

  correct_btn.click(fn=correct_subtitles, inputs=[url_input, output_text], outputs=[download_status, output_text, sub_video])

  translate_action.change(fn=lambda x: {action_btn: gr.update(value=f"Translate" if x else "Transcribe")},
                          inputs=[translate_action], outputs=[action_btn])

  gr.HTML("""<div class='footer'>
    <div class="relative">
  <div class="absolute inset-0 flex items-center" aria-hidden="true">
    <div class="w-full border-t border-gray-300"></div>
  </div>
  <div class="relative flex justify-center">
    <span class="bg-white px-2 text-sm text-gray-500">Continue</span>
  </div>
</div>

     <a href='https://twitter.com/altryne/'><img src='https://img.shields.io/badge/%40altryne-follow-green' alt=''></a>
     </div>""")

  def init_video_manual_upload(url, init_video):
    print(url)
    print(init_video)

  init_video.change(fn=init_video_manual_upload, inputs=[url_input, init_video], outputs=[])

  # Render imported buttons for API bindings
  render_api_elements(url_input,download_status, output_text, sub_video, output_file)

queue_placeholder = demo.queue()


@anvil.server.callable
def temp():
  return 'temp worked'

if __name__ == "__main__":
  gradio.close_all()
  port = os.environ.get('SERVER_PORT', 8111)
  demo.launch(show_error=True, debug=True, share=gradio_share,server_port=int(port), favicon_path='fonts/icon.png')