I want to convert a numpy array waveform into a wav-like object so that I can upload it to S3 without having to save the waveform to file locally. Imagine I have a numpy array waveform, y
,
y, sr = librosa.load('something.wav', sr = 44100)
How can I convert this numpy array, y
into a wav file-like object to upload to S3 using boto3
‘s upload_fileobj
method?
According to the boto3
docs, the file-like object must have the properties:
A file-like object to upload. At a minimum, it must implement the read method, and must return bytes.
This is how I would like to upload the file-like object:
import boto3 s3 = boto3.resource('s3') bucket = s3.Bucket('mybucket') # with open('filename', 'rb') as data: # bucket.upload_fileobj(data, 'mykey') bucket.upload_fileobj(wav_object, 'something.wav')
TLDR:
I want a function that converts a numpy array into a wav-like object that implements the read method and returns bytes.
Advertisement
Answer
You can try like this:
import io from scipy.io.wavfile import write import boto3 bytes_wav = bytes() wav_object = io.BytesIO(bytes_wav) write(wav_object, sr, y) # y is your numpy array s3 = boto3.resource('s3') bucket = s3.Bucket('mybucket') bucket.upload_fileobj(wav_object, 'something.wav')