如何使用Python通过Socket实现互联网传输PyAudio音频数据
实现方案
我们基于TCP Socket实现音频流实时传输,音频参数和你现有录音代码保持一致,无需修改原有录音逻辑核心,分为服务端(接收音频并播放)和客户端(录制音频并发送)两个脚本,运行前确保两台设备在同一局域网下,或者服务端配置了公网端口映射。
依赖安装
首先确保安装所需库:
pip install pyaudio
1. 服务端代码(接收端,运行在接收语音的设备上)
import socket import pyaudio # 音频参数 和客户端保持完全一致 CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 44100 # Socket配置 HOST = '0.0.0.0' # 监听所有网卡地址 PORT = 50007 # 端口号可自行修改,客户端要和这里一致 # 初始化PyAudio p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, output=True, frames_per_buffer=CHUNK) # 启动Socket服务 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen(1) print(f"等待客户端连接,端口:{PORT}") conn, addr = s.accept() with conn: print(f"已连接客户端:{addr}") while True: data = conn.recv(CHUNK) if not data: break stream.write(data) # 关闭资源 stream.stop_stream() stream.close() p.terminate()
2. 客户端代码(发送端,运行在录制语音的设备上)
这里复用了你原有录音的核心逻辑,只修改了存储部分为Socket发送:
import socket import pyaudio # 音频参数 和服务端保持完全一致 CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 44100 RECORD_SECONDS = 10 # 录音时长按需修改 # Socket配置 填服务端的IP地址 HOST = '127.0.0.1' # 本地测试用127.0.0.1,跨设备填服务端的局域网/公网IP PORT = 50007 # 和服务端端口一致 # 初始化PyAudio p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) # 连接服务端 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) print("开始录音并发送") for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) s.sendall(data) print("发送完成") # 关闭资源 stream.stop_stream() stream.close() p.terminate()
使用说明
- 先运行服务端脚本,再运行客户端脚本
- 跨设备使用时,需要关闭服务端设备的防火墙,或者开放对应端口的访问权限
- 如果需要持续实时传输,把客户端的for循环替换为
while True:即可,停止传输直接中断脚本就行 - 如果需要实现双向语音聊天,分别在两台设备上同时运行服务端和客户端即可,监听和发送用不同端口
内容的提问来源于stack exchange,提问作者snipersnake004
相关产品推荐
相关产品推荐

