другая структура проекта + beads + александр повтори + комментарии везде + readme
This commit is contained in:
87
app/audio/sound_level.py
Normal file
87
app/audio/sound_level.py
Normal file
@@ -0,0 +1,87 @@
|
||||
"""
|
||||
Volume control module.
|
||||
Regulates system volume on a scale from 1 to 10.
|
||||
"""
|
||||
|
||||
# Модуль управления громкостью системы.
|
||||
# Работает через системную утилиту amixer (ALSA) в Linux.
|
||||
|
||||
import subprocess
|
||||
import re
|
||||
|
||||
# Карта для перевода слов в цифры ("пять" -> 5)
|
||||
NUMBER_MAP = {
|
||||
"один": 1,
|
||||
"раз": 1,
|
||||
"два": 2,
|
||||
"три": 3,
|
||||
"четыре": 4,
|
||||
"пять": 5,
|
||||
"шесть": 6,
|
||||
"семь": 7,
|
||||
"восемь": 8,
|
||||
"девять": 9,
|
||||
"десять": 10,
|
||||
}
|
||||
|
||||
|
||||
def set_volume(level: int) -> bool:
|
||||
"""
|
||||
Устанавливает системную громкость (шкала 1-10).
|
||||
1 -> 10%
|
||||
10 -> 100%
|
||||
|
||||
Args:
|
||||
level: Число от 1 до 10.
|
||||
|
||||
Returns:
|
||||
True, если успешно.
|
||||
"""
|
||||
if not isinstance(level, int):
|
||||
print(
|
||||
f"❌ Ошибка: Уровень громкости должен быть целым числом, получено {type(level)}"
|
||||
)
|
||||
return False
|
||||
|
||||
# Ограничение диапазона
|
||||
if level < 1:
|
||||
level = 1
|
||||
elif level > 10:
|
||||
level = 10
|
||||
|
||||
percentage = level * 10
|
||||
|
||||
try:
|
||||
# Вызов команды amixer для изменения громкости Master канала
|
||||
# -q: quiet (без вывода)
|
||||
# sset: simple set
|
||||
cmd = ["amixer", "-q", "sset", "Master", f"{percentage}%"]
|
||||
subprocess.run(cmd, check=True)
|
||||
print(f"🔊 Громкость установлена на {level} ({percentage}%)")
|
||||
return True
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"❌ Ошибка при установке громкости: {e}")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"❌ Неизвестная ошибка громкости: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def parse_volume_text(text: str) -> int | None:
|
||||
"""
|
||||
Пытается найти число громкости в тексте.
|
||||
Понимает и цифры ("5"), и слова ("пять").
|
||||
"""
|
||||
text = text.lower()
|
||||
|
||||
# 1. Ищем цифры (1-10)
|
||||
num_match = re.search(r"\b(10|[1-9])\b", text)
|
||||
if num_match:
|
||||
return int(num_match.group())
|
||||
|
||||
# 2. Ищем слова из словаря
|
||||
for word, value in NUMBER_MAP.items():
|
||||
if word in text:
|
||||
return value
|
||||
|
||||
return None
|
||||
Reference in New Issue
Block a user