如何使用带Python的Socket在internet上发送PyAudio数据?

2024-05-06 17:58:04 发布

您现在位置:Python中文网/ 问答频道 /正文

所以…我的第一个关于堆栈溢出的问题,哦,天哪,这是一个令人震惊的问题。我在日常编程中使用Python,我的最新项目是语音聊天应用程序。我需要使用PyAudio来记录我将要发送的数据,而且我已经成功地用PyAudio记录了过去的事情,所以这不是问题所在。下一部分是<我不知道如何使用插座

有人能给我一些代码来帮助我解决问题吗?在你说“去读教程!”之前,我已经试过了,我的大脑几乎要爆炸了。有人能帮忙吗

为了显示我并非完全无助,这里有一些代码记录10秒的音频,并将其保存为.wav文件,保存到与.py while相同的位置:


import pyaudio
import wave

chunk = 1024  # Record in chunks of 1024 samples
sample_format = pyaudio.paInt16  # 16 bits per sample
channels = 1
fs = 44100  # Record at 44100 samples per second
seconds = 10
filename = "output.wav"

p = pyaudio.PyAudio()  # Create an interface to PortAudio

print('Recording')

stream = p.open(format=sample_format,
                channels=channels,
                rate=fs,
                frames_per_buffer=chunk,
                input=True)

frames = []  # Initialize array to store frames

# Store data in chunks for 10 seconds
for i in range(0, int(fs / chunk * seconds)):
    data = stream.read(chunk)
    frames.append(data)

# Stop and close the stream 
stream.stop_stream()
stream.close()
# Terminate the PortAudio interface
p.terminate()

print('Finished recording')

# Save the recorded data as a WAV file
wf = wave.open(filename, 'wb')
wf.setnchannels(channels)
wf.setsampwidth(p.get_sample_size(sample_format))
wf.setframerate(fs)

就这样。。。祝你今天愉快

PS:要更改上述脚本记录的秒数,请将变量“seconds”从10更改为所需的任何值


1条回答
网友
1楼 · 发布于 2024-05-06 17:58:04

因为听起来您的主要任务是通过某种网络协议传输文件/数据,所以我将使用ZeroMQ来说明这个概念,因为它的开销较小,所以我们可以专注于重要的内容。您可以使用pip install zmq安装它

首先,确保正在写入的文件已关闭:

wf.close()

之后,您可以使用以下代码段发送文件内容:

import zmq
         
PORT = 12345  # must match the receiver port
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.connect(f'tcp://localhost:{PORT}')
                                                                                      
with open('output.wav', 'rb') as in_file:
    file_content = in_file.read()
                                                                                      
print(f'Sending {len(file_content)} bytes.')                                        
socket.send(file_content) 

接收机部分可以这样实现:

import zmq
                                                                                  
PORT = 12345  # must match the sender port
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.bind(f'tcp://*:{PORT}')

msg = socket.recv()                                                            
print(f'Received {len(msg)} bytes.')

如果您现在在两个单独的终端中运行发送方和接收方,您(理想情况下)将看到发送方发送的数据被接收方接收。您可以将它们写入文件和/或播放它们。 您可以对vanilla socket执行相同的操作,只需稍微增加一点开销,即可进行设置并将数据收集到更小的块中。 无论哪种方式,您都必须决定如何处理双向通信。您将不得不在无限循环中进行发送和接收,以达到以下目的。上面的代码只显示了一次数据传输

相关问题 更多 >