@Edipp

Что делать если функция не видит атрибут?

import os
import numpy as np
from gtts import gTTS
import speech_recognition as sr

class ChatAI():
    def __init__(self, name):
        print('----------- starting system', name, '-----------')
        self.name = name

    def SpeechToText(self):
        recognizer = sr.Recognizer()
        with sr.Microphone() as mic:
            print('listening..')
            audio = recognizer.listen(mic)
        try:
            self.text = recognizer.recognize_google(audio)
            print('me -->', self.text)
        except Exception as e:
            print('me -->', e)

    @staticmethod
    def TextToSpeech(text):
        print('AI -->', text)
        speaker = gTTS(text=text, lang='en', slow=False)
        speaker.save('response.mp3')
        os.system('start response.mp3')
        os.remove('response.mp3')

    def SeparateByName(self, text):
        return True if self.name in text.lower() else False


if __name__ == '__main__':
    ai = ChatAI(name='Name')
    while True:
        ai.SpeechToText()
        if ai.SeparateByName(ai.text) is True:
            response = f'my name {ai.name}'
        ai.TextToSpeech(response)

ai.TextToSpeech(response)
^^^^^^^^
NameError: name 'response' is not defined
вроде все перепробывал, но не понимаю почему не видит его

а теперь вот это вылазит
if ai.SeparateByName(ai.text) is True:
^^^^^^^
AttributeError: 'ChatAI' object has no attribute 'text'
  • Вопрос задан
  • 147 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Включи голову и подумай.
if ai.SeparateByName(ai.text) is True:
    response = f'my name {ai.name}'
ai.TextToSpeech(response)

Если условие не выполнится, переменная response не будет определена. Нужно или дать ей альтернативное значение в ветке else, или дать значение по умолчанию до if. Ну или внести вызов TextToSpeech() внутрь if.

Аналогично, ты определяешь атрибут ChatAI.text только в методе SpeechToText(), и только если распознавание прошло успешно. Если первая запись голоса или первое распознавание прошли неудачно, атрибут text определён не будет. В случае вторых и последующих - он сохранит своё прежнее значение, и ты не сможешь понять, это пользователь дважды повторил одно и то же, или бот тупит.
Тебе нужно или определить ему какое-то значение по умолчанию в __init__(), или, что лучше, вообще не использовать атрибут, а возвращать это значение из метода через return.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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