Intereting Posts
выход на проектор, так как разрешение ноутбука составляет 16: 9, а проектор ниже Как я могу обмануть процесс, думая, что файл не существует? Почему терминал говорит, что у меня есть почта каждый раз, когда я его открываю? Может ли кто-нибудь уточнить для меня о глобальной переменной в этом сценарии оболочки? Просмотр резервной копии bup с помощью gitk или gitg Объединить две таблицы на основе значения в первом столбце Как скопировать / tar-файлы из папки с огромным количеством файлов? команда tr не работает с восьмеричными последовательностями Многоадресная рассылка с маршрутизатором Debian Перемещение с bash на zsh: сброс PATH Добавление нового атрибута в существующий xml-файл с помощью sed или awk Получить список индексов каждого элемента в списке, как если бы он отсортирован Извлечь отмеченные строки из текстового файла с помощью Bash Как изменить цель ссылки / dev / rtc? Сделать пользовательский файл iso debian

Как автоматически настроить громкость в соответствии со звуком вокруг меня?

Я живу рядом с большой дорогой. Наличие окна, открытого ночью, благословенно прохладно и, с перерывами, очень громко. Как я могу настроить громкость автоматически, на основе встроенного микрофонного входа? Если я установил громкость, чтобы слышать речь в фильме во время прохода автомобиля, он будет очень громким в другое время, и он чувствует себя очень неприятно по отношению к окружающим людям (снаружи и соседям).

Моя система – Debian Buster, хотя я, вероятно, могу получить общее решение для работы. Если пакет не доступен, это сделает команду, чтобы извлечь громкость от микрофона по умолчанию, уже будет полезна для сценария.

Я сделал сценарий Python, чтобы выполнить эту работу. Остальная проблема заключается в том, что мой микрофон моего ноутбука, конечно же, также заберет собственные динамики. Я думаю, что «эхо-отмена» может быть тем, что я ищу, но я понятия не имел, как реализовать это сам. Однако использование внешнего микрофона может работать.

К сожалению, это python 2 из python-alsaaudio зависимости python-alsaaudio .

 #!/usr/bin/env python ''' For noise cancellation: $ pactl load-module module-echo-cancel $ PULSE_PROP="filter.want=echo-cancel" ./this-script.py ''' ''' SETTINGS (you might want to keep presets for music and speech) ''' smoothing = 15 # Over how many samples should we compute? step_size = 1 # maximum volume adjustment in percent points # scale_xxx = (n, level) # At mic level n, scale to level% audio volume scale_min = (4, 39) scale_max = (19, 53) ''' CREDITS https://stackoverflow.com/a/1937058 How get sound input from microphone in python, and process it on the fly? Answer by jbochi https://stackoverflow.com/a/10739764 How to programmatically change volume in Ubuntu Answer by mata ''' import alsaaudio, audioop, sys, os bucket = [None for i in range(smoothing)] inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE) inp.setchannels(1) inp.setrate(8000) inp.setformat(alsaaudio.PCM_FORMAT_S16_LE) inp.setperiodsize(200) print('Setting volume to minimum ({}%)'.format(scale_min[1])) os.system('pactl set-sink-volume 0 {}%'.format(scale_min[1])) i = 1 last_volume = scale_min[1] while True: l, data = inp.read() if l: val = audioop.max(data, 2) bucket[i % smoothing] = val if i % smoothing == 0: m = min(bucket) miclvl = float(m) / 50.0 if miclvl < scale_min[0]: scale = scale_min[1] elif miclvl > scale_max[0]: scale = scale_max[1] else: miclvl_range = scale_max[0] - scale_min[0] level_range = scale_max[1] - scale_min[1] scale = (miclvl - scale_min[0]) / miclvl_range * level_range + scale_min[1] scale = int(round(scale)) step = max(min(scale - last_volume, step_size), -step_size) if step != 0: last_volume += step step = '+' + str(step) if step > 0 else str(step) os.system('pactl set-sink-volume 0 {}%'.format(step)) miclvl = round(miclvl, 1) miclvlpacing = ' ' * (4 - len(str(miclvl))) stepspacing = ' ' * (2 - len(str(step))) sys.stdout.write('mic lvl {}{} ideal scale {}% adjust {}{} now {} '.format( miclvl, miclvlpacing, str(scale), step, stepspacing, last_volume)) print(int(round(last_volume - scale_min[1])) * 'x') i += 1