@Legor2000

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.recognizer_google(audio, language = "ru-RU")
		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['cmd'].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("C:/Python/music.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)

speak("Добрый день, пользователь")
speak("Саша слушает")

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


А выдаёт вот это:
Traceback (most recent call last):
  File "First2.py", line 92, in <module>
    speak_engine.setProperty('voice', voices[4].id)
IndexError: list index out of range
  • Вопрос задан
  • 686 просмотров
Решения вопроса 1
milssky
@milssky
Координатор племени фиолетовых обезьянок
1. Вы научитесь заворачить ваш код в соответствующий тег или нет?
2. Очевидно, голосов меньше, чем 5, отсюда и ошибка.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@PavelMos
Компилятор же указывает, что проблема в
voices, в котором данные от speak_engine.getProperty('voices')
Можно напрямую посмотреть, что в нём, например:
voices = speak_engine.getProperty('voices')
print (voices)
Ответ написан
Ваш ответ на вопрос

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

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