Добавил:
oih07968
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
import queue
import logging
import os
import time as t
import datetime as dt
import configparser as cp
import sounddevice as sd
import soundfile as sf
import numpy
assert numpy # чтобы предотвратить сообщение "imported but unused"
# настройки по умолчанию
device = 0
samplerate = None
channels = 1
subtype = 'PCM_24'
record_seconds = 10
max_record_seconds = 600
trigger = 50
log_level = logging.INFO
# создаем глобальные переменные
q = queue.Queue()
timeout = 0
max_timeout = 0
qsize = 0
# настраиваем логирование
logging.basicConfig(filename='report.log', level=log_level,
format="%(asctime)s %(levelname)s %(message)s")
def callback(indata, frames, time, status):
# вызывается (из отдельного потока) для каждого звукового блока
global timeout, max_timeout, qsize
volume = numpy.linalg.norm(indata) * 100
if volume > trigger:
timeout = t.time() + record_seconds # записываем время до которого идеи запись
if max_timeout == 0:
max_timeout = t.time() + max_record_seconds
if t.time() < timeout and t.time() < max_timeout:
q.put(indata.copy()) # если идем запись файла пишем в очередь
qsize += 1
else:
timeout = 0
max_timeout = 0
if os.path.exists('settings.ini'):
config = cp.ConfigParser()
config.read('settings.ini')
# читаем значения из конфиг. файла
device = int(config.get('settings', 'device'))
samplerate = config.get('settings', 'samplerate')
channels = int(config.get('settings', 'channels'))
subtype = config.get('settings', 'subtype')
record_seconds = int(config.get('settings', 'record_seconds'))
max_record_seconds = int(config.get('settings', 'max_record_seconds'))
trigger = int(config.get('settings', 'trigger'))
log_level = int(config.get('settings', 'log_level'))
if samplerate == 'None':
samplerate = None
else:
samplerate = int(samplerate)
else:
logging.warning('Error opening the settings file')
print('Error opening the settings file')
# создаем файл настроек если он не открывается или отсутствует
config = cp.ConfigParser()
config.add_section('settings')
config.set('settings', 'device', str(device))
config.set('settings', 'samplerate', str(samplerate))
config.set('settings', 'channels', str(channels))
config.set('settings', 'subtype', str(subtype))
config.set('settings', 'record_seconds', str(record_seconds))
config.set('settings', 'max_record_seconds', str(max_record_seconds))
config.set('settings', 'trigger', str(trigger))
config.set('settings', 'log_level', str(log_level))
with open('settings.ini', "w") as config_file:
config.write(config_file)
try:
if samplerate is None: # если не задано получаем значение по умолчанию
device_info = sd.query_devices(device, 'input')
# звуковой файл ждет int, микрофон отдает float
samplerate = int(device_info['default_samplerate'])
with sd.InputStream(samplerate=samplerate, device=device,
channels=channels, callback=callback): # начинаем слушать микрофон
logging.info('Listening...')
print('Listening...')
while True:
if qsize > 0: # если появились данные для записи
now = dt.datetime.now() # получаем текущую дату время
folder = now.strftime('%Y-%m-%d')
if not os.path.isdir(folder): # проверяем есть ли папка для текущего дня
os.mkdir(folder) # если нет - создаем
os.chdir(folder) # переходим в папку с датой
filename = now.strftime('%Y-%m-%d %H-%M-%S.wav')
with sf.SoundFile(filename, mode='x', samplerate=samplerate,
channels=channels, subtype=subtype) as file: # создаем звуковой файл
logging.info('Recording started: ' + repr(filename))
print('Recording started: ' + repr(filename))
while t.time() < timeout or qsize > 0: # записываем файл record_seconds секунд
if qsize > 0:
file.write(q.get())
qsize -= 1
logging.info('Recording finished: ' + repr(filename))
print('Recording finished: ' + repr(filename))
os.chdir("..") # возвращаемся в основную папку
except KeyboardInterrupt:
logging.info('Execution was interrupted by the user')
print('Execution was interrupted by the user')
Соседние файлы в папке course