2026-02-15 12:56:17 +03:00
2026-02-12 14:12:37 +03:00
2026-02-12 14:12:37 +03:00
2026-01-02 20:26:44 +03:00
2026-02-12 14:12:37 +03:00
2026-02-12 14:12:37 +03:00
2026-02-12 14:12:37 +03:00

🎙️ Alexander Smart Speaker

Голосовой ассистент для Linux с wake word, STT/TTS и набором голосовых навыков

Python Linux License

Возможности

Функция Описание
🔊 Активация по ключевому слову Активация по команде Alexandr
🧠 Диалог с AI Взаимодействие с Perplexity с сохранением контекста
🌐 Перевод Перевод RU ↔ EN с озвучиванием
🌤️ Погода Информация о погоде по умолчанию и по названию города
Таймеры и будильники Управление таймерами, будильниками и секундомерами
🔊 Управление громкостью Регулировка системной громкости
🎵 Spotify интеграция Управление воспроизведением (play/pause/next/current track)
🌍 Игра в города Классическая игра в города

🏗️ Архитектура проекта

Диаграмма взаимодействия компонентов

graph TB
    subgraph "Основной цикл"
        A[main() - основной цикл] --> B{Режим активации}
        B -->|Ожидание wake word| C[wait_for_wakeword()]
        B -->|Режим диалога| D[listen() в режиме follow-up]
        C --> E[Прослушивание команды]
        D --> E
        E --> F[Анализ команды]
    end
    
    subgraph "Аудио подсистема"
        C1[wait_for_wakeword()<br/>wakeword.py<br/>check_wakeword_once()]
        E1[listen()<br/>stt.py<br/>get_recognizer()]
        G1[speak()<br/>tts.py<br/>initialize()]
        H1[parse_volume_text()<br/>sound_level.py<br/>set_volume()]
        
        C1 -.-> E1
        E1 -.-> G1
        H1 -.-> G1
    end
    
    subgraph "Ядро"
        F1[is_stop_command()<br/>commands.py<br/>_normalize_text()]
        F2[ask_ai_stream()<br/>ai.py<br/>translate_text()]
        F3[clean_response()<br/>cleaner.py]
        F5[get_smalltalk_response()<br/>smalltalk.py]
        
        F --> F1
        F --> F2
        F --> F3
        F --> F5
    end
    
    subgraph "Функции"
        I1[get_weather_report()<br/>weather.py]
        I2[get_timer_manager()<br/>timer.py]
        I3[get_alarm_clock()<br/>alarm.py]
        I4[get_stopwatch_manager()<br/>stopwatch.py]
        I5[get_music_controller()<br/>music.py]
        I6[get_cities_game()<br/>cities_game.py]
        
        F --> I1
        F --> I2
        F --> I3
        F --> I4
        F --> I5
        F --> I6
    end
    
    subgraph "Обработка команд"
        F --> J{Тип команды}
        J -->|Small talk| K[get_smalltalk_response()]
        J -->|Повтор| L[Повтор последнего ответа]
        J -->|Стоп| M[is_stop_command()]
        J -->|Таймер| N[parse_command() timer]
        J -->|Будильник| O[parse_command() alarm]
        J -->|Секундомер| P[parse_command() stopwatch]
        J -->|Громкость| Q[parse_volume_text() + set_volume()]
        J -->|Погода| R[get_weather_report()]
        J -->|Музыка| S[parse_command() music]
        J -->|Перевод| T[parse_translation_request()]
        J -->|Города| U[handle() cities_game]
        J -->|AI| V[ask_ai_stream()]
    end
    
    subgraph "Ответ пользователю"
        K --> W[clean_response()]
        L --> W
        M --> W
        N --> W
        O --> W
        P --> W
        Q --> W
        R --> W
        S --> W
        T --> W
        U --> W
        V --> W
        
        W --> X[speak()]
        X --> Y[Возврат в режим ожидания]
        Y --> A
    end
    
    %% Connections
    C1 -.-> A
    E1 -.-> F
    G1 -.-> X
    F2 -.-> V
    F3 -.-> W
    I1 -.-> R
    I2 -.-> N
    I3 -.-> O
    I4 -.-> P
    I5 -.-> S
    I6 -.-> U
    
    style A fill:#e1f5fe
    style F fill:#f3e5f5
    style X fill:#e8f5e8
    style Y fill:#fff3e0
</graph>

Диаграмма потока команд от wake word до функций

graph TD
    subgraph "Активация и распознавание"
        A[wait_for_wakeword()<br/>wakeword.py] --> B[listen()<br/>stt.py]
        B --> C[Распознанный текст]
    end
    
    subgraph "Анализ команды"
        C --> D{Тип команды}
    end
    
    subgraph "Обработка специфических команд"
        D -->|Small talk| E[get_smalltalk_response()<br/>smalltalk.py]
        D -->|Стоп команда| F[is_stop_command()<br/>commands.py]
        D -->|Таймер| G[parse_command()<br/>timer.py]
        D -->|Будильник| H[parse_command()<br/>alarm.py]
        D -->|Секундомер| I[parse_command()<br/>stopwatch.py]
        D -->|Громкость| J[parse_volume_text()<br/>sound_level.py<br/>set_volume()]
        D -->|Погода| K[get_weather_report()<br/>weather.py]
        D -->|Музыка| L[parse_command()<br/>music.py]
        D -->|Перевод| M[parse_translation_request()<br/>ai.py<br/>translate_text()]
        D -->|Города| N[handle()<br/>cities_game.py]
        D -->|Обычный вопрос| O[ask_ai_stream()<br/>ai.py]
    end
    
    subgraph "Ответ пользователю"
        E --> P[clean_response()<br/>cleaner.py]
        F --> P
        G --> P
        H --> P
        I --> P
        J --> P
        K --> P
        L --> P
        M --> P
        N --> P
        O --> P
        P --> Q[speak()<br/>tts.py]
    end
    
    subgraph "Цикл управления"
        Q --> R{Продолжить диалог?}
        R -->|Да| S[Остаться в режиме ожидания]
        R -->|Нет| T[Ждать wake word снова]
        S --> B
        T --> A
    end
</graph>

🛠️ Технологии

Компонент Технология
Wake word pvporcupine
STT deepgram-sdk
TTS Silero (torch, torchaudio)
AI Perplexity API
Погода Open-Meteo
Музыка Spotify Web API (spotipy)

📋 Требования

  • ОС: Linux
  • Python: 3.9+
  • Системные пакеты:
sudo apt-get update
sudo apt-get install -y portaudio19-dev libasound2-dev mpg123

💡 Для управления громкостью необходим pactl или amixer (обычно из pulseaudio-utils/alsa-utils).

🚀 Установка

  1. Клонируйте репозиторий:
git clone https://github.com/your-username/alexander_smart-speaker.git
cd alexander_smart-speaker
  1. Настройте виртуальное окружение:
python -m venv venv
source venv/bin/activate  # или venv\Scripts\activate на Windows
pip install -r requirements.txt

⚙️ Настройка

  1. Создайте файл конфигурации:
cp .env.example .env
  1. Обязательные переменные окружения:
PERPLEXITY_API_KEY=your_perplexity_api_key_here
DEEPGRAM_API_KEY=your_deepgram_api_key_here
PORCUPINE_ACCESS_KEY=your_porcupine_access_key_here
  1. Полная конфигурация (как в .env.example):
PERPLEXITY_API_KEY=your_perplexity_api_key_here
PERPLEXITY_MODEL=llama-3.1-sonar-small-128k-chat
DEEPGRAM_API_KEY=your_deepgram_api_key_here
PORCUPINE_ACCESS_KEY=your_porcupine_access_key_here
PORCUPINE_SENSITIVITY=0.8
TTS_EN_SPEAKER=en_0
WEATHER_LAT=63.56
WEATHER_LON=53.69
WEATHER_CITY=Ухта
SPOTIFY_CLIENT_ID=your_spotify_client_id
SPOTIFY_CLIENT_SECRET=your_spotify_client_secret
SPOTIFY_REDIRECT_URI=http://localhost:8888/callback

▶️ Запуск

make run
# или
python run.py

🗣️ Примеры голосовых команд

Категория Команды
Активация Alexandr
Диалог Почему небо голубое?
Погода Какая сейчас погода?, Погода в Москве
Перевод Переведи на английский: как дела
Таймер Поставь таймер на 5 минут
Будильник Поставь будильник на 7:30, Будильник по будням в 8:00
Секундомер Запусти секундомер, Покажи активные секундомеры
Громкость Громкость 5
Spotify Включи музыку, Пауза, Что сейчас играет
Игра Давай сыграем в города
Остановка Стоп, Хватит, Повтори

🛠️ Полезные команды

Команда Назначение
make run Запуск ассистента
make check Базовая проверка проекта
make qwen-context Собрать контекст проекта

📁 Структура проекта

alexander_smart-speaker/
├── run.py                 # точка входа
├── app/
│   ├── main.py           # главный цикл ассистента
│   ├── audio/            # wake word, STT, TTS, громкость
│   ├── core/             # конфиг, AI, роутинг команд, утилиты
│   └── features/         # погода, будильник, таймер, секундомер, музыка, города
├── assets/               # модели и звуки
├── data/                 # сохраненные будильники/таймеры/секундомеры
└── scripts/              # скрипты для установки и обслуживания

🔧 Диагностика проблем

Проблема Решение
Ошибки STT/AI Проверьте ключи в .env
Нет звука Проверьте системное устройство вывода и утилиты pactl/amixer
Не играет будильник/таймер Убедитесь, что установлен mpg123
Spotify не управляется Проверьте SPOTIFY_*, авторизацию и наличие активного устройства

📄 Лицензия

MIT, см. LICENSE.txt.


Если вам понравился проект, поставьте звезду!

Description
No description provided
Readme 1.1 MiB
Languages
Python 99.6%
Shell 0.3%