archivartaunik commited on
Commit
04c273e
·
verified ·
1 Parent(s): 4ba47fd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +112 -56
app.py CHANGED
@@ -4,6 +4,12 @@ from google import genai
4
  from google.genai import types
5
  import mimetypes
6
  from pydub import AudioSegment
 
 
 
 
 
 
7
 
8
  # Атрыманне ключоў і мадэляў з пераменных асяроддзя
9
  GEMINI_API_KEY = os.getenv("gemini")
@@ -17,6 +23,9 @@ client = genai.Client(api_key=GEMINI_API_KEY)
17
  def transcribe_audio(audio_file: str) -> str:
18
  """Транскрыбуе аўдыяфайл з дапамогай Google GenAI."""
19
  try:
 
 
 
20
  mime_type, _ = mimetypes.guess_type(audio_file)
21
  if not mime_type or not mime_type.startswith("audio"):
22
  return (
@@ -46,13 +55,18 @@ def transcribe_audio(audio_file: str) -> str:
46
  return response.text.strip()
47
 
48
  except FileNotFoundError:
 
49
  return "Памылка: Файл не знойдзены."
50
  except Exception as e:
51
- return f"Нечаканая памылка: {e}"
 
52
 
53
 
54
  def fix_subtitles_format(transcript: str) -> str:
55
  """Выпраўляе фармат часу ў субцітрах."""
 
 
 
56
  prompt_fix = (
57
  "Не змяняй тэксты, выправі толькі часовы фармат у субцітрах на правільны, "
58
  "вось прыклад 00:00:01,589. \nУ адказ напішы толькі субцітры:\n"
@@ -68,24 +82,31 @@ def fix_subtitles_format(transcript: str) -> str:
68
  )
69
  return response_fix.text.strip()
70
  except Exception as e:
71
- print(f"Памылка пры выпраўленні субцітраў: {e}")
72
  return transcript
73
 
74
 
75
  def create_srt(transcript: str, filename: str = "subtitles.srt") -> tuple[str, str]:
76
  """Стварае SRT-файл з транскрыпцыі."""
 
 
 
77
  try:
78
  with open(filename, "w", encoding="utf-8") as f:
79
  f.write(transcript)
80
  return transcript, filename
81
  except Exception as e:
82
- return f"Памылка пры запісе SRT-файла: {e}", ""
 
83
 
84
 
85
  def process_audio(audio_path: str) -> tuple[str, str]:
86
  """Апрацоўвае аўдыёфайл: транскрыбуе і стварае SRT."""
 
 
 
87
  transcript = transcribe_audio(audio_path)
88
- if transcript.startswith("Памылка") or transcript.startswith("Немагчыма"):
89
  return transcript, ""
90
 
91
  fixed_transcript = fix_subtitles_format(transcript)
@@ -95,17 +116,24 @@ def process_audio(audio_path: str) -> tuple[str, str]:
95
 
96
  def extract_audio_from_video(video_file: str) -> tuple[str, str]:
97
  """Выдзяляе аўдыёдарожку з відэафайла."""
 
 
 
98
  try:
99
  audio = AudioSegment.from_file(video_file)
100
  audio_path = "extracted_audio.mp3"
101
  audio.export(audio_path, format="mp3")
102
  return audio_path, ""
103
  except Exception as e:
104
- return "", f"Памылка пры выдзяленні аўдыё з відэафайла: {e}"
 
105
 
106
 
107
  def process_video(video_path: str) -> tuple[str, str]:
108
  """Апрацоўвае відэафайл: выдзяляе аўдыё, транскрыбуе і стварае SRT."""
 
 
 
109
  audio_path, error = extract_audio_from_video(video_path)
110
  if error:
111
  return error, ""
@@ -114,26 +142,41 @@ def process_video(video_path: str) -> tuple[str, str]:
114
 
115
  def process_file(audio_path: str | None, video_path: str | None) -> tuple[str, str]:
116
  """Апрацоўвае файл (аўдыё або відэа)."""
117
- if audio_path:
118
- return process_audio(audio_path)
119
- elif video_path:
120
- return process_video(video_path)
121
- else:
122
- return "Няма файла для апрацоўкі.", ""
 
 
 
 
123
 
124
 
125
  def update_on_audio_change(audio_path: str | None) -> gr.update:
126
  """Абнаўляе інтэрфейс пры змене аўдыёфайла."""
127
- return gr.update(value=None, interactive=not bool(audio_path))
 
 
 
 
128
 
129
 
130
  def update_on_video_change(video_path: str | None) -> gr.update:
131
  """Абнаўляе інтэрфейс пры змене відэафайла."""
132
- return gr.update(value=None, interactive=not bool(video_path))
 
 
 
 
133
 
134
 
135
  def translate_transcript(transcript: str, target_language: str) -> tuple[str, str]:
136
  """Перакладае транскрыпцыю на іншую мову і стварае SRT."""
 
 
 
137
  prompt_text = (
138
  f"Перакладзі толькі тэксты субцітраў на {target_language} мову. "
139
  "Астатняе пакінь як ёсць.\nТэкст:\n{transcript}"
@@ -150,51 +193,64 @@ def translate_transcript(transcript: str, target_language: str) -> tuple[str, st
150
  translated_srt_filename = "translated_subtitles.srt"
151
  return create_srt(translated, translated_srt_filename)
152
  except Exception as e:
153
- return f"Памылка пры перакладзе: {e}", ""
154
-
155
-
156
- with gr.Blocks() as demo:
157
- gr.Markdown("# Транскрыпцыя аўдыя для беларускай мовы")
158
- gr.Markdown(
159
- """
160
- ## Загрузіце аўдыёфайл або відэафайл да 15 хвілін. Калі загружаны аўдыёфайл, відэа неактыўна, і наадварот.
161
- Субцітры будуць аўтаматычна згенераваны разам з SRT-файлам.
162
- [Далучайцеся да беларускаймоўнай суполкі ў ТГ](https://t.me/belarusai)
163
- **Падтрымаць праект:** [Buy me a coffee](https://buymeacoffee.com/tuteishygpt)
164
- """
165
- )
166
- with gr.Row():
167
- audio_input = gr.Audio(type="filepath", label="Аўдыёфайл")
168
- video_input = gr.Video(label="Відэафайл")
 
 
169
 
170
- audio_input.change(
171
- fn=update_on_audio_change, inputs=audio_input, outputs=video_input
172
- )
173
- video_input.change(
174
- fn=update_on_video_change, inputs=video_input, outputs=audio_input
175
- )
176
 
177
- btn = gr.Button("Апрацаваць")
178
- transcript_output = gr.Textbox(label="Транскрыпцыя", lines=10)
179
- file_output = gr.File(label="SRT-файл")
180
- btn.click(
181
- fn=process_file, inputs=[audio_input, video_input], outputs=[transcript_output, file_output]
182
- )
183
 
184
- gr.Markdown("## Пераклад субцітраў")
185
- with gr.Row():
186
- language_dropdown = gr.Dropdown(
187
- choices=["English", "Руcкая", "Польская", "Літоўская", "Нямецкая"],
188
- label="Выберы мову перакладу",
189
- value="English",
 
 
 
 
 
 
 
 
190
  )
191
- translate_btn = gr.Button("Пераклад")
192
- translation_output = gr.Textbox(label="Пераклад", lines=10)
193
- translation_file_output = gr.File(label="Translated SRT-файл")
194
- translate_btn.click(
195
- fn=translate_transcript,
196
- inputs=[transcript_output, language_dropdown],
197
- outputs=[translation_output, translation_file_output],
198
- )
199
 
200
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
4
  from google.genai import types
5
  import mimetypes
6
  from pydub import AudioSegment
7
+ import asyncio
8
+ import logging
9
+
10
+ # Configure logging
11
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
12
+ logger = logging.getLogger(__name__)
13
 
14
  # Атрыманне ключоў і мадэляў з пераменных асяроддзя
15
  GEMINI_API_KEY = os.getenv("gemini")
 
23
  def transcribe_audio(audio_file: str) -> str:
24
  """Транскрыбуе аўдыяфайл з дапамогай Google GenAI."""
25
  try:
26
+ if not audio_file or not os.path.exists(audio_file):
27
+ return "Памылка: Файл не знойдзены або не указаны."
28
+
29
  mime_type, _ = mimetypes.guess_type(audio_file)
30
  if not mime_type or not mime_type.startswith("audio"):
31
  return (
 
55
  return response.text.strip()
56
 
57
  except FileNotFoundError:
58
+ logger.error(f"Файл не знойдзены: {audio_file}")
59
  return "Памылка: Файл не знойдзены."
60
  except Exception as e:
61
+ logger.error(f"Памылка пры транскрыпцыі: {str(e)}", exc_info=True)
62
+ return f"Нечаканая памылка: {str(e)}"
63
 
64
 
65
  def fix_subtitles_format(transcript: str) -> str:
66
  """Выпраўляе фармат часу ў субцітрах."""
67
+ if not transcript:
68
+ return ""
69
+
70
  prompt_fix = (
71
  "Не змяняй тэксты, выправі толькі часовы фармат у субцітрах на правільны, "
72
  "вось прыклад 00:00:01,589. \nУ адказ напішы толькі субцітры:\n"
 
82
  )
83
  return response_fix.text.strip()
84
  except Exception as e:
85
+ logger.error(f"Памылка пры выпраўленні субцітраў: {str(e)}", exc_info=True)
86
  return transcript
87
 
88
 
89
  def create_srt(transcript: str, filename: str = "subtitles.srt") -> tuple[str, str]:
90
  """Стварае SRT-файл з транскрыпцыі."""
91
+ if not transcript:
92
+ return "", ""
93
+
94
  try:
95
  with open(filename, "w", encoding="utf-8") as f:
96
  f.write(transcript)
97
  return transcript, filename
98
  except Exception as e:
99
+ logger.error(f"Памылка пры запісе SRT-файла: {str(e)}", exc_info=True)
100
+ return f"Памылка пры запісе SRT-файла: {str(e)}", ""
101
 
102
 
103
  def process_audio(audio_path: str) -> tuple[str, str]:
104
  """Апрацоўвае аўдыёфайл: транскрыбуе і стварае SRT."""
105
+ if not audio_path:
106
+ return "Не указаны шлях да аўдыёфайла.", ""
107
+
108
  transcript = transcribe_audio(audio_path)
109
+ if transcript.startswith("Памылка") or transcript.startswith("Немагчыма") or transcript.startswith("Нечаканая"):
110
  return transcript, ""
111
 
112
  fixed_transcript = fix_subtitles_format(transcript)
 
116
 
117
  def extract_audio_from_video(video_file: str) -> tuple[str, str]:
118
  """Выдзяляе аўдыёдарожку з відэафайла."""
119
+ if not video_file or not os.path.exists(video_file):
120
+ return "", "Памылка: Відэафайл не знойдзены або не указаны."
121
+
122
  try:
123
  audio = AudioSegment.from_file(video_file)
124
  audio_path = "extracted_audio.mp3"
125
  audio.export(audio_path, format="mp3")
126
  return audio_path, ""
127
  except Exception as e:
128
+ logger.error(f"Памылка пры выдзяленні аўдыё з відэафайла: {str(e)}", exc_info=True)
129
+ return "", f"Памылка пры выдзяленні аўдыё з відэафайла: {str(e)}"
130
 
131
 
132
  def process_video(video_path: str) -> tuple[str, str]:
133
  """Апрацоўвае відэафайл: выдзяляе аўдыё, транскрыбуе і стварае SRT."""
134
+ if not video_path:
135
+ return "Не указаны шлях да відэафайла.", ""
136
+
137
  audio_path, error = extract_audio_from_video(video_path)
138
  if error:
139
  return error, ""
 
142
 
143
  def process_file(audio_path: str | None, video_path: str | None) -> tuple[str, str]:
144
  """Апрацоўвае файл (аўдыё або відэа)."""
145
+ try:
146
+ if audio_path:
147
+ return process_audio(audio_path)
148
+ elif video_path:
149
+ return process_video(video_path)
150
+ else:
151
+ return "Няма файла для апрацоўкі.", ""
152
+ except Exception as e:
153
+ logger.error(f"Памылка пры апрацоўцы файла: {str(e)}", exc_info=True)
154
+ return f"Памылка пры апрацоўцы файла: {str(e)}", ""
155
 
156
 
157
  def update_on_audio_change(audio_path: str | None) -> gr.update:
158
  """Абнаўляе інтэрфейс пры змене аўдыёфайла."""
159
+ try:
160
+ return gr.update(value=None, interactive=not bool(audio_path))
161
+ except Exception as e:
162
+ logger.error(f"Памылка пры абнаўленні інтэрфейса: {str(e)}", exc_info=True)
163
+ return gr.update(value=None, interactive=True)
164
 
165
 
166
  def update_on_video_change(video_path: str | None) -> gr.update:
167
  """Абнаўляе інтэрфейс пры змене відэафайла."""
168
+ try:
169
+ return gr.update(value=None, interactive=not bool(video_path))
170
+ except Exception as e:
171
+ logger.error(f"Памылка пры абнаўленні інтэрфейса: {str(e)}", exc_info=True)
172
+ return gr.update(value=None, interactive=True)
173
 
174
 
175
  def translate_transcript(transcript: str, target_language: str) -> tuple[str, str]:
176
  """Перакладае транскрыпцыю на іншую мову і стварае SRT."""
177
+ if not transcript:
178
+ return "Няма тэксту для перакладу.", ""
179
+
180
  prompt_text = (
181
  f"Перакладзі толькі тэксты субцітраў на {target_language} мову. "
182
  "Астатняе пакінь як ёсць.\nТэкст:\n{transcript}"
 
193
  translated_srt_filename = "translated_subtitles.srt"
194
  return create_srt(translated, translated_srt_filename)
195
  except Exception as e:
196
+ logger.error(f"Памылка пры перакладзе: {str(e)}", exc_info=True)
197
+ return f"Памылка пры перакладзе: {str(e)}", ""
198
+
199
+
200
+ try:
201
+ with gr.Blocks() as demo:
202
+ gr.Markdown("# Транскрыпцыя аўдыя для беларускай мовы")
203
+ gr.Markdown(
204
+ """
205
+ ## Загрузіце аўдыёфайл або відэафайл да 15 хвілін. Калі загружаны аўдыёфайл, відэа неактыўна, і наадварот.
206
+ Субцітры будуць аўтаматычна згенераваны разам з SRT-файлам.
207
+ [Далучайцеся да беларускаймоўнай суполкі ў ТГ](https://t.me/belarusai)
208
+ **Падтрымаць праект:** [Buy me a coffee](https://buymeacoffee.com/tuteishygpt)
209
+ """
210
+ )
211
+ with gr.Row():
212
+ audio_input = gr.Audio(type="filepath", label="Аўдыёфайл")
213
+ video_input = gr.Video(label="Відэафайл")
214
 
215
+ audio_input.change(
216
+ fn=update_on_audio_change, inputs=audio_input, outputs=video_input
217
+ )
218
+ video_input.change(
219
+ fn=update_on_video_change, inputs=video_input, outputs=audio_input
220
+ )
221
 
222
+ btn = gr.Button("Апрацаваць")
223
+ transcript_output = gr.Textbox(label="Транскрыпцыя", lines=10)
224
+ file_output = gr.File(label="SRT-файл")
225
+ btn.click(
226
+ fn=process_file, inputs=[audio_input, video_input], outputs=[transcript_output, file_output]
227
+ )
228
 
229
+ gr.Markdown("## Пераклад субцітраў")
230
+ with gr.Row():
231
+ language_dropdown = gr.Dropdown(
232
+ choices=["English", "Руcкая", "Польская", "Літоўская", "Нямецкая"],
233
+ label="Выберы мову перакладу",
234
+ value="English",
235
+ )
236
+ translate_btn = gr.Button("Пераклад")
237
+ translation_output = gr.Textbox(label="Пераклад", lines=10)
238
+ translation_file_output = gr.File(label="Translated SRT-файл")
239
+ translate_btn.click(
240
+ fn=translate_transcript,
241
+ inputs=[transcript_output, language_dropdown],
242
+ outputs=[translation_output, translation_file_output],
243
  )
 
 
 
 
 
 
 
 
244
 
245
+ # Запуск з дадатковымі параметрамі для стабільнасці
246
+ demo.launch(
247
+ server_name="0.0.0.0",
248
+ server_port=7860,
249
+ share=False,
250
+ debug=False,
251
+ show_error=True,
252
+ prevent_thread_lock=True
253
+ )
254
+ except Exception as e:
255
+ logger.critical(f"Крытычная памылка пры запуску праграмы: {str(e)}", exc_info=True)
256
+ print(f"Крытычная памылка: {str(e)}")