Ошибка Google TTS Python
Всем привет, я использую Google TTS,Zoom API и Selenium для того, что бы мой бот мог общаться в зуме с людьми и задавать вопросы, но проблема в том, что после того как бот приветствует обнаруженного участника, в логах вылезает ошибка DEPRECATED_ENDPOINT[15888:10840:0818/210759.301:ERROR:google_apis\gcm\engine\registration_request.cc:291] Registration response error message: DEPRECATED_ENDPOINT
Сразу скажу, что большую часть кода, писал DeepSeek
Вот мой код:
import os
import time
import json
import threading
from datetime import datetime, timedelta
from urllib.parse import quote
from flask import Flask, redirect, request, render_template_string
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pyttsx3
import gtts
from pydub import AudioSegment
from pydub.playback import play
import tempfile
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
filename='bot.log',
filemode='w' # Перезаписывать файл при каждом запуске
)
logger = logging.getLogger(__name__)
app = Flask(__name__)
# Конфигурация
CONFIG_FILE = 'zoom_config.json'
CHROME_DRIVER_PATH = 'chromedriver.exe' # Убедитесь, что файл находится в той же папке
CHROME_BINARY_PATH = 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe' # Путь к Chrome
# Список вопросов для бота
QUESTIONS = [
"Добрый день! Я голосовой бот. Как вас зовут?",
"Приятно познакомиться! Какой у вас опыт работы в этой области?",
"Что вас интересует в нашем продукте?",
"Есть ли у вас вопросы ко мне?",
"Спасибо за беседу! Хорошего дня!"
]
# Инициализация синтезатора речи
engine = pyttsx3.init()
engine.setProperty('rate', 150)
engine.setProperty('volume', 1.0)
def is_participant_present(driver):
"""Проверяет наличие участника несколькими способами"""
try:
# Способ 1: Проверка счетчика участников
try:
counter = WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "span.footer-button__number-counter span")))
return int(counter.text) > 1
except:
pass
# Способ 2: Проверка видео элементов
videos = driver.find_elements(By.CSS_SELECTOR, "video")
if len(videos) > 1:
return True
# Способ 3: Проверка по списку участников
participants = driver.find_elements(By.CSS_SELECTOR, "div.participants-item")
return len(participants) > 1
except Exception as e:
logger.error(f"Ошибка при проверке участников: {str(e)}")
return False
def wait_for_participant(driver):
"""Ожидание участника с несколькими методами обнаружения"""
print("Ожидаем участника...")
wait = WebDriverWait(driver, 300) # 5 минут таймаут
try:
# Способ 1: По счетчику участников
def participant_count_greater_than_1(driver):
try:
counter = driver.find_element(By.CSS_SELECTOR, "span.footer-button__number-counter span")
return int(counter.text) > 1
except:
return False
wait.until(participant_count_greater_than_1)
return True
except Exception as e:
print(f"Способ 1 не сработал: {str(e)}")
try:
# Способ 2: По наличию видеоэлементов
wait.until(lambda d: len(d.find_elements(By.CSS_SELECTOR, "video")) > 1)
return True
except Exception as e:
print(f"Способ 2 не сработал: {str(e)}")
return False
вот основные функции моего бота:
def speak(text):
"""Упрощенная и надежная версия синтеза речи"""
print(f"[BOT] {text}")
try:
# Инициализация движка при каждом вызове для надежности
engine = pyttsx3.init()
engine.setProperty('rate', 180)
# Установка русского голоса если доступен
voices = engine.getProperty('voices')
for voice in voices:
if 'ru' in voice.languages or 'russian' in voice.languages:
engine.setProperty('voice', voice.id)
break
engine.say(text)
engine.runAndWait()
engine.stop() # Явная остановка движка
except Exception as e:
print(f"Ошибка синтеза речи: {str(e)}")
def join_meeting_with_selenium(meeting_url):
"""Присоединяется к конференции через веб-интерфейс"""
try:
chrome_options = Options()
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument("--use-fake-ui-for-media-stream")
chrome_options.add_argument("--disable-notifications")
chrome_options.add_argument("--mute-audio")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_experimental_option("prefs", {
"profile.default_content_setting_values.media_stream_mic": 2,
"profile.default_content_setting_values.media_stream_camera": 2,
"profile.default_content_setting_values.geolocation": 2,
"profile.default_content_setting_values.notifications": 2
})
if os.path.exists(CHROME_BINARY_PATH):
chrome_options.binary_location = CHROME_BINARY_PATH
service = Service(executable_path=CHROME_DRIVER_PATH)
driver = webdriver.Chrome(service=service, options=chrome_options)
# Извлекаем пароль из URL если есть
password = ""
if "pwd=" in meeting_url:
password = meeting_url.split("pwd=")[1].split("&")[0]
# Форсируем веб-версию с паролем
forced_web_url = meeting_url.replace("zoom.us/j/", "zoom.us/wc/join/") + f"&uname=HR-AI"
driver.get(forced_web_url)
print("Открываем веб-версию Zoom")
# Обрабатываем экран ввода пароля (если появился)
try:
password_field = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='password']")))
password_field.send_keys(password)
join_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "button.preview-join-button")))
join_button.click()
print("Успешно ввели пароль")
except Exception as e:
print(f"Поле для пароля не найдено: {str(e)}")
# Вводим имя если требуется
try:
name_field = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "input-for-name")))
name_field.send_keys("HR-AI")
print("Ввели имя")
except:
print("Поле для имени не найдено")
# Нажимаем кнопку присоединения
try:
join_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "button.preview-join-button")))
join_button.click()
print("Успешно присоединились")
except Exception as e:
print(f"Ошибка при нажатии кнопки: {str(e)}")
# Ждем участника и задаем вопросы
logger.info("Ожидаем участника...")
participant_detected = False
questions_asked = 0
last_check_time = time.time()
while questions_asked < len(QUESTIONS):
try:
# Проверяем участника каждые 5 секунд
if time.time() - last_check_time > 5:
if is_participant_present(driver):
if not participant_detected:
logger.info("Участник обнаружен, начинаю диалог...")
participant_detected = True
# Задаем вопрос
speak(QUESTIONS[questions_asked])
questions_asked += 1
logger.info(f"Задан вопрос {questions_asked}/{len(QUESTIONS)}")
# Делаем скриншот для диагностики
driver.save_screenshot(f'question_{questions_asked}.png')
# Ждем перед следующим вопросом
if questions_asked < len(QUESTIONS):
logger.info("Ожидаем 20 секунд перед следующим вопросом...")
time.sleep(20)
else:
logger.info("Участник не обнаружен, продолжаем проверку...")
last_check_time = time.time()
time.sleep(1)
except Exception as e:
logger.error(f"Ошибка в основном цикле: {str(e)}")
time.sleep(5)
except Exception as e:
print(f"Критическая ошибка: {str(e)}")
if 'driver' in locals():
driver.save_screenshot('error.png')
finally:
if 'driver' in locals():
driver.quit()