
Голосовые ассистенты давно перестали быть просто игрушкой — теперь это полноценные цифровые помощники, которые умеют общаться, искать информацию и даже шутить (иногда лучше некоторых людей). В этой статье разберём, как собрать своего кастомного ассистента с нуля на Python, используя современные NLP-инструменты. Без Siri, без Alexa, всё своё, родное.
Зачем всё это?
Когда голосовой ассистент отвечает тебе по делу — это магия. Но чтобы эта магия случилась, под капотом крутится куча хитрых технологий: автоматическое распознавание речи (ASR), обработка естественного языка (NLP), диалоговые модели, синтез речи (TTS)… и если хоть одна часть запнётся — привет, хаос. А ещё желательно, чтобы он не сливал все данные на сервера третьих лиц, да?
В этой статье покажу, как собрать своего ассистента, который будет работать локально, понимать речь, говорить в ответ и помнить, о чём вы с ним говорили. Всё на Python, по-взрослому.
Архитектура голосового ассистента
Вот базовые блоки системы:
-
ASR (Automatic Speech Recognition) — распознавание речи из микрофона.
-
NLP Engine — обработка текста, понимание намерений.
-
Dialogue Manager — управление диалогом, логикой взаимодействия.
-
TTS (Text-to-Speech) — озвучивание ответа.
-
API Layer — если ассистенту нужно что-то искать или выполнять действия.
Мы будем использовать:
-
Whisper от OpenAI для распознавания речи.
-
Rasa в качестве движка для диалогов и NLP.
-
pyttsx3 для синтеза речи.
-
SpeechRecognition для захвата голоса.
Часть 1: Распознавание речи с Whisper
Whisper — это модель от OpenAI, которая умеет распознавать аудио. Можно использовать её локально через whisper или faster-whisper.
Пример кода на Python:
import whisper
import sounddevice as sd
import numpy as np
import scipy.io.wavfile
model = whisper.load_model("base")
def record_audio(duration=5, fs=16000):
print("Говори...")
audio = sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype='int16')
sd.wait()
return np.squeeze(audio)
def save_wav(filename, audio, fs=16000):
scipy.io.wavfile.write(filename, fs, audio)
audio = record_audio()
save_wav("temp.wav", audio)
result = model.transcribe("temp.wav")
print("Ты сказал:", result["text"])
Часть 2: NLP с Rasa
Rasa позволяет строить полноценные диалоговые системы с определением намерений, слотов, контекста.
# nlu.yml
version: "3.1"
nlu:
- intent: greet
examples: |
- Привет
- Здравствуй
- Доброе утро
- intent: ask_weather
examples: |
- Какая погода?
- Что там с погодой?
- Будет дождь?
# domain.yml
intents:
- greet
- ask_weather
responses:
utter_greet:
- text: "Привет! Чем могу помочь?"
utter_weather:
- text: "Погода отличная, солнышко светит!"
Дальше пишем stories, запускаем rasa train
, и всё — диалоговая логика работает.
Часть 3: Синтез речи
Для TTS можно использовать pyttsx3
, он работает оффлайн и довольно шустрый.
import pyttsx3
engine = pyttsx3.init()
engine.say("Привет! Я твой голосовой ассистент.")
engine.runAndWait()
Можно выбрать голос, скорость, тональность. На винде и маке разные голоса, но общее API — одинаковое.
Часть 4: Склеиваем всё вместе
Теперь мы можем построить полный цикл:
-
Голос → текст (Whisper)
-
Текст → интент (Rasa)
-
Ответ → текст (Rasa)
-
Текст → речь (pyttsx3)
# main.py
from rasa.core.agent import Agent
from whisper import load_model
import pyttsx3
agent = Agent.load('models') # путь к модели rasa
asr_model = load_model("base")
tts = pyttsx3.init()
while True:
audio = record_audio()
save_wav("temp.wav", audio)
result = asr_model.transcribe("temp.wav")
user_text = result["text"]
response = agent.handle_text(user_text)
if response:
reply = response[0]['text']
print(f"Ассистент: {reply}")
tts.say(reply)
tts.runAndWait()
Что можно улучшить?
-
Заменить
pyttsx3
наCoqui TTS
илиVITS
для более человеческого голоса. -
Добавить память и историю диалога с базой данных.
-
Подключить внешние API — погоду, календари, заметки.
Заключение
Сделать своего голосового ассистента — это не так сложно, как может показаться. Главное — не пытаться сделать сразу как у Google или Amazon. Маленькими шагами можно дойти до вполне приличного помощника. И самое главное — он будет именно таким, как тебе нужно.
А потом можно уже и добавить ему характер. Пусть бурчит по утрам или говорит «Мастер, вы сегодня великолепны».
Если статья оказалась полезной — попробуйте реализовать хотя бы базовую версию ассистента. Поверьте, это очень затягивает. Особенно, когда ассистент впервые называет вас по имени.
Автор: kris_petrova