UMFUCHI
@UMFUCHI
НедоПайтонист

Как исправить код?

Делаю голос.ассистента захотел скоротить дорожку их if-elif-else по видосу с ютуба, теперь код воспринимает любую команду как "Привет" и сразу после ответа на "Привет" идёт ответ на "Как дела" (без запроса на команду) и краш.
вот код:
from gtts import gTTS
import random
import time
import playsound
import speech_recognition as sr
import pyautogui as pg


def listen_command():
    # obtain audio from the microphone
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("Скажите вашу команду: ")
        r.adjust_for_ambient_noise(source,  duration=1)
        audio = r.listen(source)
    # recognize speech using Google Speech Recognition
    try:
        our_speech = r.recognize_google(audio, language="ru")
        print("Вы сказали: " + our_speech)
        return our_speech
    except sr.UnknownValueError:
        return "Повторите пожалуйста"
    except sr.RequestError:
        return "ошибка"


def do_this_command(message):
    message = message.lower()
    commands = {
        'Привет' in message: say_message("Здравствуйте, сэр!"),
        'как дела' in message: say_message('Всё отлично, у вас?'),
        "всё хорошо" in message: say_message("Это отлично"),
        "плохо" in message: say_message("Что-то случилось?"),
        "Какое сейчас время" in message: say_message("Сейчас:"),
        "пока" in message: say_message("Рад был встречи")+exit(),
        "передвинь мышь немного вправо" in message: say_message("Как пожелаете" + str(right_mouse_control())),
        "передвинь мышь немного влево" in message: say_message("Как пожелаете" + str(left_mouse_control())),
        "передвинь мышь немного вверх" in message: say_message("Как пожелаете" + str(up_mouse_control())),
        "передвинь мышь немного вниз" in message: say_message("Как пожелаете" + str(down_mouse_control())),
        "открой оперу" in message: say_message("Как пожелаете" + str(operaopen())),
        "закрой оперу" in message: say_message("Как пожелаете" + str(operaclose())),
        "где я" in message: str(pos())
    }
    return commands.get(message, say_message("Команда не распознана."))

def right_mouse_control():
    pg.move(300, 0, 0.5)


def left_mouse_control():
    pg.move(-300, 0, 0.5)


def down_mouse_control():
    pg.move(0, 300, 0.5)


def up_mouse_control():
    pg.move(0, -300, 0.5)


def operaopen():
    pg.leftClick(-1872, 249)
    pg.doubleClick(-1872, 249, 0.5)


def operaclose():
    pg.leftClick(-20, 130)


def say_message(message):
    voice = gTTS(message, lang="ru")
    file_voice_name = "_audio_" + str(time.time()) + "_" + str(random.randint(0, 100000)) + ".mp3"
    voice.save(file_voice_name)
    playsound.playsound(file_voice_name)
    print("Голосовой ассистент: " + message)


def pos():
    print(pg.position())


if __name__ == '__main__':
    while True:
        command = listen_command()
        do_this_command(command)


Вот сама ошибка:
Вы сказали: Привет
Голосовой ассистент: Здравствуйте, сэр!
Голосовой ассистент: Всё отлично, у вас?
Traceback (most recent call last):
  File "C:\Users\User\PycharmProjects\Jarviss\main.py", line 87, in <module>
    do_this_command(command)
  File "C:\Users\User\PycharmProjects\Jarviss\main.py", line 32, in do_this_command
    "всё хорошо" in message: say_message(' '),
  File "C:\Users\User\PycharmProjects\Jarviss\main.py", line 75, in say_message
    voice.save(file_voice_name)
  File "C:\Users\User\PycharmProjects\Jarviss\venv\lib\site-packages\gtts\tts.py", line 313, in save
    self.write_to_fp(f)
  File "C:\Users\User\PycharmProjects\Jarviss\venv\lib\site-packages\gtts\tts.py", line 259, in write_to_fp
    prepared_requests = self._prepare_requests()
  File "C:\Users\User\PycharmProjects\Jarviss\venv\lib\site-packages\gtts\tts.py", line 204, in _prepare_requests
    assert text_parts, 'No text to send to TTS API'
AssertionError: No text to send to TTS API

Process finished with exit code 1
  • Вопрос задан
  • 189 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
commands = {
        'Привет' in message: say_message("Здравствуйте, сэр!"),
        'как дела' in message: say_message('Всё отлично, у вас?'),
        "всё хорошо" in message: say_message("Это отлично"),

Если бы выучил азы Питона перед тем как делать ботов по видосикам, знал бы, что так словари не работают. Ты можешь сделать немного по другому, если очень хочется:
commands = [
( (lambda text: 'привет' in text), 'Добрый день!'),
( (lambda text: 'пока' in text), 'До свидания!'),
]
#используем так:
for predicate, response in commands:
  if predicate(message):
    say_message(response)
    break
else: #else относится к for, сработает если не было break, т.е. не нашли команду
  say_message("Моя твоя не понимает")

Или можешь попробовать воспользоваться вот этим моим ответом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы