Files
2026-07-13 13:39:38 +08:00

107 lines
3.1 KiB
Python

#!/usr/bin/env python3
"""
Example: Voice Agent with Krisp Noise Cancellation
This example demonstrates how to integrate Krisp noise cancellation
into a LiveKit voice agent for human-to-bot conversations.
The audio pipeline:
Room → RoomIO (with KrispVivaFilterFrameProcessor) → VAD → STT → LLM → TTS → Room
Prerequisites:
1. Set KRISP_VIVA_FILTER_MODEL_PATH environment variable to your .kef model file
2. Install required packages:
- livekit-agents (with PR #4145 support for FrameProcessor)
- livekit-plugins-krisp
- livekit-plugins-openai (or your preferred STT/LLM/TTS)
Usage:
python krisp_agent_example.py dev
"""
import logging
from dotenv import load_dotenv
from livekit.agents import (
Agent,
AgentServer,
AgentSession,
JobContext,
cli,
inference,
room_io,
)
from livekit.plugins import krisp, openai
logger = logging.getLogger("krisp-agent-example")
load_dotenv()
class KrispAgent(Agent):
"""Voice agent that uses Krisp for noise cancellation."""
def __init__(self) -> None:
super().__init__(
instructions=(
"You are a helpful voice assistant. "
"Keep your responses concise and conversational. "
"Do not use emojis or special characters in your responses."
),
)
async def on_enter(self):
"""Called when the agent enters the session."""
logger.info("Krisp agent entered session")
# Generate initial greeting (uninterruptible for AEC calibration)
self.session.generate_reply(allow_interruptions=False)
server = AgentServer()
@server.rtc_session()
async def entrypoint(ctx: JobContext):
"""Main entrypoint for the agent session."""
# Configure the agent session
session = AgentSession(
vad=inference.VAD(),
stt=openai.STT(model="whisper-1"),
llm=openai.LLM(model="gpt-4o-mini"),
tts=openai.TTS(voice="alloy"),
allow_interruptions=True,
min_endpointing_delay=0.5,
max_endpointing_delay=3.0,
)
logger.info("Starting agent session with RoomIO and Krisp noise cancellation")
# Create Krisp FrameProcessor for noise cancellation
processor = krisp.KrispVivaFilterFrameProcessor(
noise_suppression_level=100, # 0-100, where 100 is maximum suppression
frame_duration_ms=10,
sample_rate=16000, # Pre-load model at this sample rate
)
# Start the session with RoomIO configuration
# IMPORTANT: frame_size_ms must match Krisp's frame_duration_ms
await session.start(
agent=KrispAgent(),
room=ctx.room,
room_options=room_io.RoomOptions(
audio_input=room_io.AudioInputOptions(
sample_rate=16000, # Krisp supports: 8k, 16k, 24k, 32k, 44.1k, 48k
num_channels=1,
frame_size_ms=10, # Must match Krisp frame_duration_ms (10, 15, 20, 30, or 32)
noise_cancellation=processor, # Pass FrameProcessor directly
),
),
)
logger.info("✅ Krisp noise cancellation active")
if __name__ == "__main__":
cli.run_app(server)