안녕하세요, 네트워크에서 오디오를 보내는 데 문제가 있습니다. 거리가없는 로컬 시스템에는 아무런 문제가 없지만 원격 시스템에서 테스트 할 때마다 오디오가 있지만 음성 입력이 아니라 고르지/지연 등이 필요합니다. 오디오 전송을 어떻게 처리하는지 나는 지금 4 일 동안 노력했고 해결책을 찾을 수 없다.파이썬 오디오 오버 네트워크 문제
나는 모든 관련 코드를 게시하고 시도하고 그것을 최선을 설명합니다 내가 할 수
이 더 소음
를 허용 할#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))
모든 아이디어를 크게하는 방법을 부탁드립니다
### 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)
및 완성을위한
은 Tkinter를 에서 키보드의root.bind_all('', keypress)
바인딩 오디오를 처리하는 서버 코드 그 키 누르기 방법을 필요에 따라 작동 시키거나 더 나은 방법을 제안 할 수 있습니다. 아니면 내가 완전히 잘못된 것을하고있을 수도 있습니다.
* 환호
내가
무엇을하려하십니까? 음성 채팅 앱인가요? 사용자가 오디오를 보내기 위해 키를 누르고 있어야합니까? 인코딩하고 보내기 전에 5 초 동안 오디오를 녹음하는 이유는 무엇입니까? – jozzas
Hey Jozzas 네, 음성 채팅 앱입니다. 5 초 녹음은 현재 주석 처리 된 몇 가지 사항을 테스트하는 것입니다 :-) 왼쪽 컨트롤 키를 누른 상태로 오디오를 전송해야하지만 내 로컬 시스템에서 말한 것처럼 그것은 잘 작동하지만 원격 시스템에 보낼 때 딸깍 소리가 나기를 클릭합니다 :-) 나는 약간의 샘플 속도로 연주를 시도했지만 실제로해야 할 일이 확실하지 않습니다. * 건배 귀하의 회신에 감사드립니다 – ADE