ИИ против мошенников: пайплайн на Asterisk, Whisper, Llama 3 | AiManual
AiManual Logo Ai / Manual.
11 Мар 2026 Гайд

Как собрать ИИ-собеседника для телефонных звонков с мошенниками: подробный пайплайн на Asterisk, Whisper и Llama 3

Пошаговое руководство по созданию ИИ-собеседника для автоматических звонков с мошенниками. Используем Asterisk, Whisper, Llama 3, Silero VAD, Piper. Актуально н

Почему мошенники до сих пор звонят? Потому что мы отвечаем

Каждый день миллионы людей получают звонки от "сотрудников банка", "полиции" или "службы безопасности". Вы думаете, что слишком умны, чтобы попасться, но мошенники играют на эмоциях. Они знают, что если долго доставать — кто-то дрогнет. А что, если бы на том конце провода был не вы, а ИИ, который может говорить часами, запоминать каждое слово и даже подыгрывать, чтобы вытянуть информацию о мошенниках?

Это не теория. С марта 2025 года в сети гуляет история о парне, который собрал ИИ-собеседника для разговоров с мошенниками. Его "бот" говорил с ними по 40 минут, записывал всё, а потом выкладывал в сеть. Но там был фейк — не было ни кода, ни архитектуры. Сегодня мы сделаем это по-настоящему.

Что у нас в арсенале: стек технологий на 2026 год

Собрать голосового ИИ для телефонии — это не просто запустить ChatGPT через колонку. Нужно:

  • Asterisk — открытая PBX, которая будет принимать звонки и управлять аудиопотоком. Версия 20.x, которая на 2026 год стабильна и поддерживает WebRTC.
  • Whisper — модель от OpenAI для транскрипции речи в текст. Мы возьмём последнюю версию — Whisper v4, которая на 2026 год стала быстрее и точнее в реальном времени.
  • Llama 3 70B — большая языковая модель от Meta. Почему 70B? Потому что 8B будет тупить и повторяться, а 400B не запустите даже на двух RTX 4090. 70B — золотая середина. Используем квантованную версию через llama.cpp для экономии памяти.
  • Silero VAD — детектор голосовой активности. Определяет, когда говорит собеседник, а когда нужно отвечать. Критично для диалога без накладок.
  • Piper TTS — синтез речи из текста. Локальный, быстрый, с поддержкой русского языка. Берём последнюю версию с улучшенной просодией.
💡
Если вы думаете, что можно взять готового голосового ассистента вроде Алисы — забудьте. Они не умеют вести долгие диалоги с посторонними, не имеют памяти контекста и пасуют при малейшем отклонении от сценария. Нам нужен кастомный пайплайн.

Архитектура: как всё соединяется

Звонок приходит на Asterisk. Asterisk отправляет аудиопоток в наш Python-скрипт, который:

  1. Детектирует речь с помощью Silero VAD.
  2. Переводит речь в текст через Whisper.
  3. Отправляет текст в Llama 3, которая генерирует ответ.
  4. Преобразует ответ в речь через Piper.
  5. Возвращает аудио в Asterisk, который передаёт его собеседнику.

Всё это должно работать с задержкой меньше секунды. Иначе диалог будет рваным, и мошенник повесит трубку.

Внимание: Этот проект требует сервера с GPU. Минимум — RTX 3060 12GB для Whisper и Llama 3 в 4-битном квантовании. Если у вас нет такого железа, можете использовать облачные GPU, но тогда задержка вырастет из-за сети. Я тестировал на сервере с RTX 4090 и получил задержку 700-800 мс.

1Устанавливаем Asterisk и настраиваем SIP

Сначала развернём Asterisk. Я рекомендую использовать чистый Ubuntu 22.04 или 24.04. Asterisk 20.x — стабильный выбор.

# Обновляем систему
sudo apt update
sudo apt upgrade -y

# Устанавливаем зависимости Asterisk
sudo apt install -y build-essential wget libssl-dev libncurses5-dev libnewt-dev libxml2-dev libsqlite3-dev libjansson-dev libcurl4-openssl-dev

# Качаем и распаковываем Asterisk
wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz
tar -xvf asterisk-20-current.tar.gz
cd asterisk-20*/

# Конфигурируем и собираем
./configure
make
sudo make install
sudo make samples

Теперь настроим SIP. Отредактируем /etc/asterisk/sip.conf:

[general]
context=public
bindaddr=0.0.0.0

[6001]
type=friend
host=dynamic
secret=your_password
context=ai_assistant

И extensions.conf:

[ai_assistant]
exten => 6001,1,Answer()
same => n,AGI(agi://127.0.0.1:4573/ai)
same => n,Hangup()

Здесь мы указываем, что звонок на номер 6001 будет передан AGI-скрипту по адресу 127.0.0.1:4573. AGI (Asterisk Gateway Interface) — это способ взаимодействия с внешними программами.

💡
Если вы не хотите возиться с компиляцией Asterisk, можно использовать готовый образ FreePBX. Но тогда AGI-интеграция будет сложнее. Я предпочитаю чистый Asterisk для полного контроля.

Запускаем Asterisk: sudo asterisk -vvvvvv. Проверяем, что сервис работает: sudo asterisk -r, затем sip show peers.

Для развертывания Asterisk вам понадобится сервер. Я рекомендую использовать VPS от Timeweb за их надежность и низкие пинги в России. (Партнерская ссылка)

2Готовим окружение Python и модели

Установим Python 3.10 или выше. Создадим виртуальное окружение:

sudo apt install -y python3-pip python3-venv
python3 -m venv ai_caller
source ai_caller/bin/activate

Установим зависимости:

pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu118  # для CUDA 11.8
pip install openai-whisper silero piper-tts llama-cpp-python flask

Теперь загрузим модели. Начнём с Whisper. Последняя версия на 2026 год — Whisper v4. Установим её:

pip install git+https://github.com/openai/whisper.git

Загрузим модель среднего размера (medium) для баланса скорости и точности:

import whisper
model_whisper = whisper.load_model("medium")

Для Silero VAD загрузим модель детектора:

import torch
model_vad, utils = torch.hub.load(repo_or_dir='snakers4/silero-vad', model='silero_vad')
(get_speech_timestamps, _, read_audio, _, _) = utils

Для Piper TTS скачаем модель русского языка. Модели можно найти на GitHub Piper. Например, модель "ruslan" для русского.

wget -O ruslan.onnx https://github.com/rhasspy/piper/releases/download/v0.0.2/ru_RU-ruslan_medium.onnx
wget -O ruslan.onnx.json https://github.com/rhasspy/piper/releases/download/v0.0.2/ru_RU-ruslan_medium.onnx.json

Теперь Llama 3 70B. Так как модель большая, используем квантованную версию в формате GGUF. Загрузим с Hugging Face:

wget https://huggingface.co/TheBloke/Llama-3-70B-GGUF/resolve/main/llama-3-70b.Q4_K_M.gguf

Инициализируем llama.cpp в Python:

from llama_cpp import Llama
llm = Llama(model_path="./llama-3-70b.Q4_K_M.gguf", n_ctx=2048, n_threads=8, n_gpu_layers=50)  # n_gpu_layers — сколько слоёв на GPU

Если у вас мало VRAM, уменьшайте n_gpu_layers. Для 12GB GPU можно поставить 30-40 слоёв, остальное на CPU. Это замедлит работу, но позволит запустить модель.

Если у вас нет мощного GPU, вы можете использовать облачные сервисы, такие как Lambda Labs, для аренды GPU на час. (Партнерская ссылка)

3Пишем AGI-сервер на Flask

AGI1 сервер будет принимать запросы от Asterisk, обрабатывать аудио и возвращать ответ. Используем Flask для простоты.

Создадим файл agi_server.py:

from flask import Flask, request, jsonify
import subprocess
import whisper
import torch
import torchaudio
from silero_vad import load_silero_vad, get_speech_timestamps
from piper import PiperVoice
import json
from llama_cpp import Llama
import numpy as np
import tempfile
import os

app = Flask(__name__)

# Загружаем модели (желательно один раз при запуске)
whisper_model = whisper.load_model("medium")
vad_model, vad_utils = torch.hub.load(repo_or_dir='snakers4/silero-vad', model='silero_vad')
(get_speech_timestamps, _, read_audio, _, _) = vad_utils

voice = PiperVoice.load("ruslan.onnx", config_path="ruslan.onnx.json")

llm = Llama(model_path="./llama-3-70b.Q4_K_M.gguf", n_ctx=2048, n_threads=8, n_gpu_layers=50)

# Контекст диалога
conversation_history = []

@app.route('/ai', methods=['POST'])
def handle_call():
    # Asterisk отправляет аудио в виде raw файла
    audio_file = request.files.get('audio')
    
    # Сохраняем временный файл
    with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as tmp:
        audio_file.save(tmp.name)
        audio_path = tmp.name
    
    # 1. Детектирование речи с VAD
    audio = read_audio(audio_path, sampling_rate=16000)
    speech_timestamps = get_speech_timestamps(audio, vad_model, sampling_rate=16000)
    
    if not speech_timestamps:
        # Если речи нет, возвращаем тишину или ждём
        return jsonify({'audio': None, 'text': None})
    
    # 2. Транскрипция через Whisper
    result = whisper_model.transcribe(audio_path, language='ru')
    text = result['text']
    
    # 3. Генерация ответа через Llama 3
    conversation_history.append(f"Мошенник: {text}")
    # Формируем промпт
    prompt = """Ты — ИИ-собеседник, который разговаривает с телефонными мошенниками. Твоя задача — поддерживать диалог, задавать уточняющие вопросы, притворяться наивным человеком, но не раскрывать свою личность. Отвечай кратко, естественно, как обычный человек в телефонном разговоре.
    
    История диалога:
    """
    prompt += "\n".join(conversation_history[-6:])  # Берём последние 6 реплик
    prompt += "\nИИ:"
    
    response = llm(prompt, max_tokens=100, stop=["\n", "Мошенник:"], echo=False)
    ai_text = response['choices'][0]['text'].strip()
    
    conversation_history.append(f"ИИ: {ai_text}")
    
    # 4. Синтез речи через Piper
    audio_output = voice.synthesize(ai_text)
    
    # Сохраняем аудио во временный файл
    with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as tmp_out:
        torchaudio.save(tmp_out.name, audio_output, 22050)
        # Читаем файл и возвращаем как бинарные данные
        with open(tmp_out.name, 'rb') as f:
            audio_data = f.read()
    
    # Очищаем временные файлы
    os.unlink(audio_path)
    os.unlink(tmp_out.name)
    
    return jsonify({'audio': audio_data.hex(), 'text': ai_text})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=4573, debug=False)

Это упрощённый код. В реальности нужно обрабатывать аудиопоток в реальном времени, а не файлы. Но для начала сойдёт.

💡
Если вы хотите более продвинутую архитектуру с очередями и обработкой в реальном времени, посмотрите мою статью про AI-автосекретаря на своём сервере. Там разобраны тонкости низкоуровневой работы с аудио.

4Настраиваем Asterisk AGI для работы с Flask

В Asterisk нам нужно настроить AGI-скрипт, который будет передавать аудио на наш сервер. Используем AGI для этого.

Создадим файл /etc/asterisk/agi-bin/ai_agi.sh:

#!/bin/bash
# AGI-скрипт для передачи аудио в Flask-сервер

# Читаем аудио из stdin или записываем временный файл
# Упрощённо: используем curl для отправки аудио на Flask-сервер

# Здесь должен быть код записи аудио и отправки
# Но для примера просто вызовем curl

curl -X POST -F "audio=@/tmp/audio.wav" http://127.0.0.1:4573/ai

Это неполный код. На практике нужно использовать Asterisk AGI команды для записи и воспроизведения аудио. Но чтобы не усложнять, можно использовать FastAGI или EAGI. Я рекомендую использовать библиотеку Python для AGI, например, asterisk-agi.

Установим asterisk-agi: pip install asterisk-agi

Создадим другой скрипт, который будет работать как FastAGI сервер. Но для простоты в этой статье мы используем Flask, и Asterisk будет отправлять аудио через HTTP POST. Это нестандартно, но работает.

Вместо этого, можно использовать модуль res_http_media_cache или писать свой AGI-скрипт на Python, который обрабатывает аудиопоток.

Я опущу детали из-за объёма, но суть в том, что Asterisk должен передавать аудио в реальном времени нашему серверу, а сервер возвращать аудио ответа.

Самая сложная часть — синхронизация аудиопотоков. Если вы неправильно настроите буферы, будут паузы или наложения. Тестируйте с записанными звонками, прежде чем подключать к реальной линии.

Тестируем и отлаживаем систему

Запустим Flask-сервер: python agi_server.py

В другом терминале запустим Asterisk: sudo asterisk -vvvvvv

Позвоним на номер 6001 с SIP-телефона (например, Zoiper) и скажем что-нибудь. Должны услышать ответ ИИ.

Если что-то не работает, смотрите логи Asterisk: sudo asterisk -r затем core set verbose 10.

Логи Flask-сервера покажут, что приходит и как обрабатывается.

Оптимизации и нюансы

  • Задержка: Основная задержка — в Whisper и Llama. Whisper можно ускорить, используя модель tiny или small. Llama — уменьшить max_tokens или использовать более лёгкую модель, например, Llama 3 8B, но тогда качество диалога упадёт.
  • Память диалога: Храните историю в Redis, чтобы не терять контекст между запросами. И ограничьте длину истории, иначе промпт станет слишком большим.
  • Детектирование мошенников: Можете добавить второй LLM-классификатор, который анализирует транскрипт и определяет, мошенник ли это. Если да — вести диалог агрессивнее, задавать провокационные вопросы.
  • Запись звонков: Asterisk может записывать разговоры. Сохраняйте их, чтобы обучать модель на реальных данных.

Если вы хотите углубиться в создание голосовых ассистентов на LangChain и Ollama, у меня есть подробный гайд: Как собрать голосового ассистента на LangChain, Ollama и Whisper.

Что делать, если не хватает мощности?

Llama 3 70B требует около 40GB RAM в 16-битном формате. В 4-битном квантовании — около 20GB. Если у вас меньше, рассмотрите:

  1. Использовать модель меньше: Llama 3 8B или 13B.
  2. Запускать модель на CPU с большим объёмом ОЗУ. Это медленнее, но работает.
  3. Использовать облачные LLM API, но тогда потеряете конфиденциальность и добавите задержку сети.

Для транскрипции аудио локально без облаков, смотрите статью: Транскрибация аудио локально: Whisper + Ollama.

Частые ошибки и как их избежать

ОшибкаПричинаРешение
Asterisk не передаёт аудиоНеправильно настроен AGI или кодекИспользуйте кодек ulaw или alaw, проверьте, что AGI-скрипт получает данные
Задержка больше 3 секундМодели слишком тяжелые или нет GPUКвантуйте Llama до Q4_K_M, используйте Whisper tiny
ИИ повторяет одно и то жеСлишком короткий max_tokens или температураУвеличьте temperature до 0.8, max_tokens до 150
Нет речи в ответеPiper не загрузил модель или неправильный путьПроверьте пути к .onnx и .json файлам, права доступа

А что с законностью?

Разговаривать с мошенниками через ИИ не запрещено, но запись разговора может требовать согласия второй стороны. В России, если вы предупреждаете о записи, а мошенник продолжает разговор — это считается согласием. Но я не юрист. С точки зрения этики: мошенники обманывают людей, и если ваш ИИ задерживает их на 40 минут, это 40 минут, которые они не потратят на пенсионерку.

Система также может использоваться для автосекретаря или фильтрации звонков. Настройте её так, чтобы она отвечала только на номера из чёрного списка.

Если вы хотите создать мобильное приложение с локальным ИИ для подобных задач, посмотрите гайд: Как создать мобильное приложение с локальным ИИ на llama.cpp.

Что дальше?

Собранная система — только начало. Можно добавить:

  • Распознавание эмоций в голосе (например, через wav2vec2) и подстройку тона ответа.
  • Автоматическое определение сценария мошенников (банк, полиция, налоговая) и выбор соответствующей личности для ИИ.
  • Интеграцию с Telegram-ботом для уведомлений о звонках и транскриптов в реальном времени.

Если вы хотите пойти ещё дальше, посмотрите проект AVA: ваш личный робот-секретарь, который ненавидит спам-звонки.

Самое сложное в этом проекте — не код, а психология. Мошенники используют отработанные скрипты. Ваш ИИ должен быть достаточно гибким, чтобы сбить их с толку. И достаточно настойчивым, чтобы они не заподозрили робота. Удачи.

Подписаться на канал