Spaces:
Runtime error
Runtime error
#!/usr/bin/env python3 | |
"""Create a recording with arbitrary duration. | |
The soundfile module (https://python-soundfile.readthedocs.io/) | |
has to be installed! | |
""" | |
import argparse | |
import tempfile | |
import queue | |
import sys | |
import sounddevice as sd | |
import soundfile as sf | |
import numpy # Make sure NumPy is loaded before it is used in the callback | |
assert numpy # avoid "imported but unused" message (W0611) | |
def int_or_str(text): | |
"""Helper function for argument parsing.""" | |
try: | |
return int(text) | |
except ValueError: | |
return text | |
parser = argparse.ArgumentParser(add_help=False) | |
parser.add_argument( | |
'-l', '--list-devices', action='store_true', | |
help='show list of audio devices and exit') | |
args, remaining = parser.parse_known_args() | |
if args.list_devices: | |
print(sd.query_devices()) | |
parser.exit(0) | |
parser = argparse.ArgumentParser( | |
description=__doc__, | |
formatter_class=argparse.RawDescriptionHelpFormatter, | |
parents=[parser]) | |
parser.add_argument( | |
'filename', nargs='?', metavar='FILENAME', | |
help='audio file to store recording to') | |
parser.add_argument( | |
'-d', '--device', type=int_or_str, | |
help='input device (numeric ID or substring)') | |
parser.add_argument( | |
'-r', '--samplerate', type=int, help='sampling rate') | |
parser.add_argument( | |
'-c', '--channels', type=int, default=1, help='number of input channels') | |
parser.add_argument( | |
'-t', '--subtype', type=str, help='sound file subtype (e.g. "PCM_24")') | |
args = parser.parse_args(remaining) | |
q = queue.Queue() | |
def callback(indata, frames, time, status): | |
"""This is called (from a separate thread) for each audio block.""" | |
if status: | |
print(status, file=sys.stderr) | |
q.put(indata.copy()) | |
try: | |
if args.samplerate is None: | |
device_info = sd.query_devices(args.device, 'input') | |
# soundfile expects an int, sounddevice provides a float: | |
args.samplerate = int(device_info['default_samplerate']) | |
if args.filename is None: | |
args.filename = tempfile.mktemp(prefix='delme_rec_unlimited_', | |
suffix='.wav', dir='') | |
# Make sure the file is opened before recording anything: | |
with sf.SoundFile(args.filename, mode='x', samplerate=args.samplerate, | |
channels=args.channels, subtype=args.subtype) as file: | |
with sd.InputStream(samplerate=args.samplerate, device=args.device, | |
channels=args.channels, callback=callback): | |
print('#' * 80) | |
print('press Ctrl+C to stop the recording') | |
print('#' * 80) | |
while True: | |
file.write(q.get()) | |
except KeyboardInterrupt: | |
print('\nRecording finished: ' + repr(args.filename)) | |
parser.exit(0) | |
except Exception as e: | |
parser.exit(type(e).__name__ + ': ' + str(e)) |