File size: 3,184 Bytes
10fe697 9fad0db 9da5321 2ff7a4a 10fe697 10dbd97 647ae53 42295c8 10dbd97 eef635f da62944 933bac2 da62944 933bac2 9fad0db 69610ab da62944 6838e5c da62944 b26b92f 42295c8 da62944 933bac2 b26b92f 69610ab da62944 b26b92f da62944 647ae53 da62944 6838e5c b26b92f 6838e5c 647ae53 42295c8 b26b92f 647ae53 b26b92f 647ae53 b26b92f 647ae53 b26b92f 647ae53 b26b92f 647ae53 b26b92f 647ae53 42295c8 b26b92f 647ae53 9fad0db 647ae53 |
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 |
import gradio as gr
from transformers import pipeline
from pydub import AudioSegment
import os
# Załaduj mniejszy model Whisper do transkrypcji
transcriber = pipeline("automatic-speech-recognition", model="openai/whisper-small")
# Załaduj model do tłumaczenia na angielski
translator = pipeline("translation", model="Helsinki-NLP/opus-mt-pl-en")
# Funkcja zmniejszenia jakości audio i konwersji do WAV
def reduce_audio_quality(input_path):
try:
audio = AudioSegment.from_file(input_path)
reduced_audio = audio.set_frame_rate(16000).set_channels(1).set_sample_width(2)
reduced_path = "reduced_audio.wav"
reduced_audio.export(reduced_path, format="wav", bitrate="64k")
return reduced_path
except Exception as e:
return None
# Funkcja podziału audio na segmenty 30-sekundowe
def split_audio_to_segments(input_path, segment_length=30):
audio = AudioSegment.from_file(input_path)
segments = []
for i in range(0, len(audio), segment_length * 1000):
segment = audio[i:i + segment_length * 1000]
segment_path = f"segment_{i // 1000}.wav"
segment.export(segment_path, format="wav")
segments.append(segment_path)
return segments
# Funkcja przetwarzania pliku z użyciem streaming
def transcribe_audio_stream(file):
try:
reduced_audio = reduce_audio_quality(file.name)
if not reduced_audio:
yield "Nie udało się zmniejszyć rozmiaru pliku."
return
segments = split_audio_to_segments(reduced_audio, segment_length=30)
full_transcription = ""
for segment in segments:
result = transcriber(segment)
full_transcription += result['text'] + " "
os.remove(segment)
yield full_transcription.strip() # Stream częściowej transkrypcji
os.remove(reduced_audio)
except Exception as e:
yield f"Błąd: {e}"
# Funkcja tłumaczenia poprawionego tekstu
def translate_text(text):
try:
translation = translator(text)[0]['translation_text']
return translation.strip()
except Exception as e:
return f"Błąd podczas tłumaczenia: {e}"
# Interfejs Gradio
with gr.Blocks() as app:
gr.Markdown("## Whisper Small - Transkrypcja i Tłumaczenie")
gr.Markdown("Prześlij plik audio/wideo, wygeneruj transkrypcję, popraw ją ręcznie i przetłumacz na angielski.")
with gr.Row():
file_input = gr.File(label="Prześlij plik audio lub wideo (MOV, MP4, WAV, MP3)")
transcribe_button = gr.Button("Wykonaj transkrypcję")
transcription_output = gr.Textbox(label="Transkrypcja tekstowa (edytowalna)", lines=10)
translate_button = gr.Button("Przetłumacz na angielski")
translation_output = gr.Textbox(label="Tłumaczenie na angielski", lines=10)
# Streaming transkrypcji
transcribe_button.click(
transcribe_audio_stream,
inputs=file_input,
outputs=transcription_output
)
# Tłumaczenie tekstu po poprawkach
translate_button.click(
translate_text,
inputs=transcription_output,
outputs=translation_output
)
app.launch()
|