oral_ui.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import gradio as gr
  2. import time
  3. def start_stream():
  4. return "assets/sample.mp4" # 返回示例视频路径
  5. def stop_stream():
  6. return None
  7. def add_subtitle(text, font, size, position):
  8. return f"字幕已添加:{text} ({font}, {size}px, {position})", None
  9. def process_video(progress=gr.Progress()):
  10. progress(0, "开始处理视频...")
  11. for i in range(10):
  12. time.sleep(0.2)
  13. progress((i + 1) / 10, f"正在处理第 {i+1}/10 段...")
  14. return "处理完成", "assets/processed.mp4"
  15. with gr.Blocks(title="口播视频剪辑工具") as demo:
  16. gr.Markdown("# 口播视频剪辑工具")
  17. with gr.Row():
  18. # 左侧控制面板
  19. with gr.Column(scale=1):
  20. # 推流控制
  21. with gr.Group():
  22. gr.Markdown("## 推流控制")
  23. start_btn = gr.Button("开始推流", variant="primary")
  24. stop_btn = gr.Button("停止推流")
  25. original_video = gr.Video(label="原始视频预览", interactive=False)
  26. # 字幕设置
  27. with gr.Group():
  28. gr.Markdown("## 字幕设置")
  29. subtitle_text = gr.Textbox(label="字幕内容", placeholder="输入字幕文字")
  30. with gr.Row():
  31. font_selector = gr.Dropdown(["黑体", "宋体", "微软雅黑", "Arial"],
  32. label="字体选择", value="黑体")
  33. font_size = gr.Slider(10, 72, value=32, label="字体大小")
  34. position_selector = gr.Dropdown(["顶部居中", "底部居中", "自定义"],
  35. label="字幕位置", value="底部居中")
  36. add_subtitle_btn = gr.Button("添加字幕")
  37. # 剪辑控制
  38. with gr.Group():
  39. gr.Markdown("## 剪辑处理")
  40. start_clip_btn = gr.Button("开启剪辑", variant="primary")
  41. progress_output = gr.Textbox(label="处理进度", interactive=False)
  42. # 右侧结果预览
  43. with gr.Column(scale=2):
  44. gr.Markdown("## 剪辑结果预览")
  45. processed_video = gr.Video(label="处理结果", interactive=False)
  46. # 事件绑定
  47. start_btn.click(
  48. start_stream,
  49. outputs=original_video
  50. )
  51. stop_btn.click(
  52. stop_stream,
  53. outputs=original_video
  54. )
  55. add_subtitle_btn.click(
  56. add_subtitle,
  57. inputs=[subtitle_text, font_selector, font_size, position_selector],
  58. outputs=[progress_output, processed_video]
  59. )
  60. start_clip_btn.click(
  61. process_video,
  62. outputs=[progress_output, processed_video]
  63. )
  64. if __name__ == "__main__":
  65. demo.launch(server_name="0.0.0.0", server_port=6688)