WebRTC Transcriber

Abstract

WebRTC 实时语音转写示例

Authors

Walter Fan

Status

v1.0

Updated

2026-03-20

概述

WebRTC Transcriber 是一个基于 Pion WebRTC 构建的实时语音转写应用。 它通过浏览器采集音频,经由 WebRTC 发送到 Go 后端,再交给转写引擎(Whisper、Google、Azure 等)进行实时语音识别, 转写结果通过 DataChannel 回传给前端。

项目同时支持纯录音模式(recorder),可以只录制 WAV 文件而不做转写。

项目地址https://github.com/walterfan/webrtc-transcriber

核心特性

特性

说明

实时流式传输

基于 Pion WebRTC 的低延迟音频采集

多厂商转写

支持 Whisper(本地)、Google、Azure、百度、讯飞

隐私优先

默认使用 Whisper 本地转写,音频不离开服务器

音频录制

支持录制为 WAV 文件,带文件管理功能

音频可视化

浏览器端实时波形显示

用户认证

基于 Session Cookie 的简单登录系统

技术栈

技术

后端

Go + Pion WebRTC v2 + Opus 解码 + Gorilla WebSocket

前端

Vue 3 + TypeScript + Vite + Tailwind CSS

转写引擎

Whisper(whisper-ctranslate2)、Google Speech、Azure Speech、百度语音、讯飞语音

架构

┌─────────────┐     WebRTC      ┌─────────────────┐     Audio      ┌──────────────┐
│   Browser   │ ◄─────────────► │  Go Server      │ ─────────────► │  Whisper AI  │
│  (Vue 3)    │                 │  (Pion WebRTC)  │                │  (or Cloud)  │
└─────────────┘                 └─────────────────┘                └──────────────┘
       │                               │                                  │
       │    DataChannel               │                                  │
       ◄──────────────────────────────┼──────────────────────────────────┘
              (Transcription Results)

数据流

  1. 浏览器通过 getUserMedia 采集音频

  2. 音频通过 WebRTC(Opus 编码的 RTP)发送到 Go 后端

  3. 后端将 Opus RTP 解码为 PCM

  4. PCM 音频送入转写服务(Whisper / Google / Azure / 百度 / 讯飞)

  5. 转写结果通过 DataChannel 以 JSON 格式回传给浏览器

核心模块

cmd/transcribe-server    # 入口:HTTP 服务器、认证、路由
  └─► internal/session   # SDP 交换处理
        └─► internal/rtc # WebRTC 连接管理、Opus 解码
              └─► internal/transcribe  # 转写服务接口和各厂商实现

关键源码

文件

职责

cmd/transcribe-server/main.go

入口:HTTP 服务、认证、路由、厂商选择

internal/rtc/pion.go

Pion WebRTC 实现:PeerConnection、ICE、Track、DataChannel

internal/rtc/opus.go

Opus RTP → PCM 解码

internal/session/handler.go

SDP Offer/Answer 交换

internal/transcribe/service.go

ServiceStream 接口定义

internal/transcribe/whisper.go

Whisper 本地转写实现

internal/transcribe/gspeech.go

Google Speech-to-Text 实现

frontend/src/composables/useWebRTC.ts

前端 WebRTC 连接逻辑

安装与运行

前置条件

  • Go 1.21+

  • Node.js 18+

  • Whisper(默认转写引擎):pip install whisper-ctranslate2

构建与启动

# 构建前端和后端
make

# 启动服务
./webrtc-transcriber

# 浏览器访问
open http://localhost:9070

命令行选项

./webrtc-transcriber [options]
  --vendor string     whisper | google | azure | baidu | xunfei | recorder (default "whisper")
  --model string      tiny | base | small | medium | large (default "small")
  --language string   en | zh | ja | auto (default "auto")
  --output string     录音输出目录 (default "recordings")
  --http.port string  HTTP 端口 (default "9070")

如需使用云端转写服务,将 env.example 复制为 .env 并填入对应的 API 密钥。

WebRTC 相关要点

这个项目展示了几个重要的 WebRTC 实践模式:

Opus 解码

浏览器通过 WebRTC 发送的音频默认使用 Opus 编码。后端需要将 Opus RTP 包解码为 PCM 才能送入转写引擎。 项目使用 hraban/opus 库完成解码,这是服务端处理 WebRTC 音频的常见模式。

DataChannel 回传结果

转写结果不通过信令或 HTTP 返回,而是通过 DataChannel 直接推送给浏览器, 保持了低延迟和实时性。这是 DataChannel 的典型应用场景。

单向媒体流

与双向视频通话不同,这个项目只需要浏览器 → 服务器的单向音频流。 RTCPeerConnectionaddTransceiver 配置为 sendonly,服务端配置为 recvonly

参考