Розробка AI-голосового управління інтерфейсами для людей з обмеженими можливостями Голосове управління — основний засіб введення для людей з порушеннями опорно-рухового апарату, людей з вадами зору, літніх користувачів з когнітивними особливостями. Стандарти: WCAG 2.1 критерій 3.3.7, EN 301549, ГОСТ Р 52872-2019. ### Архітектура голосового управління```python
from faster_whisper import WhisperModel from openai import AsyncOpenAI import asyncio import pyaudio import numpy as np
class AccessibilityVoiceController: def init(self, app_commands: dict): self.stt = WhisperModel("base", device="cuda", compute_type="int8") self.llm = AsyncOpenAI() self.commands = app_commands # {"открыть профиль": handler_fn, ...} self.wake_word = "помощник"
async def listen_and_execute(self):
audio_stream = self._open_mic_stream()
while True:
audio_chunk = audio_stream.read(frames=16000 * 3) # 3 секунды
audio_np = np.frombuffer(audio_chunk, dtype=np.int16).astype(np.float32) / 32768.0
segments, _ = self.stt.transcribe(audio_np, language="ru", vad_filter=True)
text = " ".join(s.text for s in segments).strip().lower()
if not text or self.wake_word not in text:
continue
command_text = text.split(self.wake_word, 1)[-1].strip()
await self.process_command(command_text)
async def process_command(self, text: str):
# Точное совпадение
for cmd, handler in self.commands.items():
if cmd in text:
await handler()
await self.speak_feedback(f"Выполняю: {cmd}")
return
# Нечёткое распознавание через LLM
intent = await self.classify_intent_with_llm(text)
if intent and intent in self.commands:
await self.commands[intent]()
await self.speak_feedback(f"Понял, выполняю")
else:
await self.speak_feedback("Не понял команду. Повторите, пожалуйста.")
async def classify_intent_with_llm(self, text: str) -> str | None:
available = list(self.commands.keys())
response = await self.llm.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "system",
"content": f"Определи, какой команде соответствует фраза пользователя. Доступные команды: {available}. Верни только название команды или 'null'."
}, {
"role": "user",
"content": text
}]
)
result = response.choices[0].message.content.strip()
return result if result != "null" else None
### TTS зворотний зв'язокpython
import edge_tts
import tempfile
import pygame
async def speak_feedback(text: str, voice: str = "ru-RU-DmitryNeural"): """Озвучиваем системный ответ через Edge TTS (бесплатно)""" tts = edge_tts.Communicate(text=text, voice=voice, rate="+10%")
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as f:
await tts.save(f.name)
pygame.mixer.music.load(f.name)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
await asyncio.sleep(0.1)
### Навігація по веб-інтерфейсуpython
Команды для веб-навигации через Playwright/Selenium
class WebAccessibilityCommands:
COMMAND_MAP = {
"перейти в профиль": lambda p: p.goto("/profile"),
"открыть настройки": lambda p: p.goto("/settings"),
"увеличить шрифт": lambda p: p.evaluate("document.documentElement.style.fontSize = '120%'"),
"уменьшить шрифт": lambda p: p.evaluate("document.documentElement.style.fontSize = '90%'"),
"нажать кнопку сохранить": lambda p: p.click("button:has-text('Сохранить')"),
"прокрутить вниз": lambda p: p.keyboard.press("End"),
"прочитать страницу": lambda p: read_page_content(p),
"заполнить поле имени": fill_name_field,
}
### Сумісність зі скріндрідерами Голосове керування доповнює (не замінює) скринрідери. Інтеграція через ARIA live regions:html
<button id="voice-toggle" aria-label="Голосовое управление" aria-pressed="false"
<span class="mic-icon" aria-hidden="true"></span>
<span class="sr-only">Активировать голосовое управление</span>
```### Доступність та персоналізація | Потреба Рішення | |------------|---------| | Порушення мови / заїкуватість | Збільшений час очікування (10 сек), повторення | | Акцент/діалект | Fine-tuned Whisper чи Яндекс SpeechKit | | Повільне мовлення | Зменшена швидкість VAD threshold | | Когнітивні особливості | Прості однослівні команди, підказки | Робота у шумі | DeepFilterNet перед STT Терміни: голосове керування для одного веб-програми — 2–3 тижні. Система, що кастомізується з профілями користувачів і навчанням під акцент — 6–8 тижнів.







