Nitzantry1 commited on
Commit
7071c4e
·
verified ·
1 Parent(s): d68c03f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +121 -140
app.py CHANGED
@@ -3,8 +3,7 @@ import sys
3
  import logging
4
  import warnings
5
  import torch
6
- import numpy as np
7
- from typing import Optional, Union, Dict
8
 
9
  # הגדרת logging
10
  logging.basicConfig(
@@ -13,140 +12,123 @@ logging.basicConfig(
13
  )
14
  logger = logging.getLogger(__name__)
15
 
16
- # התעלמות מאזהרות מיותרות
17
  warnings.filterwarnings("ignore", category=UserWarning)
18
- warnings.filterwarnings("ignore", category=FutureWarning)
19
 
20
  try:
21
  import gradio as gr
22
  from pyannote.audio import Pipeline
23
  except ImportError as e:
24
- logger.error(f"שגיאה בטעינת ספריות: {str(e)}")
25
  sys.exit(1)
26
 
27
- class DiarizationPipeline:
28
- def __init__(self):
29
- self.pipeline = None
30
- self.device = "cuda" if torch.cuda.is_available() else "cpu"
31
- logger.info(f"Using device: {self.device}")
32
-
33
- def initialize(self) -> Optional[str]:
34
- """מאתחל את הפייפליין עם טיפול שגיאות"""
35
- try:
36
- hf_token = os.getenv('HF_TOKEN')
37
- if not hf_token:
38
- return "חסר טוקן HF_TOKEN. אנא הגדר אותו בהגדרות."
39
-
40
- self.pipeline = Pipeline.from_pretrained(
41
- "pyannote/speaker-diarization@2.1",
42
- use_auth_token=hf_token
43
- )
44
-
45
- if self.device == "cuda":
46
- self.pipeline = self.pipeline.to(torch.device("cuda"))
47
-
48
- return None # אתחול הצליח
49
-
50
- except Exception as e:
51
- error_msg = f"שגיאה באתחול המודל: {str(e)}"
52
- logger.error(error_msg)
53
- return error_msg
54
-
55
- def process_audio(
56
- self,
57
- audio_path: str,
58
- min_speakers: Optional[int] = None,
59
- max_speakers: Optional[int] = None
60
- ) -> Dict[str, Union[str, float, int]]:
61
- """מעבד קובץ אודיו ומחזיר תוצאות מפורטות"""
62
-
63
- try:
64
- if not os.path.exists(audio_path):
65
- return {"error": "קובץ האודיו לא נמצא"}
66
-
67
- file_size = os.path.getsize(audio_path) / (1024 * 1024) # MB
68
- if file_size > 100: # הגבלת גודל קובץ
69
- return {"error": f"גודל הקובץ ({file_size:.1f}MB) גדול מדי. המקסימום הוא 100MB"}
70
-
71
- # וידוא שהפייפליין מאותחל
72
- if self.pipeline is None:
73
- init_error = self.initialize()
74
- if init_error:
75
- return {"error": init_error}
76
-
77
- # עיבוד האודיו
78
- diarization = self.pipeline(
79
- audio_path,
80
- min_speakers=min_speakers if min_speakers and min_speakers > 0 else None,
81
- max_speakers=max_speakers if max_speakers and max_speakers > 0 else None
82
- )
83
 
84
- # עיבוד התוצאות
85
- segments = []
86
- speakers = set()
87
- total_duration = 0
88
-
89
- for turn, _, speaker in diarization.itertracks(yield_label=True):
90
- segment = {
91
- "start": turn.start,
92
- "end": turn.end,
93
- "duration": turn.duration,
94
- "speaker": speaker
95
- }
96
- segments.append(segment)
97
- speakers.add(speaker)
98
- total_duration += turn.duration
99
-
100
- # יצירת פלט מעוצב
101
- output_text = "תוצאות זיהוי הדוברים:\n\n"
102
-
103
- for segment in segments:
104
- output_text += (
105
- f"[{segment['start']:.1f}s -> {segment['end']:.1f}s] "
106
- f"{segment['speaker']}\n"
107
- )
108
-
109
- # הוספת סטטיסטיקות
110
- output_text += f"\nסיכום:\n"
111
- output_text += f"מספר דוברים שזוהו: {len(speakers)}\n"
112
- output_text += f"משך כולל: {total_duration:.1f} שניות\n"
113
- output_text += f"גודל הקובץ: {file_size:.1f}MB\n"
114
-
115
- if min_speakers or max_speakers:
116
- output_text += f"הגבלות שהוגדרו: "
117
- if min_speakers:
118
- output_text += f"מינימום {min_speakers} דוברים, "
119
- if max_speakers:
120
- output_text += f"מקסימום {max_speakers} דוברים"
121
- output_text += "\n"
122
-
123
- return {
124
- "text": output_text,
125
- "num_speakers": len(speakers),
126
- "duration": total_duration,
127
- "file_size": file_size,
128
- "segments": segments
129
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
 
131
- except Exception as e:
132
- error_msg = f"שגיאה בעיבוד האודיו: {str(e)}"
133
- logger.error(error_msg)
134
- return {"error": error_msg}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
 
136
- # יצירת המעטפת לממשק משתמש
137
- def create_interface(pipeline: DiarizationPipeline) -> gr.Interface:
138
- def process_wrapper(audio_path, min_speakers, max_speakers):
139
- if audio_path is None:
140
- return "לא נבחר קובץ אודיו"
141
-
142
- result = pipeline.process_audio(audio_path, min_speakers, max_speakers)
143
-
144
- if "error" in result:
145
- return f"שגיאה: {result['error']}"
146
- return result["text"]
147
 
 
 
148
  return gr.Interface(
149
- fn=process_wrapper,
150
  inputs=[
151
  gr.Audio(
152
  label="קובץ אודיו",
@@ -155,13 +137,13 @@ def create_interface(pipeline: DiarizationPipeline) -> gr.Interface:
155
  ),
156
  gr.Number(
157
  label="מינימום דוברים (אופציונלי)",
158
- value=0,
159
  minimum=0,
160
  step=1
161
  ),
162
  gr.Number(
163
  label="מקסימום דוברים (אופציונלי)",
164
- value=0,
165
  minimum=0,
166
  step=1
167
  )
@@ -175,41 +157,40 @@ def create_interface(pipeline: DiarizationPipeline) -> gr.Interface:
175
  העלה קובץ אודיו לזיהוי הדוברים השונים והזמנים שלהם.
176
 
177
  הערות:
178
- - תומך בפורמטים: WAV, MP3, FLAC
179
- - גודל קובץ מקסימלי: 100MB
180
- - מומלץ להשתמש בהקלטות באיכות טובה
181
- - אם ידוע לך מספר הדוברים, הזן אותו לשיפור הדיוק
 
 
 
 
 
 
182
  """,
183
  examples=[
184
  ["example.wav", 2, 4],
185
  ["interview.mp3", 2, 2]
186
- ],
187
- allow_flagging="never",
188
- theme="default"
189
  )
190
 
191
  if __name__ == "__main__":
192
  try:
193
- # הדפסת מידע על הסביבה
194
  logger.info(f"Python version: {sys.version}")
195
  logger.info(f"PyTorch version: {torch.__version__}")
196
- logger.info(f"NumPy version: {np.__version__}")
197
  logger.info(f"Space ID: {os.getenv('SPACE_ID', 'unknown')}")
198
  logger.info(f"GPU available: {torch.cuda.is_available()}")
199
 
200
  if torch.cuda.is_available():
201
  logger.info(f"GPU model: {torch.cuda.get_device_name(0)}")
202
 
203
- # יצירת הפייפליין והממשק
204
- pipeline = DiarizationPipeline()
205
- demo = create_interface(pipeline)
206
-
207
- # הפעלת הממשק
208
  demo.launch(
209
  share=True,
210
  enable_queue=True,
211
- max_threads=4,
212
- debug=True
213
  )
214
 
215
  except Exception as e:
 
3
  import logging
4
  import warnings
5
  import torch
6
+ from typing import Optional, Dict, Any
 
7
 
8
  # הגדרת logging
9
  logging.basicConfig(
 
12
  )
13
  logger = logging.getLogger(__name__)
14
 
15
+ # התעלמות מאזהרות לא רלוונטיות
16
  warnings.filterwarnings("ignore", category=UserWarning)
 
17
 
18
  try:
19
  import gradio as gr
20
  from pyannote.audio import Pipeline
21
  except ImportError as e:
22
+ logger.error(f"שגיאה בטעינת הספריות הנדרשות: {str(e)}")
23
  sys.exit(1)
24
 
25
+ def initialize_pipeline() -> Optional[Pipeline]:
26
+ """אתחול מודל הדיאריזציה עם טיפול שגיאות"""
27
+ try:
28
+ hf_token = os.getenv('HF_TOKEN')
29
+ if not hf_token:
30
+ raise ValueError("לא נמצא HF_TOKEN במשתני הסביבה")
31
+
32
+ pipeline = Pipeline.from_pretrained(
33
+ "pyannote/[email protected]",
34
+ use_auth_token=hf_token
35
+ )
36
+
37
+ # העברה ל-GPU אם זמין
38
+ if torch.cuda.is_available():
39
+ pipeline = pipeline.to(torch.device("cuda"))
40
+ logger.info("המודל הועבר ל-GPU")
41
+ else:
42
+ logger.info("רץ על CPU")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
+ return pipeline
45
+
46
+ except Exception as e:
47
+ logger.error(f"שגיאה באתחול המודל: {str(e)}")
48
+ return None
49
+
50
+ def process_audio(audio_path: str, min_speakers: int = None, max_speakers: int = None) -> Dict[str, Any]:
51
+ """עיבוד קובץ האודיו וזיהוי דוברים"""
52
+ try:
53
+ # בדיקות תקינות
54
+ if not audio_path or not os.path.exists(audio_path):
55
+ return {"error": "לא נבחר קובץ אודיו תקין"}
56
+
57
+ file_size_mb = os.path.getsize(audio_path) / (1024 * 1024)
58
+ if file_size_mb > 100: # הגבלת גודל ל-100MB
59
+ return {"error": f"גודל הקובץ ({file_size_mb:.1f}MB) גדול מדי. המקסימום הוא 100MB"}
60
+
61
+ # אתחול המודל
62
+ pipeline = initialize_pipeline()
63
+ if pipeline is None:
64
+ return {"error": "שגיאה באתחול המודל"}
65
+
66
+ # הגדרת פרמטרים לזיהוי
67
+ diarization_options = {}
68
+ if min_speakers and min_speakers > 0:
69
+ diarization_options['min_speakers'] = min_speakers
70
+ if max_speakers and max_speakers > 0:
71
+ diarization_options['max_speakers'] = max_speakers
72
+
73
+ # זיהוי דוברים
74
+ diarization = pipeline(audio_path, **diarization_options)
75
+
76
+ # עיבוד התוצאות
77
+ results = []
78
+ speakers = set()
79
+ total_duration = 0
80
+
81
+ for turn, _, speaker in diarization.itertracks(yield_label=True):
82
+ segment = {
83
+ "start": turn.start,
84
+ "end": turn.end,
85
+ "duration": turn.duration,
86
+ "speaker": speaker
 
 
87
  }
88
+ results.append(segment)
89
+ speakers.add(speaker)
90
+ total_duration += turn.duration
91
+
92
+ # יצירת פלט מעוצב
93
+ output = [
94
+ "תוצאות זיהוי הדוברים:",
95
+ "=" * 30,
96
+ ""
97
+ ]
98
+
99
+ for segment in results:
100
+ output.append(
101
+ f"[{segment['start']:.1f}s -> {segment['end']:.1f}s] "
102
+ f"{segment['speaker']}"
103
+ )
104
 
105
+ output.extend([
106
+ "",
107
+ "=" * 30,
108
+ "סיכום:",
109
+ f"• מספר דוברים שזוהו: {len(speakers)}",
110
+ f"• משך כולל: {total_duration:.1f} שניות",
111
+ f"• גודל הקובץ: {file_size_mb:.1f}MB",
112
+ ])
113
+
114
+ if min_speakers or max_speakers:
115
+ constraints = []
116
+ if min_speakers:
117
+ constraints.append(f"מינימום {min_speakers} דוברים")
118
+ if max_speakers:
119
+ constraints.append(f"מקסימום {max_speakers} דוברים")
120
+ output.append(f"• הגבלות: {', '.join(constraints)}")
121
+
122
+ return {"text": "\n".join(output)}
123
 
124
+ except Exception as e:
125
+ logger.error(f"שגיאה בעיבוד האודיו: {str(e)}")
126
+ return {"error": f"שגיאה בעיבוד: {str(e)}"}
 
 
 
 
 
 
 
 
127
 
128
+ def create_gradio_interface() -> gr.Interface:
129
+ """יצירת ממשק המשתמש"""
130
  return gr.Interface(
131
+ fn=lambda audio, min_spk, max_spk: process_audio(audio, min_spk, max_spk).get("text", "שגיאה בעיבוד"),
132
  inputs=[
133
  gr.Audio(
134
  label="קובץ אודיו",
 
137
  ),
138
  gr.Number(
139
  label="מינימום דוברים (אופציונלי)",
140
+ value=None,
141
  minimum=0,
142
  step=1
143
  ),
144
  gr.Number(
145
  label="מקסימום דוברים (אופציונלי)",
146
+ value=None,
147
  minimum=0,
148
  step=1
149
  )
 
157
  העלה קובץ אודיו לזיהוי הדוברים השונים והזמנים שלהם.
158
 
159
  הערות:
160
+ תומך בפורמטים: WAV, MP3, FLAC
161
+ גודל קובץ מקסימלי: 100MB
162
+ מומלץ להשתמש בהקלטות באיכות טובה
163
+ אם ידוע מספר הדוברים, ציון שלו יכול לשפר את הדיוק
164
+ """,
165
+ article="""
166
+ שים לב:
167
+ 1. הזיהוי הכי מדויק בהקלטות ללא רעשי רקע
168
+ 2. לפעמים המודל יכול לזהות את אותו דובר פעמיים
169
+ 3. הזמנים מוצגים בשניות
170
  """,
171
  examples=[
172
  ["example.wav", 2, 4],
173
  ["interview.mp3", 2, 2]
174
+ ]
 
 
175
  )
176
 
177
  if __name__ == "__main__":
178
  try:
179
+ # מידע על הסביבה
180
  logger.info(f"Python version: {sys.version}")
181
  logger.info(f"PyTorch version: {torch.__version__}")
 
182
  logger.info(f"Space ID: {os.getenv('SPACE_ID', 'unknown')}")
183
  logger.info(f"GPU available: {torch.cuda.is_available()}")
184
 
185
  if torch.cuda.is_available():
186
  logger.info(f"GPU model: {torch.cuda.get_device_name(0)}")
187
 
188
+ # יצירה והפעלת הממשק
189
+ demo = create_gradio_interface()
 
 
 
190
  demo.launch(
191
  share=True,
192
  enable_queue=True,
193
+ max_threads=4
 
194
  )
195
 
196
  except Exception as e: