Помощь с голосовым ассистентом.

mr_jeff

Новичок
Пользователь
Апр 30, 2020
1
0
1
У меня возникла проблема а именно вот с этим
voices = speak_engine.getProperty('voices')
speak_engine.setProperty('voice', voices[4].id)

Сама проблема:
Traceback (most recent call last):
File "Golosov.py", line 92, in <module>
speak_engine.setProperty('voice', voices[4].id)
IndexError: list index out of range

(Дополнения для синтеза речи есть)

Вот сам код:
# Голосовой ассистент
import os
import time
import speech_recognition as sr
from fuzzywuzzy import fuzz
import pyttsx3
import datetime

# настройки
opts = {
"alias": ('железо','железяка','железный','железн',
'железяня','жел','жележечка','железа','желези'),
"tbr": ('скажи','расскажи','покажи','сколько','произнеси'),
"cmds": {
"ctime": ('текущее время','сейчас времени','который час'),
"radio": ('включи музыку','воспроизведи музыку','включи музыку'),
"stupid1": ('расскажи анекдот','рассмеши меня','ты знаешь анекдоты')
}
}

# функции
def speak(what):
print( what )
speak_engine.say( what )
speak_engine.runAndWait()
speak_engine.stop()

def callback(recognizer, audio):
try:
voice = recognizer.recognize_google(audio, language = "ru-RU").lower()
print("[log] Распознано: " + voice)

if voice.startswith(opts["alias"]):
# обращаются к железке
cmd = voice

for x in opts['alias']:
cmd = cmd.replace(x, "").strip()

for x in opts['tbr']:
cmd = cmd.replace(x, "").strip()

# распознаем и выполняем команду
cmd = recognize_cmd(cmd)
execute_cmd(cmd['cmd'])

except sr.UnknownValueError:
print("[log] Голос не распознан!")
except sr.RequestError as e:
print("[log] Неизвестная ошибка, проверьте интернет!")

def recognize_cmd(cmd):
RC = {'cmd': '', 'percent': 0}
for c,v in opts['cmds'].items():

for x in v:
vrt = fuzz.ratio(cmd, x)
if vrt > RC['percent']:
RC['cmd'] = c
RC['percent'] = vrt

return RC

def execute_cmd(cmd):
if cmd == 'ctime':
# сказать текущее время
now = datetime.datetime.now()
speak("Сейчас " + str(now.hour) + ":" + str(now.minute))

elif cmd == 'radio':
# воспроизвести радио
os.system("D:\\roses - roses.mp3")

elif cmd == 'stupid1':
# рассказать анекдот
speak("Мой разработчик не научил меня анекдотам ... Ха ха ха")

else:
print('Команда не распознана, повторите!')

# запуск
r = sr.Recognizer()
m = sr.Microphone(device_index = 1)

with m as source:
r.adjust_for_ambient_noise(source)

speak_engine = pyttsx3.init()

# Только если у вас установлены голоса для синтеза речи!
voices = speak_engine.getProperty('voices')
speak_engine.setProperty('voice', voices[4].id)

# forced cmd test
speak("Мой разработчик не научил меня анекдотам ... Ха ха ха")

#speak("Добрый день, кожанный")
#speak("Железо слушает")

#stop_listening = r.listen_in_background(m, callback)
#while True: time.sleep(0.1) # infinity loop
 

borntohack

змееуст
Команда форума
Модератор
Апр 22, 2020
78
62
18
39
Москва, РФ
Пожалуйста, заключите свой код в соответствующий тег code=python. Тогда мы сможем вам помочь.
Предварительно, посмотрите, что именно возвращает вам speak_engine.getProperty('voices'). Вы обращаетесь к 4-му индексу - элемент №5 в списке.
Ошибка IndexError: list index out of range означает, что в списке меньше элементов
 

Форум IT Специалистов