# πŸŽ™οΈ Alexander Smart Speaker **Голосовой ассистСнт для Linux с wake word, STT/TTS ΠΈ Π½Π°Π±ΠΎΡ€ΠΎΠΌ голосовых Π½Π°Π²Ρ‹ΠΊΠΎΠ²** [![Python](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/) [![Linux](https://img.shields.io/badge/Linux-FCC624?logo=linux&logoColor=black)](https://www.linux.org/) [![License](https://img.shields.io/github/license/your-username/alexander_smart-speaker)](LICENSE.txt)
## ✨ ВозмоТности | Ѐункция | ОписаниС | |--------|----------| | πŸ”Š **Активация ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΌΡƒ слову** | Активация ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ `Alexandr` | | 🧠 **Π”ΠΈΠ°Π»ΠΎΠ³ с AI** | ВзаимодСйствиС с Perplexity с сохранСниСм контСкста | | 🌐 **ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄** | ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ RU ↔ EN с ΠΎΠ·Π²ΡƒΡ‡ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ | | 🌀️ **Погода** | Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΠΎΠ³ΠΎΠ΄Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ ΠΏΠΎ названию Π³ΠΎΡ€ΠΎΠ΄Π° | | ⏰ **Π’Π°ΠΉΠΌΠ΅Ρ€Ρ‹ ΠΈ Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊΠΈ** | Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°ΠΌΠΈ, Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊΠ°ΠΌΠΈ ΠΈ сСкундомСрами | | πŸ”Š **Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒΡŽ** | Π Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° систСмной громкости | | 🎡 **Spotify интСграция** | Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ воспроизвСдСниСм (play/pause/next/current track) | | 🌍 **Π˜Π³Ρ€Π° Π² Π³ΠΎΡ€ΠΎΠ΄Π°** | ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠ°Ρ ΠΈΠ³Ρ€Π° Π² Π³ΠΎΡ€ΠΎΠ΄Π° | ## πŸ—οΈ АрхитСктура ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ### Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° взаимодСйствия ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ```mermaid graph TB subgraph "Основной Ρ†ΠΈΠΊΠ» (app/main.py)" A[main() - основной Ρ†ΠΈΠΊΠ»] --> B{Π Π΅ΠΆΠΈΠΌ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ} B -->|ОТиданиС wake word| C[wait_for_wakeword()] B -->|Π Π΅ΠΆΠΈΠΌ Π΄ΠΈΠ°Π»ΠΎΠ³Π°| D[listen() Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ follow-up] C --> E[ΠŸΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹] D --> E E --> F[Анализ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹] end subgraph "Аудио подсистСма (app/audio/)" C1[wakeword.py
- wait_for_wakeword()
- check_wakeword_once()] E1[stt.py
- listen()
- get_recognizer()] G1[tts.py
- speak()
- initialize()] H1[sound_level.py
- parse_volume_text()
- set_volume()] C1 -.-> E1 E1 -.-> G1 H1 -.-> G1 end subgraph "Π―Π΄Ρ€ΠΎ (app/core/)" F1[commands.py
- is_stop_command()
- _normalize_text()] F2[ai.py
- ask_ai_stream()
- translate_text()] F3[cleaner.py
- clean_response()] F4[config.py
- Настройки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°] F5[smalltalk.py
- get_smalltalk_response()] F --> F1 F --> F2 F --> F3 F --> F5 end subgraph "Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ (app/features/)" I1[weather.py
- get_weather_report()] I2[timer.py
- get_timer_manager()] I3[alarm.py
- get_alarm_clock()] I4[stopwatch.py
- get_stopwatch_manager()] I5[music.py
- get_music_controller()] I6[cities_game.py
- get_cities_game()] 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 ``` ## πŸ› οΈ Π’Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ | ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ | ВСхнология | |-----------|------------| | **Wake word** | `pvporcupine` | | **STT** | `deepgram-sdk` | | **TTS** | `Silero` (`torch`, `torchaudio`) | | **AI** | Perplexity API | | **Погода** | Open-Meteo | | **ΠœΡƒΠ·Ρ‹ΠΊΠ°** | Spotify Web API (`spotipy`) | ## πŸ“‹ ВрСбования - **ОБ**: Linux - **Python**: 3.9+ - **БистСмныС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹**: ```bash sudo apt-get update sudo apt-get install -y portaudio19-dev libasound2-dev mpg123 ``` > πŸ’‘ Для управлСния Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ `pactl` ΠΈΠ»ΠΈ `amixer` (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠ· `pulseaudio-utils`/`alsa-utils`). ## πŸš€ Установка 1. **ΠšΠ»ΠΎΠ½ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ**: ```bash git clone https://github.com/your-username/alexander_smart-speaker.git cd alexander_smart-speaker ``` 2. **НастройтС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅**: ```bash python -m venv venv source venv/bin/activate # ΠΈΠ»ΠΈ venv\Scripts\activate Π½Π° Windows pip install -r requirements.txt ``` ## βš™οΈ Настройка 1. **Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ**: ```bash cp .env.example .env ``` 2. **ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния**: ```ini PERPLEXITY_API_KEY=your_perplexity_api_key_here DEEPGRAM_API_KEY=your_deepgram_api_key_here PORCUPINE_ACCESS_KEY=your_porcupine_access_key_here ``` 3. **Полная конфигурация** (ΠΊΠ°ΠΊ Π² `.env.example`): ```ini 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 ``` ## ▢️ Запуск ```bash 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](LICENSE.txt). ---
**Если Π²Π°ΠΌ понравился ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΏΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ⭐ Π·Π²Π΅Π·Π΄Ρƒ!**