Thanks — you confirmed Voice Isolation is included on Build (100 min free).
But calling Krisp BVCTelephony from my Node.js agent returns “not authenticated”.
Since the entitlement exists on Build, what exactly do I need to do to activate it?
Do I need to enable a billing state / add a card (Build shows “no card required”)?
Is there a project setting to turn on Voice Isolation?
Or is the Node.js integration path different from what I’m using
(session.start inputOptions: { noiseCancellation: TelephonyBackgroundVoiceCancellation() })?
I feel like there is some missing context for this conversation
Just to confirm, are you using LiveKit cloud as your media transport (i.e. not using self-hosted LiveKit). If so, can you share a session ID where you see this issue?
In this session I enabled Krisp BVCTelephony via session.start
inputOptions: { noiseCancellation: TelephonyBackgroundVoiceCancellation() }.
The agent logs “not authenticated” right after the room connects, and voice
isolation never applies (background noise is not filtered). The call itself
works fine otherwise. We’re on the Build plan (which lists 100 min voice
isolation included). What do we need to do to authorize/activate it?
You are using self-hosted agents with LiveKit Cloud. I would expect this to work, provided you have not exceeded your 100 min allowance, but even then I would not expect a ‘not authenticated’ error.
I would like to understand where in the code the ‘not authenticated’ error is coming from, can you please share more of your agent log (if you don’t want to post it publicly, feel free to DM), so I can better understand what is leading to that error.
Thanks Darryn. Yes — self-hosted Node.js agents connecting to LiveKit Cloud
(project insale-ai-m1echo28), on the Build plan, well under the 100 min allowance.
The “not authenticated” line appears with no prefix/timestamp, right after the
room connects and after our own “NOISE_CANCELLATION_READY” log — so it looks
like it’s coming from the noise-cancellation native module / rtc-node, not our
code. Agent log excerpt:
{“level”:20,“name”:“lk-rtc”,“msg”:“Connect callback received”}
[VOICE_AGENT][NOISE_CANCELLATION_READY] ← our log: NC factory created
DEBUG: connection state changed state: 1
not authenticated ← THIS (no prefix/timestamp)
WARN: turnDetection is a TurnDetector, but the LLM is a RealtimeModel with
server-side turn detection enabled, ignoring the turnDetection setting
DEBUG: Creating WebSocket connection to OpenAI Realtime API
Voice isolation then never applies (background noise isn’t filtered), though the
call itself works. Session ID: RM_tvw2G4vJ9HYw
(room: wa-in-923017074429-1784122265820)
Separately, we also see this during the call (may or may not be related):
ERROR: Unsupported item type: agent_config_update
at livekitItemToOpenAIItem (@livekit/agents-plugin-openai/…/realtime_model.js:1614)
WARN: failed to sync chat context to remove never-played messages
Package versions: @livekit/agents + @livekit/agents-plugin-openai (OpenAI
Realtime model), @livekit/noise-cancellation-node ^0.1.10. Happy to share more.
Quick question, are you set on the telephony BVC model?
In case you are open to trying alternatives, there is also ai-coustics Quail Voice Focus model that works as well with the telephony. It should be included in the plan, as well as you can authenticate it with the ai-coustics sdk key when self-hosted. There shouldn’t be many changes required, just simply one different argument since we are also natively integrated on LiveKit.
Happy to help if you are interested, and good luck with solving the issue.
Thanks Pawel, that sounds great — yes, I’m open to trying the ai-coustics
Quail Voice Focus model instead of Krisp BVCTelephony.
We’re on self-hosted Node.js agents (@livekit/agents + agents-plugin-openai)
connecting to LiveKit Cloud. Could you share:
The exact argument / code change for the Node.js agents SDK — right now we
use, in session.start:
inputOptions: { noiseCancellation: TelephonyBackgroundVoiceCancellation() }
What would the ai-coustics Quail Voice Focus equivalent look like?
Where do we get the ai-coustics SDK key, and how do we pass it
(e.g. an env variable the agent reads)?
Just to confirm — will this resolve the “not authenticated” we hit with
Krisp, since ai-coustics can authenticate via the SDK key when self-hosted?
The code change.** Install our plugin and swap out Krisp’s TelephonyBackgroundVoiceCancellation() for our audioEnhancement(...) in the same inputOptions.noiseCancellation slot:
Works for both WebRTC and telephony (SIP) participants - no separate telephony model needed.
2. The SDK key. Generate a license key on the ai-coustics developer platform (developers.ai-coustics.com), then pass it via the auth parameter. Reading it from an env var like AIC_LICENSE_KEY (as above) is the clean way - the docs example passes the literal string, but env is preferred for self-hosting.
3. Will it fix “not authenticated”? Yes. Our plugin authenticates directly against the ai-coustics license key (Auth.aiCousticsApi(...)).
Thanks Pawel! Quick check before I set it up — is generating the license key
on the developer platform free, and is the Voice Focus usage fully covered by
our LiveKit Build plan (like the included voice-isolation minutes), or are
there any separate ai-coustics costs/limits on the free key I should know about?
One billing question: we’re using ai-coustics Voice Focus via the direct
license key (Auth.aiCousticsApi(…)), as you suggested. Does this usage count
under our LiveKit plan’s included voice-isolation minutes (since the LiveKit
pricing page lists ai-coustics Voice Focus as an included option), or is it
billed separately through ai-coustics after the 30-day trial?
We’re planning production and need to know the exact cost. Thanks!
Before we upgrade — will moving to the Ship plan resolve the “not authenticated”
error for voice isolation, or is it a separate config issue you’re still
looking into? Just want to be sure before we pay for Ship. Thanks!
@remote_admin so if you are using self-hosted SFU instead of LiveKit Cloud, and authenticate with our SDK key, then it would be counted directly to ai-coustics SDK key. Otherwise, it would be part of the LiveKit Plan, and you do not have to even generate the ai-coustics sdk key at all - just stay entirely on the LiveKit, the billing would be attached automatically on the LiveKit side. If you do authenticate with our SDK then your usage counts as a regular ai-coustics SDK key, where you can monitor your usage here: https://developers.ai-coustics.com/dashboard/sdk/usage However the SDK key creation is free - you do not even need a credit card, plus first 30 days are free. It works in the following way, you just sign up, create the key, and use it directly in your app. After 30 days if you like it, then you can check your usage in the dashboard and get the corresponding subscription.
The term “self-hosting” is being used in two ways:
You can self-host LiveKit agents. The alternative is hosting your agents in LiveKit cloud
You can self-host LiveKit. The alternative is using the hosted version of LiveKit, known as LiveKit cloud.
@remote_admin you are self-hosting your agents but you are using LiveKit Cloud, you are not self-hosting LiveKit.
The API key that @Pawel_Lach is talking about is ONLY required if you are self-hosting LiveKit, so you would not need that. Usage of ai-coustics VF model is covered by your existing LiveKit billing plan.
This is a really good workaround, and I hope it resolves the immediate issue. I am still concerned that Krisp is reporting as unavailable, and if there is an underlying bug. If you see an error such as audio filter disabled, continuing without it, from here, then that would also help track down the root cause.
Update: We’re now on the Ship plan (confirmed on billing) with
WHATSAPP_CALL_NOISE_CANCELLATION enabled, but Krisp
TelephonyBackgroundVoiceCancellation STILL logs “not authenticated” and voice
isolation never applies — even on Ship. So it’s not a plan/tier issue.
Notably, the ai-coustics audioEnhancement() path worked fine (no “not
authenticated”) when we tested it. You mentioned ai-coustics VF is covered by
our LiveKit plan and we don’t need the ai-coustics key on LiveKit Cloud —
what’s the exact Node.js code to use ai-coustics VF (or Krisp) so it actually
authenticates and applies? The calls themselves work; only the NC won’t activate.
Session ID (latest): room wa-in-923017074429-1784197702479
You mentioned ai-coustics VF is covered by
our LiveKit plan and we don’t need the ai-coustics key on LiveKit Cloud —
what’s the exact Node.js code to use ai-coustics VF
It should be what @Pawel_Lach provided above, just omit the auth key:
How are you determining that the noise cancellation is not being applied? If you have Agent Insights enabled, the recordings there are recorded with NC applied.
Progress — the keyless setup fixed “not authenticated” (thanks!). But with NC
enabled, the caller’s inbound audio never reaches the agent: transcript is
always empty and we hit “User away timeout”, and the caller only hears ringing.
With NC disabled, calls work fine with two-way audio.
One thing I noticed: livekit-agents download-files only discovered/downloaded
files for @livekit/agents-plugin-openai — nothing for @livekit/plugins-ai-coustics.
Do the ai-coustics Voice Focus model files need to be downloaded separately, and
if so, how? That might be why the NC processor is dropping the caller’s audio.