Skip to content

Instantly share code, notes, and snippets.

@JarbasAl
Last active January 13, 2019 12:12
Show Gist options
  • Select an option

  • Save JarbasAl/4f6ff67d477d4bdcf70e8d18b44f334e to your computer and use it in GitHub Desktop.

Select an option

Save JarbasAl/4f6ff67d477d4bdcf70e8d18b44f334e to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import pyaudio
import socket
class AudioStreamer(object):
def __init__(self, host='0.0.0.0', port=50000, backlog=5, chunk=1024,
channels=1, rate=16000, pa=None):
self.rate = rate
self.channels = channels
if pa is None:
self.pa = pyaudio.PyAudio()
# Socket Initialization
self.host = host
self.port = port
self.backlog = backlog
self.chunk = chunk
self.stream = self.pa.open(format=pyaudio.paInt16,
channels=self.channels,
rate=self.rate,
input=True,
frames_per_buffer=self.chunk)
def init_socket(self):
try:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((self.host, self.port))
print("client connected")
except ConnectionRefusedError:
print("can not connect to server, verify host and port")
raise
def run(self):
self.init_socket()
print("streaming audio")
# Main Functionality
while True:
try:
data = self.stream.read(self.chunk)
self.sock.send(data)
ans = self.sock.recv(self.chunk).decode("utf-8")
if "busy" in ans:
print("server is busy")
break
except BrokenPipeError:
print("server connection crashed")
break
except ConnectionResetError:
print("server reset connection")
break
except KeyboardInterrupt:
print("closing connection")
break
def close(self):
self.stream.close()
self.pa.terminate()
print("Client has stopped running")
if __name__ == "__main__":
receiver = AudioStreamer()
receiver.run()
receiver.close()
#!/usr/bin/env python
import pyaudio
import socket
from threading import Thread
class AudioReceiver(object):
def __init__(self, host='0.0.0.0', port=50000, backlog=5, chunk=1024,
channels=1, rate=16000, pa=None):
self.rate = rate
self.channels = channels
if pa is None:
self.pa = pyaudio.PyAudio()
# Socket Initialization
self.host = host
self.port = port
self.backlog = backlog
self.chunk = chunk
# Opening of the audio stream
self.stream = self.pa.open(format=pyaudio.paInt16,
channels=self.channels,
rate=self.rate,
output=True,
frames_per_buffer=self.chunk)
self.init_socket()
self.clients = {}
self.on_call = False
def init_socket(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind((self.host, self.port))
self.sock.listen(self.backlog)
print("socket open")
def on_new_client(self, client, addr):
self.on_call = True
print("Listening to incoming stream from ", addr)
while True:
try:
data = client.recv(self.chunk)
if data:
# Write data to pyaudio stream
self.stream.write(data) # Stream the recieved audio data
client.send(b'ACK') # Send an ACK
except KeyboardInterrupt:
print("server closed by user")
break
except ConnectionResetError as e:
print("client disconnected")
break
except Exception as e:
print(e)
break
client.close()
self.on_call = False
def run(self):
# Main Functionality
while True:
if self.on_call:
client, address = self.sock.accept()
client.send(b'busy') # Send an ACK
client.close()
else:
client, address = self.sock.accept()
thread = Thread(target=self.on_new_client,
args=(client, address),
daemon=True).start()
self.clients[address] = thread
def close(self):
self.stream.close()
self.pa.terminate()
print("Server has stopped running")
if __name__ == "__main__":
receiver = AudioReceiver()
receiver.run()
receiver.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment