Микрокомпьютер: Raspberry Pi 4 (рекомендуется) или Orange Pi
Микрофон: USB-микрофон (например, Fifine K669) или матричный (ReSpeaker 4-Mic Array)
Динамик: Любой USB/Bluetooth-динамик
SD-карта: От 16 ГБ (для ОС и моделей ИИ)
Vosk(лучший оффлайн-вариант):
1. Контекстное понимание:
- Использование Rasa NLU для сложных диалогов
- Пример: _"Выключи свет в гостиной, но оставь на кухне"_
Голосовая идентификация:
Биометрия голоса через speaker-recognition
Разные профили для членов семьи
Оффлайн TTS:
# RHVoice (русские голоса)
from rhvoice_wrapper import RHVoice
engine = RHVoice(voice='Anna')
engine.say('Свет включён', 'output.wav')
# RHVoice (русские голоса) Оффлайн TTS:
from rhvoice_wrapper import RHVoice
engine = RHVoice(voice='Anna')
engine.say('Свет включён', 'output.wav')
Вот готовый рабочий код оффлайн голосового ассистента для Raspberry Pi, который можно скопировать целиком:
#!/usr/bin/env python3
import pyaudio
from vosk import Model, KaldiRecognizer
import json
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
from time import sleep
# Настройки GPIO
GPIO.setmode(GPIO.BCM)
LIGHT_PIN = 17
GPIO.setup(LIGHT_PIN, GPIO.OUT)
# Настройки MQTT
MQTT_BROKER = "localhost"
MQTT_PORT = 1883
# Инициализация MQTT клиента
client = mqtt.Client()
client.connect(MQTT_BROKER, MQTT_PORT)
# Путь к модели Vosk (скачать с https://alphacephei.com/vosk/models)
MODEL_PATH = "vosk-model-small-ru"
model = Model(MODEL_PATH)
recognizer = KaldiRecognizer(model, 16000)
# Настройка аудиопотока
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=16000,
input=True,
frames_per_buffer=8192,
input_device_index=0)
print("Голосовой ассистент запущен. Говорите...")
def handle_command(command):
command = command.lower()
# Управление светом через GPIO
if "включи свет" in command:
GPIO.output(LIGHT_PIN, GPIO.HIGH)
print("Свет включен")
elif "выключи свет" in command:
GPIO.output(LIGHT_PIN, GPIO.LOW)
print("Свет выключен")
# Отправка команд по MQTT
elif "включи розетку" in command:
client.publish("home/socket", "ON")
print("Розетка включена")
elif "выключи розетку" in command:
client.publish("home/socket", "OFF")
print("Розетка выключена")
try:
while True:
data = stream.read(4096, exception_on_overflow=False)
if recognizer.AcceptWaveform(data):
result = json.loads(recognizer.Result())
if 'text' in result and len(result['text']) > 0:
print(f"Распознано: {result['text']}")
handle_command(result['text'])
except KeyboardInterrupt:
print("\nЗавершение работы...")
finally:
stream.stop_stream()
stream.close()
p.terminate()
GPIO.cleanup()
client.disconnect()
Что нужно сделать перед запуском:
Установите зависимости:
sudo apt-get install python3-pyaudio
pip3 install vosk paho-mqtt RPi.GPIO
Скачайте русскую языковую модель Vosk:
wget https://alphacephei.com/vosk/models/vosk-model-small-ru-0.22.zip
unzip vosk-model-small-ru-0.22.zip
mv vosk-model-small-ru-0.22 vosk-model-small-ru
Для управления устройствами по MQTT установите Mosquitto:
sudo apt-get install mosquitto mosquitto-clients
Запустите скрипт:
python3 voice_assistant.py
Это система для оффлайн преобразования текста в голос (Text-to-Speech) с использованием русского голосового движка RHVoice.🧠 Что это такое?
🔧 Базовый пример кода
from rhvoice_wrapper import RHVoice
engine = RHVoice(voice='Anna') # Выбор голоса
engine.say('Свет включён', 'output.wav') # Синтез в файл
📥 Установка
# Для Ubuntu/Debian:
sudo apt install rhvoice rhvoice-language-russian
pip3 install rhvoice-wrapper
🗣 Доступные голоса
Anna
(женский, рекомендован)Elena
(женский)Irina
(женский)Artemiy
(мужской)💡 Интеграция с ассистентом
from rhvoice_wrapper import RHVoice
import os
engine = RHVoice(voice='Anna')
def speak(text):
engine.say(text, 'response.wav')
os.system('aplay response.wav') # Проигрываем звук
speak("Лампочка активирована")
⚡ Альтернативные TTS-решения
Библиотека
Языки
Качество
RHVoice
RU/EN
Хорошее
Silero
RU
Отличное
eSpeak
50+
Роботизированное
🧠 Нейросетевой Silero
import torch
model = torch.hub.load('snakers4/silero-models', 'tts', 'ru')
model.speak('Привет мир', 'out.wav')
🚀 Продвинутые функции
# Изменение параметров голоса
engine.say('Текст', speed=1.2, pitch=0.8)
# Синтез без сохранения в файл
audio_data = engine.synthesize('Текст')
⚠️ Важно
Anna
звучит наиболее естественно
Комментарии