Skip to content

Instantly share code, notes, and snippets.

@mabdrabo
Created January 28, 2014 23:05
Show Gist options
  • Save mabdrabo/8678538 to your computer and use it in GitHub Desktop.
Save mabdrabo/8678538 to your computer and use it in GitHub Desktop.
Simple script to record sound from the microphone, dependencies: easy_install pyaudio
import pyaudio
import wave
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
CHUNK = 1024
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "file.wav"
audio = pyaudio.PyAudio()
# start Recording
stream = audio.open(format=FORMAT, channels=CHANNELS,
rate=RATE, input=True,
frames_per_buffer=CHUNK)
print "recording..."
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print "finished recording"
# stop Recording
stream.stop_stream()
stream.close()
audio.terminate()
waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()
@creboy
Copy link

creboy commented Apr 22, 2020

Traceback (most recent call last):
File "a.py", line 16, in
frames_per_buffer=CHUNK)
File "/usr/lib/python2.7/site-packages/pyaudio.py", line 750, in open
stream = Stream(self, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/pyaudio.py", line 441, in init
self._stream = pa.open(**arguments)
IOError: [Errno -9996] Invalid input device (no default output devicce)

archlinux on termux,python2.7. struggle by this for a long time. how to solve it ?

@kongkip
Copy link

kongkip commented May 19, 2020

How do you read this file after writing?

@el07694
Copy link

el07694 commented Jun 2, 2020

ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:869:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:869:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_route.c:869:(find_matching_chmap) Found no matching channel map
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused

ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused

ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card
ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card
python3.6: src/hostapi/alsa/pa_linux_alsa.c:3636: PaAlsaStreamComponent_BeginPolling: Assertion `ret == self->nfds' failed.
Aborted (core dumped)


I may not have the easy_install. Is that the problem?

Thanks in advance,
Chris Pappas

@shilan
Copy link

shilan commented Jun 10, 2020

Hi, it just worked like a charm. :) I am new to sound features. If I want to record a wave file as described below:

Each utterance is stored as a one-second (or less)
WAVE format file, with the sample data encoded as
linear 16-bit single-channel PCM values, at a 16 KHz
rate.

Should I change the Constants like:

FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
CHUNK = 1024
RECORD_SECONDS = 1
WAVE_OUTPUT_FILENAME = "file.wav"

how should I reflect the 16-bit?

@TheEccentricDuck
Copy link

Thank yo for yo code, ma man (or woman).

@adfadasdf-cymklajkjsk
Copy link

Sorry but the code won't work

@SpirosArk
Copy link

Sorry but the code won't work

What's the error?

@TheEccentricDuck
Copy link

Sorry but the code won't work

I think I know the problem, you may have a python3 interpreter while this code is written in python2. You need to delete the spaces after any print and turn it into print(...)

@bg172
Copy link

bg172 commented May 29, 2021

Hi, I got this error when I tried to record audio

Traceback (most recent call last):
  File "listen.py", line 23, in <module>
    data = stream.read(CHUNKSIZE)
  File "/.../python/venv/lib/python3.5/site-packages/pyaudio.py", line 608, in read
    return pa.read_stream(self._stream, num_frames, exception_on_overflow)
OSError: [Errno -9981] Input overflowed

Why it is happening?
How can I fix that?

same here, did you find the fix ?

I had same issue on RPi3b+ and fixed it with picking up input device:

stream = self.audio.open(format=FORMAT, input_device_index = 2,
                                 channels=CHANNELS,
                                 rate=RATE,
                                 input=True,    # Save the recorded data in a .wav format
                             frames_per_buffer=CHUNK)

I achieved a much better stability by setting CHUNK to an integer fraction of RATE, e.g. CHUNK = int(RATE/10), otherwise still had same exception mostly already in 10s to 80s after starting the loop with stream.read(chunk). And anyway for such data sources it is a good approach to use "try" and be ready for exceptions and know how much gets lost:)

@sinanaybar
Copy link

Hi,thanks good

@deluxerootit
Copy link

How can I add timestamp on the recorded audio?

I mean like putting current time on each frame in opencv:
cv2.putText(frame, str(datetime.now()), (20, 40), font, 2, (255, 255, 255), 2, cv2.LINE_AA)

@el07694
Copy link

el07694 commented Jun 24, 2022

You can use pydub module for this i think.
For example

from pydub import AudioSegment
...
...
...
    data = stream.read(CHUNK)
    slice = AudioSegment(data, sample_width=???, frame_rate=???, channels=???)
    slice_len = len(slice) #slice_len is the duration of data frame in milliseconds

@sujantkumarkv
Copy link

hey all, i know this is too old a gist, but i came here from nvidia forum. Any help is appreciated.

This script is assuming i physically have the jetson right and using its microphone? because i'm connected to it via ssh on my macbook & physically very far. So, i guess I somehow need to send the audio packets/bytes to it?

and does pyaudio help with that? anyone has clues how to proceed? thanks :)

cc @mabdrabo @el07694 @deluxerootit @sinanaybar @bg172 @TheEccentricDuck @shilan @kongkip @YveOms @creboy @jdelange @muthiyanbhushan @Raman99444 @soni30 @Shinoy-12 @salilsaxena @davekimble2 @ajfarkas @kanik9 @progware @ecambronero @ClaudiaMarchPiris @PiepsC @Skykiller664 @pomarec @s1st3r @morenol @sharpriy @riadibadulla @marijnruyts @Dinesh2903 @danidz @HarrisMx @maelfosso @xe1gyq @rdhara @MihailRis @Akshay0724 @nmnhut2010 @ashishmd @rachit1994 @kevinmgamboa

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment