Как воспроизвести аудио, как оно принимается по сети? - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь записать микрофонный вход от клиента, а затем отправить аудиоданные по сети.Сервер получает эти аудиоданные и воспроизводит их по мере их поступления.

В настоящее время у меня есть программа, в которой клиент записывает аудиосэмпл в течение 3 секунд.Затем аудиосэмпл отправляется на сервер, который затем преобразует аудиоданные в файл .wav.

Сервер:

import socket
import pyaudio
import wave

# Socket
HOST = socket.gethostname()
PORT = 5000

# Audio
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
frames = []

with socket.socket() as server_socket:
    server_socket.bind((HOST, PORT))
    server_socket.listen(1)
    conn, address = server_socket.accept()
    print("Connection from " + address[0] + ":" + str(address[1]))
    while True:
        try:
            data = conn.recv(2048)
            frames.append(data)
        except socket.error as error_message:
            break

print(frames)

with wave.open(WAVE_OUTPUT_FILENAME, 'wb') as wf:
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))

Клиент:

import socket
import pyaudio

# Socket
HOST = socket.gethostname()
PORT = 5000

# Audio
CHUNK = 1024 * 4
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("Recording")

with socket.socket() as client_socket:
    client_socket.connect((HOST, PORT))
    while True:
        data = stream.read(CHUNK)
        client_socket.send(data)

Модуль sounddevice имеет пример документации под названием wire.py , который делает именно то, что мне нужно на стороне сервера.Тем не менее, программа, кажется, довольно низкого уровня, и я не могу понять, как передать аудиоданные, записанные с pyaudio.

1 Ответ

0 голосов
/ 27 января 2019

РЕДАКТИРОВАТЬ: Решение

import socket
import pyaudio

# Socket
HOST = socket.gethostname()
PORT = 5000

# Audio
p = pyaudio.PyAudio()
CHUNK = 1024 * 4
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                output=True,
                frames_per_buffer=CHUNK)

with socket.socket() as server_socket:
    server_socket.bind((HOST, PORT))
    server_socket.listen(1)
    conn, address = server_socket.accept()
    print("Connection from " + address[0] + ":" + str(address[1]))

    data = conn.recv(4096)
    while data != "":
        try:
            data = conn.recv(4096)
            stream.write(data)
        except socket.error:
            print("Client Disconnected")
            break

stream.stop_stream()
stream.close()
p.terminate()

Похоже, магия приходит с stream.write(data), где data - это байтовый объект, полученный через сокет.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...