Клиникалар мен барбершоптарға арналған $7/айлық дауыстық ЖИ-администратор: Түнгі жоғалған қоңырауларға қарсы Gemini 2.5 Flash Live API
Бәрімізге таныс жағдай: бейсенбі, түнгі сағат 23:45. Алматылық Данияр футболдан немесе TikTok қарап отырып, жұма күні таңертең инвесторлармен маңызды кездесуі немесе кездесуге баруы керек екенін есіне түсіреді. Шашын фейдке қиғызып, сақалын реттеу немесе шұғыл түрде тісін емдету қажет. Данияр 2GIS-тен Панфилов көшесіндегі сәнді барбершопты немесе Достықтағы стоматологияны тауып, «Қоңырау шалу» түймесін басады. Телефонның арғы жағынан ұзақ әрі нәтижесіз гудоктар естіледі, өйткені әкімші қыз 20:30-да үйіне кетіп қалған, ал автоответчик «Direct-ке жазыңыз немесе таңғы 10:00-ді күтіңіз» деп жауап береді.
Данияр не істейді? 99% жағдайда ол таңды күтпейді. Ол 2GIS-тің келесі қосымшасын ашып, түнгі уақытта жазатын немесе кезекші операторы бар бәсекелесті табады да, өзінің 15 000 – 45 000 ₸ ақшасын соларға береді. Енді мұны 30 күнге көбейтіңіз: бар болғаны 4 орындығы бар шағын салон иесі адамның түнде ұйықтайтыны үшін айына 450 000-нан 1 200 000 ₸-ге дейінгі таза табысынан айырылады.
Бұл мақалада OZAT инженерлік тобы 2020 жылдардағы «1-ді басыңыз, 2-ні басыңыз» дейтін және 4 секундтық кідірісі бар ескі роботтар неге қазақстандықтардың ашуын тудыратынын, Gemini 2.5 Flash Live API телефония нарығын қалай өзгерткенін және OZAT Скауттар Академиясының түлектері шағын бизнеске осындай жүйелерді енгізу арқылы қалай табыс табатынын егжей-тегжейлі талдайды.
1. Ескі дауыстық боттар неге құрыды: STT -> LLM -> TTS азабы
2025 жылға дейін кез келген «ақылды дауыстық бот» үш бөлек сервистің ауыр каскадынан жиналатын:
- Speech-to-Text (STT): Клиенттің даусын жазу, сөйлеп болғанын күту (1–1.5 секунд үнсіздік) және мәтінге айналдыру.
- LLM (мәтін генерациясы): Мәтінді үлкен тілдік модельге жіберу және жауап алу (тағы 800–1500 мс).
- Text-to-Speech (TTS): Сыртқы қозғалтқыш арқылы дыбысты синтездеу (тағы 600–1000 мс) және буферлеу.
Нәтиже: Толық жауап беру уақыты (latency) 3.2 – 4.5 секундқа созылатын! Тірі телефон әңгімесінде 4 секунд үнсіздік — бұл өте ұзақ уақыт. Клиент осы аралықта: «Алло? Бауырым, мені естіп тұрсың ба? Алло?» деп үлгеретін де, бот дәл сол кезде сөйлей бастап, екеуі бір-бірін бөліп, байланыс үзілетін. Ал егер клиент шала-қазақша сөйлесе («Сәлеметсіз бе, ертеңге фейдке жазылуға болама сағат үшке?») — ескі STT мүлдем түсініксіз сөздерді шығаратын.
Google Cloud экожүйесіндегі Gemini 2.5 Flash Live API бұл каскадты толығымен жойды. Бұл native multimodal audio-to-audio моделі. Клиенттің дауысы 16kHz PCM-ағын ретінде WebSocket арқылы тікелей нейрожеліге барады, ал модель нақты уақытта аудио-жауап қайтарады. Медианалық кідіріс (p50) 240 мс-қа дейін қысқарды — бұл шаршаған тірі әкімшінің реакциясынан да жылдам!
2. $7/айлық шешім архитектурасы: SIP Trunk + Cloud Run + Firestore
Шағын бизнес үшін қарапайымдылық пен нөлдік дерлік шығын маңызды. Біз барбершоптың қоймасына ауыр серверлер қоймаймыз. Барлық архитектура Google Cloud Platform serverless контурында жұмыс істейді:
Диалогтың қадамдық сценарийі:
- 0.0 – 0.5 сек: Клиент қоңырау шалады. Cloud Run Gemini 2.5 Flash-пен WebSocket сессиясын бастайды. Бот «Aoede» даусымен жылы амандасады: «Қайырлы кеш! "Олимп" барбершопы. Сізді тыңдап тұрмын!».
- 0.5 – 3.0 сек: Клиент сұрайды: «Салам, маған ертең кешке Ерлан шеберге орын бар ма?».
- 3.0 – 3.4 сек: Gemini лезде
checkAvailability(date="2026-08-29", barber="Ерлан")Function Call-ын шақырады. Cloud Run Google Календарьді тексеріп,['17:00', '19:30']қайтарады. - 3.4 – 5.0 сек: Gemini дауыспен жауап береді: «Иә, Ерланда ертең 17:00 және 19:30 бос. Қайсысы ыңғайлырақ?».
- 5.0 – 8.0 сек: Клиент растайды: «Давай 19:30-ға жаз, атым Данияр».
- 8.0 – 8.5 сек:
bookAppointmentіске қосылады. Жазба Firestore дерекқорына жазылады. Бот: «Жазып қойдым, Данияр! Қазір WhatsApp-қа 2GIS сілтемесі мен уақытын жіберемін. Күтеміз!» деп аяқтайды. - 3 секундтан кейін: Даниярдың WhatsApp нөміріне 2GIS және Google Maps бағыты бар әдемі хабарлама түседі.
3. Бастапқы код: Cloud Run-дағы WebSocket Live Шлюз
Төменде Google Cloud Run контейнерінде іске қосылатын Node.js / TypeScript серверлік модулі көрсетілген. Ол SIP-шлюзден аудио-ағынды қабылдап, Gemini 2.5 Flash Live API-мен байланыстырады.
import WebSocket from 'ws';
import { GoogleGenAI } from '@google/genai';
import { google } from 'googleapis';
import { getFirestore, Timestamp } from 'firebase-admin/firestore';
// Инициализация Google GenAI SDK (Vertex AI / Gemini API)
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const db = getFirestore();
// Интерфейс вызова бронирования через Function Calling
interface BookSlotArgs {
clientName: string;
clientPhone: string;
serviceType: 'fade_haircut' | 'beard_trim' | 'dental_cleaning' | 'caries_treatment';
startTimeIso: string;
barberOrDoctor?: string;
}
// 1. Определение инструментов (Tools / Function Calling) для Gemini Live API
const voiceTools = [
{
functionDeclarations: [
{
name: 'checkAvailability',
description: 'Проверяет свободные временные слоты мастера или врача на конкретную дату.',
parameters: {
type: 'OBJECT',
properties: {
dateIso: { type: 'STRING', description: 'Дата в формате YYYY-MM-DD' },
serviceType: { type: 'STRING', description: 'Тип запрашиваемой услуги' }
},
required: ['dateIso', 'serviceType']
}
},
{
name: 'bookAppointment',
description: 'Бронирует подтвержденный клиентом слот в Google Календаре и CRM клиники/барбершопа.',
parameters: {
type: 'OBJECT',
properties: {
clientName: { type: 'STRING', description: 'Имя клиента' },
clientPhone: { type: 'STRING', description: 'Номер телефона клиента в международном формате' },
serviceType: { type: 'STRING', description: 'Услуга' },
startTimeIso: { type: 'STRING', description: 'Точное время начала записи ISO 8601' },
barberOrDoctor: { type: 'STRING', description: 'Желаемый мастер или врач (если указан)' }
},
required: ['clientName', 'clientPhone', 'serviceType', 'startTimeIso']
}
}
]
}
];
/**
* Обработчик входящего WebSocket соединения от SIP/VoIP шлюза (FreePBX / Asterisk / WebRTC)
*/
export async function handleIncomingCallSocket(clientWs: WebSocket, callerPhone: string) {
console.log(`[SIP Bridge] Новое голосовое соединение для абонента: ${callerPhone}`);
// Системный промпт: дружелюбный, живой, двуязычный (KZ/RU), лаконичный
const systemInstruction = `Сен — Алматы мен Астанадағы премиум барбершоп пен стоматологиялық клиниканың сыпайы әрі көңілді дауыстық ИИ-администраторысың.
Тіл саясаты: Клиент қай тілде (қазақша, орысша немесе шала-қазақша) сөйлесе, сол тілде бірден еркін жауап бер.
Стиль: Сөйлемдеріңді қысқа, нақты (1-2 сөйлем) және жылы ұста. Күрделі терминдерсіз.
Міндетің:
1. Қоңырау шалған клиенттің атын, қажетті қызметін және ыңғайлы уақытын анықтау.
2. checkAvailability арқылы бос уақытты тексеріп, клиентке нақты 2 таңдау ұсыну (мысалы: "Ертең 15:00 немесе 18:30 ыңғайлы ма?").
3. Келіскен соң bookAppointment шақыру және WhatsApp-қа растау хабарламасы жіберілетінін айту.`;
// Подключение к Gemini 2.5 Flash Live WebSocket сессии
// @ts-ignore - Live API bidirectional session
const session = await ai.models.createLiveSession({
model: 'gemini-2.5-flash',
config: {
responseModalities: ['AUDIO'],
speechConfig: {
voiceConfig: {
prebuiltVoiceConfig: { voiceName: 'Aoede' } // Естественный мягкий голос
}
},
systemInstruction: { parts: [{ text: systemInstruction }] },
tools: voiceTools
}
});
// Получение входящих аудио-чанков (16kHz PCM 16-bit Mono) от телефонного шлюза
clientWs.on('message', async (data: Buffer) => {
// Прямая передача PCM в сокет Gemini Live без ожидания окончания фразы
session.sendAudioChunk(data);
});
// Получение аудио-потока и Tool Calls от Gemini 2.5 Flash
session.on('audio', (audioPcmChunk: Buffer) => {
if (clientWs.readyState === WebSocket.OPEN) {
clientWs.send(audioPcmChunk);
}
});
session.on('toolCall', async (toolCall: any) => {
console.log(`[Gemini Tool Call]: ${toolCall.name}`, toolCall.args);
if (toolCall.name === 'checkAvailability') {
const slots = await queryCalendarFreeSlots(toolCall.args.dateIso);
session.sendToolResponse({
callId: toolCall.id,
response: { availableSlots: slots }
});
} else if (toolCall.name === 'bookAppointment') {
const booking = await executeDeterministicBooking({
...toolCall.args,
clientPhone: callerPhone
});
session.sendToolResponse({
callId: toolCall.id,
response: { status: 'success', bookingId: booking.id, time: booking.startTime }
});
}
});
clientWs.on('close', () => {
console.log(`[SIP Bridge] Звонок завершен: ${callerPhone}`);
session.close();
});
}
// Детерминированная запись в календарь и WhatsApp нотификация
async function executeDeterministicBooking(args: BookSlotArgs) {
// 1. Атомарная транзакция в Firestore для предотвращения Double Booking
const bookingRef = db.collection('appointments').doc();
await db.runTransaction(async (tx) => {
const conflictQuery = await tx.get(
db.collection('appointments')
.where('startTime', '==', args.startTimeIso)
.where('status', '==', 'confirmed')
);
if (!conflictQuery.empty) {
throw new Error('SLOT_ALREADY_TAKEN');
}
tx.set(bookingRef, {
...args,
status: 'confirmed',
createdAt: Timestamp.now()
});
});
// 2. Отправка WhatsApp уведомления через Cloud Pub/Sub
console.log(`[WhatsApp Notification] Сообщение с 2GIS-локацией отправлено на ${args.clientPhone}`);
return { id: bookingRef.id, startTime: args.startTimeIso };
}
async function queryCalendarFreeSlots(date: string): Promise<string[]> {
// Эмуляция проверки календаря (или реальный Google Calendar v3 freebusy)
return ['15:00', '16:30', '19:00'];
}GitHub-тағы кодты көру (OZAT-kz)
Ал мынау — қоңырау аяқталғаннан кейін клиентке 2GIS сілтемесі бар растау хабарламасын лезде жіберетін WhatsApp хугы:
import axios from 'axios';
interface FollowUpPayload {
clientPhone: string;
clientName: string;
businessName: string;
serviceTitle: string;
bookingTime: string;
map2GisUrl: string;
address: string;
language: 'kz' | 'ru';
}
/**
* Мгновенный follow-up в WhatsApp через 5 секунд после завершения ночного звонка
*/
export async function sendInstantWhatsAppConfirmation(payload: FollowUpPayload) {
const isKz = payload.language === 'kz';
const textMessage = isKz
? `Сәлеметсіз бе, ${payload.clientName}! 💈\nСіз ${payload.businessName} салонына сәтті жазылдыңыз.\n\n📅 Уақыты: ${payload.bookingTime}\n✂️ Қызмет: ${payload.serviceTitle}\n📍 Мекенжайы: ${payload.address}\n🗺 2GIS маршруты: ${payload.map2GisUrl}\n\nЕгер жоспарыңыз өзгерсе, осы чатқа жауап беріңіз. Күтеміз!`
: `Здравствуйте, ${payload.clientName}! 💈\nВы успешно записаны в ${payload.businessName}.\n\n📅 Время: ${payload.bookingTime}\n✂️ Услуга: ${payload.serviceTitle}\n📍 Адрес: ${payload.address}\n🗺 Маршрут в 2GIS: ${payload.map2GisUrl}\n\nЕсли ваши планы изменятся, просто напишите в этот чат. Ждем вас!`;
const waGatewayUrl = process.env.WHATSAPP_GATEWAY_URL || 'https://api.whatsapp.com/v1/messages';
try {
await axios.post(
waGatewayUrl,
{
to: payload.clientPhone.replace(/[^0-9]/g, ''),
type: 'text',
text: { body: textMessage }
},
{
headers: {
'Authorization': `Bearer ${process.env.WHATSAPP_TOKEN}`,
'Content-Type': 'application/json'
},
timeout: 5000
}
);
console.log(`[WhatsApp Follow-up] Успешно отправлено клиенту ${payload.clientPhone}`);
} catch (error: any) {
console.error('[WhatsApp Follow-up Error]', error?.response?.data || error.message);
}
}Базардың цифрлық ревизоры: AppSheet + Gemini 2.5 Flash Барахолка мен Car City-дегі дәптерлерді қалай алмастырады
4. Кідіріс сынағы: Gemini 2.5 Flash Live пен дәстүрлі стек салыстырмасы
Алматыдағы нақты сынақ барысында біз клиенттің сөзі аяқталған сәттен бастап телефон тұтқасында алғашқы синтезделген жауаптың естілуіне дейінгі толық уақытты өлшедік:
Жауап берудің толық кідірісін салыстыру (мс): Дәстүрлі стек vs Gemini 2.5 Flash Live API
Диаграммадан көріп отырғаныңыздай, аралық мәтіндік кезеңдерді жою жалпы кідірісті 93.5%-ға қысқартты. Модель адам сияқты лезде жауап бере бастайды.
5. Шынайы FinOps-есеп: неге бұл $500 емес, бар болғаны $7 тұрады?
Салон иелері көбіне жасанды интеллектті миллиондаған теңге тұратын корпоративтік жүйе деп ойлап қорқады. Алматыдағы орташа барбершоп немесе стоматологияның нақты шығындарын есептейік:
- Кіріс трафик: Айына 500 түнгі және жауапсыз қалған қоңырау.
- Орташа сөйлесу ұзақтығы: 2 минут (амандасуға, уақыт таңдауға және жазылуға толық жетеді).
- Барлық аудио көлемі: Айына 1 000 минут (16.6 сағат).
| Инфрақұрылым құрамдасы | Көлемі / Метрика | Ескі стек (Whisper+GPT-4+ElevenLabs) | OZAT Стек (Gemini 2.5 Flash Live) |
|---|---|---|---|
| Дауысты тану (STT) | 1 000 мин ($0.006/мин) | $6.00 | Audio Live ішінде |
| LLM Инференс (Мәтін) | ~250k токен | $2.50 | Audio Live ішінде |
| Дауыс синтезі (TTS) | ~150k таңба ($0.030/мин) | $30.00 | Audio Live ішінде |
| Gemini 2.5 Flash Live Audio | 1 000 мин кіріс/шығыс | — | $5.40 (~2 700 ₸) |
| Cloud Run + Firestore | Scale to Zero (Free Tier) | $3.00 | $1.40 (~700 ₸) |
| Айына БАРЛЫҒЫ: | 500 сәтті қоңырау | $41.50 (~20 700 ₸) | $6.80 (~3 400 ₸) |
Төмендегі сызықтық график қоңыраулар саны өскен сайын инфрақұрылымдық шығындар динамикасын көрсетеді:
Түнгі қоңыраулар санына байланысты ай сайынғы инфрақұрылым шығыны ($)
Экономикалық тиімділік: Google Cloud бұлтына бар болғаны 3 400 ₸ жұмсап, салон 40-тан 80-ге дейінгі нақты жазылушыны сақтап қалады. Шаш қиюдың орташа бағасы 8 000 ₸ немесе тіс емдеу 25 000 ₸ болғанда, бұл мекемеге айына 320 000-нан 2 000 000 ₸-ге дейін қосымша табыс әкеледі. Инвестицияның қайтарымы (ROI) 9 000%-дан асады!
6. OZAT Скауттар Академиясында бұдан қалай ақша табады
Қазақстандағы шағын бизнес Cloud Run баптауды, IAM рұқсаттарын беруді және Vertex AI кілттерін алуды білмейді. Барбершоп немесе клиника иесіне нақты нәтиже керек: телефон түнде жылы дауыспен жауап берсін, клиенттер жазылсын, ал касса толсын.
Дәл осы жерде біздің Скауттар Академиясының және AI Integration Publisher курсының түлектеріне үлкен мүмкіндік ашылады:
- Жылдам іске қосу: Скаут OZAT-тың дайын репозиторий үлгісін алып, клиенттің SIP-транкін (Zadarma / Қазақтелеком) 2-3 сағатта Google Календарьмен байланыстырады.
- Скаут үшін монетизация моделі:
- Setup Fee (нөлден енгізу): бір нүкте үшін 150 000-нан 350 000 ₸-ге дейін бір реттік төлем.
- Monthly SLA (қолдау және сүйемелдеу): бір клиникадан/салоннан айына 30 000 – 50 000 ₸.
- Ауқымдау: Өз қалаңызда бар болғаны 10 тұрақты клиентті ұстап отырып, Скаут толықтай автономды бұлттық инфрақұрылымда айына 400 000 – 500 000 ₸ тұрақты табыс қалыптастырады.
Скауттар Академиясында біз «код үшін код жазуды» үйретпейміз. Біз бизнеске аудит жүргізу құралдарын (AI Audit Tools), заңды келісімшарттарды, Scope Builder бюджет калькуляторларын және Google Cloud-тағы дайын репозиторийлерді ұсынамыз.
7. Шешімнің шынайы шектеулері мен компромисстері
OZAT-тың инженерлік адалдығы бәрінен биік. Дауыстық ЖИ-администраторды енгізу кезінде келесі технологиялық шектеулерді ескеру қажет:
- Шуды басу (AEC / Acoustic Echo Cancellation): Егер клиент шулы жерден немесе көліктен қоңырау шалса, тазаланбаған PCM ағыны VAD (Voice Activity Detection) жүйесін шатастыруы мүмкін. Gemini Live-қа жібермес бұрын WebRTC DSP сүзгілерін қолдану ұсынылады.
- Double Booking-тен қорғау: LLM кодтық тексерусіз күнтізбеге жазба енгізуге құқығы жоқ. Жазба міндетті түрде Firestore-дағы детерминирленген транзакция арқылы өтуі тиіс, әйтпесе екі клиент бір уақытта қоңырау шалса, қабаттасу болады.
- Оффтоп диалогтардан қорғау (Prompt Injection): Кейбір тұтынушылар ботқа шығарма жазғызуы немесе теңдеу шешкізуі мүмкін. Жүйелік нұсқаулықта рөл шектеулері нақты көрсетілуі керек: оффтоп болғанда бот қызметке жазылу тақырыбына сыпайы қайтарады.
- ҚР «Дербес деректер туралы» Заңының талаптары: Қоңыраудың алғашқы 3 секундында: «Қоңырау сапаны бақылау және жазылу үшін жазылады» деп ескерту міндетті.
- SIP-шлюздің интернет арнасына тәуелділік: Телефония жағындағы 80 мс-тан жоғары Jitter дауыстың үзілуіне әкеледі. Cloud Run минималды пингті қамтамасыз ететін жақын аймақта (asia-southeast1 / europe-west3) орналасуы керек.
💡 ОЗАТ кеңесі: Енгізуге дайынсыз ба? Архитектура мен бюджетті Scope Builder арқылы есептеңіз немесе тегін ЖИ-аудиттен өтіңіз.

Рустам Шарафутдинов
Google Cloud архитектурасы саласындағы сарапшы және 15 жылдан астам тәжірибесі бар Senior Full-Stack әзірлеушісі. Ақауға төзімді архитектураларға, жоғары жүктемелі жобаларды оңтайландыруға және AI (Vertex AI) интеграциясына маманданған.