
Голосовые ассистенты давно перестали быть просто игрушкой — теперь это полноценные цифровые помощники, которые умеют общаться, искать информацию и даже шутить (иногда лучше некоторых людей). В этой статье разберём, как собрать своего кастомного ассистента с нуля на 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. Маленькими шагами можно дойти до вполне приличного помощника. И самое главное — он будет именно таким, как тебе нужно.
А потом можно уже и добавить ему характер. Пусть бурчит по утрам или говорит «Мастер, вы сегодня великолепны».
Если статья оказалась полезной — попробуйте реализовать хотя бы базовую версию ассистента. Поверьте, это очень затягивает. Особенно, когда ассистент впервые называет вас по имени.
ссылка на оригинал статьи https://habr.com/ru/articles/897862/
Добавить комментарий