File size: 1,487 Bytes
e112632 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
\
import argparse, asyncio, websockets, wave, json, sys
def read_wav_pcm16(path, chunk_ms=20):
with wave.open(path, 'rb') as wf:
assert wf.getsampwidth() == 2, "Expect 16-bit PCM WAV"
sr = wf.getframerate()
assert sr == 16000, f"Expect 16kHz, got {sr}"
ch = wf.getnchannels()
assert ch == 1, f"Expect mono, got {ch}"
frames_per_chunk = int(sr * (chunk_ms/1000.0))
while True:
data = wf.readframes(frames_per_chunk)
if not data:
break
yield data
async def main():
ap = argparse.ArgumentParser()
ap.add_argument("--url", default="ws://localhost:8080/ws/amd")
ap.add_argument("--wav", required=True)
ap.add_argument("--chunk_ms", type=int, default=20)
args = ap.parse_args()
async with websockets.connect(args.url, max_size=2**23) as ws:
async def receiver():
try:
async for msg in ws:
print("SERVER:", msg)
except Exception as e:
print("Receiver ended:", e, file=sys.stderr)
recv_task = asyncio.create_task(receiver())
for chunk in read_wav_pcm16(args.wav, args.chunk_ms):
await ws.send(chunk)
await asyncio.sleep(args.chunk_ms/1000.0)
await ws.send(json.dumps({"type":"flush"}))
await asyncio.sleep(1.0)
await ws.close()
await recv_task
if __name__ == "__main__":
asyncio.run(main())
|