Pipecat থেকে ThunderPhone ব্যবহার করুন
আপনার নিজস্ব ট্রান্সপোর্ট ও টেলিফোনি সহ একটি Pipecat পাইপলাইনের মধ্যে স্পিচ-টু-স্পিচ সার্ভিস হিসেবে একটি ThunderPhone ভয়েস এজেন্ট চালান।
Pipecat কম্পোজেবল সার্ভিস ব্যবহার করে ভয়েস এজেন্ট তৈরি করার জন্য একটি ওপেন-সোর্স ফ্রেমওয়ার্ক। ThunderPhone একটি স্পিচ-টু-স্পিচ LLM সার্ভিস হিসেবে যুক্ত হয়: Pipecat কলারের অডিও পাঠায়, ThunderPhone এজেন্টের কণ্ঠস্বর, ট্রান্সক্রিপ্ট এবং ফাংশন কল ফেরত দেয়, আর Pipecat-এর ট্রান্সপোর্ট (Daily, LiveKit, Twilio, WebRTC, একটি স্থানীয় মাইক্রোফোন) অডিও বহন করে। স্পিচ রিকগনিশন, ভাষা মডেল, কণ্ঠস্বর, পালা নেওয়া, 47টি ভাষা এবং টুল—সবকিছুই ThunderPhone-এ চলে।
এভাবে করা কলগুলো কল ইতিহাসে দেখা যায় এবং অন্য যেকোনো রিয়েলটাইম কলের মতো আপনার পণ্যের প্রতি-মিনিট হারে বিল করা হয়। এতে কোনো সাবস্ক্রিপশন বা ThunderPhone ফোন নম্বর জড়িত নেই।
ইনস্টল করুন
pip install pipecat-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyপ্যাকেজটি Pipecat-এর OpenAI Realtime সার্ভিসকে র্যাপ করে, কারণ ThunderPhone-এর
Realtime WebSocket একই প্রোটোকলে কথা বলে। এর জন্য
pipecat-ai 1.8 বা নতুন সংস্করণ প্রয়োজন।
একটি সংরক্ষিত এজেন্ট চালান
এজেন্ট যা কিছু করে (prompt, কণ্ঠস্বর, ইঞ্জিন, ভাষা, টুল, অভিবাদন, নীরবতা যাচাই)—সবকিছু ThunderPhone-এ কনফিগার করা হয়। পাইপলাইন শুধু অডিও সরায়।
from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.worker import PipelineParams, PipelineWorker
from pipecat.processors.aggregators.llm_context import LLMContext
from pipecat.processors.aggregators.llm_response_universal import LLMContextAggregatorPair
from pipecat_thunderphone import ThunderPhoneRealtimeLLMService
llm = ThunderPhoneRealtimeLLMService(agent_id=12)
context = LLMContext()
aggregators = LLMContextAggregatorPair(context)
pipeline = Pipeline([
transport.input(),
aggregators.user(),
llm,
aggregators.assistant(),
transport.output(),
])
worker = PipelineWorker(pipeline, params=PipelineParams(allow_interruptions=True))একটি সংরক্ষিত এজেন্ট নিজের সময়সূচি অনুযায়ী কল শুরু করে, তাই সার্ভিসটি Pipecat-এর
কাছ থেকে প্রারম্ভিক প্রতিক্রিয়া অনুরোধ করে না। তবুও একটি চাইলে
greet_on_connect=True দিন।
ইনলাইনে সেশন কনফিগার করুন
agent_id ছাড়া, নির্দেশনা ও টুল Pipecat কনটেক্সট থেকে আসে, OpenAI-এর ক্ষেত্রেও
যেভাবে আসে। product ইঞ্জিন বেছে নেয় এবং voice ThunderPhone-এর কণ্ঠস্বর বেছে নেয়।
from pipecat.adapters.schemas.function_schema import FunctionSchema
from pipecat.adapters.schemas.tools_schema import ToolsSchema
from pipecat.services.llm_service import FunctionCallParams
llm = ThunderPhoneRealtimeLLMService(product="bolt", voice="olivia", language="es")
async def check_availability(params: FunctionCallParams):
slots = await calendar.free_slots(params.arguments["date"])
await params.result_callback({"slots": slots})
llm.register_function("check_availability", check_availability)
context = LLMContext(
messages=[{"role": "system", "content": "You are Acme Dental's receptionist."}],
tools=ToolsSchema(standard_tools=[
FunctionSchema(
name="check_availability",
description="Free appointment slots on a date",
properties={"date": {"type": "string"}},
required=["date"],
)
]),
)ইনলাইন সেশন ক্লায়েন্ট-নিয়ন্ত্রিত: কনটেক্সট আসার সময় Pipecat প্রতিক্রিয়া অনুরোধ করে বলে এজেন্ট আগে কথা বলে, এবং আপনি কোনো বার্তা যোগ না করলে বা আরেকটি প্রতিক্রিয়া অনুরোধ না করলে নীরবতার সময় চুপ থাকে।
বিকল্পসমূহ
| আর্গুমেন্ট | অর্থ |
|---|---|
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 | উচ্চারণ চলাকালীন কলার ট্রান্সক্রিপ্টের খণ্ডাংশ স্ট্রিম করুন (অতিরিক্ত বিলযোগ্য)। |
greet_on_connect | সেশন প্রস্তুত হওয়ার সঙ্গে সঙ্গেই প্রথম প্রতিক্রিয়ার অনুরোধ করুন। |
end_task_on_call_ended | ThunderPhone কল শেষ করলে EndWorkerFrame পাঠান (ডিফল্টভাবে চালু)। |
ইভেন্ট
ThunderPhone রিয়েলটাইম প্রোটোকলের ওপর প্ল্যাটফর্ম ইভেন্ট যোগ করে। সার্ভিসটি সেগুলো হ্যান্ডলারে পাঠায়:
@llm.event_handler("on_call_ended")
async def on_call_ended(service, event):
print("call ended:", event["reason"], "call id:", service.call_id)সেশন লাইভ হলে service.call_id সেট হয়। কলের পর রেকর্ডিং,
ট্রান্সক্রিপ্ট এবং গ্রেড আনতে এটি
GET /v1/calls/{call_id}-এর সঙ্গে ব্যবহার করুন।
সীমা
- টার্ন শনাক্তকরণ সার্ভার-সাইডে এবং সবসময় চালু থাকে; Pipecat-নিয়ন্ত্রিত টার্ন
(
turn_detection=False) সমর্থিত নয়। - সার্ভিসে নিবন্ধিত ফাংশনগুলো শুধু ইনলাইন সেশনের জন্য চলে। একটি সংরক্ষিত এজেন্ট ThunderPhone-এ নিজস্ব টুল চালায়।
- উভয় দিকেই অডিও হলো 24 kHz-এ 16-বিট মনো PCM।
- ভিডিও ফ্রেম উপেক্ষা করা হয়।