您好,我在通过网络发送音频时遇到问题。在我的本地系统没有距离没有问题,但每当我在远程系统上测试有音频,但它不是语音输入,我想它的波涛汹涌/ laggy等我相信它在我如何处理发送的音频,但我已经尝试了4天,无法找到解决方案。通过网络问题的Python音频
,我将发布所有相关的代码,并试图解释尽我所能
这些都是常数/全局值
#initilaize Speex speex_enc = speex.Encoder() speex_enc.initialize(speex.SPEEX_MODEID_WB) speex_dec = speex.Decoder() speex_dec.initialize(speex.SPEEX_MODEID_WB) #some constant values chunk = 320 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 44100
我发现调节采样率值将允许更多的噪音
下面是pyAudio代码初始化音频设备,这也是全球
#initalize PyAudio p = pyaudio.PyAudio() stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, output = True, frames_per_buffer = chunk)
这个下一个功能是从麦克风写入数据并使用客户端功能发送数据的按键功能。这是我相信我遇到问题的地方。
我相信我是如何处理这个问题的,因为如果我按住它来获取音频,它会在每次迭代中循环发送。我不确定这里要做什么。 (想法!)
def keypress(event): #chunklist = [] #RECORD_SECONDS = 5 if event.keysym == 'Escape': root.destroy() #x = event.char if event.keysym == 'Control_L': #for i in range(0, 44100/chunk * RECORD_SECONDS): try: #get data from mic data = stream.read(chunk) except IOError as ex: if ex[1] != pyaudio.paInputOverflowed: raise data = '\x00' * chunk encdata = speex_enc.encode(data) #Encode the data. #chunklist.append(encdata) #send audio client(chr(CMD_AUDIO), encrypt_my_audio_message(encdata))
服务器代码来处理音频键盘的Tkinter的
root.bind_all('', keypress)
任何想法是极大的赞赏如何
### Server function ### def server(): PORT = 9001 ### Initialize socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind((socket.gethostbyname(socket.gethostname()), PORT)) # socket.gethostbyname(socket.gethostname()) server_socket.listen(5) read_list = [server_socket] ### Start receive loop while True: readable, writable, errored = select.select(read_list, [], []) for s in readable: if s is server_socket: conn, addr = s.accept() read_list.append(conn) print "Connection from ", addr else: msg = conn.recv(2048) if msg: cmd, msg = ord(msg[0]),msg[1:] ## get a text message from GUI if cmd == CMD_MSG: listb1.insert(END, decrypt_my_message(msg).strip() + "\n") listb1.yview(END) ## get an audio message elif cmd == CMD_AUDIO: # make sure length is 16 --- HACK --- if len(msg) % 16 != 0: msg += '\x00' * (16 - len(msg) % 16) #decrypt audio data = decrypt_my_message(msg) decdata = speex_dec.decode(data) #Write the data back out to the speaker stream.write(decdata, chunk) else: s.close() read_list.remove(s)
,并完成绑定我可以根据需要使该按键方法正常工作,或者提出更好的方法,或者我可以完全做错事
*欢呼
请注意,我已经测试过它没有加密的方法也和同样的事情:-)
你想做什么?这是一个语音聊天应用程序吗?应该要求用户按住一个键才能发送音频?为什么在编码和发送之前录制5秒的音频? – jozzas
嘿Jozzas是这是一个语音聊天应用程序和五秒录音只是为了测试一些当前被注释掉的东西:-)它应该是你按住左侧的控制键并发送音频,但就像我说的在我的本地系统它工作正常,但发送到远程系统时,我听到单击单击单击:-)我试着玩取样率有点,但我真的不确定需要做什么*欢呼谢谢你的回复 – ADE