#!/usr/bin/env python3 import os import sys import time import google.generativeai as genai # Setup proxies for Google API routing through HTTP proxy (port 10809 is supported by gRPC) os.environ["https_proxy"] = "http://127.0.0.1:10809" os.environ["http_proxy"] = "http://127.0.0.1:10809" os.environ["all_proxy"] = "http://127.0.0.1:10809" # Configure Gemini with the active AI Studio key API_KEY = "AIzaSyAJMfQ_mRZ1picRXVFNaeFJ7fpAkZxUKyk" 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" # Split message if it's too long for TG limit (4096 chars) for chunk in [msg[i:i+4000] for i in range(0, len(msg), 4000)]: data = urllib.parse.urlencode({"chat_id": CHAT_ID, "text": chunk, "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}", flush=True) def transcribe_audio(audio_path, output_prefix, model_name="gemini-2.5-flash"): if not os.path.exists(audio_path): print(f"Error: File not found: {audio_path}", flush=True) sys.exit(1) size_mb = os.path.getsize(audio_path) / (1024 * 1024) print(f"File size: {size_mb:.2f} MB", flush=True) 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...", flush=True) audio_file = genai.upload_file(path=audio_path) print(f"File uploaded successfully! API Name: {audio_file.name}", flush=True) # 2. Wait for processing start_time = time.time() while audio_file.state.name == "PROCESSING": print("File is processing on Google servers... waiting 10s", flush=True) 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!", flush=True) 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", flush=True) # Send transcript to Telegram send_tg(f"βœ… **Π Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°!** ({elapsed/60:.1f} ΠΌΠΈΠ½)\nΠ Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ сохранСны Π²:\n- `{md_file}`\n- `{txt_file}`\n\nπŸ“ **ВСкст Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠΈ:**\n\n{transcript_text}") except Exception as e: print(f"Error during transcription generation: {e}", flush=True) send_tg(f"❌ **Ошибка Π²ΠΎ врСмя Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ тСкста:**\n`{e}`") finally: # Delete remote file from Google storage print("Cleaning up file from Google storage...", flush=True) try: genai.delete_file(name=audio_file.name) print("Cleanup done.", flush=True) except Exception as e: print(f"Cleanup error: {e}", flush=True) 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-2.5-flash" transcribe_audio(audio_path, output_prefix, model_name)