| ```python | |
| import sounddevice as sd | |
| import numpy as np | |
| import wave | |
| import os | |
| from datetime import datetime | |
| class AudioRecorder: | |
| def __init__(self, sample_rate=44100, channels=1): | |
| self.sample_rate = sample_rate | |
| self.channels = channels | |
| self.recording = False | |
| self.frames = [] | |
| def callback(self, indata, frames, time, status): | |
| if self.recording: | |
| self.frames.append(indata.copy()) | |
| def start_recording(self): | |
| self.recording = True | |
| self.frames = [] | |
| self.stream = sd.InputStream( | |
| samplerate=self.sample_rate, | |
| channels=self.channels, | |
| callback=self.callback, | |
| dtype='float32' | |
| ) | |
| self.stream.start() | |
| def stop_recording(self): | |
| self.recording = False | |
| self.stream.stop() | |
| self.stream.close() | |
| return np.concatenate(self.frames) | |
| def save_wav(self, filename, audio_data): | |
| with wave.open(filename, 'wb') as wf: | |
| wf.setnchannels(self.channels) | |
| wf.setsampwidth(2) | |
| wf.setframerate(self.sample_rate) | |
| wf.writeframes((audio_data * 32767).astype(np.int16)) | |
| def record_and_save(self, duration=5, output_dir='recordings'): | |
| os.makedirs(output_dir, exist_ok=True) | |
| timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") | |
| filename = os.path.join(output_dir, f"recording_{timestamp}.wav") | |
| print(f"Recording for {duration} seconds...") | |
| audio_data = sd.rec(int(duration * self.sample_rate), samplerate=self.sample_rate, channels=self.channels) | |
| sd.wait() | |
| self.save_wav(filename, audio_data) | |
| print(f"Saved recording to {filename}") | |
| return filename | |
| ``` |