Spaces:
Running
Running
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() | |