- BrainTools - https://www.braintools.ru -
Голосовые ассистенты давно перестали быть просто игрушкой — теперь это полноценные цифровые помощники, которые умеют общаться, искать информацию и даже шутить (иногда лучше некоторых людей). В этой статье разберём, как собрать своего кастомного ассистента с нуля на Python, используя современные NLP-инструменты. Без Siri, без Alexa, всё своё, родное.
Когда голосовой ассистент отвечает тебе по делу — это магия. Но чтобы эта магия случилась, под капотом крутится куча хитрых технологий: автоматическое распознавание речи (ASR), обработка естественного языка (NLP), диалоговые модели, синтез речи (TTS)… и если хоть одна часть запнётся — привет, хаос. А ещё желательно, чтобы он не сливал все данные на сервера третьих лиц, да?
В этой статье покажу, как собрать своего ассистента, который будет работать локально, понимать речь, говорить в ответ и помнить, о чём вы с ним говорили. Всё на Python, по-взрослому.
Вот базовые блоки системы:
ASR (Automatic Speech Recognition) — распознавание речи из микрофона.
NLP Engine — обработка текста, понимание намерений.
Dialogue Manager — управление диалогом, логикой [1] взаимодействия.
TTS (Text-to-Speech) — озвучивание ответа.
API Layer — если ассистенту нужно что-то искать или выполнять действия.
Мы будем использовать:
Whisper от OpenAI для распознавания речи.
Rasa в качестве движка для диалогов и NLP.
pyttsx3 для синтеза речи.
SpeechRecognition для захвата голоса.
Whisper — это модель от OpenAI, которая умеет распознавать аудио. Можно использовать её локально через whisper или faster-whisper.
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"])
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
, и всё — диалоговая логика работает.
Для TTS можно использовать pyttsx3
, он работает оффлайн и довольно шустрый.
import pyttsx3
engine = pyttsx3.init()
engine.say("Привет! Я твой голосовой ассистент.")
engine.runAndWait()
Можно выбрать голос, скорость, тональность. На винде и маке разные голоса, но общее API — одинаковое.
Теперь мы можем построить полный цикл:
Голос → текст (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
для более человеческого голоса.
Добавить память [2] и историю диалога с базой данных.
Подключить внешние API — погоду, календари, заметки.
Сделать своего голосового ассистента — это не так сложно, как может показаться. Главное — не пытаться сделать сразу как у Google или Amazon. Маленькими шагами можно дойти до вполне приличного помощника. И самое главное — он будет именно таким, как тебе нужно.
А потом можно уже и добавить ему характер. Пусть бурчит по утрам или говорит «Мастер, вы сегодня великолепны».
Если статья оказалась полезной — попробуйте реализовать хотя бы базовую версию ассистента. Поверьте, это очень затягивает. Особенно, когда ассистент впервые называет вас по имени.
Автор: kris_petrova
Источник [3]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/13922
URLs in this post:
[1] логикой: http://www.braintools.ru/article/7640
[2] память: http://www.braintools.ru/article/4140
[3] Источник: https://habr.com/ru/articles/897862/?utm_campaign=897862&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.