Привет, ребята. У меня проблема с чат-ботом, который должен работать с текстом в речь и из речи в текст. Предполагается подождать микрофон формы ввода и затем ответить списком ответов из базы данных SQLite. Однако бот получает только мой первый ввод, на который получен ответ, и после этого он продолжает отправлять мой первый ввод снова и снова в бесконечном цикле.
Chatboy использует pyaudio и pygame
В начале работы chatbots во время цикла я импортирую форму ответа из текста в текстовый код. Он работает, если он не должен повторяться. Кажется, что часть преобразования текста в текст не запускается во второй раз и просто пропускает его полностью с уже заполненным ответом из первого ввода.
Это код, который запускает самого чат-бота,
while True:
print(('Bot: ' + B))
from speak import response #importing response from speech-to-text code
print(('Host: ' + response))
if response == 'ukončiť':
print('Program bol úspešne ukončený')
break
if response == 'vypnúť':
print('Program bol úspešne ukončený')
break
words = get_words(B)
words_length = sum([n * len(word) for word, n in words])
sentence_id = get_id('sentence', response)
for word, n in words:
word_id = get_id('word', word)
weight = sqrt(n / float(words_length))
cursor.execute('INSERT INTO associations VALUES (?, ?, ?)', (word_id, sentence_id, weight))
connection.commit()
cursor.execute('CREATE TEMPORARY TABLE results(sentence_id INT, sentence TEXT, weight REAL)')
words = get_words(response)
words_length = sum([n * len(word) for word, n in words])
for word, n in words:
weight = sqrt(n / float(words_length))
cursor.execute('INSERT INTO results SELECT associations.sentence_id, sentences.sentence, ?*associations.weight/(4+sentences.used) FROM words INNER JOIN associations ON associations.word_id=words.rowid INNER JOIN sentences ON sentences.rowid=associations.sentence_id WHERE words.word=?', (weight, word,))
cursor.execute('SELECT sentence_id, sentence, SUM(weight) AS sum_weight FROM results GROUP BY sentence_id ORDER BY sum_weight DESC LIMIT 1')
row = cursor.fetchone()
cursor.execute('DROP TABLE results')
tts = gTTS(text=str(row[1]), lang='sk')
tts.save("B.mp3")
mixer.music.load('B.mp3')
mixer.music.play()
if row is None:
cursor.execute('SELECT rowid, sentence FROM sentences WHERE used = (SELECT MIN(used) FROM sentences) ORDER BY RANDOM() LIMIT 1')
row = cursor.fetchone()
B = row[1]
cursor.execute('UPDATE sentences SET used=used+1 WHERE rowid=?', (row[0],))
Этот код запускает речь в текст
import speech_recognition as sr
from gtts import gTTS
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
from pygame import mixer
mixer.init()
while True:
r = sr.Recognizer()
with sr.Microphone() as source:
r.adjust_for_ambient_noise(source, duration=1)
print("Tell something!")
audio = r.listen(source,phrase_time_limit=2)
try:
response = r.recognize_google(audio, language='sk-SK')
break
except sr.UnknownValueError:
print("Google nemôže rozoznať audio")
except sr.RequestError as e:
print("Google error; {0}".format(e))
Перед первым кодом есть 2 переменные для помещения ответов в базу данных. Я думаю, что это не обязательно для размещения здесь