10 KiB
10 KiB
HR Interview Integration with LiveKit
Обзор
Система интеграции для проведения голосовых собеседований с HR AI агентом через LiveKit. Пользователь общается голосом с AI, который анализирует речь, генерирует вопросы через LLM и отвечает синтезированной речью.
Архитектура
Frontend (Ready)
- ✅ Кнопка "К собеседованию" для резюме со статусом
parsed
- ✅ Страница
/interview/[id]
с проверкой доступности - ✅ Компонент
InterviewSession
с LiveKit интеграцией - ✅ Аудио-только режим (без видео)
- ✅ Управление микрофоном и завершением сессии
Backend API Requirements
1. Валидация резюме для собеседования
GET /api/resume/{resumeId}/validate-interview
Response:
{
"canInterview": true,
"message": "Resume is ready for interview"
}
Error cases:
404
- резюме не найдено400
- резюме не готово (статус неparsed
)
2. Получение токена для LiveKit
POST /api/interview/{resumeId}/token
Response:
{
"token": "livekit_jwt_token_here",
"roomName": "interview_room_123",
"serverUrl": "wss://your-livekit-server.com"
}
LiveKit Server Integration
Environment Variables
NEXT_PUBLIC_LIVEKIT_URL=wss://your-livekit-server.com
LIVEKIT_API_KEY=your_api_key
LIVEKIT_API_SECRET=your_api_secret
Server-side Components
-
LiveKit Room Management
- Создание уникальных комнат для каждого собеседования
- Управление участниками (пользователь + AI агент)
- Токены с ограниченными правами
-
Speech-to-Text Service
- Получение аудио потока от пользователя
- Конвертация речи в текст в реальном времени
- Определение пауз в речи для передачи в LLM
-
LLM Processing
- Анализ текста от пользователя
- Генерация вопросов на основе резюме
- Контекст предыдущих ответов
- Логика завершения собеседования
-
Text-to-Speech Service
- Конвертация ответов LLM в аудио
- Передача аудио потока через LiveKit
Data Flow
sequenceDiagram
participant User
participant Frontend
participant Backend
participant LiveKit
participant STT as Speech-to-Text
participant LLM
participant TTS as Text-to-Speech
User->>Frontend: Нажимает "К собеседованию"
Frontend->>Backend: GET /api/resume/{id}/validate-interview
Backend-->>Frontend: canInterview: true
Frontend->>Backend: POST /api/interview/{id}/token
Backend-->>Frontend: LiveKit token
Frontend->>LiveKit: Connect to room
Frontend->>LiveKit: Send start_interview message
LiveKit->>Backend: start_interview event
Backend->>LLM: Generate first question
LLM-->>Backend: Question text
Backend->>TTS: Convert to speech
TTS-->>Backend: Audio data
Backend->>LiveKit: Send audio + question text
LiveKit-->>Frontend: Receive audio + text
loop Interview Process
User->>LiveKit: Speak answer
LiveKit->>Backend: Audio stream
Backend->>STT: Convert speech
STT-->>Backend: User text
Backend->>LLM: Process answer + generate next question
LLM-->>Backend: Next question or end signal
Backend->>TTS: Convert to speech
TTS-->>Backend: Audio data
Backend->>LiveKit: Send audio + text
LiveKit-->>Frontend: Display question + play audio
end
Backend->>LiveKit: Send interview_complete
LiveKit-->>Frontend: Show completion
Frontend->>User: Return to vacancy page
Message Protocol
Frontend → Server:
{
"type": "start_interview",
"resumeId": 123
}
{
"type": "end_interview",
"resumeId": 123
}
Server → Frontend:
{
"type": "question",
"text": "Расскажите о своем опыте в разработке",
"questionNumber": 1
}
{
"type": "ai_speaking_start"
}
{
"type": "ai_speaking_end"
}
{
"type": "interview_complete",
"summary": "Interview completed successfully"
}
Implementation Steps
Priority Implementation Order
- Phase 1: Базовые API endpoints + LiveKit токены (минимальный MVP)
- Phase 2: Аудио pipeline (STT/TTS)
- Phase 3: LLM интеграция и логика собеседования
Backend Setup
-
Install LiveKit SDK
pip install livekit livekit-api # or npm install livekit-server-sdk
-
Create LiveKit Room Service
from livekit import api class InterviewRoomService: def create_room(self, resume_id: int): room_name = f"interview_{resume_id}_{timestamp}" # Create room logic def generate_token(self, room_name: str, participant_name: str): # Generate JWT token
-
Implement API Endpoints
- Resume validation endpoint
- Token generation endpoint
- WebRTC signaling handling
-
Set up Audio Processing Pipeline
- Speech-to-Text service (Google, Azure, или OpenAI Whisper)
- Text-to-Speech service (Google, Azure, или ElevenLabs)
- LLM integration (OpenAI GPT, Claude, или локальная модель)
-
Database Schema Updates
ALTER TABLE resumes ADD COLUMN interview_session_id VARCHAR(255); ALTER TABLE resumes ADD COLUMN interview_completed_at TIMESTAMP; CREATE TABLE interview_sessions ( id SERIAL PRIMARY KEY, resume_id INTEGER REFERENCES resumes(id), room_name VARCHAR(255), status VARCHAR(50), started_at TIMESTAMP, completed_at TIMESTAMP, transcript TEXT, ai_feedback TEXT );
Security Considerations
-
Token Security
- Ограниченное время жизни токенов
- Права только на конкретную комнату
- Валидация прав пользователя
-
Data Privacy
- Шифрование аудио потоков
- Временное хранение записей
- GDPR соответствие
-
Rate Limiting
- Ограничение на количество сессий
- Защита от злоупотреблений
Testing Strategy
-
Unit Tests
- API endpoints
- Token generation
- Message handling
-
Integration Tests
- LiveKit connection
- Audio pipeline
- LLM integration
-
Load Testing
- Множественные одновременные сессии
- Производительность аудио обработки
Monitoring & Analytics
-
Metrics
- Время подключения к сессии
- Качество аудио соединения
- Длительность собеседований
- Процент завершенных интервью
-
Logging
- События соединения
- Ошибки аудио обработки
- LLM запросы и ответы
Deployment
-
LiveKit Server
- Развертывание сервера LiveKit
- SSL сертификаты
- Настройка TURN серверов для NAT
-
Scaling
- Горизонтальное масштабирование
- Load balancing
- CDN для статических ресурсов
Quick Start для Backend разработчика
Minimum Viable Product (1-2 дня)
-
Заглушки API endpoints:
# Всегда возвращать canInterview: true GET /api/resume/{id}/validate-interview # Вернуть тестовый LiveKit токен POST /api/interview/{id}/token
-
Настроить LiveKit server локально:
docker run --rm -p 7880:7880 -p 7881:7881 -p 7882:7882 \ -e LIVEKIT_KEYS="your-api-key: your-secret-key" \ livekit/livekit-server:latest
-
Тестирование соединения:
- Frontend должен подключиться к LiveKit
- Пользователь увидит интерфейс собеседования
- Микрофон должен работать
Full Implementation (1-2 недели)
После MVP добавить:
- Реальную логику валидации резюме
- Speech-to-Text processing
- LLM для генерации вопросов
- Text-to-Speech для ответов AI
- Сохранение результатов в БД
Возможные упрощения для MVP:
- Валидацию можно убрать (всегда разрешать)
- Вместо AI агента показывать заглушку "Скоро здесь будет AI интервьюер"
- Логи всех действий в консоль для отладки
Current Status
✅ Completed:
- Frontend компоненты готовы
- LiveKit интеграция настроена
- UI для собеседования реализован
🔄 Next Steps:
- Реализовать backend API endpoints
- Настроить LiveKit server
- Интегрировать Speech-to-Text/Text-to-Speech
- Подключить LLM для генерации вопросов
- Тестирование и отладка
Contact Frontend Developer
При вопросах по интеграции:
- Формат сообщений между клиентом и сервером
- Структура токенов LiveKit
- Обработка ошибок на фронтенде