Доработка звука
This commit is contained in:
61
scripts/vu_meter.py
Normal file
61
scripts/vu_meter.py
Normal file
@@ -0,0 +1,61 @@
|
||||
import sys
|
||||
import numpy as np
|
||||
import sounddevice as sd
|
||||
|
||||
# Настройки
|
||||
DURATION = 0.2 # Увеличили буфер для стабильности на Raspberry Pi
|
||||
SAMPLE_RATE = 44100 # Частота дискретизации
|
||||
|
||||
|
||||
def audio_callback(indata, frames, time, status):
|
||||
# Игнорируем input overflow, чтобы не засорять вывод,
|
||||
# но выводим другие критические ошибки, если они будут
|
||||
if status and not status.input_overflow:
|
||||
print(f"\nСтатус: {status}", file=sys.stderr)
|
||||
|
||||
# Вычисляем среднеквадратичное значение (RMS)
|
||||
rms = np.sqrt(np.mean(indata**2))
|
||||
|
||||
# Переводим в проценты.
|
||||
# Коэффициент 250 хорошо подходит для стандартных микрофонов
|
||||
volume_percent = min(int(rms * 250), 100)
|
||||
|
||||
# Рисуем текстовый индикатор
|
||||
bar_length = int(volume_percent / 2) # Шкала из 50 символов max
|
||||
bar = "█" * bar_length + "-" * (50 - bar_length)
|
||||
|
||||
# Выводим в консоль с очисткой конца строки (\033[K), чтобы убрать артефакты
|
||||
sys.stdout.write(f"\rУровень: {volume_percent:3}% | [{bar}]\033[K")
|
||||
sys.stdout.flush()
|
||||
|
||||
|
||||
print("Поиск аудиоустройств...")
|
||||
|
||||
device_id = None
|
||||
devices = sd.query_devices()
|
||||
for idx, dev in enumerate(devices):
|
||||
# Ищем устройство без учета регистра
|
||||
if "pcm2902" in dev["name"].lower() and dev["max_input_channels"] > 0:
|
||||
device_id = idx
|
||||
print(f"Найдено устройство: {dev['name']} (ID: {idx})")
|
||||
break
|
||||
|
||||
if device_id is None:
|
||||
print("Используем аудиоустройство по умолчанию.")
|
||||
|
||||
print("Запуск мониторинга уровня звука. Для выхода нажмите Ctrl+C\n")
|
||||
|
||||
try:
|
||||
with sd.InputStream(
|
||||
device=device_id,
|
||||
channels=1,
|
||||
samplerate=SAMPLE_RATE,
|
||||
blocksize=int(SAMPLE_RATE * DURATION),
|
||||
callback=audio_callback,
|
||||
):
|
||||
while True:
|
||||
sd.sleep(100)
|
||||
except KeyboardInterrupt:
|
||||
print("\nМониторинг остановлен.")
|
||||
except Exception as e:
|
||||
print(f"\nОшибка: {e}")
|
||||
Reference in New Issue
Block a user