import pyaudio import wave from datetime import datetime # Generate a file name from current date and time current_date_time = datetime.now().strftime("%Y-%m-%d--%H-%M-%S") file_name = 'recording_' + current_date_time # 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: ")) #file_name = str(input("Please enter a name for the output file: ")) # 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 = file_name MONITORING = False # 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 is for testing 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}.")