From 6374a50717a390ac58684f74150ead4f79b8742a Mon Sep 17 00:00:00 2001 From: Admin Date: Sun, 5 Jul 2026 22:04:12 +0400 Subject: [PATCH] feat: Add gemini_transcribe.py for high quality audio transcription using Gemini API --- gemini_transcribe.py | 101 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 gemini_transcribe.py diff --git a/gemini_transcribe.py b/gemini_transcribe.py new file mode 100644 index 0000000..fb1dad7 --- /dev/null +++ b/gemini_transcribe.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +import os +import sys +import time +import google.generativeai as genai + +# Config API key +API_KEY = os.getenv("GOOGLE_API_KEY", "AIzaSyD09NxPpyTk4RZLGqE6dFzJwNxhawRAegc") +genai.configure(api_key=API_KEY) + +BOT_TOKEN = "8725618164:AAH1tGalq-pw1l0t4P5c0sdLkCVJdh7IE7M" +CHAT_ID = "197957361" + +def send_tg(msg): + import urllib.parse + import urllib.request + try: + url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage" + data = urllib.parse.urlencode({"chat_id": CHAT_ID, "text": msg, "parse_mode": "markdown"}).encode("utf-8") + req = urllib.request.Request(url, data=data) + urllib.request.urlopen(req, timeout=15) + except Exception as e: + print(f"Failed to send Telegram message: {e}") + +def transcribe_audio(audio_path, output_prefix, model_name="gemini-1.5-pro"): + if not os.path.exists(audio_path): + print(f"Error: File not found: {audio_path}") + sys.exit(1) + + size_mb = os.path.getsize(audio_path) / (1024 * 1024) + print(f"File size: {size_mb:.2f} MB") + + send_tg(f"πŸŽ™ **Вранскрибация Π°ΡƒΠ΄ΠΈΠΎ Ρ‡Π΅Ρ€Π΅Π· Gemini:**\nΠ€Π°ΠΉΠ»: `{os.path.basename(audio_path)}` ({size_mb:.1f} MB)\nМодСль: `{model_name}`\n\n*Запуск Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² Google API...*") + + # 1. Upload file + print(f"Uploading {audio_path} to Google Gemini File API...") + audio_file = genai.upload_file(path=audio_path) + print(f"File uploaded successfully! API Name: {audio_file.name}") + + # 2. Wait for processing + start_time = time.time() + while audio_file.state.name == "PROCESSING": + print("File is processing on Google servers... waiting 10s") + time.sleep(10) + audio_file = genai.get_file(name=audio_file.name) + + if audio_file.state.name == "FAILED": + send_tg("❌ **Ошибка**: ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°ΡƒΠ΄ΠΈΠΎΡ„Π°ΠΉΠ»Π° Π½Π° сСрвСрС Google Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ.") + raise ValueError("Audio processing failed on Google servers.") + + print("Audio file is active and ready!") + send_tg("⚑️ **Аудиофайл Π³ΠΎΡ‚ΠΎΠ² ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅.** Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ тСкста Π² Gemini (это ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ Π΄ΠΎ 2-3 ΠΌΠΈΠ½ΡƒΡ‚)...") + + # 3. Transcribe with model + model = genai.GenerativeModel(model_name) + prompt = ( + "Π‘Π΄Π΅Π»Π°ΠΉ максимально Ρ‚ΠΎΡ‡Π½ΡƒΡŽ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΡƒ (Ρ‚Ρ€Π°Π½ΡΠΊΡ€ΠΈΠ±Π°Ρ†ΠΈΡŽ) этой аудиозаписи Π½Π° русском языкС. " + "ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉ голоса ΠΈ раздСляй Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎ спикСрам (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: 'Π‘ΠΏΠΈΠΊΠ΅Ρ€ 1:', 'Π‘ΠΏΠΈΠΊΠ΅Ρ€ 2:'), Ссли говорят Ρ€Π°Π·Π½Ρ‹Π΅ люди. " + "ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ расставляй Ρ‚Π°ΠΉΠΌΠΊΠΎΠ΄Ρ‹ Ρ€Π΅ΠΏΠ»ΠΈΠΊ ΠΈΠ»ΠΈ Ρ‚Π°ΠΉΠΌΠΊΠΎΠ΄Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 1-2 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, [04:12]). " + "ΠžΡ„ΠΎΡ€ΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² красивом ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ Markdown-Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ, Π°Π±Π·Π°Ρ†Π°ΠΌΠΈ ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ²." + ) + + try: + response = model.generate_content([audio_file, prompt]) + transcript_text = response.text + + # Save MD file + md_file = f"{output_prefix}.md" + with open(md_file, "w", encoding="utf-8") as f: + f.write(transcript_text) + + # Save plain text copy + txt_file = f"{output_prefix}.txt" + with open(txt_file, "w", encoding="utf-8") as f: + f.write(transcript_text) + + elapsed = time.time() - start_time + print(f"Success! Unpacked in {elapsed:.1f}s") + + send_tg(f"βœ… **Π Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°!**\nΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: {elapsed/60:.1f} ΠΌΠΈΠ½\n\nΠ Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ сохранСны Π²:\n- `{md_file}`\n- `{txt_file}`") + + except Exception as e: + print(f"Error during transcription generation: {e}") + send_tg(f"❌ **Ошибка Π²ΠΎ врСмя Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ тСкста:**\n`{e}`") + + finally: + # Delete remote file from Google storage + print("Cleaning up file from Google storage...") + genai.delete_file(name=audio_file.name) + print("Cleanup done.") + +if __name__ == "__main__": + if len(sys.argv) < 3: + print("Usage: python3 gemini_transcribe.py [model_name]") + sys.exit(1) + + audio_path = sys.argv[1] + output_prefix = sys.argv[2] + model_name = sys.argv[3] if len(sys.argv) > 3 else "gemini-1.5-pro" + + transcribe_audio(audio_path, output_prefix, model_name)