Build a live translation broadcast app with the Gemini Live API and LiveKit
Quick Summary
Gemini Live API와 LiveKit을 결합하면 언어별 번역 세션을 공유하고 유휴 연결을 회수하는 방식으로 실시간 다국어 오디오·자막 방송 앱을 구축할 수 있다.
영상 보기
클릭 전까지는 가벼운 미리보기만 먼저 불러옵니다.
🖼️ 인포그래픽

🖼️ 4컷 인포그래픽

💡 한 줄 결론
Gemini Live API와 LiveKit을 결합하면 언어별 번역 세션을 공유하고 유휴 연결을 회수하는 방식으로 실시간 다국어 오디오·자막 방송 앱을 구축할 수 있다.
📌 핵심 요점
- 방송자는 이벤트 ID에 연결된 LiveKit 방으로 원본 음성을 보내고, Gemini Live API는 요청된 언어별 번역 음성과 자막을 생성하며, Cloud Run은 애플리케이션과 장기 실행 WebSocket을 호스팅한다.
- 번역 세션 관리자는 활성 목표 언어마다 최대 하나의 Gemini WebSocket만 유지한다. 같은 언어를 선택한 청취자는 기존 세션을 함께 구독하고, 마지막 청취자가 떠나면 해당 세션을 종료한다.
- 원본 PCM 오디오는 Gemini로 전달되고, 반환된 번역 음성과 자막은 LiveKit을 통해 같은 언어의 청취자들에게 배포된다. 자막은 중간 결과를 먼저 보여 준 뒤 최종 문단으로 확정된다.
- 참가자는 QR 코드를 스캔하고 이어폰과 선호 언어를 선택해 같은 발표를 들을 수 있다. LiveKit은 WebRTC 오디오와 데이터 채널 기반 자막을 담당하며, 로컬 Docker·자체 서버·LiveKit Cloud 환경을 지원한다.
- 현재 데모는 이벤트 상태를 메모리에 저장하므로 단일 인스턴스로 제한된다. 활성 언어가 약 10~15개를 넘으면 CPU 한계에 접근할 수 있고 실용 범위는 약 15~20개이며, 더 큰 규모에는 데이터베이스 기반 상태 분리와 언어별 LiveKit 방 분할이 필요하다.
🧩 배경과 문제 정의
- 서로 다른 언어를 쓰는 청중이 하나의 행사를 각자 선호하는 언어로 실시간 청취하려면, 번역 세션과 오디오·자막 배포를 효율적으로 연결해야 한다.
- Gemini Live API가 언어별 번역을 처리하고, LiveKit이 WebRTC 기반 오디오와 자막을 방송하며, Google Cloud Run이 애플리케이션과 장기 실행 WebSocket을 호스팅한다.
- 활성 언어마다 별도의 Gemini WebSocket이 필요하므로, 같은 언어의 청취자끼리 세션을 공유하고 유휴 세션을 종료하는 구조가 비용과 확장성을 좌우한다.
🕒 시간순 섹션별 상세정리
- Gemini·LiveKit·Cloud Run 기반 방송 구조
- Gemini API의 실시간 번역 결과를 LiveKit으로 전달하고 Cloud Run에 애플리케이션을 배포해, 하나의 원본 음성을 여러 언어로 동시에 방송한다. [00:34]
- 방송자는 LiveKit 방에 해당하는 이벤트 ID를 만들고 마이크나 브라우저 탭의 오디오를 전송하며, 번역 브리지가 청취자가 요청한 언어의 스트림을 연결한다. [01:16]
- 청취자가 중국어나 프랑스어처럼 아직 활성화되지 않은 언어를 선택하면, 해당 목표 언어를 위한 Gemini Live 번역 세션이 새로 생성된다. [02:14]
- 같은 프랑스어를 선택한 추가 청취자는 기존 번역 세션을 구독하므로, 청취자 수가 늘어도 동일 언어의 WebSocket을 중복 생성하지 않는다. [02:49]
- 행사 현장의 청취 경험과 개발 환경
- 행사 참가자는 QR 코드를 휴대전화로 스캔한 뒤 이어폰을 연결해 선호 언어를 선택할 수 있어, 언어가 다른 청중도 같은 발표를 함께 들을 수 있다. [04:18]
- Next.js 애플리케이션을 Cloud Run에 배포하면 실시간 번역에 필요한 장기 실행 WebSocket을 유지할 수 있다. [05:01]
- 번역 브리지의 오디오·자막 처리 흐름
- 번역 세션 관리자는 목표 언어의 기존 브리지를 조회하거나 새로 만들고, 세션이 없으면 Gemini Live API에 WebSocket을 열어 오디오 출력과 출력 자막을 요청한다. [07:06]
- 방송 페이지의 원본 PCM 오디오가 Gemini로 들어가며, 반환된 번역 음성과 자막 텍스트는 각각 LiveKit 방의 해당 언어 청취자들에게 전달된다. [07:44]
- Cloud Run 배포와 비용 제어
- Dockerfile은 의존성 설치, Next.js 빌드, 애플리케이션 디렉터리 배포, 서버 포트 노출 순서로 Cloud Run 실행 이미지를 구성한다. [09:18]
- Gemini와 LiveKit의 API 키·시크릿은 Google Cloud Secret Manager에 저장해 컨테이너에 전달하므로, 배포 이미지에 자격 증명을 직접 포함하지 않는다. [09:46]
- 단일 인스턴스 제약과 확장 전략
- 이벤트별 번역 상태와 브리지 정보를 메모리에 보관하므로 데모는 최대 한 인스턴스만 사용할 수 있으며, 다중 인스턴스로 확장하려면 상태를 데이터베이스로 분리해야 한다. [10:20]
- 언어마다 장기 실행 WebSocket이 하나씩 추가되어 활성 언어가 약 10~15개를 넘으면 CPU 한계에 접근할 수 있고, 현재 구조의 실용 범위는 동시 언어 약 15~20개다. [11:24]
- 언어별 룸 분리를 통한 확장 전략
- README의 ‘Architecture and Scaling’ 섹션에서 주요 설계 결정과 확장 제약을 자세히 확인할 수 있다. [11:48]
- LiveKit Cloud의 수용 규모는 더 늘릴 수 있지만, 이 구조에서 실제 제한 요소는 동시 활성 언어 수다. [12:09]
- 더 큰 규모로 확장하려면 언어별 세션을 별도 룸으로 분리해 독립적으로 확장할 수 있다. [12:24]
- 현재 데모 구성은 소규모 이벤트에 충분히 적합하다는 결론으로 마무리한다. [12:29]
🧾 결론
- 이 앱의 핵심은 번역 모델 호출 자체보다 언어별 WebSocket의 생성·공유·종료를 일관되게 관리하는 번역 브리지에 있다.
- 청취자 수가 늘더라도 같은 목표 언어의 세션을 재사용하므로, 소규모 다국어 행사에서는 연결 수와 비용을 억제할 수 있다.
- Cloud Run의 장기 실행 WebSocket 지원, 최소 인스턴스 0 설정, Secret Manager 연동을 조합하면 배포·보안·유휴 비용을 함께 관리할 수 있다.
- 다중 인스턴스나 더 많은 동시 언어를 지원하려면 메모리 상태를 데이터베이스로 외부화하고 언어별 스트림을 독립적으로 확장해야 한다.
📈 투자·시사 포인트
- 비용 구조는 전체 청취자 수보다 동시에 활성화된 목표 언어 수에 더 크게 좌우된다. 언어별 세션 공유와 유휴 세션 종료가 단위 경제성의 핵심이다.
- QR 코드와 모바일 이어폰을 이용하는 방식은 별도 통역 장비 없이 동일 행사 안에서 언어별 청취 경험을 제공할 수 있음을 보여 준다.
- 초기 소규모 행사에는 단일 방·단일 인스턴스 구조가 적합하지만, 동시 언어 증가에 대비한 상태 저장소와 스트림 분할이 확장 투자의 우선순위가 된다.
- Gemini Live API, LiveKit, Cloud Run을 결합한 구조에서는 번역 품질뿐 아니라 WebSocket 수명주기, 오디오·자막 동기화, 비밀정보 관리가 서비스 완성도를 결정한다.
⚠️ 불확실하거나 확인이 필요한 부분
- 실제 행사 환경에서의 종단 간 지연시간, 번역 정확도, 음성과 자막의 동기화 수준은 제시되지 않았다.
- 활성 언어 약 10~15개에서 CPU 한계에 접근하고 약 15~20개가 실용 범위라는 수치는 언급되지만, 인스턴스 사양과 오디오 조건별 측정 결과는 제공되지 않았다.
- 단일 인스턴스 장애, Gemini 또는 LiveKit 연결 중단, Cloud Run 재시작 시 세션을 복구하는 방법은 설명되지 않았다.
- 자막 기반 정리: 타임스탬프가 있는 자막을 기준으로 정리했으며, 고유명사·수치·인용은 원문 확인 필요 시 별도 검증한다.
- 영상 속 주장: 발표자의 해석·전망·비교는 확인된 외부 사실이 아니라 영상 속 주장으로 분리해 읽는다.
- 검증 필요: 수치, 기업 실적, 정책·시장 전망은 발행 전 최신 자료로 별도 검증이 필요하다.
✅ 액션 아이템
- 이벤트 ID, 방송자 원본 PCM 입력, 목표 언어별 번역 브리지, LiveKit 청취 스트림을 연결하는 최소 기능 앱을 구현한다.
- 언어별 청취자 수를 추적해 첫 청취자 접속 시 세션을 생성하고 마지막 청취자 이탈 시 WebSocket을 종료하는 수명주기 로직을 검증한다.
- 중간 자막과 최종 자막을 구분하고 목표 언어·세그먼트 ID를 포함하는 이벤트 형식을 테스트한다.
- Gemini와 LiveKit 자격 증명을 Secret Manager에 저장하고, 배포 이미지에 비밀정보가 포함되지 않는지 확인한다.
❓ 열린 질문
- 실제 행사장의 네트워크와 모바일 기기 조건에서 번역 음성 및 자막의 허용 가능한 종단 간 지연시간은 얼마인가?
- Cloud Run 인스턴스 한 대가 안정적으로 처리할 수 있는 동시 언어 수는 선택한 CPU·메모리 사양에 따라 어떻게 달라지는가?
- 다중 인스턴스로 전환할 때 언어별 브리지 소유권과 청취자 수를 어떤 데이터베이스 구조로 일관되게 관리할 것인가?