File size: 7,540 Bytes
6160629
 
8a727d2
d9d75ab
06555da
04c273e
e64464f
8a727d2
 
a9913d9
8a727d2
265d4cc
8a727d2
6160629
d9d75ab
8a727d2
 
6160629
 
8a727d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4ba47fd
8a727d2
 
 
 
 
 
 
 
 
89be3e8
 
8a727d2
 
6160629
04c273e
a9913d9
8a727d2
 
 
 
631160f
8a727d2
 
 
4ba47fd
8a727d2
 
 
 
 
 
 
631160f
265d4cc
3ab57cd
8a727d2
d9d75ab
f2c750c
d9d75ab
f2c750c
d9d75ab
8a727d2
89be3e8
8a727d2
 
 
 
 
631160f
89be3e8
 
a9913d9
8a727d2
9dab23b
06555da
6c7418c
 
8a727d2
9dab23b
8a727d2
265d4cc
8a727d2
 
9dab23b
8a727d2
9dab23b
 
8a727d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
04c273e
8a727d2
 
 
4ba47fd
8a727d2
 
 
 
 
 
89be3e8
8a727d2
 
 
f2c750c
8a727d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f2c750c
8a727d2
 
 
 
 
 
 
04c273e
8a727d2
 
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import os
import gradio as gr
import google.generativeai as genai
import mimetypes
from pydub import AudioSegment

GEMINI_API_KEY = os.getenv("gemini")
MODEL_NAME_TH = os.getenv("modTH")
MODEL_NAME = os.getenv("mod")

genai.configure(api_key=GEMINI_API_KEY)

def transcribe_audio(audio_file):
    try:
        mime_type, _ = mimetypes.guess_type(audio_file)
        if mime_type is None:
            return "Немагчыма вызначыць тып файла. Падтрымліваюцца толькі аўдыяфайлы."
        with open(audio_file, "rb") as f:
            audio_data = f.read()
        prompt_text = (
            """The user wants me to transcribe the audio into subtitles in SRT format, with a maximum of three words per one subtitle.
I need to listen to the audio and create subtitles with timestamps. Check time format hours:minutes:seconds,milliseconds (00:00:00,000) after creating all.  Example SRT format:
1
00:00:01,670 --> 00:00:02,030
За мяжою, за мяжою,
2
00:00:02,270 --> 00:00:03,850
ні сваё і не чужое.
3
00:00:04,240 --> 00:00:05,760
Хоць спявай ты, хоць ты грай,
4
00:00:05,770 --> 00:00:06,250
а навокал іншы край.
            """
        )
        model = genai.GenerativeModel(MODEL_NAME_TH)
        response = model.generate_content(
            [prompt_text, {"mime_type": mime_type, "data": audio_data}]
        )
        if response.text:
            transcript = response.text.strip()
        else:
            transcript = "Не атрымалася транскрыбаваць аўдыя. Магчыма, памылка з API."
        return transcript
    except FileNotFoundError:
        return "Памылка: Файл не знойдзены."
    except genai.APIError as e:
        return f"Памылка API: {str(e)}"
    except Exception as e:
        return f"Нечаканая памылка: {str(e)}"

def fix_subtitles_format(transcript):
    """
    Дадатковы запыт да мадэлі, які выпраўляе фармат часоў у субцітрах.
    """
    try:
        prompt_fix = (
            f"Не змяняй тэксты, выправі толькі часовы фармат у субцітрах на правільны, вось прыклад 00:00:01,589 \n"
            f" У адказ напішы толькі субцітры: {transcript}"
        )
        model = genai.GenerativeModel(MODEL_NAME)
        response_fix = model.generate_content(prompt_fix)
        if response_fix.text:
            fixed_transcript = response_fix.text.strip()
        else:
            fixed_transcript = transcript
        return fixed_transcript
    except Exception as e:
        return transcript

def create_srt(transcript, filename="subtitles.srt"):
    try:
        with open(filename, "w", encoding="utf-8") as f:
            f.write(transcript)
        return transcript, filename
    except Exception as e:
        return f"Памылка пры запісе SRT-файла: {str(e)}", None

def process_audio(audio):
    transcript = transcribe_audio(audio)
    if transcript.startswith("Памылка"):
        return transcript, None
    # Дадаем другі запыт для выпраўлення фармату часоў у субцітрах
    fixed_transcript = fix_subtitles_format(transcript)
    text, srt_file = create_srt(fixed_transcript)
    return text, srt_file

def extract_audio_from_video(video_file):
    try:
        audio = AudioSegment.from_file(video_file)
        audio_path = "extracted_audio.mp3"
        audio.export(audio_path, format="mp3")
        return audio_path, None
    except Exception as e:
        return None, f"Памылка пры выдзяленні аўдыі з відэафайла: {str(e)}"

def process_video(video):
    audio_path, error = extract_audio_from_video(video)
    if error:
        return error, None
    return process_audio(audio_path)

def process_file(audio, video):
    if audio is not None:
        return process_audio(audio)
    elif video is not None:
        return process_video(video)
    else:
        return "Няма файла для апрацоўкі.", None

def update_on_audio_change(audio):
    if audio is not None:
        return gr.update(value=None, interactive=False)
    else:
        return gr.update(interactive=True)

def update_on_video_change(video):
    if video is not None:
        return gr.update(value=None, interactive=False)
    else:
        return gr.update(interactive=True)

def translate_transcript(transcript, target_language):
    try:
        prompt_text = (
            f"перакладзі толькі тэксты субцітраў на {target_language} мову. Астатняя пакінь як ёсць."
            f"Тэкст:\n{transcript}"
        )
        model = genai.GenerativeModel(MODEL_NAME)
        response = model.generate_content(prompt_text)
        if response.text:
            translated = response.text.strip()
        else:
            translated = "Не атрымалася перакласці тэкст. Магчыма, памылка з API."
        translated_srt_filename = "translated_subtitles.srt"
        with open(translated_srt_filename, "w", encoding="utf-8") as f:
            f.write(translated)
        return translated, translated_srt_filename
    except Exception as e:
        return f"Памылка пры перакладзе: {str(e)}", None

with gr.Blocks() as demo:
    gr.Markdown("# Транскрыпцыя аўдыя для беларускай мовы")
    gr.Markdown(
        """
## Загрузіце аўдыёфайл або відэафайл да 15 хвілін.  Калі загружаны аўдыёфайл, відэа неактыўна, і наадварот.
Субцітры будуць аўтаматычна згенераваны разам з файлам субцітраў.
[Далучайцеся да беларускаймоўнай суполкі ў ТГ](https://t.me/belarusai)
**Падтрымаць праект:** [Buy me a coffee](https://buymeacoffee.com/tuteishygpt)
        """
    )
    with gr.Row():
        audio_input = gr.Audio(type="filepath", label="Аўдыёфайл")
        video_input = gr.Video(label="Відэафайл")
    audio_input.change(fn=update_on_audio_change, inputs=audio_input, outputs=video_input)
    video_input.change(fn=update_on_video_change, inputs=video_input, outputs=audio_input)
    
    btn = gr.Button("Апрацаваць")
    transcript_output = gr.Textbox(label="Транскрыпцыя", lines=10)
    file_output = gr.File(label="SRT-файл")
    btn.click(fn=process_file, inputs=[audio_input, video_input], outputs=[transcript_output, file_output])
    
    gr.Markdown("## Пераклад субцітраў")
    with gr.Row():
        language_dropdown = gr.Dropdown(
            choices=["English", "Руcкая", "Польская", "Літоўская", "Нямецкая"],
            label="Выберы мову перакладу", value="English"
        )
        translate_btn = gr.Button("Пераклад")
    translation_output = gr.Textbox(label="Пераклад", lines=10)
    translation_file_output = gr.File(label="Translated SRT-файл")
    translate_btn.click(
        fn=translate_transcript,
        inputs=[transcript_output, language_dropdown],
        outputs=[translation_output, translation_file_output]
    )

demo.launch()