From 94823ab95258924e01e6b60a887efe692f0249b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Mon, 24 Jun 2024 14:56:24 -0700 Subject: [PATCH 1/2] transports(daily): always check size of read audio frames --- CHANGELOG.md | 7 +++++++ pyproject.toml | 2 +- src/pipecat/transports/base_input.py | 2 +- src/pipecat/transports/services/daily.py | 17 ++++++++--------- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ab6d2b55..c85d9685a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to **pipecat** will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Fixed + +- Fixed a Daily transport blocking situation that occurred while reading audio + frames after a participant left the room. Needs daily-python >= 0.10.1. + ## [0.0.32] - 2024-06-22 ### Added diff --git a/pyproject.toml b/pyproject.toml index d5b28e3ad..4b5a85319 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,7 @@ Website = "https://pipecat.ai" anthropic = [ "anthropic~=0.25.7" ] azure = [ "azure-cognitiveservices-speech~=1.37.0" ] cartesia = [ "numpy~=1.26.0", "sounddevice", "cartesia" ] -daily = [ "daily-python~=0.10.0" ] +daily = [ "daily-python~=0.10.1" ] deepgram = [ "deepgram-sdk~=3.2.7" ] examples = [ "python-dotenv~=1.0.0", "flask~=3.0.3", "flask_cors~=4.0.1" ] fal = [ "fal-client~=0.4.0" ] diff --git a/src/pipecat/transports/base_input.py b/src/pipecat/transports/base_input.py index cb7be5d55..4f906149d 100644 --- a/src/pipecat/transports/base_input.py +++ b/src/pipecat/transports/base_input.py @@ -55,7 +55,7 @@ class BaseInputTransport(FrameProcessor): async def push_audio_frame(self, frame: AudioRawFrame): if self._params.audio_in_enabled or self._params.vad_enabled: - self._audio_in_queue.put_nowait(frame) + await self._audio_in_queue.put(frame) # # Frame processor diff --git a/src/pipecat/transports/services/daily.py b/src/pipecat/transports/services/daily.py index 9fdf9dab1..13c8dbce6 100644 --- a/src/pipecat/transports/services/daily.py +++ b/src/pipecat/transports/services/daily.py @@ -209,19 +209,18 @@ class DailyTransportClient(EventHandler): async def read_next_audio_frame(self) -> AudioRawFrame | None: sample_rate = self._params.audio_in_sample_rate num_channels = self._params.audio_in_channels + num_frames = int(sample_rate / 100) * 2 # 20ms of audio - if self._other_participant_has_joined: - num_frames = int(sample_rate / 100) * 2 # 20ms of audio - - future = self._loop.create_future() - self._speaker.read_frames(num_frames, completion=completion_callback(future)) - audio = await future + future = self._loop.create_future() + self._speaker.read_frames(num_frames, completion=completion_callback(future)) + audio = await future + if len(audio) > 0: return AudioRawFrame(audio=audio, sample_rate=sample_rate, num_channels=num_channels) else: - # If no one has ever joined the meeting `read_frames()` would block, - # instead we just wait a bit. daily-python should probably return - # silence instead. + # If we don't read any audio it could be there's no participant + # connected. daily-python will return immediately if that's the + # case, so let's sleep for a little bit (i.e. busy wait). await asyncio.sleep(0.01) return None From 98bd183bc44f41757a175abc9c62b25154488981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Tue, 25 Jun 2024 09:42:05 -0700 Subject: [PATCH 2/2] pyproject: fix cartesia version and update requirements files --- linux-py3.10-requirements.txt | 22 ++++++++------------- macos-py3.10-requirements.txt | 36 ++++++++++++++++++++--------------- pyproject.toml | 2 +- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/linux-py3.10-requirements.txt b/linux-py3.10-requirements.txt index 8b5b260f0..0874c8c1d 100644 --- a/linux-py3.10-requirements.txt +++ b/linux-py3.10-requirements.txt @@ -4,7 +4,7 @@ # # pip-compile --all-extras pyproject.toml # -aiofiles==23.2.1 +aiofiles==24.1.0 # via deepgram-sdk aiohttp==3.9.5 # via @@ -51,8 +51,6 @@ certifi==2024.6.2 # httpcore # httpx # requests -cffi==1.16.0 - # via sounddevice charset-normalizer==3.3.2 # via requests click==8.1.7 @@ -64,7 +62,7 @@ coloredlogs==15.0.1 # via onnxruntime ctranslate2==4.3.1 # via faster-whisper -daily-python==0.10.0 +daily-python==0.10.1 # via pipecat-ai (pyproject.toml) dataclasses-json==0.6.7 # via @@ -94,7 +92,7 @@ fastapi-cli==0.0.4 # via fastapi faster-whisper==1.0.2 # via pipecat-ai (pyproject.toml) -filelock==3.15.3 +filelock==3.15.4 # via # huggingface-hub # pyht @@ -121,7 +119,7 @@ future==1.0.0 # via pyloudnorm google-ai-generativelanguage==0.6.4 # via google-generativeai -google-api-core[grpc]==2.19.0 +google-api-core[grpc]==2.19.1 # via # google-ai-generativelanguage # google-api-python-client @@ -139,7 +137,7 @@ google-auth-httplib2==0.2.0 # via google-api-python-client google-generativeai==0.5.4 # via pipecat-ai (pyproject.toml) -googleapis-common-protos==1.63.1 +googleapis-common-protos==1.63.2 # via # google-api-core # grpcio-status @@ -219,7 +217,7 @@ langchain-openai==0.1.9 # via pipecat-ai (pyproject.toml) langchain-text-splitters==0.2.1 # via langchain -langsmith==0.1.81 +langsmith==0.1.82 # via # langchain # langchain-community @@ -338,8 +336,6 @@ pyasn1-modules==0.4.0 # via google-auth pyaudio==0.2.14 # via pipecat-ai (pyproject.toml) -pycparser==2.22 - # via cffi pydantic==2.7.4 # via # anthropic @@ -404,7 +400,7 @@ safetensors==0.4.3 # via # timm # transformers -scipy==1.13.1 +scipy==1.14.0 # via pyloudnorm shellingham==1.5.4 # via typer @@ -416,8 +412,6 @@ sniffio==1.3.1 # anyio # httpx # openai -sounddevice==0.4.7 - # via pipecat-ai (pyproject.toml) sqlalchemy==2.0.31 # via # langchain @@ -428,7 +422,7 @@ sympy==1.12.1 # via # onnxruntime # torch -tenacity==8.4.1 +tenacity==8.4.2 # via # langchain # langchain-community diff --git a/macos-py3.10-requirements.txt b/macos-py3.10-requirements.txt index 0364d7d92..fad025c9f 100644 --- a/macos-py3.10-requirements.txt +++ b/macos-py3.10-requirements.txt @@ -1,10 +1,10 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile --all-extras pyproject.toml # -aiofiles==23.2.1 +aiofiles==24.1.0 # via deepgram-sdk aiohttp==3.9.5 # via @@ -28,6 +28,10 @@ anyio==4.4.0 # openai # starlette # watchfiles +async-timeout==4.0.3 + # via + # aiohttp + # langchain attrs==23.2.0 # via # aiohttp @@ -47,8 +51,6 @@ certifi==2024.6.2 # httpcore # httpx # requests -cffi==1.16.0 - # via sounddevice charset-normalizer==3.3.2 # via requests click==8.1.7 @@ -60,7 +62,7 @@ coloredlogs==15.0.1 # via onnxruntime ctranslate2==4.3.1 # via faster-whisper -daily-python==0.10.0 +daily-python==0.10.1 # via pipecat-ai (pyproject.toml) dataclasses-json==0.6.7 # via @@ -78,6 +80,10 @@ einops==0.8.0 # via pipecat-ai (pyproject.toml) email-validator==2.2.0 # via fastapi +exceptiongroup==1.2.1 + # via + # anyio + # pytest fal-client==0.4.0 # via pipecat-ai (pyproject.toml) fastapi==0.111.0 @@ -86,7 +92,7 @@ fastapi-cli==0.0.4 # via fastapi faster-whisper==1.0.2 # via pipecat-ai (pyproject.toml) -filelock==3.15.3 +filelock==3.15.4 # via # huggingface-hub # pyht @@ -112,7 +118,7 @@ future==1.0.0 # via pyloudnorm google-ai-generativelanguage==0.6.4 # via google-generativeai -google-api-core[grpc]==2.19.0 +google-api-core[grpc]==2.19.1 # via # google-ai-generativelanguage # google-api-python-client @@ -130,7 +136,7 @@ google-auth-httplib2==0.2.0 # via google-api-python-client google-generativeai==0.5.4 # via pipecat-ai (pyproject.toml) -googleapis-common-protos==1.63.1 +googleapis-common-protos==1.63.2 # via # google-api-core # grpcio-status @@ -208,7 +214,7 @@ langchain-openai==0.1.9 # via pipecat-ai (pyproject.toml) langchain-text-splitters==0.2.1 # via langchain -langsmith==0.1.81 +langsmith==0.1.82 # via # langchain # langchain-community @@ -296,8 +302,6 @@ pyasn1-modules==0.4.0 # via google-auth pyaudio==0.2.14 # via pipecat-ai (pyproject.toml) -pycparser==2.22 - # via cffi pydantic==2.7.4 # via # anthropic @@ -362,7 +366,7 @@ safetensors==0.4.3 # via # timm # transformers -scipy==1.13.1 +scipy==1.14.0 # via pyloudnorm shellingham==1.5.4 # via typer @@ -374,8 +378,6 @@ sniffio==1.3.1 # anyio # httpx # openai -sounddevice==0.4.7 - # via pipecat-ai (pyproject.toml) sqlalchemy==2.0.31 # via # langchain @@ -386,7 +388,7 @@ sympy==1.12.1 # via # onnxruntime # torch -tenacity==8.4.1 +tenacity==8.4.2 # via # langchain # langchain-community @@ -400,6 +402,8 @@ tokenizers==0.19.1 # anthropic # faster-whisper # transformers +tomli==2.0.1 + # via pytest torch==2.3.1 # via # pipecat-ai (pyproject.toml) @@ -423,6 +427,7 @@ typer==0.12.3 typing-extensions==4.12.2 # via # anthropic + # anyio # deepgram-sdk # fastapi # google-generativeai @@ -435,6 +440,7 @@ typing-extensions==4.12.2 # torch # typer # typing-inspect + # uvicorn typing-inspect==0.9.0 # via dataclasses-json ujson==5.10.0 diff --git a/pyproject.toml b/pyproject.toml index 4b5a85319..6d21d787b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ Website = "https://pipecat.ai" [project.optional-dependencies] anthropic = [ "anthropic~=0.25.7" ] azure = [ "azure-cognitiveservices-speech~=1.37.0" ] -cartesia = [ "numpy~=1.26.0", "sounddevice", "cartesia" ] +cartesia = [ "cartesia~=0.1.1" ] daily = [ "daily-python~=0.10.1" ] deepgram = [ "deepgram-sdk~=3.2.7" ] examples = [ "python-dotenv~=1.0.0", "flask~=3.0.3", "flask_cors~=4.0.1" ]