#!/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)