File size: 3,132 Bytes
81d850a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import streamlit as st
import torch
import librosa
import numpy as np
from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
import io
from datetime import datetime

# Konfiguracja strony
st.set_page_config(
    page_title="Transkrypcja Audio - Polski",
    page_icon="🎤",
    layout="wide"
)

@st.cache_resource
def zaladuj_model():
    """Ładuje model i procesor z cache"""
    nazwa_modelu = "jonatasgrosman/wav2vec2-large-xlsr-53-polish"
    procesor = Wav2Vec2Processor.from_pretrained(nazwa_modelu)
    model = Wav2Vec2ForCTC.from_pretrained(nazwa_modelu)
    return procesor, model

def transkrybuj_audio(audio_bytes, procesor, model):
    """Transkrybuje audio z przekazanych bajtów"""
    # Konwersja bajtów na numpy array
    audio, czestotliwosc = librosa.load(io.BytesIO(audio_bytes), sr=16000)
    
    # Przygotowanie danych wejściowych
    dane_wejsciowe = procesor(audio, sampling_rate=16000, return_tensors="pt").input_values

    # Wykonanie transkrypcji
    with torch.no_grad():
        logity = model(dane_wejsciowe).logits
    
    # Dekodowanie transkrypcji
    przewidziane_id = torch.argmax(logity, dim=-1)
    transkrypcja = procesor.batch_decode(przewidziane_id)[0]
    
    return transkrypcja

def main():
    st.title("🎤 Transkrypcja Audio w Języku Polskim")
    
    st.markdown("""
    ### Instrukcja:
    1. Wgraj plik audio (WAV, MP3, etc.)
    2. Poczekaj na transkrypcję
    3. Pobierz wynik jako plik tekstowy
    """)

    # Ładowanie modelu
    with st.spinner("Ładowanie modelu..."):
        procesor, model = zaladuj_model()

    # Upload pliku
    plik_audio = st.file_uploader("Wybierz plik audio", type=['wav', 'mp3', 'ogg', 'm4a'])
    
    if plik_audio is not None:
        st.audio(plik_audio)
        
        if st.button("Rozpocznij transkrypcję"):
            with st.spinner("Trwa transkrypcja..."):
                try:
                    # Transkrypcja
                    transkrypcja = transkrybuj_audio(plik_audio.getvalue(), procesor, model)
                    
                    # Wyświetlenie wyniku
                    st.success("Transkrypcja zakończona!")
                    st.markdown("### Wynik transkrypcji:")
                    st.text_area("", transkrypcja, height=200)
                    
                    # Przygotowanie pliku do pobrania
                    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
                    nazwa_pliku = f"transkrypcja_{timestamp}.txt"
                    
                    st.download_button(
                        label="Pobierz transkrypcję",
                        data=transkrypcja.encode('utf-8'),
                        file_name=nazwa_pliku,
                        mime="text/plain"
                    )
                    
                except Exception as e:
                    st.error(f"Wystąpił błąd podczas transkrypcji: {str(e)}")

    st.markdown("---")
    st.markdown("""
    ### Informacje:
    - Model: Wav2Vec2-Large-XLSR-53-Polish
    - Obsługiwane formaty: WAV, MP3, OGG, M4A
    - Język: Polski
    """)

if __name__ == "__main__":
    main()