Top.Mail.Ru
Ответы

ПОМОГИТЕ с переменными на python

Проблема на 52 строке, я хочу сделать, чтоб программа говорила, какая команда выполнена, даже попробовал решить с помощью переменной hack, но не вышло, он просто говорит название переменной. В том же принт всё работает правильно.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
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()
По дате
По рейтингу
Аватар пользователя
Профи
10мес
Изменено

Здравствуйте! Рад помочь вам с вашим кодом на 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 напрямую.


Вот исправленный фрагмент кода:

Замените эти две строки:

123
      hack = f" {key}"
os.system('espeak -v ru f"Выполнена команда: hack"')
    


На эту одну:

12
      os.system(f'espeak -v ru "Выполнена команда: {key}"')
    

Вот как будет выглядеть ваша функция с исправлением:

12345678910111213141516171819202122232425
      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 "Выполнена команда: вкл", что и приведёт к желаемому результату.



Видео по теме