AI-система голосового управления интерфейсами для людей с ОВЗ

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
AI-система голосового управления интерфейсами для людей с ОВЗ
Средняя
~2-4 недели
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1252
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1170
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    873
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1092
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    830

Разработка AI-голосового управления интерфейсами для людей с ограниченными возможностями

Голосовое управление — основное средство ввода для людей с нарушениями опорно-двигательного аппарата, слабовидящих, пожилых пользователей с когнитивными особенностями. Стандарты: WCAG 2.1 критерий 3.3.7, EN 301 549, ГОСТ Р 52872-2019.

Архитектура голосового управления

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 обратная связь

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)

Навигация по веб-интерфейсу

# Команды для веб-навигации через 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:

<!-- Статус голосовых команд для скринридера -->
<div
    id="voice-status"
    role="status"
    aria-live="polite"
    aria-atomic="true"
    class="sr-only"
>
    <!-- Сюда JS вставляет: "Команда выполнена: открыть профиль" -->
</div>

<!-- Визуальный индикатор прослушивания -->
<button
    id="voice-toggle"
    aria-label="Голосовое управление"
    aria-pressed="false"
>
    <span class="mic-icon" aria-hidden="true"></span>
    <span class="sr-only">Активировать голосовое управление</span>
</button>

Доступность и персонализация

Потребность Решение
Нарушения речи/заикание Увеличенный timeout ожидания (10 сек), повторение
Акцент / диалект Fine-tuned Whisper или Яндекс SpeechKit
Медленная речь Уменьшенная скорость VAD threshold
Когнитивные особенности Простые однословные команды, подсказки
Работа в шуме DeepFilterNet перед STT

Сроки: голосовое управление для одного веб-приложения — 2–3 недели. Кастомизируемая система с профилями пользователей и обучением под акцент — 6–8 недель.