← Все статьи

Голосовой звонок сразу нескольким ИИ в одном окне: как сделать «позвонить Claude, GPT и DeepSeek» с перебиванием

Голосовой звонок сразу нескольким ИИ в одном окне: как сделать «позвонить Claude, GPT и DeepSeek» с перебиванием

Коротко о главном (BLUF)

В этом материале мы разбираем ключевые аспекты работы с нейросетями: актуальные модели, практические советы по промптам и примеры генераций. Читайте дальше, чтобы узнать подробности.

В большинстве чатов с ИИ голос выглядит так: диктуешь сообщение, ждёшь, читаешь ответ. Это не разговор — это надиктовка. Мы в NeuralSpace сделали в разделе «Чат» полноценный голосовой звонок: ты говоришь, модель отвечает голосом в реальном врем��ни, её можно перебивать, и позвонить можно любой модели — Claude, GPT, DeepSeek — в одном и том же окне. Разбор, как это устроено и почему сложнее, чем кажется.

Почему «надиктовка» ≠ разговор

Живой разговор держится на двух вещах, которых нет у push-to-talk интерфейсов:

  1. Низкая задержка. Пауза в 3–4 секунды между вашей репликой и ответом убивает ощущение диалога. Модель должна начинать отвечать почти сразу.
  2. Перебивание (barge-in). В живой речи мы перебиваем постоянно: «стоп, не то», «короче», «а можно…». Если ассистент договаривает свою длинную мысль, игнорируя, что вы уже говорите, — это не собеседник, это автоответчик.

Оба пункта — про архитектуру потоков, а не про «подключить синтез речи».

Архитектура

Полнодуплексный тракт: непрерывный вход, стриминг токенов в озвучку, обрыв ответа при перебивании
Полнодуплексный тракт: непрерывный вход, стриминг токенов в озвучку, обрыв ответа при перебивании

Полнодуплексный тракт. Микрофон стримится непрерывно, распознавание идёт параллельно с воспроизведением ответа. Ключевой момент: как только детектор речи ловит, что пользователь заговорил во время ответа модели, воспроизведение немедленно останавливается, недоговорённый ответ обрезается, а то, что модель успела сказать до перебивания, корректно уходит в контекст — чтобы она понимала, на чём её прервали.

Модель-агностик. Самое интересное решение — единый голосовой слой поверх разных моделей. Пользователь в одном окне переключает собеседника: сейчас разговаривает с Claude, через минуту — с GPT, потом с DeepSeek. Для этого голосовой тракт (распознавание + детекция речи + логика перебивания + синтез) отвязан от конкретной модели: модель — это сменный «мозг» за общим голосовым интерфейсом. Тракт работает с абстрактным потоком «реплика → поток токенов ответа → озвучка» и не знает, кто стоит за ним.

Стриминг ответа в озвучку. Чтобы не ждать, пока модель допишет весь ответ, токены уходят в синтез по мере генерации, чанками по границам предложений. Это даёт низкую задержку и делает перебивание естественным: обрываем ровно на том, что уже произнесено.

Грабли

  • Ложное срабатывание barge-in. Кашель, фоновый шум, «угу» — модель замолкает не вовремя. Пришлось калибровать порог детектора речи, чтобы отличать реальную реплику от шума.
  • Контекст после перебивания. Если просто выкинуть недоговорённый ответ, модель «забывает», что вообще отвечала. Мы сохраняем произнесённую часть как её ход в диалоге — тогда «стоп, а вот про второе подробнее» работает осмысленно.
  • Переключение модели в живом разговоре. История диалога общая, но у моделей разные форматы и «характер». Мы нормализуем историю так, чтобы новая модель подхватывала разговор, а не начинала с чистого листа.

Зачем это

Разные модели сильны в разном: одна лучше рассуждает, другая креативнее, третья быстрее и дешевле для болтовни. Голосовой звонок с переключением превращает это в естественный сценарий: обсудил идею с одной, попросил вторую покритиковать, третью — накидать вариантов. Всё голосом, в одном окне, с возможностью перебить в любой момент. Тот же голосовой тракт лежит под голосовым агентом для сайтов — там он ещё и кнопки нажимает.

Если строите голосовые интерфейсы поверх языковых моделей — интересно обсудить, как вы решаете barge-in и сохранение контекста при обрыве. Попробовать звонок: neuralspace.pro/chat.

🇬🇧 English version

Voice in most AI chats is really just dictation: you speak a message, wait, read a reply. That's not a conversation. In the NeuralSpace chat we built an actual voice call: you talk, the model replies out loud in real time, you can interrupt it, and you can call any model — Claude, GPT, DeepSeek — in the same window. Here's the architecture, and why it's harder than “add TTS.”

Why dictation ≠ conversation

  1. Low latency. A 3–4 second gap between your turn and the reply kills the feel. The model has to start answering almost immediately.
  2. Barge-in. In real speech we interrupt constantly (“stop, wrong one”, “shorter”, “wait—”). If the assistant finishes its long thought while you're already talking, it's an answering machine, not a partner.

Both are streaming-architecture problems, not “plug in TTS” problems.

Architecture

Full-duplex pipeline: continuous input, tokens streamed into speech, playback cut on interruption
Full-duplex pipeline: continuous input, tokens streamed into speech, playback cut on interruption

Full-duplex pipeline. The mic streams continuously; recognition runs in parallel with playback. The moment voice detection catches the user speaking during the model's reply, playback stops instantly, the unfinished reply is truncated, and whatever the model said before the interruption is committed to context — so it knows where it got cut off.

Model-agnostic. The most interesting decision: one voice layer over many models. The user switches who they're talking to in the same window — Claude now, GPT a minute later, then DeepSeek. The voice pipeline (recognition + voice detection + barge-in control + synthesis) is decoupled from the specific model: the model is a swappable “brain” behind a shared voice interface, working on an abstract “turn → token stream → speech” flow.

Streaming the reply into speech. Instead of waiting for the full answer, tokens go to synthesis as they generate, chunked on sentence boundaries. That's what gives low latency and makes interruption natural: we cut exactly at what's already been spoken.

Gotchas

  • False barge-in. Coughs, background noise, “mhm” made it stop at the wrong time. We had to calibrate the voice-detection threshold to tell a real turn from noise.
  • Context after interruption. If you just drop the unfinished reply, the model “forgets” it was even answering. We keep the spoken part as its turn, so “stop — tell me more about the second point” works.
  • Switching model mid-call. History is shared, but models differ in format and character. We normalize the history so the new model picks up the conversation instead of starting fresh.

Why bother

Different models are good at different things — one reasons better, one's more creative, one's faster and cheaper for chatting. Voice-calling with switching makes that natural: talk an idea through with one, have a second critique it, a third brainstorm variants. All by voice, one window, interrupt anytime. The same voice pipeline sits under our embeddable voice agent — there it also clicks buttons.

If you build voice interfaces over language models, we're curious how you handle barge-in and context on truncation. Try it: neuralspace.pro/chat.

Часто задаваемые вопросы (FAQ)

Вопрос: Как получить лучший результат от нейросети?
Ответ: Используйте подробные промпты (описания) на английском языке, задавайте стиль и детали сцены.

Вопрос: Можно ли использовать эти материалы в коммерческих целях?
Ответ: Да, сгенерированный контент полностью принадлежит вам.