Снимок состояния до переноса серверного UI

This commit is contained in:
AidarKC
2026-06-03 14:49:03 +04:00
parent 2c2aad1355
commit c97b3e3ec3
6 changed files with 41 additions and 54 deletions
+24 -15
View File
@@ -18,7 +18,7 @@ import time
import traceback
import uuid
from pathlib import Path
from typing import Any
from typing import Any, Callable
from urllib import error, request
DEFAULT_ALLOWED_PLAYERS = ",".join([
@@ -1509,7 +1509,10 @@ class ShinePyBotService:
try:
if job.get("type") == "voice":
self._safe_send(chat_id, f"#{job_num}: распознаю голосовое...", reply_to=message_id)
recognized = self._transcribe_voice_job(job)
recognized = self._transcribe_voice_job(
job,
status_cb=lambda note: self._safe_send(chat_id, f"#{job_num}: {note}", reply_to=message_id),
)
job["text"] = recognized
self._append_history(history_path, "voice_transcription", {"jobId": job_id, "jobNum": job_num, "text": recognized})
preview = recognized.strip()
@@ -2206,7 +2209,12 @@ class ShinePyBotService:
raise VoiceReplyError("OpenAI вернул пустой аудиофайл.")
return audio
def _transcribe_voice_job(self, job: dict[str, Any]) -> str:
def _transcribe_voice_job(
self,
job: dict[str, Any],
*,
status_cb: Callable[[str], Any] | None = None,
) -> str:
if not self.cfg.openai_api_key:
raise VoiceTranscriptionError(
"не настроен ключ OpenAI для распознавания.",
@@ -2225,17 +2233,11 @@ class ShinePyBotService:
media_type = (job.get("telegram_media_type") or "voice").strip()
duration_seconds = int(job.get("telegram_duration_seconds") or 0)
telegram_file_size = int(job.get("telegram_file_size") or 0)
if self._telegram_cloud_download_is_likely_too_big(telegram_file_size):
limit_mb = self._bytes_to_mb(20 * 1024 * 1024)
actual_mb = self._bytes_to_mb(telegram_file_size)
raise VoiceTranscriptionError(
(
f"Telegram не даст этому боту скачать такой файл через обычный Bot API "
f"(примерно {actual_mb} MB при лимите около {limit_mb} MB). "
f"Для очень длинных аудио нужен локальный `telegram-bot-api` сервер или другой способ доставки файла."
),
stage="telegram_get_file_too_big",
retryable=False,
file_looks_big_for_cloud = self._telegram_cloud_download_is_likely_too_big(telegram_file_size)
if file_looks_big_for_cloud and status_cb is not None:
status_cb(
"файл большой, всё равно пробую скачать его из Telegram. "
f"Предварительный размер около {self._bytes_to_mb(telegram_file_size)} MB."
)
started_at = time.time()
print(f"[py-bot] transcribe start job={job_id} num={job_num} media={media_type}", flush=True)
@@ -2244,6 +2246,11 @@ class ShinePyBotService:
f"[py-bot] transcribe downloaded job={job_id} filename={filename} size={len(file_bytes)} bytes",
flush=True,
)
if file_looks_big_for_cloud and status_cb is not None:
status_cb(
"скачивание из Telegram прошло успешно. "
f"Фактический размер около {self._bytes_to_mb(len(file_bytes))} MB, дальше готовлю аудио и отправляю в OpenAI."
)
prepared_parts = self._prepare_audio_parts_for_transcription(
file_bytes,
filename,
@@ -2290,7 +2297,9 @@ class ShinePyBotService:
detail = str(e)
if "file is too big" in detail.lower():
raise VoiceTranscriptionError(
"Telegram считает файл слишком большим для скачивания через текущий Bot API. Для такого аудио нужен локальный `telegram-bot-api` сервер или другой способ передать файл боту.",
"Файл большой: я попробовал скачать его через текущий Telegram Bot API, "
"но Telegram не дал это сделать. Для такого аудио нужен локальный `telegram-bot-api` "
"сервер или другой способ передать файл боту.",
stage="telegram_get_file_too_big",
retryable=False,
detail=detail,