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

Во время произношения ассистент говорит "текст"None, как можно исправить?

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("Скажите вашу команду: ")
        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()
    if "привет" in message :
        say_message("Здравствуйте, хозяин!") or say_message("Рад снова вас видеть")
    elif "джарвис" in message:
        say_message("Слушаю")
    elif "как дела" in message:
        say_message("Всё отлично, у Вас?")
    elif "всё хорошо" in message:
        say_message("Это отлично")
    elif "всё плохо" in message:
        say_message("Что случилось?")
    elif "могло быть и лучше" in message:
        say_message("Что случилось?")
    elif "что ты умеешь" in message:
        say_message("Я могу ...")
    elif "какое сейчас время" in message:
        say_message("Сейчас ")
    elif "пока" in message:
        say_message("Рад служить Вам")
        exit()
    elif "передвинь мышь немного вправо" in message:
        say_message("Как пожелаете"+str(right_mouse_control()))
    elif "передвинь мышь немного влево" in message:
        say_message("Как пожелаете" + str(left_mouse_control()))
    elif "передвинь мышь немного вверх" in message:
        say_message("Как пожелаете"+str(up_mouse_control()))
    elif "передвинь мышь немного вниз" in message:
        say_message("Как пожелаете"+str(down_mouse_control()))
    elif "открой оперу" in message:
        say_message("Как пожелаете"+str(operaopen()))
    elif "закрой оперу" in message:
        say_message("Как пожелаете"+str(operaclose()))
    elif "где я" in message:
        say_message("Вы:"+str(pos()))
    elif "напиши" in message:
        do_this_command(str(write(message)))
        
    else:
        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 write(message):
    pg.leftClick(-1113, 305)
    say_message("Что пишем?")
    pg.typewrite(message)
    




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)

Что исправить в коде чтобы не было вот так:
Вы сказали: закрой Оперу
Голосовой ассистент: Как пожелаетеNone
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Что за ерунда у тебя в коде творится? Поучи азы Питона сначала, потом уже бросайся помощников писать...

say_message("Здравствуйте, хозяин!" and "Рад снова вас видеть!")
Как по твоему, что вот этот and должен значить? На самом деле, у тебя ВСЕГДА будет произноситься только второе выражение. and - это логический оператор в первую очередь. Его поведение для не-логических значений весьма специфическое.

say_message("Как пожелаете"+str(right_mouse_control()))
Оставляя за кадром вопрос "зачем", что возвращает функция right_mouse_control()? Она должна возвращать какой-то текст для произношения? Если должна, она явно этого не делает. Если не должна, то зачем ты засовываешь её возвращаемое значение в строку? Почему просто её не вызвать, вне рамок say_message()?
То же самое для остальных вариантов ниже.

Ну и простыня elif как вишенка на торте, да.

EDIT: покажу, как можно это улучшить. Код сложный, но зато легко расширяется.
Сделаем класс, который будет рулить списком известных команд и сопоставленными им фразами.
Чтобы не пришлось повторяться, сделаем так, чтобы для добавления новой команды достаточно было
написать функцию и задекорировать её. Пример будет ниже.
class VoiceCommandList: #класс управляет списком голосовых команд
  def __init__(self):
    self.actions = list() #список известных классу команд
  
  def on(self, condition): #декоратор, подписывает функцию на голосовую команду
    if isinstance(condition, str):
      condition = condition.lower()
      predicate = lambda text: condition in text #если условие - строка, она должна входить в текст
    elif callable(condition):
      predicate = condition #если условие - функция, она должна вернуть истину для текста
    else: #ни то ни другое - ошибка
      raise TypeError('Condition must be either string or function!')
    #эта функция - декоратор, она будет помечать функции-команды.
    #она описана именно внутри метода on()!
    def decorator(command_func):
      self.actions.append( (predicate, command_func) )
      return command_func
    return decorator
  
  def run_command(self, text): #функция получает строку, определяет и вызывает соотв. её команду
    text = text.lower()
    for predicate, command in self.actions:
      if predicate(text): #текст соответствует известной команде
        try:
          response = command(text) #пытаемся выполнить команду
          if response is None: #если команда не сообщила нам, что ответить
            response = "Команда выполнена" 
        except Exception as err: #не получилось
          response = "Ошибка при выполнении команды"
          print(err)
        if response: #если есть какой-то ответ
          say_message(response) #то произносим его
        break #выполняем не более одной команды за раз
    else: #этот else относится к for, не к if! Если не нашли ни одной похожей команды
      say_message("Неизвестная команда")

А теперь примеры использования класса. Мы можем добавлять команды, описав функции. Нет нужды править длинную простыню if-elif-else
vcl = VoiceCommandList() #экземпляр списка команд

#опишем реакцию на простую строку типа "привет".
@vcl.on('привет') #если передаём в декоратор строку - это означает, что строка должна содержаться в тексте
def hello(text): #функция-команда принимает аргумент - сказанный пользователем текст
  return "Доброе время суток" #она должна вернуть текст, который скажет бот

@vcl.on('открой оперу')
def start_opera(text):
  operaopen() #выполняем действие
  return "Браузер запущен" #возвращаем текст ответа

@vcl.on('напиши')
def write_message(text):
  print(text)
  #если ничего не вернём, будет отклик по умолчанию

@vcl.on(lambda text: ('влево' in text) and ('вправо' in text)) #можно делать сложные условия!
def what(text):
  return "Так влево или вправо?"

Ну а чтобы скормить боту распознанную строку:
vcl.run_command('привет') #сюда можно подставить выхлоп распознавателя речи
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
InternetMaster
@InternetMaster
Интернет
Более неграмотный код я видел только в начале своего обучения Python.
Зачем and в начале кода? Напиши просто
if "привет" in message :
        say_message("Здравствуйте, хозяин! Рад снова вас видеть!")


Спрашиваешь почему возвращает None, и при этом где целый код? Что означает operaclose(). Что это за переменная и зачем она нужна в ответе?

Просто сделай проверку if-elif или if-else: Если действие выполнено, пиши что "Как пожелаете, мистер.". Если есть ошибка, то пиши "Действие не может быть исполнено, мистер".

Такую блевотину я давно не видел.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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