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())