SRT-Translation / app.py
Tal
initial push
837c1b6
import gradio as gr
import srt
from datetime import timedelta
import openai
import os
# 配置OpenAI API(用户需要自行添加API密钥)
openai.api_key = os.getenv('OPENAI_API_KEY')
def translate_text(text, target_language):
client = openai.OpenAI()
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": f"你是一个专业翻译,请准确将字幕内容翻译成{target_language},保持口语化表达。"},
{"role": "user", "content": text}
]
)
return response.choices[0].message.content
def process_srt(input_file, target_language):
with open(input_file.name, 'r', encoding='utf-8') as f:
subs = list(srt.parse(f.read()))
translated_subs = []
for sub in subs:
translated_text = translate_text(sub.content, target_language)
translated_subs.append(srt.Subtitle(
index=sub.index,
start=sub.start,
end=sub.end,
content=translated_text
))
return srt.compose(translated_subs)
# Gradio界面
with gr.Blocks() as demo:
gr.Markdown("## SRT translation")
with gr.Row():
input_file = gr.File(label="Upload SRT file", type="filepath")
target_language = gr.Dropdown(
choices=["English", "Finnish", "Chinese", "Japanese", "Korean", "German", "French", "Spanish", "Italian", "Arabic", "Russian"],
label="Chose target language",
value="Finnish"
)
btn = gr.Button("Start Translation", variant="primary", scale=1)
with gr.Row():
preview_text = gr.Textbox(label="Preview", interactive=False)
output_file = gr.File(label="Download translated file", visible=True)
def process_file(file, target_language):
translated = process_srt(file, target_language)
output_path = os.path.join(os.getcwd(), "translated.srt")
with open(output_path, 'w', encoding='utf-8') as f:
f.write(translated)
return translated, output_path
btn.click(
fn=process_file,
inputs=[input_file, target_language],
outputs=[preview_text, output_file]
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=int(os.getenv('PORT', 7860)))