LiveKit Agents ನಿಂದ ThunderPhone ಬಳಸಿ
LiveKit ಕೊಠಡಿಗಳು, SIP ಮತ್ತು ಟೆಲಿಫೋನಿ ಸುತ್ತಲೂ ಇರುವ LiveKit Agents ಸೆಷನ್ನ ರಿಯಲ್ಟೈಮ್ (ಮಾತಿನಿಂದ-ಮಾತಿಗೆ) ಮಾದರಿಯಾಗಿ ThunderPhone ಧ್ವನಿ ಏಜೆಂಟ್ ಅನ್ನು ಚಲಾಯಿಸಿ.
LiveKit Agents ಎಂಬುದು LiveKit ರೂಮ್ಗಳ ಮೇಲೆ ನೈಜಕಾಲದ ಧ್ವನಿ ಏಜೆಂಟ್ಗಳಿಗಾಗಿ ಇರುವ ಮುಕ್ತ-ಮೂಲ ಫ್ರೇಮ್ವರ್ಕ್ ಆಗಿದೆ. ThunderPhone ನೈಜಕಾಲದ ಮಾದರಿಯಾಗಿ ಸಂಯೋಜನೆಯಾಗುತ್ತದೆ: ಫ್ರೇಮ್ವರ್ಕ್ ಭಾಗವಹಿಸುವವರ ಆಡಿಯೊವನ್ನು ಕಳುಹಿಸುತ್ತದೆ, ThunderPhone ಏಜೆಂಟ್ನ ಧ್ವನಿ, ಟ್ರಾನ್ಸ್ಕ್ರಿಪ್ಟ್ಗಳು ಮತ್ತು ಫಂಕ್ಷನ್ ಕರೆಗಳನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ, ಮತ್ತು LiveKit ನ ರೂಮ್, SIP ಟ್ರಂಕ್ಗಳು ಹಾಗೂ ಟೆಲಿಫೋನಿ ಆಡಿಯೊವನ್ನು ಸಾಗಿಸುತ್ತವೆ. ವಾಕ್ ಗುರುತಿಸುವಿಕೆ, ಭಾಷಾ ಮಾದರಿ, ಧ್ವನಿ, ಸರದಿ-ತೆಗೆದುಕೊಳ್ಳುವಿಕೆ, 47 ಭಾಷೆಗಳು ಮತ್ತು ಟೂಲ್ಗಳು ಎಲ್ಲವೂ ThunderPhone ನಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ.
ಈ ರೀತಿಯಲ್ಲಿ ಮಾಡಿದ ಕರೆಗಳು ಕರೆ ಇತಿಹಾಸದಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ ಮತ್ತು ಇತರ ಯಾವುದೇ ನೈಜಕಾಲದ ಕರೆಯಂತೆ ನಿಮ್ಮ ಉತ್ಪನ್ನದ ಪ್ರತಿ-ನಿಮಿಷದ ದರದಲ್ಲಿ ಶುಲ್ಕ ವಿಧಿಸಲಾಗುತ್ತದೆ. ಇದರಲ್ಲಿ ಚಂದಾದಾರಿಕೆ ಅಥವಾ ThunderPhone ಫೋನ್ ಸಂಖ್ಯೆ ಇರುವುದಿಲ್ಲ.
ಸ್ಥಾಪಿಸಿ
pip install livekit-plugins-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyThunderPhone ನ Realtime WebSocket ಅದೇ ಪ್ರೊಟೋಕಾಲ್ನಲ್ಲಿ ಸಂವಹನ ನಡೆಸುವುದರಿಂದ, ಪ್ಲಗಿನ್ LiveKit ನ OpenAI Realtime ಮಾದರಿಯನ್ನು ಸುತ್ತುವರಿಯುತ್ತದೆ. ಇದಕ್ಕೆ livekit-agents 1.8 ಅಥವಾ ಹೊಸ ಆವೃತ್ತಿ ಅಗತ್ಯವಿದೆ.
ಉಳಿಸಿದ ಏಜೆಂಟ್ ಅನ್ನು ಚಲಾಯಿಸಿ
ಏಜೆಂಟ್ ಮಾಡುವ ಎಲ್ಲವೂ (prompt, ಧ್ವನಿ, ಎಂಜಿನ್, ಭಾಷೆಗಳು, ಟೂಲ್ಗಳು, ಸ್ವಾಗತ, ಮೌನ ಪರಿಶೀಲನೆಗಳು) ThunderPhone ನಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಆಗಿರುತ್ತದೆ. ಸೆಷನ್ ಕೇವಲ ಆಡಿಯೊವನ್ನು ಸಾಗಿಸುತ್ತದೆ.
from livekit.agents import Agent, AgentSession, JobContext, WorkerOptions, cli
from livekit.plugins import thunderphone
async def entrypoint(ctx: JobContext):
session = AgentSession(llm=thunderphone.RealtimeModel(agent_id=12))
await session.start(agent=Agent(instructions=""), room=ctx.room)
if __name__ == "__main__":
cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))ಉಳಿಸಿದ ಏಜೆಂಟ್ ThunderPhone ನಲ್ಲಿ ಸ್ವಾಗತಿಸುತ್ತದೆ ಮತ್ತು ತನ್ನ ಸ್ವಂತ ಟೂಲ್ಗಳನ್ನು ಚಲಾಯಿಸುತ್ತದೆ; LiveKit ನ Agent ಸೂಚನೆಗಳು ಮತ್ತು ಟೂಲ್ಗಳನ್ನು ಕಳುಹಿಸಲಾಗುವುದಿಲ್ಲ. ThunderPhone ಏಜೆಂಟ್ ಕರೆ ಸ್ಥಗಿತಗೊಳಿಸಿದಾಗ ಕರೆ ಕೊನೆಗೊಳ್ಳುತ್ತದೆ ಮತ್ತು ಅದರೊಂದಿಗೆ ಸೆಷನ್ ಮುಚ್ಚುತ್ತದೆ.
ಸೆಷನ್ ಅನ್ನು ಇನ್ಲೈನ್ನಲ್ಲಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಿ
agent_id ಇಲ್ಲದೆ, OpenAI ಗಾಗಿ ಇರುವ ರೀತಿಯಲ್ಲೇ ಸೂಚನೆಗಳು ಮತ್ತು ಟೂಲ್ಗಳು LiveKit ನ Agentನಿಂದ ಬರುತ್ತವೆ. product ಎಂಜಿನ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡುತ್ತದೆ ಮತ್ತು voice ThunderPhone ಧ್ವನಿಯನ್ನು ಆಯ್ಕೆಮಾಡುತ್ತದೆ.
from livekit.agents import Agent, AgentSession, RunContext, function_tool
from livekit.plugins import thunderphone
class Receptionist(Agent):
def __init__(self):
super().__init__(instructions="You are Acme Dental's receptionist. Be brief.")
@function_tool
async def check_availability(self, context: RunContext, date: str) -> dict:
"""Free appointment slots on a date."""
return {"slots": await calendar.free_slots(date)}
async def entrypoint(ctx: JobContext):
session = AgentSession(
llm=thunderphone.RealtimeModel(product="bolt", voice="olivia", language="es"),
)
await session.start(agent=Receptionist(), room=ctx.room)
await session.generate_reply() # the agent speaks firstಕರೆ ಪ್ರಾರಂಭವಾದಾಗ ThunderPhone ಸೂಚನೆಗಳು ಮತ್ತು ಟೂಲ್ಗಳನ್ನು ಸ್ಥಿರಗೊಳಿಸುತ್ತದೆ, ಆದ್ದರಿಂದ ಅವುಗಳನ್ನು ಬದಲಾಯಿಸುವ update_instructions, update_tools ಮತ್ತು ಏಜೆಂಟ್ ಹಸ್ತಾಂತರಗಳಿಗೆ ಕರೆಯ ಮಧ್ಯದಲ್ಲಿ ಬೆಂಬಲವಿಲ್ಲ. ಇನ್ಲೈನ್ ಸೆಷನ್ಗಳು ಕ್ಲೈಂಟ್-ನಿಯಂತ್ರಿತವಾಗಿರುತ್ತವೆ: ನೀವು generate_reply() ಅನ್ನು ಕರೆದಾಗ ಅಥವಾ ಭಾಗವಹಿಸುವವರು ಒಂದು ಸರದಿಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದಾಗ ಏಜೆಂಟ್ ಮಾತನಾಡುತ್ತದೆ.
ಆಯ್ಕೆಗಳು
| ಆರ್ಗ್ಯುಮೆಂಟ್ | ಅರ್ಥ |
|---|---|
api_key | ರಹಸ್ಯ ಕೀ (sk_live_...). ಡೀಫಾಲ್ಟ್ ಆಗಿ THUNDERPHONE_API_KEY ಇರುತ್ತದೆ. |
agent_id | ಉಳಿಸಿದ ಏಜೆಂಟ್ ಅನ್ನು ಚಲಾಯಿಸಿ. product ಮತ್ತು voice ಜೊತೆಗೆ ಪರಸ್ಪರ ಹೊರತಾಗಿದೆ. |
product | ಇನ್ಲೈನ್ ಸೆಷನ್ಗಳ ಎಂಜಿನ್: spark, bolt ಅಥವಾ storm. |
voice | ಇನ್ಲೈನ್ ಸೆಷನ್ಗಳಿಗಾಗಿ ThunderPhone ಧ್ವನಿ ಹೆಸರು. |
language | ಇನ್ಲೈನ್ ಸೆಷನ್ಗಳ ಪ್ರಾಥಮಿಕ ಭಾಷೆ ಸೂಚನೆ, ಉದಾಹರಣೆಗೆ es. |
from_number, to_number | ರೂಮ್ ಫೋನ್ ಲೈನ್ ಅನ್ನು ನಿರ್ವಹಿಸುವಾಗ ಕರೆಯಲ್ಲಿ ದಾಖಲಿಸಬೇಕಾದ ಸಂಖ್ಯೆಗಳು. |
live_transcripts | ಕರೆಮಾಡುವವರ ಟ್ರಾನ್ಸ್ಕ್ರಿಪ್ಟ್ ತುಣುಕುಗಳನ್ನು ಉಚ್ಚಾರಣೆಯ ಮಧ್ಯದಲ್ಲೇ ಸ್ಟ್ರೀಮ್ ಮಾಡಿ (ಹೆಚ್ಚುವರಿ ಶುಲ್ಕ). |
base_url | ಎಂಡ್ಪಾಯಿಂಟ್ ಓವರ್ರೈಡ್, ಡೀಫಾಲ್ಟ್ wss://api.thunderphone.com/v1/realtime. |
ಘಟನೆಗಳು
ThunderPhone ರಿಯಲ್ಟೈಮ್ ಪ್ರೋಟೋಕಾಲ್ಗೆ ಹೆಚ್ಚುವರಿಯಾಗಿ ಪ್ಲಾಟ್ಫಾರ್ಮ್ ಘಟನೆಗಳನ್ನು ಸೇರಿಸುತ್ತದೆ. ಸೆಷನ್ ಅವುಗಳನ್ನು ಹೊರಸೂಸುತ್ತದೆ:
@session.llm.session.on("thunderphone_call_ended") # or on the RealtimeSession you hold
def on_call_ended(event):
print("call ended:", event["reason"])ಸೆಷನ್ ಲೈವ್ ಆದ ಬಳಿಕ RealtimeSession, call_id ಅನ್ನು ಒದಗಿಸುತ್ತದೆ. ಕರೆಯ ನಂತರ ರೆಕಾರ್ಡಿಂಗ್,
ಟ್ರಾನ್ಸ್ಕ್ರಿಪ್ಟ್ ಮತ್ತು ಗ್ರೇಡ್ ಪಡೆಯಲು ಅದನ್ನು
GET /v1/calls/{call_id} ಜೊತೆಗೆ ಬಳಸಿ. ಪ್ರತಿಯೊಂದು ಇತರ call.* ಘಟನೆ
(ವರ್ಗಾವಣೆ, ಕೀಪ್ಯಾಡ್, ಮಾತು ನಿರ್ಲಕ್ಷಿಸಲಾಗಿದೆ) thunderphone_call_event ಆಗಿ ಬರುತ್ತದೆ.
ಮಿತಿಗಳು
- ಟರ್ನ್ ಪತ್ತೆ ಸರ್ವರ್ ಬದಿಯಲ್ಲಿದೆ ಮತ್ತು ಯಾವಾಗಲೂ ಸಕ್ರಿಯವಾಗಿರುತ್ತದೆ; ಫ್ರೇಮ್ವರ್ಕ್ ಬದಿಯ ಟರ್ನ್ ಪತ್ತೆ
(
AgentSessionನಲ್ಲಿನturn_detection) ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ. - ಕರೆ ಪ್ರಾರಂಭವಾದ ನಂತರ ಸೂಚನೆಗಳು ಮತ್ತು ಉಪಕರಣಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ.
- ಆಡಿಯೊ ಎರಡೂ ದಿಕ್ಕುಗಳಲ್ಲಿ 24 ಕಿಲೋಹರ್ಟ್ಜ್ನಲ್ಲಿ 16-ಬಿಟ್ ಮೊನೊ PCM ಆಗಿರುತ್ತದೆ.
- ವೀಡಿಯೊ ಫ್ರೇಮ್ಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುತ್ತದೆ.