SubtitlesBE / app.py
archivartaunik's picture
Update app.py
9dab23b verified
raw
history blame
5.03 kB
import os
import gradio as gr
import google.generativeai as genai
import mimetypes
import moviepy.editor as mp
GEMINI_API_KEY = os.getenv("gemini2")
MODEL_NAME = os.getenv("mod")
genai.configure(api_key=GEMINI_API_KEY)
def transcribe_audio(audio_file):
try:
mime_type, _ = mimetypes.guess_type(audio_file)
if mime_type is None:
return "Немагчыма вызначыць тып файла. Падтрымліваюцца толькі аўдыяфайлы."
with open(audio_file, "rb") as f:
audio_data = f.read()
prompt_text = (
"""зрабі транскрыпцыю аўдыяфайла для стварэння субтытрыў з часовымі меткамі srt
не пішы нічога, акрамя транскрыпцыі ў зададзеным фармаце, вось прыклад фармату
1
00:00:00,659 --> 00:00:03,019
Вольга Гапеева. Camel Travel.
2
00:00:03,699 --> 00:00:09,500
Раман. Чытае Уладзімір Лісоўскі. Глава першая.
3
00:00:10,719 --> 00:00:15,079
Ісык-Куль. Паважаныя пасажыры!
4
00:00:15,619 --> 00:00:19,100
Наш самалёт прызямліўся ў
горадзе-героі Фрунзэ.
"""
)
model = genai.GenerativeModel(MODEL_NAME)
response = model.generate_content(
[prompt_text, {"mime_type": mime_type, "data": audio_data}]
)
if response.text:
transcript = response.text.strip()
else:
transcript = "Не атрымалася транскрыбаваць аўдыя. Магчыма, памылка з API."
return transcript
except FileNotFoundError:
return "Памылка: Файл не знойдзены."
except genai.APIError as e:
return f"Памылка API: {str(e)}"
except Exception as e:
return f"Нечаканая памылка: {str(e)}"
def create_srt(transcript):
srt_path = "subtitles.srt"
try:
with open(srt_path, "w", encoding="utf-8") as f:
f.write(transcript)
return transcript, srt_path
except Exception as e:
return f"Памылка пры запісе SRT-файла: {str(e)}", None
def process_audio(audio):
transcript = transcribe_audio(audio)
if transcript.startswith("Памылка"):
return transcript, None
text, srt_file = create_srt(transcript)
return text, srt_file
def extract_audio_from_video(video_file):
try:
clip = mp.VideoFileClip(video_file)
audio_path = "extracted_audio.wav"
clip.audio.write_audiofile(audio_path, logger=None)
return audio_path, None
except Exception as e:
return None, f"Памылка пры выдзяленні аўдыі з відэафайла: {str(e)}"
def process_video(video):
audio_path, error = extract_audio_from_video(video)
if error:
return error, None
return process_audio(audio_path)
def process_file(audio, video):
if audio is not None:
return process_audio(audio)
elif video is not None:
return process_video(video)
else:
return "Няма файла для апрацоўкі.", None
def update_on_audio_change(audio):
if audio is not None:
return gr.update(value=None, interactive=False)
else:
return gr.update(interactive=True)
def update_on_video_change(video):
if video is not None:
return gr.update(value=None, interactive=False)
else:
return gr.update(interactive=True)
with gr.Blocks() as demo:
gr.Markdown("# Транскрыпцыя аўдыя для беларускай мовы")
gr.Markdown(
"""
## Загрузіце аўдыёфайл або відэафайл. Калі загружаны аўдыёфайл, відэа неактыўна, і наадварот.
Субтытры будуць аўтаматычна згенераваны разам з файлам субтытраў.
[Далучайцеся да беларускаймоўнай суполкі ў ТГ](https://t.me/belarusai)
**Падтрымаць праект:** [Buy me a coffee](https://buymeacoffee.com/tuteishygpt)
"""
)
with gr.Row():
audio_input = gr.Audio(type="filepath", label="Аўдыёфайл")
video_input = gr.Video(type="filepath", label="Відэафайл")
audio_input.change(fn=update_on_audio_change, inputs=audio_input, outputs=video_input)
video_input.change(fn=update_on_video_change, inputs=video_input, outputs=audio_input)
btn = gr.Button("Апрацаваць")
transcript_output = gr.Textbox(label="Транскрыпцыя", lines=10)
file_output = gr.File(label="SRT-файл")
btn.click(fn=process_file, inputs=[audio_input, video_input], outputs=[transcript_output, file_output])
demo.launch()