Я пытаюсь создать систему с программным обеспечением сервера / клиента, одну на Raspberry Pi модель 3B (сервер), а другую на моем настольном компьютере (клиент).Он использует распознавание речи для ввода на стороне клиента и, как мне кажется, может стать причиной проблемы.
Когда я подключаюсь к серверу, одним из способов является то, что я заставляю клиента запрашивать команду передпрослушивание ответа от сервера (создание разорванного канала), другое - прослушивание сервера во время запроса команды (на самом деле не прослушивает команду, просто говорит, чтобы запросить команду)
Клиенткод:
import socket
import threading
import sys
import pyttsx3
import speech_recognition as sr
class Client:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = '192.168.1.222'
def talk(self, message):
print(message)
engine.say(message)
engine.runAndWait()
def command(self):
r = sr.Recognizer()
with sr.Microphone() as source:
r.pause_threshold = 1
audio = r.listen(source)
try:
command = r.recognize_google(audio, language='en')
except:
self.talk('I\'m sorry, I couldn\'t understand!')
command = ""
return command
def run(self):
while True:
self.talk('How can I help?')
com = self.command()
com = com.lower()
print(com)
self.sock.send(bytes(com, 'utf-8'))
''' checks data after command has been found (broken pipe caused)
while True:
data = self.sock.recv(1024)
if len(data) > 0:
self.talk(data)
break
'''
def __init__(self):
self.sock.connect((self.address, 10000))
iThread = threading.Thread(target=self.run)
iThread.deamon = True
iThread.start()
''' checks data while getting command (no command recieved)
while True:
data = self.sock.recv(1024)
if len(data) > 0:
self.talk(data)
break
'''
engine = pyttsx3.init()
client = Client()
код сервера:
import socket
import threading
class Server:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connections = []
def __init__(self):
self.sock.bind(('0.0.0.0', 10000))
self.sock.listen(1)
def handler(self, c, a):
while True:
data = c.recv(1024)
for connection in self.connections:
connection.send(bytes(data))
if not data:
self.connections.remove(c)
c.close()
break
print(data)
def run(self):
while True:
c, a = self.sock.accept()
cThread = threading.Thread(target=self.handler, args=(c,a))
cThread.deamon = True
cThread.start()
self.connections.append(c)
print(self.connections)
server = Server()
server.run()
Я ожидаю ответа только после получения команды (пока что в любом случае), в настоящий момент для целей тестирования я хочу толькочтобы вернуть с сервера то, что я отправил (это будет изменено позже, чтобы сервер сам решал, какое сообщение вернуть), поэтому, если я скажу «привет» через мой микрофон, сервер сможет вернуть мой ответ так же (но вбайт)