Я сделал голосового помощника на Python. Как я могу выполнить только одну, когда я использую две разные голосовые команды в одном предложении?

Я делаю голосовой помощник с Python. Я даю голосовые команды помощнику. Есть несколько предопределенных предложений и ответов. Однако, если ранее в коде были определены две команды, они начинают работать одновременно. Как я могу предотвратить это. Например, если в предложении встречаются команды, который час (saat kaç) и выключение помощника (asistan kapan), они выполняют обе функции. Вместо этого я воспринял две команды помощника, сколько сейчас времени и помощник отключился. Как я могу заставить меня задавать вопросы, например, какой из них вы хотите, чтобы я сделал?

import ... 
r = sr.Recognizer()
def record(ask=False):
    with sr.Microphone() as source:
        if ask:
            speak(ask)
        audio = r.listen(source)
        voice = ''
        try:
            voice = r.recognize_google(audio, language='tr-TR')
        except sr.UnknownValueError:
            print("anlayamadım") #anlayamadım = i couldn't understand
        except sr.RequestError:
            speak("sistem çalışmıyor") #sistem çalışmıyor= system is not work
        return voice

def response(voice):
    if 'saat kaç' in voice: #saat kaç = what time is it
        speak(datetime.now().strftime('%H:%M:%S'))
    if 'Asistan kapan' in voice: #asistan kapan = assistant shutdown
        speak("görüşürüz") #görüşürüz = bye
        exit()
#The command that consists of voice responses in the range of 1, 10000 files and deletes after the answer is answered
def speak(string):
    tts = gTTS(string, lang='tr')
    rand = random.randint(1, 10000)
    file = 'audio' + str(rand) + '.mp3'
    tts.save(file)
    playsound(file)
    os.remove(file)

speak("nasıl yardımcı olabilirim") #nasıl yardımcı olabilirim = how can i help you
time.sleep(1)
while True:
    voice = record()
    print(voice)
    response(voice)

person Bahadır Ödemiş    schedule 24.01.2021    source источник


Ответы (1)


Грубым решением было бы проверить, находятся ли обе команды в переменной voice.

def response(voice):
    if 'saat kaç' in voice and 'Asistan kapan' in voice:
    speak("which one would you like me to do first?")
    new_voice = record()
    response(new_voice)
    else:
        if 'saat kaç' in voice: #saat kaç = what time is it
            speak(datetime.now().strftime('%H:%M:%S'))
        if 'Asistan kapan' in voice: #asistan kapan = assistant shutdown
            speak("görüşürüz") #görüşürüz = bye
            exit()
    

Но я бы не рекомендовал этого, потому что, когда вы добавляете новые команды, вы должны постоянно обновлять новый оператор if, который я добавил.

Вместо этого заставьте пользователя произносить такие слова, как и при подаче нескольких команд. Теперь вы можете разделить команду на основе этого слова и запустить каждую команду.

def split_command(voice):
    commands = voice.split(" and ") # splits the command into multiple parts for each " and "  that means command like "what time is it and assistant shutdown" would become ["what time is it", "assistant shutdown"]
    for command in commands:
        response(command) # now for each command in the list it is calling the response function

def response(voice):
    if 'saat kaç' in voice: #saat kaç = what time is it
        speak(datetime.now().strftime('%H:%M:%S'))
    elif 'Asistan kapan' in voice: #asistan kapan = assistant shutdown
        speak("görüşürüz") #görüşürüz = bye
        exit()  
    # now instead of multiple ifs you can use elif 

# now inside the infinite while loop call split_command function instead of the response function
while True:
    voice = record()
    print(voice)
    split_command(voice)

Я добавил комментарий рядом со всем новым кодом, который я добавил. Я рад помочь, если вы все еще в замешательстве.

person baisbdhfug    schedule 24.01.2021
comment
Это именно то решение, которое я искал. Использование функции split() и elif дало нужный мне результат. Благодаря вашим объяснениям я понял тему. Спасибо. - person Bahadır Ödemiş; 24.01.2021