File size: 2,005 Bytes
2a56df3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# audio_capture.py (Optimized Audio Capture)
import pyaudio
import numpy as np
import wave
import os
from datetime import datetime
import config
class AudioRecorder:
def __init__(self):
self.audio = pyaudio.PyAudio()
self.stream = None
self.is_recording = False
self.sample_rate = config.SAMPLE_RATE
self.filename = f"meeting_{datetime.now().strftime('%Y%m%d_%H%M%S')}.wav"
self.audio_buffer = []
def start_recording(self):
self.is_recording = True
self.audio_buffer = []
self.stream = self.audio.open(
format=config.AUDIO_FORMAT,
channels=config.CHANNELS,
rate=self.sample_rate,
input=True,
frames_per_buffer=config.CHUNK_SIZE,
input_device_index=config.INPUT_DEVICE_INDEX
)
return True
def get_audio_chunk(self):
if self.is_recording:
try:
data = self.stream.read(config.CHUNK_SIZE, exception_on_overflow=False)
# Return as numpy array for efficient processing
return np.frombuffer(data, dtype=np.int16)
except OSError as e:
print(f"Audio error: {str(e)}")
return None
return None
def stop_recording(self):
if self.is_recording:
self.is_recording = False
self.stream.stop_stream()
self.stream.close()
self._save_recording()
return os.path.join(config.RECORDINGS_DIR, self.filename)
return None
def _save_recording(self):
os.makedirs(config.RECORDINGS_DIR, exist_ok=True)
with wave.open(os.path.join(config.RECORDINGS_DIR, self.filename), 'wb') as wf:
wf.setnchannels(config.CHANNELS)
wf.setsampwidth(self.audio.get_sample_size(config.AUDIO_FORMAT))
wf.setframerate(self.sample_rate)
wf.writeframes(b''.join(self.audio_buffer)) |