Skip to content

语音服务 ​

GOSpeak 自己不做音频转发,交给 LiveKit 干。

为什么拆出去 ​

音频转发是 IO 密集型工作:一个人说话,要把音频同时推给房间里其他所有人。放在业务进程里会让整个应用被拖慢。

拆出去之后:

  • 应用只负责签发令牌、管房间成员、处理业务逻辑
  • LiveKit 只负责转发音频
  • 两者独立扩容、独立重启

数据是怎么流的 ​

1. 用户进频道
        │
2. 前端问应用要令牌
   POST /api/v1/signal/token
        │
3. 应用用 LIVEKIT_SECRET 签一个 JWT
   里面写清楚:能进哪个房间、身份是谁
        │
4. 前端拿令牌连 LiveKit
   wss://livekit/rtc?access_token=...
        │
5. 音频在浏览器和 LiveKit 之间直连
   应用完全不参与

关键在第三步:令牌由应用签发,LiveKit 只验签。这样应用控制谁能进哪个房间,LiveKit 不用知道业务逻辑。

两种用法 ​

自建LiveKit Cloud
部署自己跑 livekit-server注册就能用
数据全在你手里经过第三方
费用服务器成本按用量计费
运维自己管升级、扩容不用管
延迟看服务器位置全球边缘节点
NAT 穿透自己配 TURN内置

小团队自建够用,也最省钱。不想运维就用云服务,配置只差三行。

配置 ​

不管哪种,应用侧就这四个变量:

ini
SFU_PROVIDER=livekit
LIVEKIT_HOST=ws://localhost:7880
LIVEKIT_KEY=你的key
LIVEKIT_SECRET=你的secret

LIVEKIT_HOST 的写法:

场景写法
本地开发ws://localhost:7880
Docker Compose 内ws://livekit:7880
生产(HTTPS)wss://voice.example.com
LiveKit Cloudwss://xxx.livekit.cloud

页面是 HTTPS 的时候,这里必须是 wss://,否则浏览器会拦掉。

应用管什么,LiveKit 管什么 ​

事情谁做
谁能进哪个房间应用(签令牌时决定)
房间里有谁两边都有,应用存自己的状态
踢人应用调 LiveKit 的管理 API
禁言应用调 LiveKit 的管理 API
音频转发LiveKit
谁在说话LiveKit 的 active speaker 事件,应用转发给前端
房间生命周期应用决定,通知 LiveKit

在后台改配置 ​

管理后台「SFU 管理」里能直接改,改完存数据库,立即生效。

这适合临时切换——比如自建挂了,先切到云服务应急。数据库里的配置优先级高于环境变量。

相关接口 ​

方法路径权限用途
POST/api/v1/signal/token登录即可拿进房令牌
GET/api/v1/signal/rooms登录即可列当前房间
GET/api/v1/signal/participants登录即可列房间成员
GET/api/v1/signal/ws-endpoint登录即可拿信令地址
POST/api/v1/signal/webhookLiveKit 调用接收房间/成员事件
POST/api/v1/sfu/configsfu:manage读当前配置
POST/api/v1/sfu/update-configsfu:manage改配置并激活
POST/api/v1/sfu/switch-providersfu:manage只切 provider,不改配置
POST/api/v1/sfu/providerssfu:manage列出已配置的 provider

下一步 ​

基于 Apache 2.0 许可开源