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
  • Вопрос задан
  • 180 просмотров
Решения вопроса 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("Моя твоя не понимает")

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

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

Войти через центр авторизации
Похожие вопросы
26 апр. 2024, в 07:20
2000 руб./за проект
26 апр. 2024, в 06:46
1000 руб./в час
26 апр. 2024, в 05:31
1000 руб./за проект