asterixix commited on
Commit
79788d3
verified
1 Parent(s): ffb2a4a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +132 -60
app.py CHANGED
@@ -5,92 +5,164 @@ import numpy as np
5
  from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
6
  import io
7
  from datetime import datetime
 
 
 
8
 
9
- # Konfiguracja strony
10
  st.set_page_config(
11
  page_title="Transkrypcja Audio - Polski",
12
  page_icon="馃帳",
13
- layout="wide"
14
  )
15
 
16
- @st.cache_resource
 
 
 
 
 
17
  def zaladuj_model():
18
- """艁aduje model i procesor z cache"""
19
- nazwa_modelu = "jonatasgrosman/wav2vec2-large-xlsr-53-polish"
20
- procesor = Wav2Vec2Processor.from_pretrained(nazwa_modelu)
21
- model = Wav2Vec2ForCTC.from_pretrained(nazwa_modelu)
22
- return procesor, model
 
 
 
 
 
 
 
 
 
23
 
24
- def transkrybuj_audio(audio_bytes, procesor, model):
25
- """Transkrybuje audio z przekazanych bajt贸w"""
26
- # Konwersja bajt贸w na numpy array
27
- audio, czestotliwosc = librosa.load(io.BytesIO(audio_bytes), sr=16000)
28
-
29
- # Przygotowanie danych wej艣ciowych
30
- dane_wejsciowe = procesor(audio, sampling_rate=16000, return_tensors="pt").input_values
 
 
 
31
 
32
- # Wykonanie transkrypcji
33
- with torch.no_grad():
34
- logity = model(dane_wejsciowe).logits
35
-
36
- # Dekodowanie transkrypcji
37
- przewidziane_id = torch.argmax(logity, dim=-1)
38
- transkrypcja = procesor.batch_decode(przewidziane_id)[0]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
- return transkrypcja
 
 
41
 
42
  def main():
43
  st.title("馃帳 Transkrypcja Audio w J臋zyku Polskim")
44
 
45
- st.markdown("""
46
- ### Instrukcja:
47
- 1. Wgraj plik audio (WAV, MP3, etc.)
48
- 2. Poczekaj na transkrypcj臋
49
- 3. Pobierz wynik jako plik tekstowy
50
- """)
51
-
52
  # 艁adowanie modelu
53
- with st.spinner("艁adowanie modelu..."):
54
- procesor, model = zaladuj_model()
55
-
56
- # Upload pliku
57
- plik_audio = st.file_uploader("Wybierz plik audio", type=['wav', 'mp3', 'ogg', 'm4a'])
 
 
 
 
 
58
 
59
  if plik_audio is not None:
 
 
 
 
 
60
  st.audio(plik_audio)
61
 
62
- if st.button("Rozpocznij transkrypcj臋"):
63
- with st.spinner("Trwa transkrypcja..."):
64
- try:
65
- # Transkrypcja
66
- transkrypcja = transkrybuj_audio(plik_audio.getvalue(), procesor, model)
67
-
68
- # Wy艣wietlenie wyniku
69
- st.success("Transkrypcja zako艅czona!")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  st.markdown("### Wynik transkrypcji:")
71
  st.text_area("", transkrypcja, height=200)
72
 
73
- # Przygotowanie pliku do pobrania
74
- timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
75
- nazwa_pliku = f"transkrypcja_{timestamp}.txt"
76
-
77
  st.download_button(
78
- label="Pobierz transkrypcj臋",
79
- data=transkrypcja.encode('utf-8'),
80
- file_name=nazwa_pliku,
81
  mime="text/plain"
82
  )
83
-
84
- except Exception as e:
85
- st.error(f"Wyst膮pi艂 b艂膮d podczas transkrypcji: {str(e)}")
 
 
 
 
 
 
 
86
 
87
- st.markdown("---")
88
- st.markdown("""
89
- ### Informacje:
90
- - Model: Wav2Vec2-Large-XLSR-53-Polish
91
- - Obs艂ugiwane formaty: WAV, MP3, OGG, M4A
92
- - J臋zyk: Polski
93
- """)
 
94
 
95
  if __name__ == "__main__":
96
  main()
 
5
  from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
6
  import io
7
  from datetime import datetime
8
+ import gc
9
+ import warnings
10
+ warnings.filterwarnings('ignore')
11
 
12
+ # Konfiguracja strony i optymalizacja pami臋ci
13
  st.set_page_config(
14
  page_title="Transkrypcja Audio - Polski",
15
  page_icon="馃帳",
16
+ layout="centered" # zmniejszone zu偶ycie miejsca
17
  )
18
 
19
+ # Optymalizacja torch
20
+ torch.backends.cudnn.benchmark = True
21
+ if torch.cuda.is_available():
22
+ torch.cuda.empty_cache()
23
+
24
+ @st.cache_resource(ttl=3600) # cache wygasa po godzinie
25
  def zaladuj_model():
26
+ """艁aduje model i procesor z cache z obs艂ug膮 b艂臋d贸w"""
27
+ try:
28
+ nazwa_modelu = "jonatasgrosman/wav2vec2-large-xlsr-53-polish"
29
+ procesor = Wav2Vec2Processor.from_pretrained(nazwa_modelu)
30
+ model = Wav2Vec2ForCTC.from_pretrained(nazwa_modelu)
31
+
32
+ # Optymalizacja modelu
33
+ if torch.cuda.is_available():
34
+ model = model.to('cuda')
35
+ model.eval() # tryb ewaluacji
36
+ return procesor, model
37
+ except Exception as e:
38
+ st.error(f"B艂膮d 艂adowania modelu: {str(e)}")
39
+ return None, None
40
 
41
+ @st.cache_data(ttl=300) # cache na 5 minut dla danych audio
42
+ def przetworz_audio(audio_bytes):
43
+ """Wst臋pne przetwarzanie audio z optymalizacj膮 pami臋ci"""
44
+ try:
45
+ # U偶ywamy ma艂ych fragment贸w do przetwarzania
46
+ y, sr = librosa.load(io.BytesIO(audio_bytes), sr=16000, mono=True)
47
+ return y, sr
48
+ except Exception as e:
49
+ st.error(f"B艂膮d przetwarzania audio: {str(e)}")
50
+ return None, None
51
 
52
+ def transkrybuj_audio(audio, procesor, model, chunk_length_s=30):
53
+ """Transkrybuje audio w chunks dla optymalizacji pami臋ci"""
54
+ try:
55
+ # Podziel audio na chunki
56
+ sample_rate = 16000
57
+ chunk_length = chunk_length_s * sample_rate
58
+ chunks = [audio[i:i + chunk_length] for i in range(0, len(audio), chunk_length)]
59
+
60
+ pelna_transkrypcja = []
61
+
62
+ # Przetwarzaj ka偶dy chunk osobno
63
+ for chunk in chunks:
64
+ if len(chunk) < 100: # pomijamy zbyt kr贸tkie chunki
65
+ continue
66
+
67
+ inputs = procesor(chunk, sampling_rate=sample_rate, return_tensors="pt", padding=True)
68
+
69
+ if torch.cuda.is_available():
70
+ inputs = inputs.input_values.to('cuda')
71
+ else:
72
+ inputs = inputs.input_values
73
+
74
+ with torch.no_grad():
75
+ logits = model(inputs).logits
76
+ predicted_ids = torch.argmax(logits, dim=-1)
77
+ transkrypcja = procesor.batch_decode(predicted_ids)[0]
78
+ pelna_transkrypcja.append(transkrypcja)
79
+
80
+ # Czyszczenie pami臋ci
81
+ del inputs, logits, predicted_ids
82
+ torch.cuda.empty_cache() if torch.cuda.is_available() else gc.collect()
83
+
84
+ return " ".join(pelna_transkrypcja)
85
 
86
+ except Exception as e:
87
+ st.error(f"B艂膮d transkrypcji: {str(e)}")
88
+ return ""
89
 
90
  def main():
91
  st.title("馃帳 Transkrypcja Audio w J臋zyku Polskim")
92
 
 
 
 
 
 
 
 
93
  # 艁adowanie modelu
94
+ procesor, model = zaladuj_model()
95
+ if procesor is None or model is None:
96
+ st.stop()
97
+
98
+ # Limit rozmiaru pliku (10MB)
99
+ plik_audio = st.file_uploader(
100
+ "Wybierz plik audio (max 10MB)",
101
+ type=['wav', 'mp3', 'ogg', 'm4a'],
102
+ accept_multiple_files=False
103
+ )
104
 
105
  if plik_audio is not None:
106
+ # Sprawdzenie rozmiaru pliku
107
+ if plik_audio.size > 10 * 1024 * 1024: # 10MB
108
+ st.error("Plik jest zbyt du偶y. Maksymalny rozmiar to 10MB.")
109
+ st.stop()
110
+
111
  st.audio(plik_audio)
112
 
113
+ if st.button("Rozpocznij transkrypcj臋", type="primary"):
114
+ progress_bar = st.progress(0)
115
+ status_text = st.empty()
116
+
117
+ try:
118
+ # Przetwarzanie audio
119
+ status_text.text("Przetwarzanie audio...")
120
+ progress_bar.progress(25)
121
+ audio, sr = przetworz_audio(plik_audio.getvalue())
122
+
123
+ if audio is None:
124
+ st.stop()
125
+
126
+ # Transkrypcja
127
+ status_text.text("Trwa transkrypcja...")
128
+ progress_bar.progress(50)
129
+ transkrypcja = transkrybuj_audio(audio, procesor, model)
130
+
131
+ # Wy艣wietlenie wyniku
132
+ progress_bar.progress(100)
133
+ status_text.text("Zako艅czono!")
134
+
135
+ if transkrypcja:
136
  st.markdown("### Wynik transkrypcji:")
137
  st.text_area("", transkrypcja, height=200)
138
 
139
+ # Przycisk pobierania
140
+ nazwa_pliku = f"transkrypcja_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
 
 
141
  st.download_button(
142
+ "馃摜 Pobierz transkrypcj臋",
143
+ transkrypcja.encode('utf-8'),
144
+ nazwa_pliku,
145
  mime="text/plain"
146
  )
147
+
148
+ # Czyszczenie
149
+ del audio
150
+ gc.collect()
151
+
152
+ except Exception as e:
153
+ st.error(f"Wyst膮pi艂 nieoczekiwany b艂膮d: {str(e)}")
154
+ finally:
155
+ progress_bar.empty()
156
+ status_text.empty()
157
 
158
+ # Informacje
159
+ with st.expander("鈩癸笍 Informacje o aplikacji"):
160
+ st.markdown("""
161
+ - Model: Wav2Vec2-Large-XLSR-53-Polish
162
+ - Maksymalny rozmiar pliku: 10MB
163
+ - Obs艂ugiwane formaty: WAV, MP3, OGG, M4A
164
+ - J臋zyk: Polski
165
+ """)
166
 
167
  if __name__ == "__main__":
168
  main()