Error passing wav file to IPython.display

Question:

I am new to Python but I am studying it as programming language for DSP. I recorded a wav file, and have been trying to play it back using IPython.display.Audio:

import IPython.display
from scipy.io import wavfile

rate, s = wavfile.read('h.wav')
IPython.display.Audio(s, rate=rate)

But this gives the following error:

struct.error: ushort format requires 0 <= number <= 0xffff

Error messages

I tried installing FFmpeg but it hasn’t helped.

Asked By: Romyo

||

Answers:

That’s not a very useful error message, it took a bit of debugging to figure out what was going on! It is caused by the "shape" of the matrix returned from wavfile being the wrong way around.

The docs for IPython.display.Audio say it expects a:

Numpy 2d array containing waveforms for each channel. Shape=(NCHAN, NSAMPLES).

If I read a (stereo) wav file I have lying around:

rate, samples = wavfile.read(path)
print(samples.shape)

I get (141120, 2) showing this is of shape (NSAMPLES, NCHAN). Passing this array directly to Audio I get a similar error as you do. Transposing the array will flip these around, causing the array to be compatible with this method. The transpose of a matrix in Numpy is accessed via the .T attribute, e.g.:

IPython.display.Audio(samples.T, rate=rate)

works for me.

Answered By: Sam Mason

Thank you for your answer, it helped me.
below is my code, maybe can help someone.

frequency = 44100
duration = 5

record = sd.rec((frequency * duration), samplerate=frequency , channels=1, blocking=True, dtype=’float64′)

sd.wait()

st.audio(record.T, sample_rate=frequency)

Answered By: larafaakram
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.