feat: Add gemini_transcribe.py for high quality audio transcription using Gemini API
This commit is contained in:
parent
d900e8a2bc
commit
6374a50717
1 changed files with 101 additions and 0 deletions
101
gemini_transcribe.py
Normal file
101
gemini_transcribe.py
Normal file
|
|
@ -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 <audio_path> <output_prefix_path> [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)
|
||||
Loading…
Reference in a new issue