diff --git a/README.md b/README.md index aa287e2..18a75c4 100644 --- a/README.md +++ b/README.md @@ -1,261 +1,83 @@ +# Alexander Smart Speaker +
-# πŸŽ™οΈ Alexander Smart Speaker +Голосовой ассистСнт для Linux: wake word, STT/TTS, AI-Π΄ΠΈΠ°Π»ΠΎΠ³ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ голосовыС Π½Π°Π²Ρ‹ΠΊΠΈ. -**Голосовой ассистСнт для 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) +[![Python 3.9+](https://img.shields.io/badge/Python-3.9%2B-3776AB?logo=python&logoColor=white)](https://www.python.org/) +[![Linux](https://img.shields.io/badge/Platform-Linux-FCC624?logo=linux&logoColor=111)](https://www.linux.org/) +[![MIT License](https://img.shields.io/badge/License-MIT-2ea44f)](LICENSE.txt) +[![Wake Word](https://img.shields.io/badge/Wake%20Word-Porcupine-0b7285)](https://picovoice.ai/platform/porcupine/) +[![STT](https://img.shields.io/badge/STT-Deepgram-4c6ef5)](https://deepgram.com/) +[![TTS](https://img.shields.io/badge/TTS-Silero-7950f2)](https://github.com/snakers4/silero-models)
-## ✨ ВозмоТности +## Π§Ρ‚ΠΎ это -| Ѐункция | ОписаниС | -|--------|----------| -| πŸ”Š **Активация ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΌΡƒ слову** | Активация ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ `Alexandr` | -| 🧠 **Π”ΠΈΠ°Π»ΠΎΠ³ с AI** | ВзаимодСйствиС с Perplexity с сохранСниСм контСкста | -| 🌐 **ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄** | ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ RU ↔ EN с ΠΎΠ·Π²ΡƒΡ‡ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ | -| 🌀️ **Погода** | Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΠΎΠ³ΠΎΠ΄Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ ΠΏΠΎ названию Π³ΠΎΡ€ΠΎΠ΄Π° | -| ⏰ **Π’Π°ΠΉΠΌΠ΅Ρ€Ρ‹ ΠΈ Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊΠΈ** | Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°ΠΌΠΈ, Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊΠ°ΠΌΠΈ ΠΈ сСкундомСрами | -| πŸ”Š **Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒΡŽ** | Π Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° систСмной громкости | -| 🎡 **Spotify интСграция** | Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ воспроизвСдСниСм (play/pause/next/current track) | -| 🌍 **Π˜Π³Ρ€Π° Π² Π³ΠΎΡ€ΠΎΠ΄Π°** | ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠ°Ρ ΠΈΠ³Ρ€Π° Π² Π³ΠΎΡ€ΠΎΠ΄Π° | +`Alexander Smart Speaker` ΡΠ»ΡƒΡˆΠ°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово `Alexandr`, распознаСт Ρ€Π΅Ρ‡ΡŒ, ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ ΠΎΠ·Π²ΡƒΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚. +ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ русский язык, Π½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ RU/EN сцСнарии (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΈ mixed-language TTS). -## πŸ—οΈ АрхитСктура ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° +## ВозмоТности -### Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° взаимодСйствия ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² +- Активация ΠΏΠΎ wake word `Alexandr` (Porcupine). +- РаспознаваниС Ρ€Π΅Ρ‡ΠΈ Ρ‡Π΅Ρ€Π΅Π· Deepgram (WebSocket, VAD, fast stop). +- ΠžΠ·Π²ΡƒΡ‡ΠΊΠ° Ρ‡Π΅Ρ€Π΅Π· Silero TTS (RU + EN, с ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎ wake word). +- AI-Π΄ΠΈΠ°Π»ΠΎΠ³ Ρ‡Π΅Ρ€Π΅Π· Perplexity API со streaming-ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ ΠΈ контСкстом. +- ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ RU -> EN ΠΈ EN -> RU. +- Погода: Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Π½ΠΎΠ· ΠΏΠΎ Π³ΠΎΡ€ΠΎΠ΄Ρƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ»ΠΈ ΠΏΠΎ названию Π³ΠΎΡ€ΠΎΠ΄Π°. +- Π’Π°ΠΉΠΌΠ΅Ρ€Ρ‹, Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊΠΈ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π±ΡƒΠ΄Π½ΠΈ/Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅), сСкундомСры. +- Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒΡŽ систСмы (Ρ‡Π΅Ρ€Π΅Π· `pactl`/`amixer`). +- Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Spotify (play/pause/next/what's playing). +- Мини-ΠΈΠ³Ρ€Π° "Π“ΠΎΡ€ΠΎΠ΄Π°". + +## Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ```mermaid -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()
wakeword.py
check_wakeword_once()] - E1[listen()
stt.py
get_recognizer()] - G1[speak()
tts.py
initialize()] - H1[parse_volume_text()
sound_level.py
set_volume()] - - C1 -.-> E1 - E1 -.-> G1 - H1 -.-> G1 - end - - subgraph "Π―Π΄Ρ€ΠΎ" - F1[is_stop_command()
commands.py
_normalize_text()] - F2[ask_ai_stream()
ai.py
translate_text()] - F3[clean_response()
cleaner.py] - F5[get_smalltalk_response()
smalltalk.py] - - F --> F1 - F --> F2 - F --> F3 - F --> F5 - end - - subgraph "Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ" - I1[get_weather_report()
weather.py] - I2[get_timer_manager()
timer.py] - I3[get_alarm_clock()
alarm.py] - I4[get_stopwatch_manager()
stopwatch.py] - I5[get_music_controller()
music.py] - I6[get_cities_game()
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 - +flowchart TD + A[Wake Word: Alexandr] --> B[STT: Deepgram] + B --> C{ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹} + C --> D[Feature modules] + C --> E[AI/Translation] + D --> F[TTS: Silero] + E --> F + F --> G[Follow-up Ρ€Π΅ΠΆΠΈΠΌ ΠΈΠ»ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ wake word] ``` -### Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄ ΠΎΡ‚ wake word Π΄ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ +## Быстрый старт -```mermaid -graph TD - subgraph "Активация ΠΈ распознаваниС" - A[wait_for_wakeword()
wakeword.py] --> B[listen()
stt.py] - B --> C[Распознанный тСкст] - end - - subgraph "Анализ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹" - C --> D{Π’ΠΈΠΏ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹} - end - - subgraph "ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° спСцифичСских ΠΊΠΎΠΌΠ°Π½Π΄" - D -->|Small talk| E[get_smalltalk_response()
smalltalk.py] - D -->|Π‘Ρ‚ΠΎΠΏ ΠΊΠΎΠΌΠ°Π½Π΄Π°| F[is_stop_command()
commands.py] - D -->|Π’Π°ΠΉΠΌΠ΅Ρ€| G[parse_command()
timer.py] - D -->|Π‘ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ| H[parse_command()
alarm.py] - D -->|Π‘Π΅ΠΊΡƒΠ½Π΄ΠΎΠΌΠ΅Ρ€| I[parse_command()
stopwatch.py] - D -->|Π“Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ| J[parse_volume_text()
sound_level.py
set_volume()] - D -->|Погода| K[get_weather_report()
weather.py] - D -->|ΠœΡƒΠ·Ρ‹ΠΊΠ°| L[parse_command()
music.py] - D -->|ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄| M[parse_translation_request()
ai.py
translate_text()] - D -->|Π“ΠΎΡ€ΠΎΠ΄Π°| N[handle()
cities_game.py] - D -->|ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ вопрос| O[ask_ai_stream()
ai.py] - end - - subgraph "ΠžΡ‚Π²Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ" - E --> P[clean_response()
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()
tts.py] - end - - subgraph "Π¦ΠΈΠΊΠ» управлСния" - Q --> R{ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π΄ΠΈΠ°Π»ΠΎΠ³?} - R -->|Π”Π°| S[ΠžΡΡ‚Π°Ρ‚ΡŒΡΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ оТидания] - R -->|НСт| T[Π–Π΄Π°Ρ‚ΡŒ wake word снова] - S --> B - T --> A - end - -``` - -## πŸ› οΈ Π’Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ - -| ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ | ВСхнология | -|-----------|------------| -| **Wake word** | `pvporcupine` | -| **STT** | `deepgram-sdk` | -| **TTS** | `Silero` (`torch`, `torchaudio`) | -| **AI** | Perplexity API | -| **Погода** | Open-Meteo | -| **ΠœΡƒΠ·Ρ‹ΠΊΠ°** | Spotify Web API (`spotipy`) | - -## πŸ“‹ ВрСбования - -- **ОБ**: Linux -- **Python**: 3.9+ -- **БистСмныС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹**: +### 1) БистСмныС зависимости (Ubuntu/Debian) ```bash sudo apt-get update -sudo apt-get install -y portaudio19-dev libasound2-dev mpg123 +sudo apt-get install -y portaudio19-dev libasound2-dev mpg123 pulseaudio-utils alsa-utils ``` -> πŸ’‘ Для управлСния Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ `pactl` ΠΈΠ»ΠΈ `amixer` (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠ· `pulseaudio-utils`/`alsa-utils`). +### 2) Установка Python-зависимостСй -## πŸš€ Установка - -1. **ΠšΠ»ΠΎΠ½ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ**: ```bash -git clone https://github.com/your-username/alexander_smart-speaker.git +git clone cd alexander_smart-speaker -``` - -2. **НастройтС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅**: -```bash -python -m venv venv -source venv/bin/activate # ΠΈΠ»ΠΈ venv\Scripts\activate Π½Π° Windows +python3 -m venv venv +source venv/bin/activate pip install -r requirements.txt ``` -## βš™οΈ Настройка +### 3) Настройка `.env` -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 +PERPLEXITY_API_KEY=... +DEEPGRAM_API_KEY=... +PORCUPINE_ACCESS_KEY=... ``` -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 -``` - -## ▢️ Запуск +### 4) Запуск ```bash make run @@ -263,62 +85,76 @@ make run python run.py ``` -## πŸ—£οΈ ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ голосовых ΠΊΠΎΠΌΠ°Π½Π΄ +ПослС запуска ассистСнт ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ Π² Ρ€Π΅ΠΆΠΈΠΌ оТидания Ρ„Ρ€Π°Π·Ρ‹ `Alexandr`. -| ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ | ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ | -|-----------|---------| -| **Активация** | `Alexandr` | -| **Π”ΠΈΠ°Π»ΠΎΠ³** | `ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅Π±ΠΎ Π³ΠΎΠ»ΡƒΠ±ΠΎΠ΅?` | -| **Погода** | `Какая сСйчас ΠΏΠΎΠ³ΠΎΠ΄Π°?`, `Погода Π² МосквС` | -| **ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄** | `ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄ΠΈ Π½Π° английский: ΠΊΠ°ΠΊ Π΄Π΅Π»Π°` | -| **Π’Π°ΠΉΠΌΠ΅Ρ€** | `ΠŸΠΎΡΡ‚Π°Π²ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π½Π° 5 ΠΌΠΈΠ½ΡƒΡ‚` | -| **Π‘ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ** | `ΠŸΠΎΡΡ‚Π°Π²ΡŒ Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ Π½Π° 7:30`, `Π‘ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ ΠΏΠΎ будням Π² 8:00` | -| **Π‘Π΅ΠΊΡƒΠ½Π΄ΠΎΠΌΠ΅Ρ€** | `Запусти сСкундомСр`, `ПокаТи Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ сСкундомСры` | -| **Π“Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ** | `Π“Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ 5` | -| **Spotify** | `Π’ΠΊΠ»ΡŽΡ‡ΠΈ ΠΌΡƒΠ·Ρ‹ΠΊΡƒ`, `ΠŸΠ°ΡƒΠ·Π°`, `Π§Ρ‚ΠΎ сСйчас ΠΈΠ³Ρ€Π°Π΅Ρ‚` | -| **Π˜Π³Ρ€Π°** | `Π”Π°Π²Π°ΠΉ сыграСм Π² Π³ΠΎΡ€ΠΎΠ΄Π°` | -| **ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ°** | `Π‘Ρ‚ΠΎΠΏ`, `Π₯Π²Π°Ρ‚ΠΈΡ‚`, `ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈ` | +## ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ `.env` -## πŸ› οΈ ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ +| ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ | ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ | По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ | НазначСниС | +|---|---|---|---| +| `PERPLEXITY_API_KEY` | Π”Π° | - | ΠšΠ»ΡŽΡ‡ Perplexity API | +| `PERPLEXITY_MODEL` | НСт | `llama-3.1-sonar-small-128k-chat` | МодСль Perplexity | +| `DEEPGRAM_API_KEY` | Π”Π° | - | ΠšΠ»ΡŽΡ‡ Deepgram STT | +| `PORCUPINE_ACCESS_KEY` | Π”Π° | - | ΠšΠ»ΡŽΡ‡ PicoVoice Porcupine | +| `PORCUPINE_SENSITIVITY` | НСт | `0.8` | Π§ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ wake word | +| `TTS_EN_SPEAKER` | НСт | `en_0` | Английский голос TTS | +| `WEATHER_LAT` | НСт | - | Π¨ΠΈΡ€ΠΎΡ‚Π° Π³ΠΎΡ€ΠΎΠ΄Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ | +| `WEATHER_LON` | НСт | - | Π”ΠΎΠ»Π³ΠΎΡ‚Π° Π³ΠΎΡ€ΠΎΠ΄Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ | +| `WEATHER_CITY` | НСт | `Π£Ρ…Ρ‚Π°` | Π“ΠΎΡ€ΠΎΠ΄ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΏΠΎΠ³ΠΎΠ΄Ρ‹ | +| `SPOTIFY_CLIENT_ID` | НСт | - | Spotify OAuth Client ID | +| `SPOTIFY_CLIENT_SECRET` | НСт | - | Spotify OAuth Client Secret | +| `SPOTIFY_REDIRECT_URI` | НСт | `http://localhost:8888/callback` | Redirect URI для Spotify | -| Команда | НазначСниС | -|---------|------------| +## ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ голосовых ΠΊΠΎΠΌΠ°Π½Π΄ + +| ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ | ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ | +|---|---| +| Активация | `Alexandr` | +| AI-Π΄ΠΈΠ°Π»ΠΎΠ³ | `ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅Π±ΠΎ Π³ΠΎΠ»ΡƒΠ±ΠΎΠ΅?` | +| ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ | `ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄ΠΈ Π½Π° английский: ΠΊΠ°ΠΊ Π΄Π΅Π»Π°` | +| Погода | `Какая ΠΏΠΎΠ³ΠΎΠ΄Π°?`, `Погода Π² МосквС` | +| Π’Π°ΠΉΠΌΠ΅Ρ€ | `ΠŸΠΎΡΡ‚Π°Π²ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π½Π° 5 ΠΌΠΈΠ½ΡƒΡ‚` | +| Π‘ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ | `ΠŸΠΎΡΡ‚Π°Π²ΡŒ Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ Π½Π° 7:30`, `Π‘ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ ΠΏΠΎ будням Π² 8:00` | +| Π‘Π΅ΠΊΡƒΠ½Π΄ΠΎΠΌΠ΅Ρ€ | `Запусти сСкундомСр`, `ПокаТи Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ сСкундомСры` | +| Π“Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ | `Π“Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ 7` | +| Spotify | `Π’ΠΊΠ»ΡŽΡ‡ΠΈ ΠΌΡƒΠ·Ρ‹ΠΊΡƒ`, `ΠŸΠ°ΡƒΠ·Π°`, `Π§Ρ‚ΠΎ сСйчас ΠΈΠ³Ρ€Π°Π΅Ρ‚` | +| Π˜Π³Ρ€Π° | `Π”Π°Π²Π°ΠΉ сыграСм Π² Π³ΠΎΡ€ΠΎΠ΄Π°` | +| Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠΌ | `ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈ`, `Π‘Ρ‚ΠΎΠΏ`, `Π₯Π²Π°Ρ‚ΠΈΡ‚` | + +## ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ + +| Команда | Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ | +|---|---| | `make run` | Запуск ассистСнта | -| `make check` | Базовая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° | -| `make qwen-context` | Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ контСкст ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° | +| `make check` | Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (`scripts/qwen-check.sh`) | +| `make qwen-context` | Π‘Π±ΠΎΡ€ контСкста ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (`scripts/qwen-context.sh`) | -## πŸ“ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° +## Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° -``` +```text alexander_smart-speaker/ -β”œβ”€β”€ run.py # Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° +β”œβ”€β”€ run.py β”œβ”€β”€ app/ -β”‚ β”œβ”€β”€ main.py # Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ассистСнта -β”‚ β”œβ”€β”€ audio/ # wake word, STT, TTS, Π³Ρ€ΠΎΠΌΠΊΠΎΡΡ‚ΡŒ -β”‚ β”œβ”€β”€ core/ # ΠΊΠΎΠ½Ρ„ΠΈΠ³, AI, Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³ ΠΊΠΎΠΌΠ°Π½Π΄, ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ -β”‚ └── features/ # ΠΏΠΎΠ³ΠΎΠ΄Π°, Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ, Ρ‚Π°ΠΉΠΌΠ΅Ρ€, сСкундомСр, ΠΌΡƒΠ·Ρ‹ΠΊΠ°, Π³ΠΎΡ€ΠΎΠ΄Π° -β”œβ”€β”€ assets/ # ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π·Π²ΡƒΠΊΠΈ -β”œβ”€β”€ data/ # сохранСнныС Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊΠΈ/Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹/сСкундомСры -└── scripts/ # скрипты для установки ΠΈ обслуТивания +β”‚ β”œβ”€β”€ main.py +β”‚ β”œβ”€β”€ audio/ # wakeword, stt, tts, volume +β”‚ β”œβ”€β”€ core/ # config, ai, command helpers, cleaner +β”‚ └── features/ # weather, timer, alarm, stopwatch, music, cities game +β”œβ”€β”€ assets/ +β”‚ β”œβ”€β”€ models/ # Porcupine keyword model (.ppn) +β”‚ └── sounds/ # Π·Π²ΡƒΠΊΠΈ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΈ Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊΠ° +β”œβ”€β”€ data/ # persisted JSON: alarms, timers, stopwatches +└── scripts/ ``` -## πŸ”§ Диагностика ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ +## Диагностика -| ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° | РСшСниС | -|----------|---------| -| Ошибки STT/AI | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ Π² `.env` | -| НСт Π·Π²ΡƒΠΊΠ° | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ систСмноС устройство Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ `pactl`/`amixer` | -| НС ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ/Ρ‚Π°ΠΉΠΌΠ΅Ρ€ | Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ установлСн `mpg123` | -| Spotify Π½Π΅ управляСтся | ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ `SPOTIFY_*`, Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ устройства | +| ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° | Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ | +|---|---| +| НС Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° `Alexandr` | `PORCUPINE_ACCESS_KEY`, ΠΌΠΈΠΊΡ€ΠΎΡ„ΠΎΠ½, Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ `PORCUPINE_SENSITIVITY` | +| STT Π½Π΅ распознаСт Ρ€Π΅Ρ‡ΡŒ | `DEEPGRAM_API_KEY`, сСтСвой доступ, Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ ΠΌΠΈΠΊΡ€ΠΎΡ„ΠΎΠ½ | +| НСт Π·Π²ΡƒΠΊΠ° | ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ аудиоустройство ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ `pactl`/`amixer` | +| Π‘ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ/Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π½Π΅ Π·Π²ΠΎΠ½ΠΈΡ‚ | Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ `mpg123` Π² систСмС | +| Spotify Π½Π΅ управляСтся | Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ `SPOTIFY_*`, Π΅ΡΡ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ устройство, Premium-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ | -## πŸ“„ ЛицСнзия +## ЛицСнзия -MIT, см. [LICENSE.txt](LICENSE.txt). - ---- - -
- -**Если Π²Π°ΠΌ понравился ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΏΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ⭐ Π·Π²Π΅Π·Π΄Ρƒ!** - -
\ No newline at end of file +ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ распространяСтся ΠΏΠΎ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ MIT. Π‘ΠΌ. `LICENSE.txt`.