Skip to main content

Overview

The Unmute frontend is a Next.js application that provides the user interface for voice conversations. It handles microphone input, Opus audio encoding, WebSocket communication, and real-time audio playback. Technology Stack:
  • Framework: Next.js 14 (React 18, TypeScript)
  • Audio: Web Audio API, Opus codec (opus-recorder)
  • WebSocket: Native WebSocket API
  • Styling: Tailwind CSS
  • State Management: React hooks

Application Structure

Location: frontend/src/app/

Main Component

File: frontend/src/app/Unmute.tsx

WebSocket Communication

Connection Setup

Server URL Logic

File: frontend/src/app/useBackendServerUrl.ts
Why /api/ prefix: Traefik routes /api/* to backend, strips prefix.

Message Handling

Audio Input

Microphone Capture

File: frontend/src/app/useAudioProcessor.ts

Opus Encoding

Library: opus-recorder (WebAssembly Opus encoder) Configuration:
  • Sample rate: 24kHz
  • Channels: Mono
  • Application: VOIP (optimized for speech)
  • Streaming: Pages sent as soon as encoded
Frame Size: ~20ms (determined by Opus encoder)

Base64 Encoding

File: frontend/src/app/audioUtil.ts

Audio Output

Opus Decoding

Audio Queue Management

Voice Configuration

UnmuteConfigurator Component

File: frontend/src/app/UnmuteConfigurator.tsx

Voice Upload

File: frontend/src/app/VoiceUpload.tsx

Subtitles

SingleRoleSubtitles Component

File: frontend/src/app/SingleRoleSubtitles.tsx

Subtitle Display

Audio Visualization

useAudioVisualizerCircle Hook

File: frontend/src/app/useAudioVisualizerCircle.ts

Keyboard Shortcuts

File: frontend/src/app/useKeyboardShortcuts.ts
Shortcuts:
  • S: Toggle subtitles
  • D: Toggle dev mode (if enabled)

Wake Lock

File: frontend/src/app/useWakeLock.ts Prevents screen from sleeping during conversation:

Deployment

Docker

File: frontend/hot-reloading.Dockerfile

Docker Compose

File: docker-compose.yml:18

Running Locally

Error Handling

Connection Errors

Server Errors

Next Steps