LiveKit 向けバーチャル背景とノイズキャンセリング
LiveKit アプリに背景のぼかしと置換、美肌補正、オートフレーミング、AI ノイズキャンセリングを追加。エフェクトはトラックの公開前に各参加者のデバイス上で動作するため、LiveKit サーバーの変更は不要です。
仕組み
-
1
トラックをラップする
映像:カメラトラックに Effects SDK の TrackProcessor を設定。音声:マイクを Audio Effects SDK に通します。
-
2
デバイス上で処理する
SDK はブラウザやアプリ内でフレームのセグメンテーションと補正、または音声のクリーンアップを行います。Web では WebGPU、WebGL、WebAssembly を使います。
-
3
いつもどおり公開する
LiveKit は処理済みのトラックを公開します。人でもエージェントでも、すべての購読者がその結果を受け取ります。
コード
LiveKit の track processor は、ローカルトラックを加工する標準的な方法です。サンプルは Web Video Effects SDK を基にそれを実装しています。Flutter のフォークは、Android、iOS、Web の LocalVideoTrack に同じエフェクトを追加します。
- 映像:ぼかし、画像・動画の背景、美肌補正、オートフレーミング、色補正、テロップ
- 音声:ノイズ抑制と室内エコー除去、speed / balanced / quality プリセット
- 再公開せずに通話中にエフェクトを変更
import { Track, TrackProcessor, VideoProcessorOptions } from 'livekit-client';
import { tsvb } from 'effects-sdk';
export class EffectsVideoProcessor implements TrackProcessor<Track.Kind.Video, VideoProcessorOptions> {
name = 'effects-sdk';
processedTrack?: MediaStreamTrack;
sdk = new tsvb('YOUR_CUSTOMER_ID');
constructor() {
this.sdk.config({ provider: 'webgpu' });
this.sdk.preload();
}
async init(opts: VideoProcessorOptions) {
this.sdk.clear();
this.sdk.useStream(new MediaStream([opts.track]));
this.processedTrack = this.sdk.getStream()?.getVideoTracks()[0];
await new Promise((ready) => (this.sdk.onReady = ready));
this.sdk.run();
}
async restart(opts: VideoProcessorOptions) {
await this.init(opts);
}
async destroy() {
this.sdk.stop();
this.sdk.clear();
this.processedTrack = undefined;
}
}
import { createLocalVideoTrack } from 'livekit-client';
const processor = new EffectsVideoProcessor();
const cameraTrack = await createLocalVideoTrack();
await cameraTrack.setProcessor(processor);
await room.localParticipant.publishTrack(cameraTrack);
// Change effects at any time, without republishing
processor.sdk.setBlur(0.6);
processor.sdk.setBackground('https://example.com/office.jpg');
import { atsvb } from 'audio-effects-sdk';
const sdk = new atsvb('YOUR_CUSTOMER_ID');
sdk.config({ preset: 'speed', sample_rate: 16000 });
sdk.preload();
const mic = await navigator.mediaDevices.getUserMedia({ audio: true });
sdk.useStream(mic);
sdk.onReady = async () => {
sdk.run();
const cleanTrack = sdk.getStream().getAudioTracks()[0];
// Publish the processed track instead of the raw microphone
await room.localParticipant.publishTrack(cleanTrack);
};
// pubspec.yaml: livekit_client from github.com/EffectsSDK/livekit-client-sdk-flutter
// Web only: load tsvb-web.js in index.html and call this first
VideoEffectsSDKExt.initialize('YOUR_CUSTOMER_ID');
final videoTrack = await LocalVideoTrack.createCameraTrack(
CameraCaptureOptions(effectsSdkRequired: true),
);
await videoTrack.start();
// Android and iOS: authorize the track
final status = await videoTrack.auth('YOUR_CUSTOMER_ID');
if (status == AuthStatus.active) {
await videoTrack.setPipelineMode(PipelineMode.blur);
await videoTrack.setBlurPower(0.6);
}
よくある質問
Flutter で開発していますか?Flutter との連携をご覧ください。
LiveKit Cloud やセルフホストの LiveKit で使えますか?
はい。エフェクトはトラックの公開前に参加者のデバイス上で適用されるため、LiveKit Cloud でも自社サーバーでも、サーバーには処理済みのトラックが届きます。サーバー側の変更はありません。
LiveKit 組み込みのノイズフィルターとの違いは?
Effects SDK は Web、iOS、Android、デスクトップのエンドユーザーのデバイス上で完結し、どの LiveKit 環境でも動作し、同じ SDK ファミリーでビデオエフェクトも提供します。ユーザーのハードウェアに合わせてプリセット(speed、balanced、quality)を選べます。
通話中にエフェクトを変更できますか?
はい。ぼかし、背景、美肌補正、フレーミングなどのエフェクトは、トラックを作り直したり再公開したりせずにいつでも切り替えられます。
LiveKit の音声エージェントでも使えますか?
はい。公開前に Audio Effects SDK でユーザーのマイクをクリーンアップすれば、エージェントには背景ノイズや室内エコーのない音声が届きます。AI 音声エージェント向けノイズキャンセリングをご覧ください。
どの LiveKit SDK に対応していますか?
Web 向けの livekit-client(JavaScript/TypeScript)には TrackProcessor で、Android、iOS、Web の LiveKit Flutter には当社の Flutter SDK フォークで対応しています。
LiveKit と連携しますか?
Web、Flutter、エージェントなど、LiveKit の構成をお聞かせください。導入をサポートします。
準備はできましたか?Developer Portal を開いて無料トライアルを始めましょう。