Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 29.05.2021
Сообщений: 77

AttributeError: 'str' object has no attribute 'keys'

25.08.2022, 12:54. Показов 2296. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здраствуйте, пишу голосового помощника и столкнулся с ошибкой (козалось-бы простой, но сам разобраться не могу).
помогите пожалуйста.

CONSOLE:
Python
1
2
3
4
5
6
7
8
9
Listening...
Started recognition...
привет
Traceback (most recent call last):
  File "C:\Users\Admin\OneDriveабочий столол.ассист\v3.py", line 153, in <module>
    execute_command_with_name(command, command_options)
  File "C:\Users\Admin\OneDriveабочий столол.ассист\v3.py", line 129, in execute_command_with_name
    for key in command.keys():
AttributeError: 'str' object has no attribute 'keys'
CODE:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
from vosk import Model, KaldiRecognizer  # оффлайн-распознавание от Vosk
import speech_recognition  # распознавание пользовательской речи (Speech-To-Text)
import pyttsx3  # синтез речи (Text-To-Speech)
import wave  # создание и чтение аудиофайлов формата wav
import json  # работа с json-файлами и json-строками
import os  # работа с файловой системой
 
 
class VoiceAssistant:
    """
    Настройки голосового ассистента, включающие имя, пол, язык речи
    """
    name = ""
    sex = ""
    speech_language = ""
    recognition_language = ""
 
 
def setup_assistant_voice():
    """
    Установка голоса по умолчанию (индекс может меняться в 
    зависимости от настроек операционной системы)
    """
    voices = ttsEngine.getProperty("voices")
 
    if assistant.speech_language == "en":
        assistant.recognition_language = "en-US"
        if assistant.sex == "female":
            # Microsoft Zira Desktop - English (United States)
            ttsEngine.setProperty("voice", voices[1].id)
        else:
            # Microsoft David Desktop - English (United States)
            ttsEngine.setProperty("voice", voices[2].id)
    else:
        assistant.recognition_language = "ru-RU"
        # Microsoft Irina Desktop - Russian
        ttsEngine.setProperty("voice", voices[0].id)
 
 
def play_voice_assistant_speech(text_to_speech):
    """
    Проигрывание речи ответов голосового ассистента (без сохранения аудио)
    :param text_to_speech: текст, который нужно преобразовать в речь
    """
    ttsEngine.say(str(text_to_speech))
    ttsEngine.runAndWait()
 
 
def record_and_recognize_audio(*args: tuple):
    """
    Запись и распознавание аудио
    """
    with microphone:
        recognized_data = ""
 
        # регулирование уровня окружающего шума
        recognizer.adjust_for_ambient_noise(microphone, duration=2)
 
        try:
            print("Listening...")
            audio = recognizer.listen(microphone, 5, 5)
 
            with open("microphone-results.wav", "wb") as file:
                file.write(audio.get_wav_data())
 
        except speech_recognition.WaitTimeoutError:
            print("Can you check if your microphone is on, please?")
            return
 
        # использование online-распознавания через Google 
        # (высокое качество распознавания)
        try:
            print("Started recognition...")
            recognized_data = recognizer.recognize_google(audio, language="ru").lower()
 
        except speech_recognition.UnknownValueError:
            pass
 
        # в случае проблем с доступом в Интернет происходит 
        # попытка использовать offline-распознавание через Vosk
        except speech_recognition.RequestError:
            print("Trying to use offline recognition...")
            recognized_data = use_offline_recognition()
 
        return recognized_data
 
 
def use_offline_recognition():
    """
    Переключение на оффлайн-распознавание речи
    :return: распознанная фраза
    """
    recognized_data = ""
    try:
        # проверка наличия модели на нужном языке в каталоге приложения
        if not os.path.exists("models/vosk-model-small-ru-0.4"):
            print("Please download the model from:\n"
                  "https://alphacephei.com/vosk/models and unpack as 'model' in the current folder.")
            exit(1)
 
        # анализ записанного в микрофон аудио (чтобы избежать повторов фразы)
        wave_audio_file = wave.open("microphone-results.wav", "rb")
        model = Model("models/vosk-model-small-ru-0.4")
        offline_recognizer = KaldiRecognizer(model, wave_audio_file.getframerate())
 
        data = wave_audio_file.readframes(wave_audio_file.getnframes())
        if len(data) > 0:
            if offline_recognizer.AcceptWaveform(data):
                recognized_data = offline_recognizer.Result()
 
                # получение данных распознанного текста из JSON-строки 
                # (чтобы можно было выдать по ней ответ)
                recognized_data = json.loads(recognized_data)
                recognized_data = recognized_data["text"]
    except:
        print("Sorry, speech service is unavailable. Try again later")
 
    return recognized_data
 
 
def execute_command_with_name(command_name: str, *args: list):
    """
    Выполнение заданной пользователем команды с дополнительными аргументами
    :param command_name: название команды
    :param args: аргументы, которые будут переданы в функцию
    :return:
    """
    #for key in commands.keys():
    for key in command.keys():
        if command_name in key:
            commands[key](*args)
        else:
            pass  # print("Command not found")
 
 
if __name__ == "__main__":
 
    # инициализация инструментов распознавания и ввода речи
    recognizer = speech_recognition.Recognizer()
    microphone = speech_recognition.Microphone()
 
    while True:
        # старт записи речи с последующим выводом распознанной речи
        # и удалением записанного в микрофон аудио
        voice_input = record_and_recognize_audio()
        #os.remove("microphone-results.wav")
        print(voice_input)
 
        # отделение комманд от дополнительной информации (аргументов)
        voice_input = voice_input.split(" ")
        command = voice_input[0]
        command_options = [str(input_part) for input_part in voice_input[1:len(voice_input)]]
        execute_command_with_name(command, command_options)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.08.2022, 12:54
Ответы с готовыми решениями:

AttributeError: 'str' object has no attribute 'tell'
Добрый день всем, я только начал изучать python. Наткнулся на задачу, написать базу данных, запись заносилась на диск, чтобы ее потом можно...

AttributeError: 'str' object has no attribute 'matches'
str=input() for i in str: while i!='s': import re b=str.matches(&quot;A-Z&quot;) if b: ...

AttributeError: 'str' object has no attribute 'asList'
Всё делал, как на примере, но ошибку всё равно выдаёт: https://habrahabr.ru/post/239081/ &gt;&gt;&gt; s = 'import matplotlib.pyplot as plt' ...

10
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
25.08.2022, 13:17
А что собственно непонятно? Написано же английским по белому: object has no attribute 'keys'. Причем написано даже какой объект: command.keys(). Вот и разбирайтесь, какие атрибуты есть у объекта command.
Ну или хотя-бы выясните, откуда в указанной строке этот объект взялся? Он не описан как глобальный, и не передается в функцию как параметр. Так откуда?
P.S. Вопрос не имеет никакого отношения к разделу "Искусственный интеллект". Разве что - что к разделу "Python для новичков".
0
0 / 0 / 0
Регистрация: 29.05.2021
Сообщений: 77
25.08.2022, 13:52  [ТС]
Спасибо
0
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,702
25.08.2022, 19:52
keys - такой атрибут есть у словарей (dict), то есть command - это должен быть некий словарь.
0
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
25.08.2022, 20:17
Цитата Сообщение от Mikhaylo Посмотреть сообщение
keys - такой атрибут есть у словарей (dict), то есть command - это должен быть некий словарь.
Вопрос не в том. Вопрос в том, откуда объект command взялся внутри функции execute_command_with_name() ?
0
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,702
25.08.2022, 21:55
Вроде в конце кода Command объявлен как глобальная строка. Но походу писатель данного кода собирался вместо Command использовать словарь Commands (с буквой s на конце, но закомментил этот кусок).
0
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
25.08.2022, 22:47
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Вроде в конце кода Command объявлен как глобальная строка.
Что-то не вижу. В какой строке?

Я вижу, что в строке 151 объявляется объект command, в строке 153 ( у меня это последняя строка кода, которую я вижу в листинге) он передается в функцию execute_command_with_name как первый, позиционный параметр. В самой функции принимается в качестве первого параметра с именем command_name, причем с ожидаемым типом str.
А далее, в строке 129 вдруг снова появляется объект сommand. Если я не доглядел и где-то есть ХОТЯ-БЫ декларация global - тогда это еще терпимо (не кошерно, но тем не менее). Но я не вижу даже такого способа передачи параметра.
0
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,702
26.08.2022, 06:38
Присвоение command вне тела какого-либо def. Значит это глобальная переменная.

На мой взгляд, надо создать словарь commands с голосовыми командами и раскомментить строку "#for key in commands.keys():".
Видимо, автор этой штуки просто баловался с кодом и передал некий тестовый вариант, нерабочий.
0
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
26.08.2022, 13:57
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Присвоение command вне тела какого-либо def. Значит это глобальная переменная.
Простите, вы о чем? Это Python, а не С++. И тут правила глобализации переменных несколько другие.

Python
1
2
3
4
5
6
def f1():
    print('Работает f1')
    a=5
a=10
f1()
print (a)
Результат:
Python
1
2
Работает f1
10
Для того, что-бы переменная стала глобальной она таковой должна быть описана внутри функции:

Python
1
2
3
4
5
6
7
def f1():
    global a
    print('Работает f1')
    a=5
a=10
f1()
print (a)
Теперь результат другой:
Python
1
2
Работает f1
5
И как я уже написал - это для раздела "новичкам о Python", а никак не в "Искусственный интеллект".
0
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,702
26.08.2022, 17:17
Цитата Сообщение от passant Посмотреть сообщение
Простите, вы о чем?
Вы описали то, как объявить глобальную переменную внутри функции. Но в нашем случае наоборот: глобальная функция объявлена в глобальном контексте и проникает в функцию и срабатывает там из-за отсутствия локальной переменной.
0
578 / 411 / 69
Регистрация: 09.01.2018
Сообщений: 1,363
26.08.2022, 20:31
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Вы описали то, как объявить глобальную переменную внутри функции. Но в нашем случае наоборот: глобальная функция объявлена в глобальном контексте и проникает в функцию и срабатывает там из-за отсутствия локальной переменной.
Нет, я показал, как можно объект описанный в глобальном контексте сделать действительно глобальным внутри функции, и что происходит, если такое описание внутри функции отсутствует. Т.е. именно то, что имеет место у ТС.
Буду весьма признателен вам, если вы мне покажете, где именно у ТС command объявляется как глобальная переменная. Я не могу найти, возможно пропустил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.08.2022, 20:31
Помогаю со студенческими работами здесь

AttributeError: 'NoneType' object has no attribute 'get'
Всем привет. Решил написать скрипт для поиска музеев в СПб. Взял за основу рабочий скрипт, написанный вчера, удалил ненужное и получилось...

AttributeError: 'NoneType' object has no attribute 'promotePrefixes'
Помогите, пожалуйста, задебажить, хочу подключиться питоном к api и разобрать полученный xml Вылетает ошибка AttributeError:...

AttributeError: 'NoneType' object has no attribute 'text'
Данный код должен выводить температуру с сайта import tkinter import requests from bs4 import BeautifulSoup from tkinter import...

AttributeError: 'module' object has no attribute 'log6'
Вот уравнение: ...

AttributeError: 'int' object has no attribute 'append'
Помогите пожалуйста разобраться For i in range(32): mas = for j in range(32): mas.append(0) кол_сочет.append(mas) //выдает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru