Как создать голосового ассистента с Whisper и GPT

Пошаговое руководство по созданию голосового ассистента на Python — Whisper для распознавания, GPT для ответов, TTS для озвучки.

Голосовой ассистент на Whisper и GPT

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

Официальная карточка модели GPT-4o Transcribe
Карточка модели распознавания речи в официальной документации OpenAI. Проверено 20 июля 2026 года.

Архитектура одной воспроизводимой версии

Поток выглядит так: микрофон записывает WAV, VAD определяет конец реплики, STT возвращает текст, LLM готовит короткий ответ, TTS пишет аудиофайл. На первом прототипе сохраняйте промежуточный текст и длительность каждого шага. Без этого невозможно понять, где возникла ошибка или задержка.

ЭтапВходВыходОтказ
VAD / записьМикрофонWAVТишина, обрыв начала, слишком длинная запись
Whisper STTWAVТекстПустой текст, ошибка имени или числа
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 без выдуманных цифр

Этапp50p95Что делать при превышении
Конец реплики / VADизмеритьизмеритьНастроить порог тишины
STTизмеритьизмеритьПроверить размер аудио и выбранный режим
LLM до первого токенаизмеритьизмеритьСократить контекст или сменить модель
TTS до первого звукаизмеритьизмеритьВключить потоковую выдачу

Измеряйте p50 и p95 на одних и тех же репликах. Среднее скрывает редкие длинные паузы, которые сильнее всего мешают диалогу.

Приватность, стоимость и качество

  • Не отправляйте записи во внешний API без понятного основания и политики хранения.
  • Считайте стоимость по фактическим минутам аудио, токенам LLM и объёму синтеза.
  • Для локального варианта учитывайте железо, электричество, обновления и очередь.
  • Проверяйте имена, числа и команды на отдельном наборе; ошибка команды опаснее стилистической шероховатости.
  • Любое действие с внешним эффектом подтверждайте отдельно от распознавания речи.

Частые вопросы

Можно ли заменить Whisper другой STT-моделью?

Да. Граница компонента — текстовый результат и метаданные. Сравните кандидатов на одном наборе аудио.

Нужен ли потоковый API?

Для прототипа нет. Для живого диалога потоковая транскрибация и TTS сокращают ощущаемую паузу.

Как тестировать ошибки распознавания?

Подготовьте эталонные фразы с именами, числами, командами и шумом. Отдельно считайте критические ошибки, которые меняют действие.

Можно ли сделать ассистента полностью локальным?

Да, заменив STT, LLM и TTS локальными компонентами. После этого всё равно нужны измерения качества и задержки.

Источники и дата проверки

Связанные материалы

Сохранённые ссылки эксперимента

Telegram-канал @toolarium