Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -2,14 +2,13 @@ import os
|
|
2 |
import gradio as gr
|
3 |
import google.generativeai as genai
|
4 |
import mimetypes
|
|
|
5 |
|
6 |
-
# Атрымаем токен з асяроддзя (Secrets у Hugging Face)
|
7 |
GEMINI_API_KEY = os.getenv("gemini2")
|
|
|
8 |
|
9 |
-
# Ініцыялізуем кліент Google Generative AI
|
10 |
genai.configure(api_key=GEMINI_API_KEY)
|
11 |
|
12 |
-
# Функцыя для транскрыпцыі аўдыя з даданым промптам для стварэння субтытраў з часовымі меткамі
|
13 |
def transcribe_audio(audio_file):
|
14 |
try:
|
15 |
mime_type, _ = mimetypes.guess_type(audio_file)
|
@@ -17,36 +16,31 @@ def transcribe_audio(audio_file):
|
|
17 |
return "Немагчыма вызначыць тып файла. Падтрымліваюцца толькі аўдыяфайлы."
|
18 |
with open(audio_file, "rb") as f:
|
19 |
audio_data = f.read()
|
20 |
-
|
21 |
prompt_text = (
|
22 |
"""зрабі транскрыпцыю аўдыяфайла для стварэння субтытрыў з часовымі меткамі srt
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
"""
|
43 |
)
|
44 |
-
|
45 |
-
model = genai.GenerativeModel("gemini-2.0-pro-exp-02-05")
|
46 |
response = model.generate_content(
|
47 |
[prompt_text, {"mime_type": mime_type, "data": audio_data}]
|
48 |
)
|
49 |
-
|
50 |
if response.text:
|
51 |
transcript = response.text.strip()
|
52 |
else:
|
@@ -59,7 +53,6 @@ def transcribe_audio(audio_file):
|
|
59 |
except Exception as e:
|
60 |
return f"Нечаканая памылка: {str(e)}"
|
61 |
|
62 |
-
# Функцыя для стварэння SRT-файла з субтытрамі
|
63 |
def create_srt(transcript):
|
64 |
srt_path = "subtitles.srt"
|
65 |
try:
|
@@ -69,7 +62,6 @@ def create_srt(transcript):
|
|
69 |
except Exception as e:
|
70 |
return f"Памылка пры запісе SRT-файла: {str(e)}", None
|
71 |
|
72 |
-
# Функцыя для апрацоўкі аўдыя
|
73 |
def process_audio(audio):
|
74 |
transcript = transcribe_audio(audio)
|
75 |
if transcript.startswith("Памылка"):
|
@@ -77,22 +69,59 @@ def process_audio(audio):
|
|
77 |
text, srt_file = create_srt(transcript)
|
78 |
return text, srt_file
|
79 |
|
80 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
81 |
with gr.Blocks() as demo:
|
82 |
gr.Markdown("# Транскрыпцыя аў��ыя для беларускай мовы")
|
83 |
-
gr.Markdown(
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
|
|
|
|
91 |
btn = gr.Button("Апрацаваць")
|
92 |
transcript_output = gr.Textbox(label="Транскрыпцыя", lines=10)
|
93 |
file_output = gr.File(label="SRT-файл")
|
94 |
-
|
95 |
-
|
96 |
-
btn.click(process_audio, inputs=audio_input, outputs=[transcript_output, file_output])
|
97 |
|
98 |
demo.launch()
|
|
|
2 |
import gradio as gr
|
3 |
import google.generativeai as genai
|
4 |
import mimetypes
|
5 |
+
import moviepy.editor as mp
|
6 |
|
|
|
7 |
GEMINI_API_KEY = os.getenv("gemini2")
|
8 |
+
MODEL_NAME = os.getenv("mod")
|
9 |
|
|
|
10 |
genai.configure(api_key=GEMINI_API_KEY)
|
11 |
|
|
|
12 |
def transcribe_audio(audio_file):
|
13 |
try:
|
14 |
mime_type, _ = mimetypes.guess_type(audio_file)
|
|
|
16 |
return "Немагчыма вызначыць тып файла. Падтрымліваюцца толькі аўдыяфайлы."
|
17 |
with open(audio_file, "rb") as f:
|
18 |
audio_data = f.read()
|
|
|
19 |
prompt_text = (
|
20 |
"""зрабі транскрыпцыю аўдыяфайла для стварэння субтытрыў з часовымі меткамі srt
|
21 |
+
не пішы нічога, акрамя транскрыпцыі ў зададзеным фармаце, вось прыклад фармату
|
22 |
+
1
|
23 |
+
00:00:00,659 --> 00:00:03,019
|
24 |
+
Вольга Гапеева. Camel Travel.
|
25 |
+
|
26 |
+
2
|
27 |
+
00:00:03,699 --> 00:00:09,500
|
28 |
+
Раман. Чытае Уладзімір Лісоўскі. Глава першая.
|
29 |
+
|
30 |
+
3
|
31 |
+
00:00:10,719 --> 00:00:15,079
|
32 |
+
Ісык-Куль. Паважаныя пасажыры!
|
33 |
+
|
34 |
+
4
|
35 |
+
00:00:15,619 --> 00:00:19,100
|
36 |
+
Наш самалёт прызямліўся ў
|
37 |
+
горадзе-героі Фрунзэ.
|
38 |
+
"""
|
|
|
|
|
39 |
)
|
40 |
+
model = genai.GenerativeModel(MODEL_NAME)
|
|
|
41 |
response = model.generate_content(
|
42 |
[prompt_text, {"mime_type": mime_type, "data": audio_data}]
|
43 |
)
|
|
|
44 |
if response.text:
|
45 |
transcript = response.text.strip()
|
46 |
else:
|
|
|
53 |
except Exception as e:
|
54 |
return f"Нечаканая памылка: {str(e)}"
|
55 |
|
|
|
56 |
def create_srt(transcript):
|
57 |
srt_path = "subtitles.srt"
|
58 |
try:
|
|
|
62 |
except Exception as e:
|
63 |
return f"Памылка пры запісе SRT-файла: {str(e)}", None
|
64 |
|
|
|
65 |
def process_audio(audio):
|
66 |
transcript = transcribe_audio(audio)
|
67 |
if transcript.startswith("Памылка"):
|
|
|
69 |
text, srt_file = create_srt(transcript)
|
70 |
return text, srt_file
|
71 |
|
72 |
+
def extract_audio_from_video(video_file):
|
73 |
+
try:
|
74 |
+
clip = mp.VideoFileClip(video_file)
|
75 |
+
audio_path = "extracted_audio.wav"
|
76 |
+
clip.audio.write_audiofile(audio_path, logger=None)
|
77 |
+
return audio_path, None
|
78 |
+
except Exception as e:
|
79 |
+
return None, f"Памылка пры выдзяленні аўдыі з відэафайла: {str(e)}"
|
80 |
+
|
81 |
+
def process_video(video):
|
82 |
+
audio_path, error = extract_audio_from_video(video)
|
83 |
+
if error:
|
84 |
+
return error, None
|
85 |
+
return process_audio(audio_path)
|
86 |
+
|
87 |
+
def process_file(audio, video):
|
88 |
+
if audio is not None:
|
89 |
+
return process_audio(audio)
|
90 |
+
elif video is not None:
|
91 |
+
return process_video(video)
|
92 |
+
else:
|
93 |
+
return "Няма файла для апрацоўкі.", None
|
94 |
+
|
95 |
+
def update_on_audio_change(audio):
|
96 |
+
if audio is not None:
|
97 |
+
return gr.update(value=None, interactive=False)
|
98 |
+
else:
|
99 |
+
return gr.update(interactive=True)
|
100 |
+
|
101 |
+
def update_on_video_change(video):
|
102 |
+
if video is not None:
|
103 |
+
return gr.update(value=None, interactive=False)
|
104 |
+
else:
|
105 |
+
return gr.update(interactive=True)
|
106 |
+
|
107 |
with gr.Blocks() as demo:
|
108 |
gr.Markdown("# Транскрыпцыя аў��ыя для беларускай мовы")
|
109 |
+
gr.Markdown(
|
110 |
+
"""
|
111 |
+
## Загрузіце аўдыёфайл або відэафайл. Калі загружаны аўдыёфайл, відэа неактыўна, і наадварот.
|
112 |
+
Субтытры будуць аўтаматычна згенераваны разам з файлам субтытраў.
|
113 |
+
[Далучайцеся да беларускаймоўнай суполкі ў ТГ](https://t.me/belarusai)
|
114 |
+
**Падтрымаць праект:** [Buy me a coffee](https://buymeacoffee.com/tuteishygpt)
|
115 |
+
"""
|
116 |
+
)
|
117 |
+
with gr.Row():
|
118 |
+
audio_input = gr.Audio(type="filepath", label="Аўдыёфайл")
|
119 |
+
video_input = gr.Video(type="filepath", label="Відэафайл")
|
120 |
+
audio_input.change(fn=update_on_audio_change, inputs=audio_input, outputs=video_input)
|
121 |
+
video_input.change(fn=update_on_video_change, inputs=video_input, outputs=audio_input)
|
122 |
btn = gr.Button("Апрацаваць")
|
123 |
transcript_output = gr.Textbox(label="Транскрыпцыя", lines=10)
|
124 |
file_output = gr.File(label="SRT-файл")
|
125 |
+
btn.click(fn=process_file, inputs=[audio_input, video_input], outputs=[transcript_output, file_output])
|
|
|
|
|
126 |
|
127 |
demo.launch()
|