From ae60d42016ac6c5592af50b649ad23059dbda095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Tue, 22 Apr 2025 15:13:12 -0700 Subject: [PATCH] s/SmartTurnAnalyzer/HttpSmartTurnAnalyzer/ and add FalSmartTurnAnalyzer --- examples/foundational/38-smart-turn.py | 6 +++-- examples/foundational/38a-local-smart-turn.py | 2 +- src/pipecat/audio/turn/fal_smart_turn.py | 26 +++++++++++++++++++ .../{smart_turn.py => http_smart_turn.py} | 14 +++++++--- ...art_turn.py => local_coreml_smart_turn.py} | 0 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/pipecat/audio/turn/fal_smart_turn.py rename src/pipecat/audio/turn/{smart_turn.py => http_smart_turn.py} (90%) rename src/pipecat/audio/turn/{local_smart_turn.py => local_coreml_smart_turn.py} (100%) diff --git a/examples/foundational/38-smart-turn.py b/examples/foundational/38-smart-turn.py index 929a22e68..ea32c69ed 100644 --- a/examples/foundational/38-smart-turn.py +++ b/examples/foundational/38-smart-turn.py @@ -10,7 +10,7 @@ import aiohttp from dotenv import load_dotenv from loguru import logger -from pipecat.audio.turn.smart_turn import SmartTurnAnalyzer +from pipecat.audio.turn.http_smart_turn import HttpSmartTurnAnalyzer from pipecat.audio.vad.silero import SileroVADAnalyzer from pipecat.audio.vad.vad_analyzer import VADParams from pipecat.pipeline.pipeline import Pipeline @@ -41,7 +41,9 @@ async def run_bot(webrtc_connection: SmallWebRTCConnection): vad_enabled=True, vad_analyzer=SileroVADAnalyzer(params=VADParams(stop_secs=0.2)), vad_audio_passthrough=True, - turn_analyzer=SmartTurnAnalyzer(url=remote_smart_turn_url, aiohttp_session=session), + turn_analyzer=HttpSmartTurnAnalyzer( + url=remote_smart_turn_url, aiohttp_session=session + ), ), ) diff --git a/examples/foundational/38a-local-smart-turn.py b/examples/foundational/38a-local-smart-turn.py index c1260c248..856cc69b6 100644 --- a/examples/foundational/38a-local-smart-turn.py +++ b/examples/foundational/38a-local-smart-turn.py @@ -10,7 +10,7 @@ from dotenv import load_dotenv from loguru import logger from pipecat.audio.turn.base_smart_turn import SmartTurnParams -from pipecat.audio.turn.local_smart_turn import LocalCoreMLSmartTurnAnalyzer +from pipecat.audio.turn.local_coreml_smart_turn import LocalCoreMLSmartTurnAnalyzer from pipecat.audio.vad.silero import SileroVADAnalyzer from pipecat.audio.vad.vad_analyzer import VADParams from pipecat.pipeline.pipeline import Pipeline diff --git a/src/pipecat/audio/turn/fal_smart_turn.py b/src/pipecat/audio/turn/fal_smart_turn.py new file mode 100644 index 000000000..7e7974ed1 --- /dev/null +++ b/src/pipecat/audio/turn/fal_smart_turn.py @@ -0,0 +1,26 @@ +# +# Copyright (c) 2024–2025, Daily +# +# SPDX-License-Identifier: BSD 2-Clause License +# + +from typing import Optional + +import aiohttp + +from pipecat.audio.turn.http_smart_turn import HttpSmartTurnAnalyzer + + +class FalSmartTurnAnalyzer(HttpSmartTurnAnalyzer): + def __init__( + self, + *, + aiohttp_session: aiohttp.ClientSession, + url: str = "https://fal.run/fal-ai/smart-turn/raw", + api_key: Optional[str] = None, + **kwargs, + ): + headers = {} + if api_key: + headers = {"Authorization": f"Key {api_key}"} + super().__init__(url=url, aiohttp_session=aiohttp_session, headers=headers, **kwargs) diff --git a/src/pipecat/audio/turn/smart_turn.py b/src/pipecat/audio/turn/http_smart_turn.py similarity index 90% rename from src/pipecat/audio/turn/smart_turn.py rename to src/pipecat/audio/turn/http_smart_turn.py index 2af94e139..4c1fb8491 100644 --- a/src/pipecat/audio/turn/smart_turn.py +++ b/src/pipecat/audio/turn/http_smart_turn.py @@ -4,7 +4,6 @@ # SPDX-License-Identifier: BSD 2-Clause License # - import asyncio import io from typing import Any, Dict @@ -16,10 +15,18 @@ from loguru import logger from pipecat.audio.turn.base_smart_turn import BaseSmartTurn, SmartTurnTimeoutException -class SmartTurnAnalyzer(BaseSmartTurn): - def __init__(self, url: str, aiohttp_session: aiohttp.ClientSession, **kwargs): +class HttpSmartTurnAnalyzer(BaseSmartTurn): + def __init__( + self, + *, + url: str, + aiohttp_session: aiohttp.ClientSession, + headers: Dict[str, str] = {}, + **kwargs, + ): super().__init__(**kwargs) self._url = url + self._headers = headers self._aiohttp_session = aiohttp_session def _serialize_array(self, audio_array: np.ndarray) -> bytes: @@ -32,6 +39,7 @@ class SmartTurnAnalyzer(BaseSmartTurn): async def _send_raw_request(self, data_bytes: bytes) -> Dict[str, Any]: headers = {"Content-Type": "application/octet-stream"} + headers.update(self._headers) logger.trace(f"Sending {len(data_bytes)} bytes as raw body to {self._url}...") try: timeout = aiohttp.ClientTimeout(total=self._params.stop_secs) diff --git a/src/pipecat/audio/turn/local_smart_turn.py b/src/pipecat/audio/turn/local_coreml_smart_turn.py similarity index 100% rename from src/pipecat/audio/turn/local_smart_turn.py rename to src/pipecat/audio/turn/local_coreml_smart_turn.py