ПОМОГИТЕ с переменными на python
Проблема на 52 строке, я хочу сделать, чтоб программа говорила, какая команда выполнена, даже попробовал решить с помощью переменной hack, но не вышло, он просто говорит название переменной. В том же принт всё работает правильно.
import sys
import time
import speech_recognition as sr
from yeelight import Bulb
from concurrent.futures import ThreadPoolExecutor
import threading
import os
# Настройки
BULB_IP = "192.168.1.3"
RELOAD_INTERVAL = 60 # Перезагрузка каждые 60 секунд
def setup_bulb():
try:
bulb = Bulb(BULB_IP)
bulb.turn_on() # Инициализация подключения
print("Подключено к лампочке Yeelight.")
return bulb
except Exception as e:
print(f"Ошибка подключения к лампочке: {e}")
sys.exit(1)
def setup_microphone():
recognizer = sr.Recognizer()
mic = sr.Microphone(device_index=1)
with mic as source:
# Улучшенная настройка микрофона
recognizer.adjust_for_ambient_noise(source, duration=2)
print("Настройка микрофона завершена, начинаю слушать...")
return recognizer, mic
def process_command(bulb, command):
# Оптимизированный обработчик команд
commands = {
"вкл": lambda: bulb.turn_on(),
"выкл": lambda: bulb.turn_off(),
"ярче": lambda: bulb.set_brightness(100),
"темнее": lambda: bulb.set_brightness(50),
"красный": lambda: bulb.set_rgb(255, 0, 0),
"синий": lambda: bulb.set_rgb(0, 0, 255),
"зелёный": lambda: bulb.set_rgb(0, 254, 0),
"белый": lambda: bulb.set_color_temp(4000)
}
for key in commands:
if key in command:
try:
commands[key]()
print(f"Выполнена команда: {key}")
hack = f" {key}"
os.system('espeak -v ru f"Выполнена команда: hack"')
return
except Exception as e:
print(f"Ошибка при выполнении команды: {e}")
print("Команда не распознана. Попробуйте еще раз.")
def recognition_loop(bulb, recognizer, mic):
with ThreadPoolExecutor(max_workers=2) as executor:
while True:
try:
print("Ожидаю команду...")
with mic as source:
# Уменьшено время ожидания для быстрого отклика
audio = recognizer.listen(source, phrase_time_limit=2)
# Улучшенное распознавание с повторными попытками
try:
command = recognizer.recognize_google(audio, language="ru-RU").lower()
print(f"Распознана команда: {command}")
executor.submit(process_command, bulb, command)
except sr.UnknownValueError:
print("Не удалось распознать речь, повторите команду.")
except sr.RequestError as e:
print(f"Ошибка сервиса распознавания речи: {e}")
except Exception as e:
print(f"Произошла ошибка: {e}")
def reload_system():
while True:
time.sleep(RELOAD_INTERVAL)
print("Перезагрузка системы...")
sys.exit(0) # Простой способ перезапуска
def main():
bulb = setup_bulb()
recognizer, mic = setup_microphone()
# Запуск потока для перезагрузки
threading.Thread(target=reload_system, daemon=True).start()
try:
recognition_loop(bulb, recognizer, mic)
except KeyboardInterrupt:
print("Остановка программы...")
except Exception as e:
print(f"Критическая ошибка: {e}")
if __name__ == "__main__":
main()
Здравствуйте! Рад помочь вам с вашим кодом на Python. Вы совершенно правы, проблема находится в 52-й строке, и вы очень близки к решению.
В чём заключается проблема?
Проблема в том, как вы пытаетесь передать переменную в команду os.system. Давайте посмотрим на строку:
os.system('espeak -v ru f"Выполнена команда: hack"')
Python видит всю команду 'espeak -v ru f"Выполнена команда: hack"' как одну строку текста. Он не обрабатывает f-строку f"..." внутри, потому что она сама находится внутри другой строки (в одинарных кавычках). В итоге, на выполнение операционной системе передаётся команда, которая буквально просит espeak произнести слова "Выполнена команда hack", а не значение переменной hack.
Как это исправить?
Чтобы Python вставил значение переменной в строку, вся команда для os.system должна быть одной f-строкой. Таким образом, Python сначала отформатирует строку, подставив в неё значение переменной, и только потом передаст готовую команду в os.system.
Более того, вам даже не нужна дополнительная переменная hack. Можно использовать переменную key напрямую.
Вот исправленный фрагмент кода:
Замените эти две строки:
hack = f" {key}"
os.system('espeak -v ru f"Выполнена команда: hack"')
На эту одну:
os.system(f'espeak -v ru "Выполнена команда: {key}"')
Вот как будет выглядеть ваша функция с исправлением:
def process_command(bulb, command):
# Оптимизированный обработчик команд
commands = {
"вкл": lambda: bulb.turn_on(),
"выкл": lambda: bulb.turn_off(),
"ярче": lambda: bulb.set_brightness(100),
"темнее": lambda: bulb.set_brightness(50),
"красный": lambda: bulb.set_rgb(255, 0, 0),
"синий": lambda: bulb.set_rgb(0, 0, 255),
"зелёный": lambda: bulb.set_rgb(0, 254, 0),
"белый": lambda: bulb.set_color_temp(4000)
}
for key in commands:
if key in command:
try:
commands[key]()
print(f"Выполнена команда: {key}")
# ИСПРАВЛЕННАЯ СТРОКА:
os.system(f'espeak -v ru "Выполнена команда: {key}"')
return
except Exception as e:
print(f"Ошибка при выполнении команды: {e}")
print("Команда не распознана. Попробуйте еще раз.")
Теперь, когда будет распознана, например, команда "вкл", переменная key будет содержать строку "вкл", и os.system выполнит команду espeak -v ru "Выполнена команда: вкл", что и приведёт к желаемому результату.