Χρησιμοποιήστε το ThunderPhone από το Pipecat
Εκτελέστε έναν φωνητικό πράκτορα ThunderPhone ως υπηρεσία ομιλία-σε-ομιλία μέσα σε μια ροή εργασίας Pipecat, με τη δική σας μεταφορά και τηλεφωνία.
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Το πακέτο περιβάλλει την υπηρεσία OpenAI Realtime του Pipecat, επειδή το
Realtime WebSocket του ThunderPhone μιλά το ίδιο πρωτόκολλο. Απαιτεί
pipecat-ai 1.8 ή νεότερο.
Εκτέλεση αποθηκευμένου πράκτορα
Όλα όσα κάνει ο πράκτορας (προτροπή, φωνή, μηχανή, γλώσσες, εργαλεία, χαιρετισμός, έλεγχοι σιωπής) διαμορφώνονται στο 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 | Προωθήστε EndWorkerFrame όταν το ThunderPhone τερματίζει την κλήση (ενεργό από προεπιλογή). |
Συμβάντα
Το 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.
- Ο ήχος είναι μονοφωνικό PCM 16-bit στα 24 kHz και στις δύο κατευθύνσεις.
- Τα καρέ βίντεο αγνοούνται.