ThunderPhone 2.0 এখন লাইভ।নিজেই শুরু করুন, খরচ মিনিটে 2¢ থেকে।ঘোষণাটি পড়ুন

Connect tools & data

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_endedThunderPhone কল শেষ করলে 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।
  • ভিডিও ফ্রেম উপেক্ষা করা হয়।