0. 环境
ubuntu22主机, 192.168.8.162,
raspberry 0w, 192.168.8.220
路由器
1. 树莓派
# rpi - send.py
# 或者命令行:arecord -D plughw:1,0 -t wav -f cd -r 16000 -c 2 | nc 192.168.8.162 12345import socket
import pyaudios = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = '192.168.8.162'
port = 12345s.connect((host, port)) RESPEAKER_RATE = 16000
RESPEAKER_CHANNELS = 2
RESPEAKER_WIDTH = 2
RESPEAKER_INDEX = 0 # refer to input device id
CHUNK = 4096p = pyaudio.PyAudio()stream = p.open(rate=RESPEAKER_RATE,format=p.get_format_from_width(RESPEAKER_WIDTH),channels=RESPEAKER_CHANNELS,input=True,input_device_index=RESPEAKER_INDEX,frames_per_buffer=CHUNK,)while True:data = stream.read(CHUNK, exception_on_overflow=False)s.sendall(data)#print("data.hex()", data.hex())print("len(data)", len(data))stream.stop_stream()
stream.close()
s.close()
2. 电脑端
# ubuntu22主机:client - recv2micfft.py
import threading
import time
import socket
import pyaudio
import numpy as np
import matplotlib.pyplot as plthost = '192.168.8.162'
port = 12345RESPEAKER_RATE = 16000
RESPEAKER_CHANNELS = 2
RESPEAKER_WIDTH = 2
RESPEAKER_INDEX = 0 # refer to input device id
CHUNK = 4096
RECORD_SECONDS = 2np_ch1 = None
np_ch2 = Nonedef audio_stream():global np_ch1global np_ch2s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind((host, port))print('server listening at',(host, (port)))s.listen(1)conn, addr = s.accept()p = pyaudio.PyAudio()stream = p.open(rate=RESPEAKER_RATE,format=p.get_format_from_width(RESPEAKER_WIDTH),channels=RESPEAKER_CHANNELS,output=True,input_device_index=RESPEAKER_INDEX,frames_per_buffer=CHUNK,)while True:data = conn.recv(CHUNK*RESPEAKER_CHANNELS*RESPEAKER_WIDTH)stream.write(data)np_data1 = np.fromstring(data, dtype=np.int16)[0::2]np_data2 = np.fromstring(data, dtype=np.int16)[1::2]if np_ch1 is None:np_ch1 = np_data1np_ch2 = np_data2elif np_ch1.shape[0] / RESPEAKER_RATE < RECORD_SECONDS:np_ch1 = np.append(np_ch1, np_data1)np_ch2 = np.append(np_ch2, np_data2)else:idx = []for i in range(len(np_data1)):idx.append(i)np_ch1 = np.delete(np_ch1, idx)np_ch2 = np.delete(np_ch2, idx)np_ch1 = np.append(np_ch1, np_data1)np_ch2 = np.append(np_ch2, np_data2)stream.stop_stream()stream.close()conn.close()s.close()def fft_show():global np_ch1global np_ch2plt.ion()# fig, ax = plt.subplots()# 创建两个子图f, (ax1, ax2) = plt.subplots(2, 1)try:while True:if np_ch1 is None:continue# 将音频数据转换为NumPy数组#np_data1 = np.frombuffer(data, dtype=np.int16)[0::2]#np_data2 = np.frombuffer(data, dtype=np.int16)[1::2]# 计算频谱# freq_data1 = np.fft.fft(np_data1)# freq_data1 = np.abs(freq_data1)# freq_data2 = np.fft.fft(np_data2)# freq_data2 = np.abs(freq_data2)# 更新绘图ax1.clear()ax1.plot(np_ch1)ax2.clear()ax2.plot(np_ch2)plt.draw()plt.pause(0.01)except KeyboardInterrupt:print("实时频谱分析结束。")# 关闭绘图窗口plt.ioff()plt.close()t1 = threading.Thread(target=audio_stream, args=())
t2 = threading.Thread(target=fft_show, args=())
t1.start()
t2.start()