U
U
UMFUCHI2021-10-06 22:23:26
Python
UMFUCHI, 2021-10-06 22:23:26

During the pronunciation, the assistant says "text"None, how can I fix it?

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)

What to fix in the code so that it doesn't look like this:
Вы сказали: закрой Оперу
Голосовой ассистент: Как пожелаетеNone

Answer the question

In order to leave comments, you need to log in

2 answer(s)
V
Vindicar, 2021-10-06
@UMFUCHI

What the hell is going on in your code? Learn the basics of Python first, then rush to write helpers...
say_message("Hello, master!" and "Good to see you again!")
What do you think this and should mean? In fact, you will ALWAYS say only the second expression. and is a boolean operator in the first place. Its behavior for non-boolean values ​​is very specific.
say_message("As you wish"+str(right_mouse_control()))
Leaving the question "why" behind the scenes, what does the right_mouse_control() function return? Should it return some text for pronunciation? If she has to, she clearly doesn't. If it shouldn't, then why are you putting its return value in a string? Why not just call her
Same for the rest of the options below.
Well, the elif sheet is like a cherry on the cake, yes.
EDIT: I'll show you how you can improve this. The code is complex, but easily extensible.
Let's make a class that will manage the list of known commands and their associated phrases.
In order not to have to repeat ourselves, we will make it so that to add a new command it is enough to
write a function and decorate it. An example will be below.

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("Неизвестная команда")

And now examples of using the class. We can add commands by describing functions. No need to edit a long if-elif-else sheet
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 "Так влево или вправо?"

Well, to feed the recognized string to the bot:
vcl.run_command('привет') #сюда можно подставить выхлоп распознавателя речи

I
InternetMaster, 2021-10-06
@InternetMaster

More illiterate code I saw only at the beginning of my Python training.
Why and at the beginning of the code? Write simply

if "привет" in message :
        say_message("Здравствуйте, хозяин! Рад снова вас видеть!")

You ask why it returns None, and at the same time where is the whole code? What does operaclose() mean. What is this variable and why is it needed in the response?
Just do an if-elif or if-else check: If the action is done, write "As you wish, mister." If there is an error, then write "The action cannot be performed, mister."
I haven't seen such vomit in a long time.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question