Как создать голосового ассистента с Whisper и GPT
Пошаговое руководство по созданию голосового ассистента на Python — Whisper для распознавания, GPT для ответов, TTS для озвучки.
Проверено 20 июля 2026 года. Минимальный голосовой ассистент принимает запись, распознаёт её через Whisper, отправляет текст в GPT и озвучивает ответ через TTS. Рабочий прототип занимает немного кода, но качество продукта определяется VAD, задержкой каждого этапа, обработкой ошибок, приватностью и возможностью перебить длинный ответ.

Архитектура одной воспроизводимой версии
Поток выглядит так: микрофон записывает WAV, VAD определяет конец реплики, STT возвращает текст, LLM готовит короткий ответ, TTS пишет аудиофайл. На первом прототипе сохраняйте промежуточный текст и длительность каждого шага. Без этого невозможно понять, где возникла ошибка или задержка.
| Этап | Вход | Выход | Отказ |
|---|---|---|---|
| VAD / запись | Микрофон | WAV | Тишина, обрыв начала, слишком длинная запись |
| Whisper STT | WAV | Текст | Пустой текст, ошибка имени или числа |
| GPT | Текст и инструкция | Короткий ответ | Тайм-аут, неподходящее действие, длинный ответ |
| TTS | Текст ответа | MP3/WAV | Неверное произношение или недоступный сервис |
Минимальный сквозной код
Пример использует официальный Python SDK. До запуска задайте OPENAI_API_KEY и подготовьте файл speech.wav.
from openai import OpenAI
client = OpenAI()
with open("speech.wav", "rb") as audio:
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio,
)
reply = client.responses.create(
model="gpt-5.6-luna",
input=[{
"role": "user",
"content": f"Ответь по-русски, максимум двумя предложениями: {transcript.text}",
}],
)
with client.audio.speech.with_streaming_response.create(
model="tts-1",
voice="alloy",
input=reply.output_text,
) as response:
response.stream_to_file("reply.mp3")Для рабочего сервиса добавьте тайм-ауты, повтор только безопасных операций, ограничение размера файла и журнал без содержимого чувствительных реплик. Модели и тарифы меняются, поэтому держите их в конфигурации, а не в нескольких местах кода.
Latency budget без выдуманных цифр
| Этап | p50 | p95 | Что делать при превышении |
|---|---|---|---|
| Конец реплики / VAD | измерить | измерить | Настроить порог тишины |
| STT | измерить | измерить | Проверить размер аудио и выбранный режим |
| LLM до первого токена | измерить | измерить | Сократить контекст или сменить модель |
| TTS до первого звука | измерить | измерить | Включить потоковую выдачу |
Измеряйте p50 и p95 на одних и тех же репликах. Среднее скрывает редкие длинные паузы, которые сильнее всего мешают диалогу.
Приватность, стоимость и качество
- Не отправляйте записи во внешний API без понятного основания и политики хранения.
- Считайте стоимость по фактическим минутам аудио, токенам LLM и объёму синтеза.
- Для локального варианта учитывайте железо, электричество, обновления и очередь.
- Проверяйте имена, числа и команды на отдельном наборе; ошибка команды опаснее стилистической шероховатости.
- Любое действие с внешним эффектом подтверждайте отдельно от распознавания речи.
Частые вопросы
Можно ли заменить Whisper другой STT-моделью?
Да. Граница компонента — текстовый результат и метаданные. Сравните кандидатов на одном наборе аудио.
Нужен ли потоковый API?
Для прототипа нет. Для живого диалога потоковая транскрибация и TTS сокращают ощущаемую паузу.
Как тестировать ошибки распознавания?
Подготовьте эталонные фразы с именами, числами, командами и шумом. Отдельно считайте критические ошибки, которые меняют действие.
Можно ли сделать ассистента полностью локальным?
Да, заменив STT, LLM и TTS локальными компонентами. После этого всё равно нужны измерения качества и задержки.
Источники и дата проверки
- OpenAI Whisper model card.
- Официальная карточка Whisper API.
- Официальная карточка TTS-1.
- Текущий каталог моделей OpenAI.