0

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.

6
  • Does this answer your question? Writing WAV file using Python, Numpy array and WAVE module Commented Jun 28, 2022 at 8:45
  • Python has a built-in docs.python.org/3/library/wave.html module. Commented Jun 28, 2022 at 8:46
  • @tevemadar that link doesn't answer my question because my starting point is a numpy array - not a wave file. I want to go from np array --> wav-like object Commented Jun 28, 2022 at 8:51
  • You'll have to scroll to the second answer, stackoverflow.com/a/64376061/7916438 Commented Jun 28, 2022 at 8:53
  • @tevemadar the second answer has with wave.open("sound1.wav", "w") as f: but I don't want to write to a file locally , I just want to return a file-like object. Commented Jun 28, 2022 at 8:56

1 Answer 1

1

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')
Sign up to request clarification or add additional context in comments.

1 Comment

Oooh let me try this and get back to you if it works

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.