serial_audio_catcher/windows_serial_to_speaker.py

53 lines
1.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import serial
import pyaudio
import numpy as np
import struct
SERIAL_PORT = 'COM13' # Adjust to your port
BAUD_RATE = 1500000
BLOCK_SIZE = 512 # PCM bytes per block (128 stereo frames)
MAGIC = 0xABCD # header marker
RATE = 16000
CHANNELS = 2
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=CHANNELS,
rate=RATE,
output=True)
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
print("Streaming audio...")
try:
while True:
# Read 2byte header
hdr = ser.read(2)
if len(hdr) < 2:
continue
(magic,) = struct.unpack('<H', hdr)
if magic != MAGIC:
# Not aligned, skip and retry
continue
# Read PCM block
data = ser.read(BLOCK_SIZE)
if len(data) != BLOCK_SIZE:
continue
# Convert to int16 and play
audio_data = np.frombuffer(data, dtype=np.int16)
stream.write(audio_data.tobytes())
except KeyboardInterrupt:
print("Stopping audio stream...")
finally:
stream.stop_stream()
stream.close()
p.terminate()
ser.close()