Wie fügt man einem LiveKit-Agents-Worker Sprecherisolation hinzu?
Lassen Sie das Anecho-SDK im stt_node des Workers über das eingehende Audio laufen, in 240-Sample-Hops bei 16 kHz. Es gibt kein LiveKit-Plugin-Paket, daher zeigt dieser Beitrag den Code, den Sie selbst schreiben, mit Resampling-Hinweisen und den Zahlen.
Sie fügen einem LiveKit-Agents-Worker Sprecherisolation hinzu, indem Sie die eingehenden Audio-Frames durch das Anecho-SDK leiten, bevor sie die Speech-to-Text-Stufe erreichen, in 240-Sample-Hops bei 16 kHz. Ein Paket livekit-plugins-anecho gibt es nicht; wir haben keines veröffentlicht. Das Folgende ist der SDK-Vertrag, angewandt auf LiveKits Frame-Typen, als Code, der Ihnen gehört.
Der Vertrag
Das SDK hat drei Objekte: Model (die .anecho-Datei aus Ihrem Dashboard), Processor (float32 hinein, gleich viele Samples heraus, 15 ms später) und UsageReporter (der Lizenz-Heartbeat; sendet Dauern, nie Audio). Das Modell arbeitet bei 16 kHz in 240-Sample-Hops. Die ersten 240 Samples eines Streams kommen als Stille zurück, das ist die algorithmische Verzögerung.
Die Frame-Schleife
In Agents erhält stt_node einen asynchronen Iterator von rtc.AudioFrame. Wir umhüllen ihn, teilen in Hops um, lassen den Prozessor laufen und liefern Frames gleicher Form.
import os
import numpy as np
from scipy.signal import resample_poly
from livekit import rtc
from livekit.agents import Agent
from anecho import Model, Processor, UsageReporter
RATE, HOP = 16_000, 240 # model rate; 240 samples = 15 ms
reporter = UsageReporter(os.environ["ANECHO_API_KEY"])
model = Model.from_file("anecho.ai_focus_model_16khz_v8_2.anecho") # from your dashboard
class IsolatedAgent(Agent):
async def stt_node(self, audio, model_settings):
async def isolated():
proc = Processor(model, reporter.ensure_license()) # one per call
reporter.attach(proc)
reporter.start()
pending = np.zeros(0, dtype=np.float32)
async for frame in audio: # rtc.AudioFrame, int16
x = np.frombuffer(frame.data, dtype=np.int16).astype(np.float32) / 32768.0
if frame.num_channels > 1: # mix down to mono
x = x.reshape(-1, frame.num_channels).mean(axis=1)
if frame.sample_rate != RATE: # e.g. 48000 -> 16000
x = resample_poly(x, RATE, frame.sample_rate).astype(np.float32)
pending = np.concatenate([pending, x])
while len(pending) >= HOP:
block, pending = pending[:HOP], pending[HOP:]
y = proc.process(block) # same length out, 15 ms behind
pcm = (np.clip(y, -1.0, 1.0) * 32767).astype(np.int16)
yield rtc.AudioFrame(
data=pcm.tobytes(), sample_rate=RATE,
num_channels=1, samples_per_channel=HOP,
)
return Agent.default.stt_node(self, isolated(), model_settings)
Das ist eine Skizze gegen den Agent.stt_node-Hook von Agents 1.x. Wir haben keinen laufenden LiveKit-Worker gebenchmarkt; prüfen Sie die Hook-Signatur gegen Ihre Agents-Version und testen Sie mit Ihrem eigenen Traffic.
Hinweise zum Resampling
- LiveKit-Frames sind int16 und häufig 48 kHz oder 24 kHz. Das Modell will float32 bei 16 kHz, also vor dem Prozessor mit einem ordentlichen Polyphasenfilter resamplen (
resample_polyoben), nicht durch Weglassen von Samples. - Nur einmal resamplen. Resampelt Ihr STT ebenfalls, ist das isolierte 16-kHz-Audio bereits, was die meisten Erkenner wollen.
- Ein Telefonie-Leg kommt mit 8 kHz. Hochrechnen auf 16 kHz stellt keine Bandbreite wieder her; siehe 8 kHz ist, wo Sprach-KI bricht.
- Behalten Sie einen Roh-Abgriff, wenn Sie auch aufzeichnen oder einen zweiten Konsumenten haben; siehe die geteilte Pipeline.
Kosten und die Plattform-Alternative
| Posten | Wert | Quelle und Datum |
|---|---|---|
| Algorithmische Verzögerung | 15 ms | Null Test, 2026-08-14 |
| Echtzeitfaktor, ein CPU-Thread | 0.067 | Null Test, 2026-08-14 (Apple M1 Max) |
| Schlechteste Blockzeit, p99 | 3.96 ms | Null Test, 2026-08-14 |
| Unser Einstiegspreis nach 10,000 Freiminuten im Monat | $0.0010 pro Minute | anecho.ai/pricing |
| LiveKit-Cloud-Voice-Isolation, über der Plan-Quote | $0.0012 pro Minute | livekit.com/pricing, abgerufen am 2026-10-15 |
LiveKit Cloud verkauft Voice Isolation als abgerechnete Position, belegt mit Modellen von Krisp und ai-coustics (livekit.com/pricing und docs.livekit.io, abgerufen am 2026-10-15). Läuft Ihr Worker auf LiveKit Cloud und passt einer dieser Slots, ist das ein vernünftiger Weg. Das SDK selbst zu betreiben hält das Audio in Ihrem Prozess und funktioniert, wo immer der Worker läuft. Die beiden Preise sind nicht vergleichbar: unserer gilt pro verarbeiteter Minute auf einer veröffentlichten Staffel, deren pro Plan. Ob Isolation Ihrem Traffic hilft, ist eine Messung, kein Standard: wie man Sprecherisolation bewertet.
FAQ
Gibt es ein Anecho-Plugin für LiveKit Agents?
Nein. Es gibt kein veröffentlichtes Plugin-Paket. Das SDK ist eine Python- und Node-Bibliothek, und dieser Beitrag zeigt den Integrationscode.
Wo sitzt der Prozessor in der LiveKit-Pipeline?
Auf dem eingehenden Audio, vor der Speech-to-Text-Stufe, im Hook stt_node.
Wie viel Latenz fügt er hinzu?
15 ms algorithmische Verzögerung, gemessen in Null Test am 2026-08-14 bei einem Echtzeitfaktor von 0.067 auf einem CPU-Thread.