Python — чтение аудиоданных без сохранения в файл

#python #audio #aws-lambda #base64

#python #Аудио #aws-lambda #base64

Вопрос:

Я отправляю аудиоданные между браузером и моей функцией AWS Lambda, но я обнаружил, что выполняю промежуточный шаг сохранения в файл для функциональных целей. Вот мой код прямо сейчас для работы:

 wavio.write(file="out.wav", data=out_file, rate=16000, sampwidth=2)  # where out_file is np.array
encode_output = base64.b64encode(open("out.wav", "rb").read())
return {
    'headers': {
        'Access-Control-Allow-Headers': 'Content-Type',
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'OPTIONS,POST,GET',
        'Content-Type': 'audio/wav'
    },
    'statusCode': 200,
    'body': encode_output,
    'isBase64Encoded': True
}
  

Однако есть ли более разумный способ преобразовать мой массив numpy и отправить закодированные аудиоданные обратно в браузер?

Комментарии:

1. вы можете попробовать использовать io.BytesIO() для создания файлоподобного объекта в памяти — но это работает, только если функция write может использовать файлоподобный объект вместо имени файла.

Ответ №1:

Функция, основанная на исходном коде write , может использовать объект file вместо filename, чтобы вы могли попытаться использовать io.BytesIO() его для создания файлоподобного объекта в памяти

Я не смог его протестировать, но это должно быть что-то вроде этого

 import io

# ... code ...

file_in_memory = io.BytesIO()

wavio.write(file=file_in_memory, ...)

file_in_memory.seek(0) # move to the beginning of file 

encode_output = base64.b64encode(file_in_memory.read())
  

Редактировать:

Я взял пример из исходного кода и использовал io.BytesIO() , и он работает

 import numpy as np
import wavio
import base64
import io

rate = 22050  # samples per second
T = 3         # sample duration (seconds)
f = 440.0     # sound frequency (Hz)
t = np.linspace(0, T, T*rate, endpoint=False)
x = np.sin(2*np.pi * f * t)

file_in_memory = io.BytesIO()

wavio.write(file_in_memory, x, rate, sampwidth=3)

file_in_memory.seek(0)

encode_output = base64.b64encode(file_in_memory.read())

print(encode_output)