Skip to content

dkeye/Voice

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Voice

Минимальный self-hosted голосовой чат с приватными комнатами и передачей звука через WebRTC.

Проект обеспечивает лёгкую и быструю голосовую связь прямо в браузере. Комнаты создаются по запросу, доступны только по ID/ссылке, а голос передаётся через WebRTC без сторонних сервисов.


Features

  • 🔒 Приватные комнаты
    Создание комнаты, подключение по ID, выход из комнаты.

  • 🎤 Голос через WebRTC
    Автоматическая передача голоса после подключения. Браузер обеспечивает echo cancellation, noise suppression и AGC.

  • 🔊 Управление звуком
    Включение/выключение микрофона и входящего звука.

  • 🔁 Автопереподключение WebRTC
    Клиент восстанавливает голосовой поток после разрыва.

  • 📡 Постоянное WebSocket‑соединение
    Используется для управления комнатами и WebRTC‑сигналинга.

  • 👥 События комнаты
    Обновления участников: вход, выход, обновление имени.

  • ⚠️ Ограничение частоты создания комнат
    Сервер возвращает {"type": "error", "error": "rate_limited"} при превышении лимитов.


Getting Started

1. Запуск сервера

go run ./cmd/server/main.go

По умолчанию сервер раздаёт статические файлы и поднимает WebSocket‑сигналинг по адресу:

/api/ws/signal

2. Открыть клиент

Перейдите в браузере на:

http://localhost:8080/

Usage

  1. Нажмите Create Room — получите ID комнаты.
  2. Отправьте ссылку другому участнику.
  3. После присоединения голос начинает передаваться автоматически.
  4. Можно:
    • менять имя,
    • включать/выключать микрофон,
    • выключать входящий звук,
    • переподключать WebRTC вручную.

Signal API (WebSocket)

Все события идут через /api/ws/signal.

Клиент → Сервер

{ "type": "create_room", "name": "optional" }
{ "type": "join", "room": "ROOM_ID", "name": "optional" }
{ "type": "leave" }
{ "type": "rename", "name": "New Name" }
{ "type": "offer", "sdp": "..." }
{ "type": "answer", "sdp": "..." }
{ "type": "candidate", "candidate": "...", "sdpMid": "0", "sdpMLineIndex": 0 }
{ "type": "whoami" }
{ "type": "ping" }

Сервер → Клиент

{ "type": "room_created", "room": "ROOM_ID" }
{ "type": "room_state", "room": "ROOM_ID", "room_name": "...", "members": [...], "count": 1 }
{ "type": "member_joined", "user": {...} }
{ "type": "member_left", "user": {...} }
{ "type": "member_updated", "user": {...} }
{ "type": "answer", "sdp": "..." }
{ "type": "offer", "sdp": "..." }
{ "type": "candidate", "candidate": "..." }
{ "type": "pong" }
{ "type": "error", "error": "rate_limited" }

Roadmap

  • 🔊 Индикатор «кто говорит» (VAD через RTP extension)
  • 🎥 Поддержка видеопотоков
  • 📈 Статус WebRTC соединения (rtt/loss/jitter)
  • 🔐 Авторизация пользователей
  • 🧩 Улучшенный UI/UX

License

Проект распространяется под лицензией GNU AGPLv3

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks