From e39781b60de88f4f20b1545faab144a50055fffd Mon Sep 17 00:00:00 2001 From: Christophe Weis <christopheweis@hotmail.fr> Date: Fri, 06 Dec 2024 11:23:14 +0100 Subject: [PATCH] fix: adjust buffer size and resolve recording overflows --- PythonExample_Recording.py | 92 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 92 insertions(+), 0 deletions(-) diff --git a/PythonExample_Recording.py b/PythonExample_Recording.py new file mode 100644 index 0000000..f780050 --- /dev/null +++ b/PythonExample_Recording.py @@ -0,0 +1,92 @@ +import pyaudio +import wave + +# Initialize PyAudio +p = pyaudio.PyAudio() + +# List available input devices +print("Available audio input devices:") +for i in range(p.get_device_count()): + device_info = p.get_device_info_by_index(i) + if device_info['maxInputChannels'] > 0: + print(f"Device ID {i}: {device_info['name']} (Max channels: {device_info['maxInputChannels']})") + +# Prompt user to select a device +device_index = int(input("Please select the device ID to use for recording: ")) +n_channels = int(input("Please enter the number of channels to use for recording: ")) +duration_sec = int(input("Please enter the desired duration (in seconds) of the recording: ")) + +# Parameters +CHANNELS = n_channels # Number of channels +SAMPLE_RATE = 48000 +CHUNK = 32 # Number of frames per buffer +FORMAT = pyaudio.paInt16 # 16-bit audio +RECORD_SECONDS = duration_sec # Duration to record (in seconds) +OUTPUT_FILENAME = "output.wav" +MONITORING = True # To write to a text file as long as the device is recording + +# Get the chosen device's info to validate it can support the entered number of channels and 48kHz +device_info = p.get_device_info_by_index(device_index) +max_channels = device_info['maxInputChannels'] +if max_channels < CHANNELS: + print(f"Error: The selected device only supports {max_channels} channels, but {CHANNELS} channels are required.") + p.terminate() + exit(1) + +# Open stream +stream = p.open(format=FORMAT, + channels=CHANNELS, + rate=SAMPLE_RATE, + input=True, + input_device_index=device_index, + frames_per_buffer=CHUNK) + +print(f"Recording {RECORD_SECONDS} seconds of audio from device ID {device_index}...") + +frames = [] + +print (f"Check status {stream.is_active()}") + +if MONITORING: + open("current_recording.txt","w+") + +for i in range(int(SAMPLE_RATE / CHUNK * RECORD_SECONDS)): + + print (i, f"RECORDING: Check status {stream.is_active()}") # This line is for testing + + try: + # Record audio + # data = stream.read(CHUNK) + data = stream.read(CHUNK, exception_on_overflow = False) # This line (as an alternative to the line above) is to prevent overflows from terminating the recording + frames.append(data) + + if MONITORING: + if i%int(10*SAMPLE_RATE/CHUNK) == 0: # Writing current time into "current_recording.txt" every 10 seconds + current_second = int(i*CHUNK/SAMPLE_RATE) + with open('current_recording.txt', 'a') as f: + f.write(f"{current_second}\n") + + except: + print ("Error") + +print("Finished recording.") + + +print (f"Check status {stream.is_active()}") +# Stop and close the stream +stream.stop_stream() +stream.close() + +# Terminate PyAudio +p.terminate() + +# Save the recorded audio to a file +wf = wave.open(OUTPUT_FILENAME, 'wb') +wf.setnchannels(CHANNELS) +wf.setsampwidth(p.get_sample_size(FORMAT)) +wf.setframerate(SAMPLE_RATE) +wf.writeframes(b''.join(frames)) +wf.close() + +print(f"Audio saved to {OUTPUT_FILENAME}.") + -- Gitblit v1.9.1