Working raw tcp implementation

drew/working-stream
Drew Bednar 3 years ago
parent 43850b2269
commit 27ae98347e

Binary file not shown.

Binary file not shown.

BIN
output

Binary file not shown.

@ -0,0 +1,6 @@
import simpleaudio as sa
filename = 'myfile.wav'
wave_obj = sa.WaveObject.from_wave_file(filename)
play_obj = wave_obj.play()
play_obj.wait_done() # Wait until sound has finished playing

@ -0,0 +1 @@
simpleaudio

@ -0,0 +1,8 @@
#
# This file is autogenerated by pip-compile with python 3.8
# To update, run:
#
# pip-compile requirement.in
#
simpleaudio==1.0.4
# via -r requirement.in

@ -0,0 +1,17 @@
# Socket Send & Receive
This example is loosely built from knowledge gained in reading https://defn.io/2018/02/25/web-app-from-scratch-01/ series.
## Why?
I needed a simple way to pipe the contents of a wave file produced by a Text to Speech model to a remote device (raspberrypi).
## Usage
The `socket_receiver.py` is intended to be a single connection reciever of binary wave files. You
can use `sender.py <wave_file_path>` to marshal a `.wav` file to the receiver, which immediately plays
back the contents. The reciever then waits for the next connection to repeat the process.
## Producing sample clips
I ran into some trouble initially producing a valid `.wav` file using Audacity. I did find that a Mono channel, 22050 Hz, file using the `signed 16bit PCM` encoding worked.

@ -0,0 +1,21 @@
import socket
import sys
# TODO Paramaterize the server target values
# TODO use python logger
if len(sys.argv) < 2:
raise ValueError("Missing input wav file")
wave_file_path = sys.argv[1]
if not wave_file_path.endswith('.wav'):
raise ValueError("File must have .wav file extension.")
(HOST,PORT)=('localhost',9000)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect((HOST,PORT))
with open(wave_file_path, 'rb') as wave_file:
s.sendfile(wave_file)
s.close()

@ -0,0 +1,47 @@
import socket
import time
import simpleaudio as sa
HOST = "127.0.0.1"
PORT = 9000
def save_file(client_socket):
timestamp = str(int(time.time()))
file_name = f"output_{timestamp}.wav"
with open(file_name,'wb') as f:
while True:
l = client_socket.recv(1024)
if not l: break
f.write(l)
def play_file(conn):
# you could consider sa.play_buffer ... I don't know if it would be more performant.
try:
wave_object = sa.WaveObject.from_wave_file(conn.makefile(mode="rb"))
play_obj = wave_object.play()
play_obj.wait_done()
except Exception as e:
print(f"Hit an error: {e} skipping playback")
return
# By default, socket.socket creates TCP sockets.
with socket.socket() as server_sock:
# This tells the kernel to reuse sockets that are in `TIME_WAIT` state.
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# This tells the socket what address to bind to.
server_sock.bind((HOST, PORT))
# 0 is the number of pending connections the socket may have before
# new connections are refused. Since this server is going to process
# one connection at a time, we want to refuse any additional connections.
server_sock.listen(0)
print(f"Listening on {HOST}:{PORT}...")
while True:
# This is a blocking call as we wait for a new connection
client_sock, client_addr = server_sock.accept()
print(f"New connection from {client_addr}.")
with client_sock as conn:
play_file(conn)
Loading…
Cancel
Save