Spaces:
Running
Running
import os | |
import gradio as gr | |
import google.generativeai as genai | |
import mimetypes | |
from pydub import AudioSegment | |
GEMINI_API_KEY = os.getenv("gembeh") | |
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 = os.getenv("p") | |
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 check_audio_length(audio): | |
if audio is not None: | |
try: | |
audio_seg = AudioSegment.from_file(audio) | |
if audio_seg.duration_seconds > 420: | |
return "Памылка: Аўдыёфайл даўжэй за 7 хвілін." | |
else: | |
return "" | |
except Exception as e: | |
return f"Памылка пры праверцы аўдыё: {str(e)}" | |
return "" | |
def check_video_length(video): | |
if video is not None: | |
try: | |
audio_seg = AudioSegment.from_file(video) | |
if audio_seg.duration_seconds > 420: | |
return "Памылка: Відэафайл даўжэй за 7 хвілін." | |
else: | |
return "" | |
except Exception as e: | |
return f"Памылка пры праверцы відэа: {str(e)}" | |
return "" | |
def process_file(audio, video): | |
if audio is not None: | |
error = check_audio_length(audio) | |
if error: | |
return error, None | |
return process_audio(audio) | |
elif video is not None: | |
error = check_video_length(video) | |
if error: | |
return error, None | |
return process_video(video) | |
else: | |
return "Няма файла для апрацоўкі.", None | |
def on_audio_change(audio): | |
# Калі загружаны аўдыёфайл, адключаем відэафайл і правяраем працягласць | |
if audio is not None: | |
error_msg = check_audio_length(audio) | |
return gr.update(value=None, interactive=False), error_msg | |
else: | |
return gr.update(interactive=True), "" | |
def on_video_change(video): | |
# Калі загружаны відэафайл, адключаем аўдыёфайл і правяраем працягласць | |
if video is not None: | |
error_msg = check_video_length(video) | |
return gr.update(value=None, interactive=False), error_msg | |
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: | |
# Дадаем Google Analytics код праз HTML-кампанент | |
gr.HTML(""" | |
<!-- Google tag (gtag.js) --> | |
<script async src="https://www.googletagmanager.com/gtag/js?id=G-2QZ4X58TG6"></script> | |
<script> | |
window.dataLayer = window.dataLayer || []; | |
function gtag(){dataLayer.push(arguments);} | |
gtag('js', new Date()); | |
gtag('config', 'G-2QZ4X58TG6'); | |
</script> | |
""") | |
gr.Markdown("# Транскрыпцыя кароткіх аўдыя для беларускай мовы") | |
gr.Markdown( | |
""" | |
## Загрузіце аўдыёфайл або відэафайл да 7 хвілін. Субцітры з кароткімі тэкстамі будуць згенераваны разам з файлам субцітраў. | |
[Ёсць пытанні ці прапановы? Далучайцеся да беларускаймоўнай суполкі штучнага інтэлекту](https://t.me/belarusai) | |
**Хочаце каб сэрвіс працаваў? Налівайце каву! :** [Buy me a coffee](https://buymeacoffee.com/tuteishygpt) | |
**Агучце беларускую мову тут :** [Беларуская мадэль маўлення](https://huggingface.co/spaces/archivartaunik/Bextts) | |
""" | |
) | |
with gr.Row(): | |
audio_input = gr.Audio(type="filepath", label="Аўдыёфайл") | |
video_input = gr.Video(label="Відэафайл") | |
# Поле Транскрыпцыя для паказу памылак будзе агульным | |
transcript_output = gr.Textbox(label="Транскрыпцыя", lines=10) | |
# Пры загрузцы аўдыё або відэа запускаем праверку працягласці і абнаўляем адпаведна поле Транскрыпцыя | |
audio_input.change(fn=on_audio_change, inputs=audio_input, outputs=[video_input, transcript_output]) | |
video_input.change(fn=on_video_change, inputs=video_input, outputs=[audio_input, transcript_output]) | |
btn = gr.Button("Апрацаваць") | |
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() | |