archivartaunik commited on
Commit
a9913d9
·
verified ·
1 Parent(s): 7d946d9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +46 -78
app.py CHANGED
@@ -1,165 +1,133 @@
1
  import os
2
  import gradio as gr
3
- import google.generativeai as genai
4
  import mimetypes
5
  from pydub import AudioSegment
6
 
7
  # Атрыманне ключоў і мадэляў з пераменных асяроддзя
8
  GEMINI_API_KEY = os.getenv("gemini")
9
- MODEL_NAME_TH = os.getenv("modTH") # Мадэль для транскрыпцыі
10
- MODEL_NAME = os.getenv("mod") # Мадэль для выпраўлення фармату і перакладу
11
- PROMPT_TRANSCRIBE = os.getenv("p") # Промпт для транскрыпцыі
 
 
 
 
 
12
 
13
- # Наладжваем API-ключ
14
- genai.configure(api_key=GEMINI_API_KEY)
15
 
16
  def transcribe_audio(audio_file: str) -> str:
17
- """Транскрыбуе аўдыяфайл з дапамогай Google Generative AI."""
18
  try:
19
  mime_type, _ = mimetypes.guess_type(audio_file)
20
  if not mime_type or not mime_type.startswith("audio"):
21
- return (
22
- "Немагчыма вызначыць тып файла або файл не з'яўляецца аўдыяфайлам. "
23
- "Падтрымліваюцца толькі аўдыяфайлы."
24
- )
25
 
26
  with open(audio_file, "rb") as f:
27
  audio_data = f.read()
28
 
29
- response = genai.generate_text(
30
- model=MODEL_NAME_TH,
31
- prompt=[PROMPT_TRANSCRIBE, {"mime_type": mime_type, "data": audio_data}],
32
- # Пры жаданні можна дадаць дадатковыя параметры, напр. temperature=0.2
33
  )
34
- return response.result.strip()
35
 
36
- except FileNotFoundError:
37
- return "Памылка: Файл не знойдзены."
38
  except Exception as e:
39
- return f"Нечаканая памылка: {e}"
 
40
 
41
  def fix_subtitles_format(transcript: str) -> str:
42
- """Выпраўляе фармат часу ў субцітрах."""
43
  prompt_fix = (
44
- "Не змяняй тэксты, выправі толькі часовы фармат у субцітрах на правільны, "
45
- "вось прыклад 00:00:01,589. \nУ адказ напішы толькі субцітры:\n"
46
  f"{transcript}"
47
  )
48
  try:
49
- response_fix = genai.generate_text(model=MODEL_NAME, prompt=prompt_fix)
50
- return response_fix.result.strip()
51
  except Exception as e:
52
- print(f"Памылка пры выпраўленні субцітраў: {e}") # Лагіраванне памылкі
53
  return transcript
54
 
 
55
  def create_srt(transcript: str, filename: str = "subtitles.srt") -> tuple[str, str]:
56
- """Стварае SRT-файл з транскрыпцыі."""
57
  try:
58
  with open(filename, "w", encoding="utf-8") as f:
59
  f.write(transcript)
60
  return transcript, filename
61
  except Exception as e:
62
- return f"Памылка пры запісе SRT-файла: {e}", ""
 
63
 
64
  def process_audio(audio_path: str) -> tuple[str, str]:
65
- """Апрацоўвае аўдыёфайл: транскрыбуе і стварае SRT."""
66
  transcript = transcribe_audio(audio_path)
67
- if transcript.startswith("Памылка") or transcript.startswith("Немагчыма"):
68
- return transcript, "" # Пусты радок замест None для файла
69
-
70
  fixed_transcript = fix_subtitles_format(transcript)
71
- text, srt_file = create_srt(fixed_transcript)
72
- return text, srt_file
73
 
74
  def extract_audio_from_video(video_file: str) -> tuple[str, str]:
75
- """Выдзяляе аўдыёдарожку з відэафайла."""
76
  try:
77
  audio = AudioSegment.from_file(video_file)
78
  audio_path = "extracted_audio.mp3"
79
  audio.export(audio_path, format="mp3")
80
  return audio_path, ""
81
  except Exception as e:
82
- return "", f"Памылка пры выдзяленні аўдыё з відэафайла: {e}"
 
83
 
84
  def process_video(video_path: str) -> tuple[str, str]:
85
- """Апрацоўвае відэафайл: выдзяляе аўдыё, транскрыбуе і стварае SRT."""
86
  audio_path, error = extract_audio_from_video(video_path)
87
  if error:
88
  return error, ""
89
  return process_audio(audio_path)
90
 
 
91
  def process_file(audio_path: str | None, video_path: str | None) -> tuple[str, str]:
92
- """Апрацоўвае файл (аўдыё або відэа)."""
93
  if audio_path:
94
  return process_audio(audio_path)
95
  elif video_path:
96
  return process_video(video_path)
97
- else:
98
- return "Няма файла для апрацоўкі.", ""
99
-
100
- def update_on_audio_change(audio_path: str | None) -> gr.update:
101
- """Абнаўляе інтэрфейс пры змене аўдыёфайла."""
102
- return gr.update(value=None, interactive=not bool(audio_path))
103
 
104
- def update_on_video_change(video_path: str | None) -> gr.update:
105
- """Абнаўляе інтэрфейс пры змене відэафайла."""
106
- return gr.update(value=None, interactive=not bool(video_path))
107
 
108
- def translate_transcript(
109
- transcript: str, target_language: str
110
- ) -> tuple[str, str]:
111
- """Перакладае транскрыпцыю на іншую мову і стварае SRT."""
112
  prompt_text = (
113
- f"Перакладзі толькі тэксты субцітраў на {target_language} мову. "
114
- "Астатняе пакінь як ёсць.\nТэкст:\n{transcript}"
115
  )
116
  try:
117
- response = genai.generate_text(model=MODEL_NAME, prompt=prompt_text)
118
- translated = response.result.strip()
119
- translated_srt_filename = "translated_subtitles.srt"
120
- return create_srt(translated, translated_srt_filename) # Перавыкарыстанне create_srt
121
  except Exception as e:
122
- return f"Памылка пры перакладзе: {e}", ""
 
123
 
124
  with gr.Blocks() as demo:
125
- gr.Markdown("# Транскрыпцыя аўдыя для беларускай мовы")
126
- gr.Markdown(
127
- """
128
- ## Загрузіце аўдыёфайл або відэафайл да 15 хвілін. Калі загружаны аўдыёфайл, відэа неактыўна, і наадварот.
129
- Субцітры будуць аўтаматычна згенераваны разам з SRT-файлам.
130
- [Далучайцеся да беларускаймоўнай суполкі ў ТГ](https://t.me/belarusai)
131
- **Падтрымаць праект:** [Buy me a coffee](https://buymeacoffee.com/tuteishygpt)
132
- """
133
- )
134
  with gr.Row():
135
  audio_input = gr.Audio(type="filepath", label="Аўдыёфайл")
136
  video_input = gr.Video(label="Відэафайл")
137
 
138
- # Больш кампактны спосаб абнаўлення інтэрактыўнасці
139
- audio_input.change(
140
- fn=update_on_audio_change, inputs=audio_input, outputs=video_input
141
- )
142
- video_input.change(
143
- fn=update_on_video_change, inputs=video_input, outputs=audio_input
144
- )
145
-
146
  btn = gr.Button("Апрацаваць")
147
  transcript_output = gr.Textbox(label="Транскрыпцыя", lines=10)
148
  file_output = gr.File(label="SRT-файл")
 
149
  btn.click(
150
- fn=process_file, inputs=[audio_input, video_input], outputs=[transcript_output, file_output]
 
 
151
  )
152
 
153
  gr.Markdown("## Пераклад субцітраў")
154
  with gr.Row():
155
  language_dropdown = gr.Dropdown(
156
- choices=["English", "Руcкая", "Польская", "Літоўская", "Нямецкая"],
157
- label="Выберы мову перакладу",
158
  value="English",
159
  )
160
- translate_btn = gr.Button("Пераклад")
 
161
  translation_output = gr.Textbox(label="Пераклад", lines=10)
162
  translation_file_output = gr.File(label="Translated SRT-файл")
 
163
  translate_btn.click(
164
  fn=translate_transcript,
165
  inputs=[transcript_output, language_dropdown],
 
1
  import os
2
  import gradio as gr
3
+ from google import genai
4
  import mimetypes
5
  from pydub import AudioSegment
6
 
7
  # Атрыманне ключоў і мадэляў з пераменных асяроддзя
8
  GEMINI_API_KEY = os.getenv("gemini")
9
+ MODEL_NAME_TH = os.getenv("modTH")
10
+ MODEL_NAME = os.getenv("mod")
11
+ PROMPT_TRANSCRIBE = os.getenv("p")
12
+
13
+ # Стварэнне сесіі і мадэляў
14
+ session = genai.Session(api_key=GEMINI_API_KEY)
15
+ model_th = genai.GenerativeModel(model_name=MODEL_NAME_TH, session=session)
16
+ model_general = genai.GenerativeModel(model_name=MODEL_NAME, session=session)
17
 
 
 
18
 
19
  def transcribe_audio(audio_file: str) -> str:
 
20
  try:
21
  mime_type, _ = mimetypes.guess_type(audio_file)
22
  if not mime_type or not mime_type.startswith("audio"):
23
+ return "Файл не аўдыёфармату."
 
 
 
24
 
25
  with open(audio_file, "rb") as f:
26
  audio_data = f.read()
27
 
28
+ response = model_th.generate_content(
29
+ [PROMPT_TRANSCRIBE, {"mime_type": mime_type, "data": audio_data}]
 
 
30
  )
31
+ return response.text.strip()
32
 
 
 
33
  except Exception as e:
34
+ return f"Памылка: {e}"
35
+
36
 
37
  def fix_subtitles_format(transcript: str) -> str:
 
38
  prompt_fix = (
39
+ "Не змяняй тэксты, толькі выправі фармат часу ў субцітрах на 00:00:01,589:\n"
 
40
  f"{transcript}"
41
  )
42
  try:
43
+ response_fix = model_general.generate_content(prompt_fix)
44
+ return response_fix.text.strip()
45
  except Exception as e:
 
46
  return transcript
47
 
48
+
49
  def create_srt(transcript: str, filename: str = "subtitles.srt") -> tuple[str, str]:
 
50
  try:
51
  with open(filename, "w", encoding="utf-8") as f:
52
  f.write(transcript)
53
  return transcript, filename
54
  except Exception as e:
55
+ return f"Памылка запісу SRT: {e}", ""
56
+
57
 
58
  def process_audio(audio_path: str) -> tuple[str, str]:
 
59
  transcript = transcribe_audio(audio_path)
60
+ if transcript.startswith("Памылка"):
61
+ return transcript, ""
 
62
  fixed_transcript = fix_subtitles_format(transcript)
63
+ return create_srt(fixed_transcript)
64
+
65
 
66
  def extract_audio_from_video(video_file: str) -> tuple[str, str]:
 
67
  try:
68
  audio = AudioSegment.from_file(video_file)
69
  audio_path = "extracted_audio.mp3"
70
  audio.export(audio_path, format="mp3")
71
  return audio_path, ""
72
  except Exception as e:
73
+ return "", f"Памылка аўдыё з відэа: {e}"
74
+
75
 
76
  def process_video(video_path: str) -> tuple[str, str]:
 
77
  audio_path, error = extract_audio_from_video(video_path)
78
  if error:
79
  return error, ""
80
  return process_audio(audio_path)
81
 
82
+
83
  def process_file(audio_path: str | None, video_path: str | None) -> tuple[str, str]:
 
84
  if audio_path:
85
  return process_audio(audio_path)
86
  elif video_path:
87
  return process_video(video_path)
88
+ return "Няма файла для апрацоўкі.", ""
 
 
 
 
 
89
 
 
 
 
90
 
91
+ def translate_transcript(transcript: str, target_language: str) -> tuple[str, str]:
 
 
 
92
  prompt_text = (
93
+ f"Перакладзі тэксты субцітраў на {target_language} мову, астатняе не змяняй:\n{transcript}"
 
94
  )
95
  try:
96
+ response = model_general.generate_content(prompt_text)
97
+ translated = response.text.strip()
98
+ return create_srt(translated, "translated_subtitles.srt")
 
99
  except Exception as e:
100
+ return f"Памылка перакладу: {e}", ""
101
+
102
 
103
  with gr.Blocks() as demo:
104
+ gr.Markdown("# Транскрыпцыя аўдыя (беларуская мова)")
 
 
 
 
 
 
 
 
105
  with gr.Row():
106
  audio_input = gr.Audio(type="filepath", label="Аўдыёфайл")
107
  video_input = gr.Video(label="Відэафайл")
108
 
 
 
 
 
 
 
 
 
109
  btn = gr.Button("Апрацаваць")
110
  transcript_output = gr.Textbox(label="Транскрыпцыя", lines=10)
111
  file_output = gr.File(label="SRT-файл")
112
+
113
  btn.click(
114
+ fn=process_file,
115
+ inputs=[audio_input, video_input],
116
+ outputs=[transcript_output, file_output],
117
  )
118
 
119
  gr.Markdown("## Пераклад субцітраў")
120
  with gr.Row():
121
  language_dropdown = gr.Dropdown(
122
+ ["English", "Руcкая", "Польская", "Літоўская", "Нямецкая"],
123
+ label="Мова перакладу",
124
  value="English",
125
  )
126
+ translate_btn = gr.Button("Перакласці")
127
+
128
  translation_output = gr.Textbox(label="Пераклад", lines=10)
129
  translation_file_output = gr.File(label="Translated SRT-файл")
130
+
131
  translate_btn.click(
132
  fn=translate_transcript,
133
  inputs=[transcript_output, language_dropdown],