Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

6 семестр / course / comrade

.py
Скачиваний:
1
Добавлен:
18.02.2023
Размер:
5.32 Кб
Скачать
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