Пока цикл не работает как намеренный в чат-боте с речью к тексту - PullRequest
1 голос
/ 21 октября 2019

Привет, ребята. У меня проблема с чат-ботом, который должен работать с текстом в речь и из речи в текст. Предполагается подождать микрофон формы ввода и затем ответить списком ответов из базы данных 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 переменные для помещения ответов в базу данных. Я думаю, что это не обязательно для размещения здесь

1 Ответ

0 голосов
/ 21 октября 2019

Вы используете import неправильно.

При первом импорте модуля Python выполнит все элементы верхнего уровня в этом модуле и запишет все функции, переменные и другиевещи это определяет. При последующем импорте он просто повторно использует материал с первого раза.

Если вы хотите выполнить код из модуля несколько раз, вы должны поместить этот код в функцию, которую вы можете вызвать.

Вам нужно сделать что-то вроде этого:

  1. Обернуть большую часть кода в вашем модуле speak внутри функции (давайте назовем его get_speech() и сделаем так, чтобы он возвращал response.

  2. В верхней части основного модуля выполните import speak или from speak import get_speech.

  3. Где вы сейчас делаете from speak import response вместо этого сделайте response = speak.get_speech() (или просто response = get_speech(), в зависимости от того, что вы импортировали сверху).

...