dv-pipecat-ai 0.0.82.dev68__tar.gz → 0.0.82.dev70__tar.gz
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.
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/PKG-INFO +1 -1
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/dv_pipecat_ai.egg-info/PKG-INFO +1 -1
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/frames/frames.py +15 -1
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/dtmf_aggregator.py +128 -87
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/filters/stt_mute_filter.py +15 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/user_idle_processor.py +16 -4
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/sarvam/stt.py +116 -26
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.dockerignore +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/ISSUE_TEMPLATE/1-bug_report.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/ISSUE_TEMPLATE/2-question.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/ISSUE_TEMPLATE/3-feature_request.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/ISSUE_TEMPLATE/4-service-issue.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/ISSUE_TEMPLATE/5-new-service.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/ISSUE_TEMPLATE/6-dependency.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/ISSUE_TEMPLATE/7-troubleshooting.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/build.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/coverage.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/format.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/github.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/promote-prod.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/publish.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/publish_test.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/python-compatibility.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/set-traffic-split.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/sync-quickstart.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.github/workflows/tests.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.gitignore +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.pre-commit-config.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/.readthedocs.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/CHANGELOG.md +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/CHANGELOG.md.template +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/CLAUDE.md +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/CONTRIBUTING.md +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/DOCKER_BUILD_OPTIMIZATION_SUMMARY.md +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/LICENSE +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/MANIFEST.in +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/README.md +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/ansible.cfg +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/ansible_deployment.sh +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/cleanup_old_containers.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/codecov.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/create-new-machine/ansible.cfg +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/create-new-machine/ansible_setup.sh +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/create-new-machine/inventory.ini +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/create-new-machine/replace_env.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/create-new-machine/setup_playbook.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/create_inventory.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/delete_old_dockers.sh +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/deploy.sh +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/deploy_playbook.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/docker-compose.dev.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/dump_logs.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/env.example +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/fetch_logs.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/inventory.ini +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/.helmignore +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/Chart.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/_helpers.tpl +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/backendconfig.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/cluster-role.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/deployment.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/hpa.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/ingress.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/keda-api-key-secret.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/keda-scaledobject.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/keda-trigger-auth.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/pdb.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/templates/service.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/values-canary.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/values-prod.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/values-stage.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/dv-pipecat/values.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/k8s/istio/destination-virtualservice.yaml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/merge-code-into-single-file.sh +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/pipecat.png +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/pyproject.toml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/restart.sh +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/restart_playbook.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/setup.cfg +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/dv_pipecat_ai.egg-info/SOURCES.txt +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/dv_pipecat_ai.egg-info/dependency_links.txt +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/dv_pipecat_ai.egg-info/requires.txt +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/dv_pipecat_ai.egg-info/top_level.txt +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/base_llm_adapter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/schemas/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/schemas/direct_function.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/schemas/function_schema.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/schemas/tools_schema.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/services/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/services/anthropic_adapter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/services/aws_nova_sonic_adapter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/services/bedrock_adapter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/services/gemini_adapter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/services/open_ai_adapter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/adapters/services/open_ai_realtime_adapter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-0.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-1.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-2.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-3.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-4.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-5.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-6.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-7.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-8.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-9.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-pound.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/dtmf-star.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/types.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/dtmf/utils.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/filters/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/filters/aic_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/filters/base_audio_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/filters/koala_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/filters/krisp_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/filters/noisereduce_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/filters/pyrnn_local_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/interruptions/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/interruptions/base_interruption_strategy.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/interruptions/min_words_interruption_strategy.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/mixers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/mixers/base_audio_mixer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/mixers/soundfile_mixer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/resamplers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/resamplers/base_audio_resampler.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/resamplers/resampy_resampler.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/resamplers/soxr_resampler.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/resamplers/soxr_stream_resampler.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/turn/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/turn/base_turn_analyzer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/turn/smart_turn/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/turn/smart_turn/base_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/turn/smart_turn/fal_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/turn/smart_turn/http_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/turn/smart_turn/local_coreml_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/turn/smart_turn/local_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/turn/smart_turn/local_smart_turn_v2.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/utils.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/vad/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/vad/data/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/vad/data/silero_vad.onnx +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/vad/data/silero_vad_v2.onnx +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/vad/silero.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/audio/vad/vad_analyzer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/clocks/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/clocks/base_clock.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/clocks/system_clock.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/extensions/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/extensions/ivr/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/extensions/ivr/ivr_navigator.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/extensions/voicemail/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/extensions/voicemail/voicemail_detector.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/frames/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/frames/frames.proto +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/frames/protobufs/frames_pb2.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/metrics/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/metrics/metrics.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/observers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/observers/base_observer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/observers/loggers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/observers/loggers/debug_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/observers/loggers/llm_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/observers/loggers/transcription_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/observers/loggers/user_bot_latency_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/observers/turn_tracking_observer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/base_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/base_task.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/llm_switcher.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/parallel_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/pipeline.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/runner.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/service_switcher.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/sync_parallel_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/task.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/task_observer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/to_be_updated/merge_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/pipeline/tts_switcher.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/dtmf_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/gated.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/gated_openai_llm_context.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/llm_context.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/llm_response.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/llm_response_universal.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/openai_llm_context.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/sentence.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/user_response.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/aggregators/vision_image_frame.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/async_generator.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/audio/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/audio/audio_buffer_processor.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/consumer_processor.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/filters/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/filters/frame_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/filters/function_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/filters/identity_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/filters/null_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/filters/wake_check_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/filters/wake_notifier_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/frame_processor.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/frameworks/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/frameworks/langchain.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/frameworks/rtvi.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/gstreamer/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/gstreamer/pipeline_source.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/idle_frame_processor.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/logger.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/metrics/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/metrics/frame_processor_metrics.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/metrics/sentry.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/producer_processor.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/text_transformer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/transcript_processor.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/two_stage_user_idle_processor.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/py.typed +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/runner/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/runner/daily.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/runner/livekit.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/runner/run.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/runner/types.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/runner/utils.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/asterisk.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/base_serializer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/convox.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/custom.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/exotel.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/livekit.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/plivo.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/protobuf.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/telnyx.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/serializers/twilio.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/ai_service.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/ai_services.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/anthropic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/anthropic/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/assemblyai/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/assemblyai/models.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/assemblyai/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/asyncai/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/asyncai/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/aws/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/aws/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/aws/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/aws/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/aws/utils.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/aws_nova_sonic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/aws_nova_sonic/aws.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/aws_nova_sonic/context.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/aws_nova_sonic/frames.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/aws_nova_sonic/ready.wav +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/azure/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/azure/common.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/azure/image.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/azure/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/azure/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/azure/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/cartesia/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/cartesia/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/cartesia/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/cerebras/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/cerebras/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/deepgram/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/deepgram/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/deepgram/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/deepseek/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/deepseek/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/elevenlabs/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/elevenlabs/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/elevenlabs/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/fal/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/fal/image.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/fal/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/fireworks/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/fireworks/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/fish/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/fish/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/gemini_multimodal_live/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/gemini_multimodal_live/events.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/gemini_multimodal_live/file_api.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/gemini_multimodal_live/gemini.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/gladia/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/gladia/config.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/gladia/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/google/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/google/frames.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/google/google.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/google/image.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/google/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/google/llm_openai.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/google/llm_vertex.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/google/rtvi.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/google/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/google/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/grok/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/grok/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/groq/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/groq/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/groq/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/groq/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/hamsa/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/hamsa/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/heygen/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/heygen/api.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/heygen/client.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/heygen/video.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/image_service.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/inworld/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/inworld/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/llm_service.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/lmnt/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/lmnt/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/mcp_service.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/mem0/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/mem0/memory.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/minimax/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/minimax/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/mistral/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/mistral/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/moondream/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/moondream/vision.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/neuphonic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/neuphonic/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/nim/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/nim/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/ollama/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/ollama/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai/base_llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai/image.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai_realtime_beta/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai_realtime_beta/azure.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai_realtime_beta/context.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai_realtime_beta/events.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai_realtime_beta/frames.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openai_realtime_beta/openai.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openpipe/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openpipe/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openrouter/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/openrouter/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/perplexity/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/perplexity/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/piper/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/piper/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/playht/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/playht/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/qwen/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/qwen/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/rime/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/rime/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/riva/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/riva/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/riva/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/sambanova/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/sambanova/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/sambanova/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/sarvam/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/sarvam/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/simli/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/simli/video.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/soniox/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/soniox/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/speechmatics/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/speechmatics/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/stt_service.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/tavus/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/tavus/video.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/together/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/together/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/tts_service.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/ultravox/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/ultravox/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/vision_service.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/vistaar/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/vistaar/llm.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/websocket_service.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/whisper/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/whisper/base_stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/whisper/stt.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/xtts/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/services/xtts/tts.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/sync/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/sync/base_notifier.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/sync/event_notifier.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/tests/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/tests/utils.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transcriptions/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transcriptions/language.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/base_input.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/base_output.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/base_transport.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/daily/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/daily/transport.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/daily/utils.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/livekit/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/livekit/transport.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/local/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/local/audio.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/local/tk.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/network/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/network/fastapi_websocket.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/network/small_webrtc.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/network/webrtc_connection.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/network/websocket_client.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/network/websocket_server.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/services/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/services/daily.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/services/helpers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/services/helpers/daily_rest.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/services/livekit.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/services/tavus.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/smallwebrtc/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/smallwebrtc/connection.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/smallwebrtc/transport.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/tavus/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/tavus/transport.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/websocket/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/websocket/client.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/websocket/fastapi.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/websocket/server.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/whatsapp/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/whatsapp/api.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/transports/whatsapp/client.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/asyncio/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/asyncio/task_manager.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/base_object.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/logger_config.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/network.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/string.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/text/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/text/base_text_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/text/base_text_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/text/markdown_text_filter.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/text/pattern_pair_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/text/simple_text_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/text/skip_tags_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/time.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/tracing/__init__.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/tracing/class_decorators.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/tracing/conversation_context_provider.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/tracing/service_attributes.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/tracing/service_decorators.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/tracing/setup.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/tracing/turn_context_provider.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/tracing/turn_trace_observer.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/utils/utils.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/stop_container.yml +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/test_elevenlabs_stt_segmented.py +0 -0
- {dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/uv.lock +0 -0
|
@@ -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
|
#
|
|
@@ -1476,7 +1490,7 @@ class STTUpdateSettingsFrame(ServiceUpdateSettingsFrame):
|
|
|
1476
1490
|
@dataclass
|
|
1477
1491
|
class DTMFUpdateSettingsFrame(ServiceUpdateSettingsFrame):
|
|
1478
1492
|
"""Frame for updating DTMF aggregator settings.
|
|
1479
|
-
|
|
1493
|
+
|
|
1480
1494
|
Updates DTMF configuration dynamically during conversation flow.
|
|
1481
1495
|
Settings can include: timeout, digits, end, reset parameters.
|
|
1482
1496
|
"""
|
{dv_pipecat_ai-0.0.82.dev68 → dv_pipecat_ai-0.0.82.dev70}/src/pipecat/processors/dtmf_aggregator.py
RENAMED
|
@@ -4,15 +4,13 @@ from pipecat.frames.frames import (
|
|
|
4
4
|
BotSpeakingFrame,
|
|
5
5
|
CancelFrame,
|
|
6
6
|
DTMFUpdateSettingsFrame,
|
|
7
|
+
EndDTMFCaptureFrame,
|
|
7
8
|
EndFrame,
|
|
8
9
|
Frame,
|
|
9
10
|
InputDTMFFrame,
|
|
11
|
+
StartDTMFCaptureFrame,
|
|
10
12
|
StartInterruptionFrame,
|
|
11
|
-
StartUserIdleProcessorFrame,
|
|
12
|
-
StopUserIdleProcessorFrame,
|
|
13
13
|
TranscriptionFrame,
|
|
14
|
-
UserStartedSpeakingFrame,
|
|
15
|
-
UserStoppedSpeakingFrame,
|
|
16
14
|
WaitForDTMFFrame,
|
|
17
15
|
)
|
|
18
16
|
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
|
|
@@ -44,95 +42,78 @@ class DTMFAggregator(FrameProcessor):
|
|
|
44
42
|
self._idle_timeout = timeout
|
|
45
43
|
self._digits = digits
|
|
46
44
|
self._digit_event = asyncio.Event()
|
|
47
|
-
self.
|
|
45
|
+
self._aggregation_task = None
|
|
48
46
|
self._end_on = end_on if end_on else set()
|
|
49
47
|
self._reset_on = reset_on if reset_on else set()
|
|
50
|
-
self.
|
|
51
|
-
|
|
52
|
-
async def _start_idle_processor(self):
|
|
53
|
-
await self.push_frame(StartUserIdleProcessorFrame(), FrameDirection.UPSTREAM)
|
|
54
|
-
self._stopped_idle_processor = False
|
|
55
|
-
|
|
56
|
-
async def _stop_idle_processor(self):
|
|
57
|
-
await self.push_frame(StopUserIdleProcessorFrame(), FrameDirection.UPSTREAM)
|
|
58
|
-
self._stopped_idle_processor = True
|
|
48
|
+
self._dtmf_capture_active = False
|
|
59
49
|
|
|
60
50
|
async def process_frame(self, frame: Frame, direction: FrameDirection) -> None:
|
|
61
51
|
# Handle DTMF frames.
|
|
62
52
|
await super().process_frame(frame, direction)
|
|
63
|
-
await self.push_frame(frame, direction)
|
|
64
|
-
if isinstance(frame, InputDTMFFrame):
|
|
65
|
-
# Start the digit aggregation task if it's not running yet.
|
|
66
|
-
if self._digit_aggregate_task is None:
|
|
67
|
-
self._digit_aggregate_task = self.create_task(self._digit_agg_handler(direction))
|
|
68
|
-
|
|
69
|
-
# Append the incoming digit.
|
|
70
|
-
if frame.button.value in self._reset_on:
|
|
71
|
-
self._aggregation = ""
|
|
72
|
-
elif frame.button.value in self._end_on:
|
|
73
|
-
await self.flush_aggregation(direction)
|
|
74
|
-
self._aggregation = ""
|
|
75
|
-
else:
|
|
76
|
-
self._digit_event.set()
|
|
77
|
-
self._aggregation += frame.button.value
|
|
78
|
-
|
|
79
|
-
# Flush if the aggregated digits reach the specified length.
|
|
80
|
-
if self._digits and len(self._aggregation) == self._digits:
|
|
81
|
-
await self.flush_aggregation(direction)
|
|
82
|
-
self._aggregation = ""
|
|
83
|
-
if self._stopped_idle_processor:
|
|
84
|
-
await self._start_idle_processor()
|
|
85
53
|
|
|
54
|
+
if isinstance(frame, InputDTMFFrame):
|
|
55
|
+
# Push the DTMF frame downstream first
|
|
56
|
+
await self.push_frame(frame, direction)
|
|
57
|
+
# Then handle it for proper frame ordering
|
|
58
|
+
await self._handle_dtmf_frame(frame)
|
|
86
59
|
elif isinstance(frame, (EndFrame, CancelFrame)):
|
|
87
60
|
# For EndFrame, flush any pending aggregation and stop the digit aggregation task.
|
|
88
61
|
if self._aggregation:
|
|
89
|
-
await self.flush_aggregation(
|
|
90
|
-
if self.
|
|
91
|
-
await self.
|
|
62
|
+
await self.flush_aggregation()
|
|
63
|
+
if self._aggregation_task:
|
|
64
|
+
await self._stop_aggregation_task()
|
|
65
|
+
await self.push_frame(frame, direction)
|
|
92
66
|
elif isinstance(frame, WaitForDTMFFrame):
|
|
93
67
|
self.logger.debug("Received WaitForDTMFFrame: Waiting for DTMF input")
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
self._digit_event.set()
|
|
99
|
-
await self._stop_idle_processor()
|
|
68
|
+
self._create_aggregation_task(raise_timeout=True)
|
|
69
|
+
self._digit_event.set() # Trigger the timeout handler
|
|
70
|
+
await self._start_dtmf_capture()
|
|
71
|
+
await self.push_frame(frame, direction)
|
|
100
72
|
elif isinstance(frame, StartInterruptionFrame):
|
|
101
|
-
self.logger.debug("Received StartInterruptionFrame
|
|
102
|
-
if self._stopped_idle_processor:
|
|
103
|
-
await self._start_idle_processor()
|
|
73
|
+
self.logger.debug("Received StartInterruptionFrame")
|
|
104
74
|
if self._aggregation:
|
|
105
|
-
await self.flush_aggregation(
|
|
75
|
+
await self.flush_aggregation()
|
|
76
|
+
await self._end_dtmf_capture()
|
|
77
|
+
await self.push_frame(frame, direction)
|
|
106
78
|
elif isinstance(frame, BotSpeakingFrame):
|
|
107
|
-
|
|
79
|
+
# Signal the aggregation task to continue when bot speaks
|
|
80
|
+
if self._aggregation_task is not None:
|
|
108
81
|
self._digit_event.set()
|
|
82
|
+
await self.push_frame(frame, direction)
|
|
109
83
|
elif isinstance(frame, DTMFUpdateSettingsFrame):
|
|
110
84
|
await self._update_settings(frame.settings)
|
|
111
85
|
# Don't pass the settings frame downstream
|
|
86
|
+
else:
|
|
87
|
+
# Pass all other frames through
|
|
88
|
+
await self.push_frame(frame, direction)
|
|
112
89
|
|
|
113
90
|
async def _update_settings(self, settings: dict) -> None:
|
|
114
91
|
"""Update DTMF aggregator settings dynamically.
|
|
115
|
-
|
|
92
|
+
|
|
116
93
|
Args:
|
|
117
94
|
settings: Dictionary containing new DTMF settings
|
|
118
95
|
Supported keys: timeout, digits, end, reset
|
|
119
96
|
"""
|
|
120
97
|
settings_changed = False
|
|
121
|
-
|
|
98
|
+
|
|
122
99
|
if "timeout" in settings and settings["timeout"] is not None:
|
|
123
100
|
new_timeout = float(settings["timeout"])
|
|
124
101
|
if new_timeout != self._idle_timeout:
|
|
125
|
-
self.logger.debug(
|
|
102
|
+
self.logger.debug(
|
|
103
|
+
f"Updating DTMF timeout from {self._idle_timeout} to {new_timeout}"
|
|
104
|
+
)
|
|
126
105
|
self._idle_timeout = new_timeout
|
|
127
106
|
settings_changed = True
|
|
128
|
-
|
|
107
|
+
|
|
129
108
|
if "digits" in settings:
|
|
130
109
|
new_digits = settings["digits"]
|
|
131
110
|
if new_digits != self._digits:
|
|
132
|
-
self.logger.debug(
|
|
111
|
+
self.logger.debug(
|
|
112
|
+
f"Updating DTMF digits from {self._digits} to {new_digits}"
|
|
113
|
+
)
|
|
133
114
|
self._digits = new_digits
|
|
134
115
|
settings_changed = True
|
|
135
|
-
|
|
116
|
+
|
|
136
117
|
if "end" in settings:
|
|
137
118
|
# Convert single string to set if needed
|
|
138
119
|
end_value = settings["end"]
|
|
@@ -142,12 +123,14 @@ class DTMFAggregator(FrameProcessor):
|
|
|
142
123
|
new_end_on = {end_value} if end_value else set()
|
|
143
124
|
else:
|
|
144
125
|
new_end_on = set(end_value)
|
|
145
|
-
|
|
126
|
+
|
|
146
127
|
if new_end_on != self._end_on:
|
|
147
|
-
self.logger.debug(
|
|
128
|
+
self.logger.debug(
|
|
129
|
+
f"Updating DTMF end_on from {self._end_on} to {new_end_on}"
|
|
130
|
+
)
|
|
148
131
|
self._end_on = new_end_on
|
|
149
132
|
settings_changed = True
|
|
150
|
-
|
|
133
|
+
|
|
151
134
|
if "reset" in settings:
|
|
152
135
|
# Convert single string to set if needed
|
|
153
136
|
reset_value = settings["reset"]
|
|
@@ -157,58 +140,116 @@ class DTMFAggregator(FrameProcessor):
|
|
|
157
140
|
new_reset_on = {reset_value} if reset_value else set()
|
|
158
141
|
else:
|
|
159
142
|
new_reset_on = set(reset_value)
|
|
160
|
-
|
|
143
|
+
|
|
161
144
|
if new_reset_on != self._reset_on:
|
|
162
|
-
self.logger.debug(
|
|
145
|
+
self.logger.debug(
|
|
146
|
+
f"Updating DTMF reset_on from {self._reset_on} to {new_reset_on}"
|
|
147
|
+
)
|
|
163
148
|
self._reset_on = new_reset_on
|
|
164
149
|
settings_changed = True
|
|
165
|
-
|
|
150
|
+
|
|
166
151
|
if settings_changed:
|
|
167
152
|
self.logger.info(f"DTMF settings updated successfully")
|
|
168
153
|
|
|
169
|
-
async def
|
|
170
|
-
"""
|
|
171
|
-
|
|
172
|
-
|
|
154
|
+
async def _handle_dtmf_frame(self, frame: InputDTMFFrame):
|
|
155
|
+
"""Handle DTMF input frame processing."""
|
|
156
|
+
# Create aggregation task if needed
|
|
157
|
+
if self._aggregation_task is None:
|
|
158
|
+
self._create_aggregation_task()
|
|
159
|
+
|
|
160
|
+
digit_value = frame.button.value
|
|
161
|
+
|
|
162
|
+
# Handle reset digits
|
|
163
|
+
if digit_value in self._reset_on:
|
|
164
|
+
self._aggregation = ""
|
|
165
|
+
return
|
|
166
|
+
|
|
167
|
+
# Handle end digits
|
|
168
|
+
if digit_value in self._end_on:
|
|
169
|
+
if self._aggregation: # Only flush if we have aggregation
|
|
170
|
+
await self.flush_aggregation()
|
|
171
|
+
return
|
|
172
|
+
|
|
173
|
+
# Add digit to aggregation
|
|
174
|
+
self._aggregation += digit_value
|
|
175
|
+
|
|
176
|
+
# Signal the aggregation task that a digit was received
|
|
177
|
+
self._digit_event.set()
|
|
178
|
+
|
|
179
|
+
# Check if we reached the digit limit
|
|
180
|
+
if self._digits and len(self._aggregation) == self._digits:
|
|
181
|
+
await self.flush_aggregation()
|
|
182
|
+
|
|
183
|
+
def _create_aggregation_task(self, raise_timeout: bool = False) -> None:
|
|
184
|
+
"""Creates the aggregation task if it hasn't been created yet."""
|
|
185
|
+
if not self._aggregation_task:
|
|
186
|
+
self._aggregation_task = self.create_task(
|
|
187
|
+
self._aggregation_task_handler(raise_timeout)
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
async def _stop_aggregation_task(self) -> None:
|
|
191
|
+
"""Stops the aggregation task."""
|
|
192
|
+
if self._aggregation_task:
|
|
193
|
+
await self.cancel_task(self._aggregation_task)
|
|
194
|
+
self._aggregation_task = None
|
|
195
|
+
|
|
196
|
+
async def _aggregation_task_handler(self, raise_timeout=False):
|
|
197
|
+
"""Background task that handles timeout-based flushing."""
|
|
173
198
|
while True:
|
|
174
199
|
try:
|
|
175
200
|
# Wait for a new digit signal with a timeout.
|
|
176
|
-
await asyncio.wait_for(
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
await self.flush_aggregation(direction, raise_timeout)
|
|
180
|
-
finally:
|
|
181
|
-
# Clear the event for the next cycle.
|
|
201
|
+
await asyncio.wait_for(
|
|
202
|
+
self._digit_event.wait(), timeout=self._idle_timeout
|
|
203
|
+
)
|
|
182
204
|
self._digit_event.clear()
|
|
205
|
+
except asyncio.TimeoutError:
|
|
206
|
+
# No new digit arrived within the timeout period; flush if needed
|
|
207
|
+
await self.flush_aggregation(raise_timeout=raise_timeout)
|
|
183
208
|
|
|
184
|
-
async def flush_aggregation(self,
|
|
209
|
+
async def flush_aggregation(self, *, raise_timeout: bool = False):
|
|
185
210
|
"""Flush the aggregated digits by emitting a TranscriptionFrame downstream."""
|
|
186
211
|
if self._aggregation:
|
|
187
|
-
#
|
|
212
|
+
# Create transcription frame
|
|
188
213
|
aggregated_frame = TranscriptionFrame(
|
|
189
214
|
f"User inputted: {self._aggregation}.", "", time_now_iso8601()
|
|
190
215
|
)
|
|
191
216
|
aggregated_frame.metadata["push_aggregation"] = True
|
|
192
|
-
|
|
193
|
-
|
|
217
|
+
|
|
218
|
+
# Send interruption frame (as per original design)
|
|
219
|
+
await self.push_frame(StartInterruptionFrame(), FrameDirection.DOWNSTREAM)
|
|
220
|
+
|
|
221
|
+
# Push the transcription frame
|
|
222
|
+
await self.push_frame(aggregated_frame, FrameDirection.DOWNSTREAM)
|
|
223
|
+
|
|
224
|
+
# Reset state
|
|
194
225
|
self._aggregation = ""
|
|
195
|
-
|
|
226
|
+
await self._end_dtmf_capture()
|
|
227
|
+
|
|
228
|
+
elif raise_timeout and not self._aggregation:
|
|
229
|
+
# Timeout with no aggregation (WaitForDTMFFrame case)
|
|
196
230
|
transcript_frame = TranscriptionFrame(
|
|
197
231
|
"User didn't press any digits on the keyboard.", "", time_now_iso8601()
|
|
198
232
|
)
|
|
199
233
|
transcript_frame.metadata["push_aggregation"] = True
|
|
200
|
-
await self.push_frame(transcript_frame)
|
|
201
|
-
|
|
202
|
-
|
|
234
|
+
await self.push_frame(transcript_frame, FrameDirection.DOWNSTREAM)
|
|
235
|
+
await self._end_dtmf_capture()
|
|
236
|
+
|
|
237
|
+
async def _start_dtmf_capture(self):
|
|
238
|
+
"""Signal the start of DTMF capture upstream."""
|
|
239
|
+
if self._dtmf_capture_active:
|
|
240
|
+
return
|
|
241
|
+
await self.push_frame(StartDTMFCaptureFrame(), FrameDirection.UPSTREAM)
|
|
242
|
+
self._dtmf_capture_active = True
|
|
203
243
|
|
|
204
|
-
async def
|
|
205
|
-
"""
|
|
206
|
-
if self.
|
|
207
|
-
|
|
208
|
-
|
|
244
|
+
async def _end_dtmf_capture(self):
|
|
245
|
+
"""Signal the end of DTMF capture upstream."""
|
|
246
|
+
if not self._dtmf_capture_active:
|
|
247
|
+
return
|
|
248
|
+
await self.push_frame(EndDTMFCaptureFrame(), FrameDirection.UPSTREAM)
|
|
249
|
+
self._dtmf_capture_active = False
|
|
209
250
|
|
|
210
251
|
async def cleanup(self) -> None:
|
|
211
252
|
"""Cleans up resources, ensuring that the digit aggregation task is cancelled."""
|
|
212
253
|
await super().cleanup()
|
|
213
|
-
if self.
|
|
214
|
-
await self.
|
|
254
|
+
if self._aggregation_task:
|
|
255
|
+
await self._stop_aggregation_task()
|
|
@@ -27,12 +27,14 @@ from pipecat.frames.frames import (
|
|
|
27
27
|
InterimTranscriptionFrame,
|
|
28
28
|
StartFrame,
|
|
29
29
|
StartInterruptionFrame,
|
|
30
|
+
StartDTMFCaptureFrame,
|
|
30
31
|
STTMuteFrame,
|
|
31
32
|
TranscriptionFrame,
|
|
32
33
|
UserStartedSpeakingFrame,
|
|
33
34
|
UserStoppedSpeakingFrame,
|
|
34
35
|
VADUserStartedSpeakingFrame,
|
|
35
36
|
VADUserStoppedSpeakingFrame,
|
|
37
|
+
EndDTMFCaptureFrame,
|
|
36
38
|
)
|
|
37
39
|
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
|
|
38
40
|
|
|
@@ -58,6 +60,7 @@ class STTMuteStrategy(Enum):
|
|
|
58
60
|
FUNCTION_CALL = "function_call"
|
|
59
61
|
ALWAYS = "always"
|
|
60
62
|
CUSTOM = "custom"
|
|
63
|
+
DTMF_CAPTURE = "dtmf_capture"
|
|
61
64
|
|
|
62
65
|
|
|
63
66
|
@dataclass
|
|
@@ -120,6 +123,7 @@ class STTMuteFilter(FrameProcessor):
|
|
|
120
123
|
self._function_call_in_progress = False
|
|
121
124
|
self._is_muted = False # Initialize as unmuted, will set state on StartFrame if needed
|
|
122
125
|
self._voicemail_detection_enabled = False # Default to False
|
|
126
|
+
self._dtmf_capture_active = False
|
|
123
127
|
|
|
124
128
|
@property
|
|
125
129
|
def is_muted(self) -> bool:
|
|
@@ -165,6 +169,10 @@ class STTMuteFilter(FrameProcessor):
|
|
|
165
169
|
if should_mute:
|
|
166
170
|
return True
|
|
167
171
|
|
|
172
|
+
case STTMuteStrategy.DTMF_CAPTURE:
|
|
173
|
+
if self._dtmf_capture_active:
|
|
174
|
+
return True
|
|
175
|
+
|
|
168
176
|
return False
|
|
169
177
|
|
|
170
178
|
async def process_frame(self, frame: Frame, direction: FrameDirection):
|
|
@@ -205,7 +213,14 @@ class STTMuteFilter(FrameProcessor):
|
|
|
205
213
|
self._first_speech_handled = True
|
|
206
214
|
should_mute = await self._should_mute()
|
|
207
215
|
self.logger.debug(f"BotStoppedSpeaking: should mute={should_mute}")
|
|
216
|
+
elif isinstance(frame, StartDTMFCaptureFrame):
|
|
217
|
+
self._dtmf_capture_active = True
|
|
218
|
+
should_mute = await self._should_mute()
|
|
219
|
+
elif isinstance(frame, EndDTMFCaptureFrame):
|
|
220
|
+
self._dtmf_capture_active = False
|
|
221
|
+
should_mute = await self._should_mute()
|
|
208
222
|
elif isinstance(frame, STTMuteFrame):
|
|
223
|
+
# TODO: Duplication of frame is actually happening. We get this frame from the downstream and then we again push it downstream. Also we're psuhing is upstream and again push it upstream in _handle_mute_state.
|
|
209
224
|
should_mute = frame.mute
|
|
210
225
|
|
|
211
226
|
# Then push the original frame
|
|
@@ -15,17 +15,17 @@ from loguru import logger
|
|
|
15
15
|
from pipecat.frames.frames import (
|
|
16
16
|
BotSpeakingFrame,
|
|
17
17
|
CancelFrame,
|
|
18
|
+
EndDTMFCaptureFrame,
|
|
18
19
|
EndFrame,
|
|
19
20
|
Frame,
|
|
20
21
|
FunctionCallCancelFrame,
|
|
21
22
|
FunctionCallInProgressFrame,
|
|
22
23
|
FunctionCallResultFrame,
|
|
23
24
|
InputDTMFFrame,
|
|
25
|
+
StartDTMFCaptureFrame,
|
|
26
|
+
StartFrame,
|
|
24
27
|
StartUserIdleProcessorFrame,
|
|
25
28
|
StopUserIdleProcessorFrame,
|
|
26
|
-
FunctionCallInProgressFrame,
|
|
27
|
-
FunctionCallResultFrame,
|
|
28
|
-
StartFrame,
|
|
29
29
|
UserStartedSpeakingFrame,
|
|
30
30
|
UserStoppedSpeakingFrame,
|
|
31
31
|
)
|
|
@@ -83,6 +83,8 @@ class UserIdleProcessor(FrameProcessor):
|
|
|
83
83
|
self._timeout = timeout
|
|
84
84
|
self._retry_count = 0
|
|
85
85
|
self._interrupted = False
|
|
86
|
+
self._function_call_active = False
|
|
87
|
+
self._dtmf_capture_active = False
|
|
86
88
|
self._conversation_started = False
|
|
87
89
|
self._idle_task = None
|
|
88
90
|
self._idle_event = asyncio.Event()
|
|
@@ -180,10 +182,20 @@ class UserIdleProcessor(FrameProcessor):
|
|
|
180
182
|
self._idle_event.set()
|
|
181
183
|
elif isinstance(frame, FunctionCallInProgressFrame):
|
|
182
184
|
# Function calls can take longer than the timeout, so we want to prevent idle callbacks
|
|
185
|
+
self._function_call_active = True
|
|
183
186
|
self._interrupted = True
|
|
184
187
|
self._idle_event.set()
|
|
185
188
|
elif isinstance(frame, FunctionCallResultFrame):
|
|
186
|
-
self.
|
|
189
|
+
self._function_call_active = False
|
|
190
|
+
self._interrupted = self._dtmf_capture_active
|
|
191
|
+
self._idle_event.set()
|
|
192
|
+
elif isinstance(frame, StartDTMFCaptureFrame):
|
|
193
|
+
self._dtmf_capture_active = True
|
|
194
|
+
self._interrupted = True
|
|
195
|
+
self._idle_event.set()
|
|
196
|
+
elif isinstance(frame, EndDTMFCaptureFrame):
|
|
197
|
+
self._dtmf_capture_active = False
|
|
198
|
+
self._interrupted = self._function_call_active
|
|
187
199
|
self._idle_event.set()
|
|
188
200
|
elif isinstance(frame, StartUserIdleProcessorFrame):
|
|
189
201
|
if not self._idle_task:
|