Включи голову и подумай.
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.