import os
import logging
import aiohttp
import json
import sqlite3
from datetime import datetime
from aiogram import Router, F, Bot
from aiogram.types import Message
from config import ADMIN_USER_ID, DATABASE_PATH
from pathlib import Path
logger = logging.getLogger(__name__)
router = Router()
WHISPER_API_URL = "http://192.168.10.167:9001/transcribe"
def log_voice_to_db(user_id, username, msg_type, duration, text):
"""Фиксация статистики в основную базу Домового"""
try:
conn = sqlite3.connect(DATABASE_PATH)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS voice_recognition_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
username TEXT,
message_type TEXT,
duration INTEGER,
text TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
cursor.execute('''
INSERT INTO voice_recognition_logs (user_id, username, message_type, duration, text)
VALUES (?, ?, ?, ?, ?)
''', (user_id, username, msg_type, duration, text))
conn.commit()
conn.close()
except Exception as e:
logger.error(f"❌ DB Log error: {e}")
@router.message(F.voice | F.video_note)
async def handle_voice_message(message: Message, bot: Bot):
# ПЕРЕВОДИМ ТОЛЬКО ДЛЯ ТЕБЯ (СУПЕРАДМИНА)
if int(message.from_user.id) != int(ADMIN_USER_ID):
return
status_msg = await message.reply("⏳ Распознаю голос (Whisper AI)...", parse_mode="HTML")
await bot.send_chat_action(message.chat.id, "typing")
try:
if message.voice:
file_id = message.voice.file_id
filename = f"{file_id}.oga"
msg_type = "VOICE"
else:
file_id = message.video_note.file_id
filename = f"{file_id}.mp4"
msg_type = "VIDEO_NOTE"
file = await bot.get_file(file_id)
# Используем aiohttp для отправки файла в микросервис
async with aiohttp.ClientSession() as session:
# Скачиваем файл во временный буфер
file_url = f"https://api.telegram.org/file/bot{bot.token}/{file.file_path}"
# Прокси если нужно (подтянется из конфига если настроено, но тут идем напрямую)
async with session.get(file_url) as file_resp:
if file_resp.status != 200:
raise Exception(f"Не удалось скачать файл из TG: {file_resp.status}")
file_content = await file_resp.read()
# Отправляем в наш Whisper-Service
data = aiohttp.FormData()
data.add_field('file', file_content, filename=filename)
async with session.post(WHISPER_API_URL, data=data) as whisper_resp:
if whisper_resp.status != 200:
err_text = await whisper_resp.text()
raise Exception(f"Ошибка Whisper API: {err_text}")
result = await whisper_resp.json()
text = result.get("text", "")
duration = result.get("duration", 0)
if text:
# Логируем в базу
log_voice_to_db(message.from_user.id, message.from_user.username, msg_type, int(duration), text)
# Формируем красивый ответ
response = f"📝 РАСШИФРОВКА ({msg_type})\n"
response += f"⏱ Длительность: {int(duration)}с\n"
response += f"━━━━━━━━━━━━━━\n"
response += f"{text}"
await status_msg.edit_text(response, parse_mode="HTML")
else:
await status_msg.edit_text("🔇 Голос обнаружен, но слов не разобрал.")
except Exception as e:
logger.error(f"❌ Voice Integration Error: {e}")
await status_msg.edit_text(f"❌ Ошибка модуля Whisper: {e}")
voice_router = router