import time
import logging
import sounddevice as sd
from . input import Input
log = logging.getLogger(__name__)
[docs]class Microphone(Input):
'''
Reads in audio from a microphone.
Args:
id (str): device index
config (dict): Configuration dictionary. Accepted keywords:
channels (int): number of audio channels
block_size (int): number of bytes to read in per iteration
samplerate (int): audio sample rate
'''
def __init__(self, id=0, config=None):
config = config or {}
defaults = {
'channels': 1,
'blocksize': 1024,
'samplerate': 44100,
}
Input.__init__(self, id=id, config=config, defaults=defaults)
[docs] def open(self):
'''Opens Audio stream'''
if type(self.id) is str:
device_list = sd.query_devices()
self.id = [index for index, device_info in enumerate(device_list) if self.id in device_info['name']][0]
self.configure()
self.input = sd.InputStream(
device=self.id,
channels=self.config['channels'],
samplerate=self.config['samplerate']
)
self.input.start()
[docs] def read(self):
'''Reads in audio blocks'''
audio = None
if self.input:
audio, overflow = self.input.read(self.config['blocksize'])
if overflow:
audio = None
log.warning('Audio block overflow')
return audio, time.time()
[docs] def close(self):
if self.input:
self.input.close()
self.input = None