dv-pipecat-ai 0.0.82.dev881__py3-none-any.whl → 0.0.85.dev1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dv-pipecat-ai might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-pipecat-ai
3
- Version: 0.0.82.dev881
3
+ Version: 0.0.85.dev1
4
4
  Summary: An open source framework for voice (and multimodal) assistants
5
5
  License-Expression: BSD-2-Clause
6
6
  Project-URL: Source, https://github.com/pipecat-ai/pipecat
@@ -134,6 +134,7 @@ Requires-Dist: fastapi<0.117.0,>=0.115.6; extra == "runner"
134
134
  Requires-Dist: pipecat-ai-small-webrtc-prebuilt>=1.0.0; extra == "runner"
135
135
  Provides-Extra: sambanova
136
136
  Provides-Extra: sarvam
137
+ Requires-Dist: sarvamai<1,>=0.1.19; extra == "sarvam"
137
138
  Requires-Dist: websockets<15.0,>=13.1; extra == "sarvam"
138
139
  Provides-Extra: sentry
139
140
  Requires-Dist: sentry-sdk~=2.23.1; extra == "sentry"
@@ -1,4 +1,4 @@
1
- dv_pipecat_ai-0.0.82.dev881.dist-info/licenses/LICENSE,sha256=DWY2QGf2eMCFhuu2ChairtT6CB7BEFffNVhXWc4Od08,1301
1
+ dv_pipecat_ai-0.0.85.dev1.dist-info/licenses/LICENSE,sha256=DWY2QGf2eMCFhuu2ChairtT6CB7BEFffNVhXWc4Od08,1301
2
2
  pipecat/__init__.py,sha256=j0Xm6adxHhd7D06dIyyPV_GlBYLlBnTAERVvD_jAARQ,861
3
3
  pipecat/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  pipecat/adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -59,10 +59,11 @@ pipecat/audio/turn/smart_turn/local_coreml_smart_turn.py,sha256=50kiBeZhnq7FZWZn
59
59
  pipecat/audio/turn/smart_turn/local_smart_turn.py,sha256=KVodqUTu8onfmfeOywgH98vBCNvBb-B3pvsQlTKyP_4,3570
60
60
  pipecat/audio/turn/smart_turn/local_smart_turn_v2.py,sha256=aYLMDURpmYycQgKsxbNEENtUe5oujeQ9H3Lbi0GYmZA,7160
61
61
  pipecat/audio/vad/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
- pipecat/audio/vad/silero.py,sha256=r9UL8aEe-QoRMNDGWLUlgUYew93-QFojE9sIqLO0VYE,7792
62
+ pipecat/audio/vad/silero.py,sha256=Cz4_hJjaBKbmUwZVbqMzED8orHOCsnF3zpERgBTw1Rw,7906
63
63
  pipecat/audio/vad/vad_analyzer.py,sha256=XkZLEe4z7Ja0lGoYZst1HNYqt5qOwG-vjsk_w8chiNA,7430
64
64
  pipecat/audio/vad/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
65
  pipecat/audio/vad/data/silero_vad.onnx,sha256=WX0ws-wHZgjQWUd7sUz-_9-VG_XK43DTj2XTO7_oIAQ,2327524
66
+ pipecat/audio/vad/data/silero_vad_v2.onnx,sha256=JiOilT9v89LB5hdAxs23FoEzR5smff7xFKSjzFvdeI8,2327524
66
67
  pipecat/clocks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
68
  pipecat/clocks/base_clock.py,sha256=PuTmCtPKz5VG0VxhN5cyhbvduEBnfNPgA6GLAu1eSns,929
68
69
  pipecat/clocks/system_clock.py,sha256=ht6TdDAn0JVXEmhLdt5igcHMQOkKO4YHNuOjuKcxkUU,1315
@@ -73,7 +74,7 @@ pipecat/extensions/voicemail/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
73
74
  pipecat/extensions/voicemail/voicemail_detector.py,sha256=g3L1m3cPJzsadeB5a8WRC9klH0D8m7xfPgB2YEaL6Do,29983
74
75
  pipecat/frames/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
76
  pipecat/frames/frames.proto,sha256=JXZm3VXLR8zMOUcOuhVoe2mhM3MQIQGMJXLopdJO_5Y,839
76
- pipecat/frames/frames.py,sha256=2T_l8fLlG7uKIdCx2SxNhY3X5WHI-94YK1a7kxsQbiU,44294
77
+ pipecat/frames/frames.py,sha256=oqoo7p-uJOqak50mxhCGq7S0TusM0I4qp3QAftKHQnw,45428
77
78
  pipecat/frames/protobufs/frames_pb2.py,sha256=VHgGV_W7qQ4sfQK6RHb5_DggLm3PiSYMr6aBZ8_p1cQ,2590
78
79
  pipecat/metrics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
80
  pipecat/metrics/metrics.py,sha256=bdZNciEtLTtA-xgoKDz2RJAy6fKrXkTwz3pryVHzc2M,2713
@@ -96,11 +97,12 @@ pipecat/pipeline/service_switcher.py,sha256=GjqtBtMSyKa0XtjYa1_requMztPRQsbWDPyZ
96
97
  pipecat/pipeline/sync_parallel_pipeline.py,sha256=dZ17GoY2q8cHwNr9zPOM-TdiC4ERe9oGEkMEV9-YDtI,10654
97
98
  pipecat/pipeline/task.py,sha256=s87JozSQvdB2sLQs9fSuiEXvB62NxZn_rqY-XFbtrwo,34110
98
99
  pipecat/pipeline/task_observer.py,sha256=DswTNgdV1bS9buKNt-E5T5vNptffhjeqoD75YNmP1GQ,6835
100
+ pipecat/pipeline/tts_switcher.py,sha256=hyGFVRbDQfaIaeIzyVkUHA3sgAFpsdkRBMId_cZJ-gM,1067
99
101
  pipecat/pipeline/to_be_updated/merge_pipeline.py,sha256=jLEWdufIW3z1xZhdoLowdJ_SGz018DQw8JYGwlBYvE4,1845
100
102
  pipecat/processors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
103
  pipecat/processors/async_generator.py,sha256=qPOZxk5eOad_NrF_Z06vWZ6deXIxb9AKZKYO2e5pkJs,2385
102
104
  pipecat/processors/consumer_processor.py,sha256=DrWCKnfblknZJ0bLmR_unIeJ1axQw4IPUn2IB3KLGGA,3228
103
- pipecat/processors/dtmf_aggregator.py,sha256=D9Ld0fTxi7lDneTV2MBf1kN6yzlnkK-xlNvUIIxPJ68,6861
105
+ pipecat/processors/dtmf_aggregator.py,sha256=mo_IXUlsnVl-_Xn8sbTGnRF4Lkts0h6E3uauGbeFyWs,10204
104
106
  pipecat/processors/frame_processor.py,sha256=VlU1h01FUilQ9UGzn7uuXELtNaASwbiMQxPChySJ7_g,29727
105
107
  pipecat/processors/idle_frame_processor.py,sha256=z8AuhGap61lA5K35P6XCaOpn4kkmK_9NZNppbpQxheU,3124
106
108
  pipecat/processors/logger.py,sha256=VGNwxQSc_F0rS3KBmfqas7f5aFyRQKfeljozOxfGXk4,2393
@@ -108,13 +110,13 @@ pipecat/processors/producer_processor.py,sha256=iIIOHZd77APvUGP7JqFbznAHUnCULcq_
108
110
  pipecat/processors/text_transformer.py,sha256=LnfWJYzntJhZhrQ1lgSSY4D4VbHtrQJgrC227M69ZYU,1718
109
111
  pipecat/processors/transcript_processor.py,sha256=CG9yej6WOiy_HhagNXjxkISHkHii0JDfK_V6opseC2E,11740
110
112
  pipecat/processors/two_stage_user_idle_processor.py,sha256=uf2aZh_lfW-eMxmFogP3R4taAJ1yXOSqjKsR7oXtD0Y,2938
111
- pipecat/processors/user_idle_processor.py,sha256=mGYv6UYxU7Qbgg4pTuGxDmZxnlyEtwMWaXtrQ9_fvaY,7969
113
+ pipecat/processors/user_idle_processor.py,sha256=PQItBx5bL1y_lFTtHf0zgLubjCXv60jU1jrVtm-K4bg,9268
112
114
  pipecat/processors/aggregators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
- pipecat/processors/aggregators/dtmf_aggregator.py,sha256=Vv5FKKt6NNH4tnPZT2MQBKijmekEhBDTrg4hESCeIMI,5324
115
+ pipecat/processors/aggregators/dtmf_aggregator.py,sha256=nngjLiaOtcZtuCNpYPyfUVLtUBUC6USuvS0tSdA9_zo,5054
114
116
  pipecat/processors/aggregators/gated.py,sha256=tii0sRrBkRW6y9Xq5iTWPnqlOEejU4VqPIPtdOa61pc,3073
115
117
  pipecat/processors/aggregators/gated_openai_llm_context.py,sha256=cr6MT8J6SpPzZbppKPOKe3_pt_5qXC9g6a4wvZDyrec,3005
116
118
  pipecat/processors/aggregators/llm_context.py,sha256=eDf1cQElcISLx3onaA9LCWuepzb2G_JGszLzpNXggXo,9723
117
- pipecat/processors/aggregators/llm_response.py,sha256=0w2jvDFUV6KM4K9TPe7j6UOPKF_p_vYX7SSfFnD1DIU,47559
119
+ pipecat/processors/aggregators/llm_response.py,sha256=P7DwrbzMQx6HUFmvc-9h65YPoGEU9JOpEYLwaUzkB_o,47671
118
120
  pipecat/processors/aggregators/llm_response_universal.py,sha256=fBnB3rZVdxj4iEKIWcnR7yTpqyKupbcg7IUv6XVxrDQ,34287
119
121
  pipecat/processors/aggregators/openai_llm_context.py,sha256=cC8DXdVPERRN04i0i-1Ys6kusvnbMALeH-Z8Pu5K684,12999
120
122
  pipecat/processors/aggregators/sentence.py,sha256=E7e3knfQl6HEGpYMKPklF1aO_gOn-rr7SnynErwfkQk,2235
@@ -127,7 +129,7 @@ pipecat/processors/filters/frame_filter.py,sha256=ZPtHToASfbbtwAdrnQH8POKIvT8hF0
127
129
  pipecat/processors/filters/function_filter.py,sha256=QNQZBIe1gzSPNI_4Zg2fgyeUhX-AmbIMp7r_XWNhwjU,2400
128
130
  pipecat/processors/filters/identity_filter.py,sha256=YNQWNNnuHivNwJa71Gc7A6ZHHq5Zw_kvuNrq9LUKK44,1418
129
131
  pipecat/processors/filters/null_filter.py,sha256=CourFfNXyhaesksiBuXxv5-mFSDpy6e9bOJ04p3iK40,1467
130
- pipecat/processors/filters/stt_mute_filter.py,sha256=BP1PX2Ka80ZZV1Mpp4OH9xA3V6cntsseQ7VUnXREWnw,9356
132
+ pipecat/processors/filters/stt_mute_filter.py,sha256=a9Pgp-z1pNQtDIKBtzdP4yFLf-3EhAoQAd0XSXWLpsQ,10147
131
133
  pipecat/processors/filters/wake_check_filter.py,sha256=EKOuw_DCK4EWJ794xS8Xza-QQImD-pjgWYp0wdyvHjI,5099
132
134
  pipecat/processors/filters/wake_notifier_filter.py,sha256=1yV3Tw8OROCS97nuZNs4igcNvRQyYu1RG2gNvYMWxKc,2077
133
135
  pipecat/processors/frameworks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -144,14 +146,14 @@ pipecat/runner/livekit.py,sha256=in-2Io3FUZV-VcZZ-gQCx9L1WnKp5sHqmm7tDYlFNl4,458
144
146
  pipecat/runner/run.py,sha256=qY3Tj-sNRnhg_MrgyzbF78LriH1hh68ENnJMZi1sZAE,18815
145
147
  pipecat/runner/types.py,sha256=iG9A1ox1ePXiEo2bWANsi6RxpGOb5n_Am5O3enbojBM,1599
146
148
  pipecat/runner/utils.py,sha256=TLf5NfNFm7i4yFcNE58vDT8T-D9gbuPdtGryaHRWnIM,17722
147
- pipecat/serializers/__init__.py,sha256=OV61GQX5ZVU7l7Dt7UTBdv2wUF7ZvtbCoXryo7nnoGY,734
149
+ pipecat/serializers/__init__.py,sha256=xcmbbR7YYU5C4HPbo2WVgPij-Bl_qlrLcnunCdpcZkg,804
148
150
  pipecat/serializers/asterisk.py,sha256=bPuGuLiCf04_H0d9Gc-5BpEtqD9BRNWnpZZq5MZ1fDY,6091
149
151
  pipecat/serializers/base_serializer.py,sha256=OyBUZccs2ZT9mfkBbq2tGsUJMvci6o-j90Cl1sicPaI,2030
150
- pipecat/serializers/convox.py,sha256=MXCLhV6GMnoP8bI6-EVrObhrftEyTGOmzVeIU5ywmPo,9536
152
+ pipecat/serializers/convox.py,sha256=Irby_iZywgBtevlxiC8nE2GY3eh4yNNRi2YC-0vnNTY,11155
153
+ pipecat/serializers/custom.py,sha256=O0gHTyoSb1AZ_tEmE9VgRViYckmsNzjwCAqt-Xc2CaM,9081
151
154
  pipecat/serializers/exotel.py,sha256=U08EQeRzfW6O2P5mKeCjTy1Ur9KoTjVty3MehmVBEC0,5939
152
- pipecat/serializers/genesys.py,sha256=5g6_F-OIWSNmStgc6-bDT5mDQkCHHKxcOWSb-F4s2-A,3564
153
155
  pipecat/serializers/livekit.py,sha256=caVZlVJGV-SmEXE_H7i3DRo1RvC9FgGCVqi8IYGrpEo,2552
154
- pipecat/serializers/plivo.py,sha256=_1qYc5AQmCO8qTgMcvN5mK6lBcgjsrtdOEzgEo_r_x4,9242
156
+ pipecat/serializers/plivo.py,sha256=9hJ8gvkVp1_sFx30ELWMJPMQQskwLKWsD49DALzAsRA,9410
155
157
  pipecat/serializers/protobuf.py,sha256=h0UgVvIa3LXxtpbeQUq0tCGicGbDHxjiY6EdxXJO0_s,5162
156
158
  pipecat/serializers/telnyx.py,sha256=9JiU_Ii9d3_-5xOzXAOdQwTn9WEuT3dtKb2iGH8GeY4,10857
157
159
  pipecat/serializers/twilio.py,sha256=Eujl7fCImuJWkbgW9yrIaM2BICwNXzUalmb5RUyVKiA,9763
@@ -199,7 +201,7 @@ pipecat/services/deepgram/tts.py,sha256=H_2WCJEx3_L4ytrHHRNkA-6GKTd1coou_vvTfiEo
199
201
  pipecat/services/deepseek/__init__.py,sha256=bU5z_oNGzgrF_YpsD9pYIMtEibeZFaUobbRjJ9WcYyE,259
200
202
  pipecat/services/deepseek/llm.py,sha256=5KjpU2blmhUTM3LcRE1ymdsk6OmoFkIzeQgyNOGwQh8,3112
201
203
  pipecat/services/elevenlabs/__init__.py,sha256=fl_Z0Ua-IgONoFGn4O-pMafwufjZ9C6cCVJkR1dN5lI,288
202
- pipecat/services/elevenlabs/stt.py,sha256=yekKTu-ymsvP79LXYaXIFBF2uCBNfqqYmFoimlcSUIg,11291
204
+ pipecat/services/elevenlabs/stt.py,sha256=nMRfeboolkAopCcdMhLf4P8mHtz4WrsrCqo6-bFrwWw,11733
203
205
  pipecat/services/elevenlabs/tts.py,sha256=RZ9thg_kFWk1xhfmW047Pk0FjtWdkgnRMiGYFv3_cWk,42777
204
206
  pipecat/services/fal/__init__.py,sha256=z_kfZETvUcKy68Lyvni4B-RtdkOvz3J3eh6sFDVKq6M,278
205
207
  pipecat/services/fal/image.py,sha256=vArKLKrIGoZfw_xeZY_E7zbUzfzVsScj-R7mOmVqjRQ,4585
@@ -224,7 +226,6 @@ pipecat/services/google/llm_openai.py,sha256=CiyeRXG8t_e6A-kzAmvEGzQdvv_9v2ln96c
224
226
  pipecat/services/google/llm_vertex.py,sha256=yqs8pqUCTgRj5wvQFHPJbGduoIaXjaqPym5x-lh5LhI,5032
225
227
  pipecat/services/google/rtvi.py,sha256=PZb1yVny5YG7_XmJRXPzs3iYapeQ4XHreFN1v6KwTGM,3014
226
228
  pipecat/services/google/stt.py,sha256=1vKZNEKZ-KLKp_7lA_VijznSqTwYRFYK1sDn2qteKtI,32814
227
- pipecat/services/google/test-google-chirp.py,sha256=ji6ta7WDgKMu9yeKovuIVRlcMuk8S6XIyzIokHQY80E,1437
228
229
  pipecat/services/google/tts.py,sha256=S_JSPqzLABfuyHLRppNiDmq2g9OFcnJOrfysVg3OHbY,32038
229
230
  pipecat/services/grok/__init__.py,sha256=PyaTSnqwxd8jdF5aFTe3lWM-TBhfDyUu9ahRl6nPS-4,251
230
231
  pipecat/services/grok/llm.py,sha256=UwCWCiqGcDy_1T8Xo904CdXyAT7QfAQn3H_awtuxIcU,7409
@@ -288,14 +289,15 @@ pipecat/services/riva/tts.py,sha256=idbqx3I2NlWCXtrIFsjEaYapxA3BLIA14ai3aMBh-2w,
288
289
  pipecat/services/sambanova/__init__.py,sha256=oTXExLic-qTcsfsiWmssf3Elclf3IIWoN41_2IpoF18,128
289
290
  pipecat/services/sambanova/llm.py,sha256=5XVfPLEk__W8ykFqLdV95ZUhlGGkAaJwmbciLdZYtTc,8976
290
291
  pipecat/services/sambanova/stt.py,sha256=ZZgEZ7WQjLFHbCko-3LNTtVajjtfUvbtVLtFcaNadVQ,2536
291
- pipecat/services/sarvam/__init__.py,sha256=rfHd18ccf-oCytmkKFSyZ1tV-FWglM1D-iKNkA2_sxc,110
292
- pipecat/services/sarvam/tts.py,sha256=H7tKV7WAdefJ_JwVwSX6rPQ5m4RmdnflQnxOML-DgFY,24444
292
+ pipecat/services/sarvam/__init__.py,sha256=B4TN_tTHV9fWg0aSoPvfQlXISA0nJaQ9-u08I9UWvH4,280
293
+ pipecat/services/sarvam/stt.py,sha256=p9Iq4loMwnftNZ_S0WoFSoX7iBbRKyja6RsVWbpj508,19314
294
+ pipecat/services/sarvam/tts.py,sha256=K-AtWE1Q0ZZwshLP-7sCDmOSIWhuKOj91BCCE4N9XAk,25010
293
295
  pipecat/services/simli/__init__.py,sha256=cbDcqOaGsEgKbGYKpJ1Vv7LN4ZjOWA04sE84WW5vgQI,257
294
296
  pipecat/services/simli/video.py,sha256=fVMYsCE5epH9rTdhN_tyPPJw7W6TCMHCOe2akKHWduw,8330
295
297
  pipecat/services/soniox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
296
298
  pipecat/services/soniox/stt.py,sha256=AhJF2YOzmqgB80x22jocgzr3neYCBMyxzP_WjkYR9Gc,15441
297
299
  pipecat/services/speechmatics/__init__.py,sha256=Jgq1fqrZVkpWC21D79L1cn5Ub8PnYgnnCaqC5pOlbIc,89
298
- pipecat/services/speechmatics/stt.py,sha256=Ljc7cqDMLxdg99NTP4Fcs9rJ5Xfl_GzxH4gMiVhmR88,44261
300
+ pipecat/services/speechmatics/stt.py,sha256=K91na2r_aDVQ1ZsUFRPGTds8nIp_CO8ZpVHDmT4iojM,44741
299
301
  pipecat/services/tavus/__init__.py,sha256=SNyyi2Xq6tXIihDG2Bwvmg6Srbd-uWd1RwG-NKWcPuI,257
300
302
  pipecat/services/tavus/video.py,sha256=67WX49Th7v6xRIPoTpvbe15CB84OD9ax2ta9jL0fWiQ,10714
301
303
  pipecat/services/together/__init__.py,sha256=hNMycJDDf3CLiL9WA9fwvMdYphyDWLv0OabYIMgvC1c,259
@@ -303,7 +305,7 @@ pipecat/services/together/llm.py,sha256=VSayO-U6g9Ld0xK9CXRQPUsd5gWJKtiA8qDAyXgs
303
305
  pipecat/services/ultravox/__init__.py,sha256=EoHCSXI2o0DFQslELgkhAGZtxDj63gZi-9ZEhXljaKE,259
304
306
  pipecat/services/ultravox/stt.py,sha256=uCQm_-LbycXdXRV6IE1a6Mymis6tyww7V8PnPzAQtx8,16586
305
307
  pipecat/services/vistaar/__init__.py,sha256=UFfSWFN5rbzl6NN-E_OH_MFaSYodZWNlenAU0wk-rAI,110
306
- pipecat/services/vistaar/llm.py,sha256=CwPPZuv5ulB-2hrH65-uMGBNlAXA3Kf_rzcYIeEF-ME,17274
308
+ pipecat/services/vistaar/llm.py,sha256=5dYy5PGnOp79ccXUY1EsseQ8uSrXgBv5mhiBG5ji1bE,19202
307
309
  pipecat/services/whisper/__init__.py,sha256=smADmw0Fv98k7cGRuHTEcljKTO2WdZqLpJd0qsTCwH8,281
308
310
  pipecat/services/whisper/base_stt.py,sha256=VhslESPnYIeVbmnQTzmlZPV35TH49duxYTvJe0epNnE,7850
309
311
  pipecat/services/whisper/stt.py,sha256=9Qd56vWMzg3LtHikQnfgyMtl4odE6BCHDbpAn3HSWjw,17480
@@ -376,7 +378,7 @@ pipecat/utils/tracing/service_decorators.py,sha256=HwDCqLGijhYD3F8nxDuQmEw-YkRw0
376
378
  pipecat/utils/tracing/setup.py,sha256=7TEgPNpq6M8lww8OQvf0P9FzYc5A30xICGklVA-fua0,2892
377
379
  pipecat/utils/tracing/turn_context_provider.py,sha256=ikon3plFOx0XbMrH6DdeHttNpb-U0gzMZIm3bWLc9eI,2485
378
380
  pipecat/utils/tracing/turn_trace_observer.py,sha256=dma16SBJpYSOE58YDWy89QzHyQFc_9gQZszKeWixuwc,9725
379
- dv_pipecat_ai-0.0.82.dev881.dist-info/METADATA,sha256=Ve7Vq3-fIlsoJB_ArZlL0wSOnVbBDdX-tCZjpvn3zjA,32639
380
- dv_pipecat_ai-0.0.82.dev881.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
381
- dv_pipecat_ai-0.0.82.dev881.dist-info/top_level.txt,sha256=kQzG20CxGf-nSsHmtXHx3hY2-8zHA3jYg8jk0TajqXc,8
382
- dv_pipecat_ai-0.0.82.dev881.dist-info/RECORD,,
381
+ dv_pipecat_ai-0.0.85.dev1.dist-info/METADATA,sha256=pgoQtdaXFQgc4EfFkWTTNBcDURv8diEDGXKD-gC0t04,32691
382
+ dv_pipecat_ai-0.0.85.dev1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
383
+ dv_pipecat_ai-0.0.85.dev1.dist-info/top_level.txt,sha256=kQzG20CxGf-nSsHmtXHx3hY2-8zHA3jYg8jk0TajqXc,8
384
+ dv_pipecat_ai-0.0.85.dev1.dist-info/RECORD,,
@@ -135,7 +135,13 @@ class SileroVADAnalyzer(VADAnalyzer):
135
135
  with automatic model state management and periodic resets.
136
136
  """
137
137
 
138
- def __init__(self, *, sample_rate: Optional[int] = None, params: Optional[VADParams] = None):
138
+ def __init__(
139
+ self,
140
+ *,
141
+ sample_rate: Optional[int] = None,
142
+ params: Optional[VADParams] = None,
143
+ model_name: Optional[str] = None,
144
+ ):
139
145
  """Initialize the Silero VAD analyzer.
140
146
 
141
147
  Args:
@@ -146,7 +152,7 @@ class SileroVADAnalyzer(VADAnalyzer):
146
152
 
147
153
  logger.debug("Loading Silero VAD model...")
148
154
 
149
- model_name = "silero_vad.onnx"
155
+ model_name = model_name or "silero_vad.onnx"
150
156
  package_path = "pipecat.audio.vad.data"
151
157
 
152
158
  try:
@@ -166,7 +172,7 @@ class SileroVADAnalyzer(VADAnalyzer):
166
172
 
167
173
  self._last_reset_time = 0
168
174
 
169
- logger.debug("Loaded Silero VAD")
175
+ logger.debug(f"Loaded Silero VAD {model_file_path}")
170
176
 
171
177
  #
172
178
  # VADAnalyzer
pipecat/frames/frames.py CHANGED
@@ -1306,6 +1306,20 @@ class SpeechControlParamsFrame(SystemFrame):
1306
1306
  turn_params: Optional[SmartTurnParams] = None
1307
1307
 
1308
1308
 
1309
+ @dataclass
1310
+ class StartDTMFCaptureFrame(SystemFrame):
1311
+ """System frame indicating the bot is actively collecting DTMF input."""
1312
+
1313
+ pass
1314
+
1315
+
1316
+ @dataclass
1317
+ class EndDTMFCaptureFrame(SystemFrame):
1318
+ """System frame indicating DTMF collection has finished."""
1319
+
1320
+ pass
1321
+
1322
+
1309
1323
  #
1310
1324
  # Control frames
1311
1325
  #
@@ -1473,6 +1487,17 @@ class STTUpdateSettingsFrame(ServiceUpdateSettingsFrame):
1473
1487
  pass
1474
1488
 
1475
1489
 
1490
+ @dataclass
1491
+ class DTMFUpdateSettingsFrame(ServiceUpdateSettingsFrame):
1492
+ """Frame for updating DTMF aggregator settings.
1493
+
1494
+ Updates DTMF configuration dynamically during conversation flow.
1495
+ Settings can include: timeout, digits, end, reset parameters.
1496
+ """
1497
+
1498
+ pass
1499
+
1500
+
1476
1501
  @dataclass
1477
1502
  class VADParamsUpdateFrame(SystemFrame):
1478
1503
  """Frame for updating VAD parameters.
@@ -1564,6 +1589,19 @@ class StopUserIdleProcessorFrame(SystemFrame):
1564
1589
  pass
1565
1590
 
1566
1591
 
1592
+ @dataclass
1593
+ class ResetUserIdleProcessorFrame(SystemFrame):
1594
+ """Frame signalling the UserIdleProcessor to treat the user as active again.
1595
+
1596
+ Parameters:
1597
+ text: Optional transcription text that triggered the reset.
1598
+ is_final: Whether the transcription was marked final by STT.
1599
+ """
1600
+
1601
+ text: str = ""
1602
+ is_final: bool = False
1603
+
1604
+
1567
1605
  @dataclass
1568
1606
  class WaitForDTMFFrame(ControlFrame):
1569
1607
  """Frame to stop the UserIdleProcessor monitoring."""
@@ -1571,6 +1609,17 @@ class WaitForDTMFFrame(ControlFrame):
1571
1609
  pass
1572
1610
 
1573
1611
 
1612
+ @dataclass
1613
+ class CallTransferFrame(ControlFrame):
1614
+ """Frame to request call transfer to another number/destination.
1615
+
1616
+ Parameters:
1617
+ target: The phone number or destination to transfer the call to.
1618
+ """
1619
+
1620
+ target: str
1621
+
1622
+
1574
1623
  @dataclass
1575
1624
  class ManuallySwitchServiceFrame(ServiceSwitcherFrame):
1576
1625
  """A frame to request a manual switch in the active service in a ServiceSwitcher.
@@ -0,0 +1,30 @@
1
+ #
2
+ # Copyright (c) 2025, Daily
3
+ #
4
+ # SPDX-License-Identifier: BSD 2-Clause License
5
+ #
6
+
7
+ """TTS switcher for switching between different TTS services at runtime, with different switching strategies."""
8
+
9
+ from typing import List, Optional, Type
10
+
11
+ from pipecat.pipeline.service_switcher import ServiceSwitcher, StrategyType
12
+ from pipecat.services.tts_service import TTSService
13
+
14
+
15
+ class TTSSwitcher(ServiceSwitcher[StrategyType]):
16
+ """A pipeline that switches between different TTS services at runtime."""
17
+
18
+ def __init__(self, tts_services: List[TTSService], strategy_type: Type[StrategyType]):
19
+ """Initialize the TTS switcher with a list of TTS services and a switching strategy."""
20
+ super().__init__(tts_services, strategy_type)
21
+
22
+ @property
23
+ def tts_services(self) -> List[TTSService]:
24
+ """Get the list of TTS services managed by this switcher."""
25
+ return self.services
26
+
27
+ @property
28
+ def active_tts(self) -> Optional[TTSService]:
29
+ """Get the currently active TTS service, if any."""
30
+ return self.strategy.active_service
@@ -4,13 +4,6 @@
4
4
  # SPDX-License-Identifier: BSD 2-Clause License
5
5
  #
6
6
 
7
- """DTMF aggregation processor for converting keypad input to transcription.
8
-
9
- This module provides a frame processor that aggregates DTMF (Dual-Tone Multi-Frequency)
10
- keypad inputs into meaningful sequences and converts them to transcription frames
11
- for downstream processing by LLM context aggregators.
12
- """
13
-
14
7
  import asyncio
15
8
  from typing import Optional
16
9
 
@@ -24,7 +17,7 @@ from pipecat.frames.frames import (
24
17
  StartFrame,
25
18
  TranscriptionFrame,
26
19
  )
27
- from pipecat.processors.frame_processor import FrameDirection, FrameProcessor, FrameProcessorSetup
20
+ from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
28
21
  from pipecat.utils.time import time_now_iso8601
29
22
 
30
23
 
@@ -33,12 +26,16 @@ class DTMFAggregator(FrameProcessor):
33
26
 
34
27
  The aggregator accumulates digits from InputDTMFFrame instances and flushes
35
28
  when:
36
-
37
29
  - Timeout occurs (configurable idle period)
38
30
  - Termination digit is received (default: '#')
39
31
  - EndFrame or CancelFrame is received
40
32
 
41
33
  Emits TranscriptionFrame for compatibility with existing LLM context aggregators.
34
+
35
+ Args:
36
+ timeout: Idle timeout in seconds before flushing
37
+ termination_digit: Digit that triggers immediate flush
38
+ prefix: Prefix added to DTMF sequence in transcription
42
39
  """
43
40
 
44
41
  def __init__(
@@ -48,14 +45,6 @@ class DTMFAggregator(FrameProcessor):
48
45
  prefix: str = "DTMF: ",
49
46
  **kwargs,
50
47
  ):
51
- """Initialize the DTMF aggregator.
52
-
53
- Args:
54
- timeout: Idle timeout in seconds before flushing
55
- termination_digit: Digit that triggers immediate flush
56
- prefix: Prefix added to DTMF sequence in transcription
57
- **kwargs: Additional arguments passed to FrameProcessor
58
- """
59
48
  super().__init__(**kwargs)
60
49
  self._aggregation = ""
61
50
  self._idle_timeout = timeout
@@ -65,18 +54,7 @@ class DTMFAggregator(FrameProcessor):
65
54
  self._digit_event = asyncio.Event()
66
55
  self._aggregation_task: Optional[asyncio.Task] = None
67
56
 
68
- async def cleanup(self) -> None:
69
- """Clean up resources."""
70
- await super().cleanup()
71
- await self._stop_aggregation_task()
72
-
73
57
  async def process_frame(self, frame: Frame, direction: FrameDirection) -> None:
74
- """Process incoming frames and handle DTMF aggregation.
75
-
76
- Args:
77
- frame: The frame to process.
78
- direction: The direction of frame flow in the pipeline.
79
- """
80
58
  await super().process_frame(frame, direction)
81
59
 
82
60
  if isinstance(frame, StartFrame):
@@ -105,7 +83,7 @@ class DTMFAggregator(FrameProcessor):
105
83
 
106
84
  # For first digit, schedule interruption.
107
85
  if is_first_digit:
108
- await self.push_frame(BotInterruptionFrame(), FrameDirection.UPSTREAM)
86
+ asyncio.create_task(self._send_interruption_task())
109
87
 
110
88
  # Check for immediate flush conditions
111
89
  if frame.button == self._termination_digit:
@@ -114,6 +92,15 @@ class DTMFAggregator(FrameProcessor):
114
92
  # Signal digit received for timeout handling
115
93
  self._digit_event.set()
116
94
 
95
+ async def _send_interruption_task(self):
96
+ """Send interruption frame safely in a separate task."""
97
+ try:
98
+ # Send the interruption frame
99
+ await self.push_frame(BotInterruptionFrame(), FrameDirection.UPSTREAM)
100
+ except Exception as e:
101
+ # Log error but don't propagate
102
+ print(f"Error sending interruption: {e}")
103
+
117
104
  def _create_aggregation_task(self) -> None:
118
105
  """Creates the aggregation task if it hasn't been created yet."""
119
106
  if not self._aggregation_task:
@@ -132,6 +119,7 @@ class DTMFAggregator(FrameProcessor):
132
119
  await asyncio.wait_for(self._digit_event.wait(), timeout=self._idle_timeout)
133
120
  self._digit_event.clear()
134
121
  except asyncio.TimeoutError:
122
+ self.reset_watchdog()
135
123
  if self._aggregation:
136
124
  await self._flush_aggregation()
137
125
 
@@ -149,3 +137,8 @@ class DTMFAggregator(FrameProcessor):
149
137
  await self.push_frame(transcription_frame)
150
138
 
151
139
  self._aggregation = ""
140
+
141
+ async def cleanup(self) -> None:
142
+ """Clean up resources."""
143
+ await super().cleanup()
144
+ await self._stop_aggregation_task()
@@ -518,6 +518,7 @@ class LLMUserContextAggregator(LLMContextResponseAggregator):
518
518
  self.set_tool_choice(frame.tool_choice)
519
519
  elif isinstance(frame, LLMFullResponseStartFrame):
520
520
  self._last_llm_response_start_time = time.time()
521
+ self.logger.debug(f"Received LLMFullResponseStartFrame")
521
522
  self._latest_final_transcript = ""
522
523
  elif isinstance(frame, SpeechControlParamsFrame):
523
524
  self._vad_params = frame.vad_params
@@ -621,6 +622,7 @@ class LLMUserContextAggregator(LLMContextResponseAggregator):
621
622
  if len(self._aggregation) > 0:
622
623
  self.logger.debug(f"Dropping {self._aggregation}")
623
624
  self._aggregation = ""
625
+ self._latest_final_transcript = ""
624
626
  self._last_user_speaking_time = time.time()
625
627
  self._user_speaking = True
626
628
  self._waiting_for_aggregation = True