Merge pull request #4393 from pipecat-ai/mb/fix-smart-turn-import
fix(turns): defer LocalSmartTurnAnalyzerV3 import to fix transformers warning
This commit is contained in:
1
changelog/4393.fixed.md
Normal file
1
changelog/4393.fixed.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
- Fixed an issue where `LocalSmartTurnAnalyzerV3` was imported unconditionally for user turn stop strategies. It is now only imported when `default_user_turn_stop_strategies()` is called. This improves startup time and removes the `transformers` "PyTorch/TensorFlow/Flax not found" warning when the default stop strategies are not used.
|
||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from pipecat.audio.turn.smart_turn.local_smart_turn_v3 import LocalSmartTurnAnalyzerV3
|
|
||||||
from pipecat.turns.user_start import (
|
from pipecat.turns.user_start import (
|
||||||
BaseUserTurnStartStrategy,
|
BaseUserTurnStartStrategy,
|
||||||
ExternalUserTurnStartStrategy,
|
ExternalUserTurnStartStrategy,
|
||||||
@@ -44,6 +43,8 @@ def default_user_turn_stop_strategies() -> list[BaseUserTurnStopStrategy]:
|
|||||||
Returns ``[TurnAnalyzerUserTurnStopStrategy(LocalSmartTurnAnalyzerV3)]``.
|
Returns ``[TurnAnalyzerUserTurnStopStrategy(LocalSmartTurnAnalyzerV3)]``.
|
||||||
Useful when building a custom strategy list that extends the defaults.
|
Useful when building a custom strategy list that extends the defaults.
|
||||||
"""
|
"""
|
||||||
|
from pipecat.audio.turn.smart_turn.local_smart_turn_v3 import LocalSmartTurnAnalyzerV3
|
||||||
|
|
||||||
return [TurnAnalyzerUserTurnStopStrategy(turn_analyzer=LocalSmartTurnAnalyzerV3())]
|
return [TurnAnalyzerUserTurnStopStrategy(turn_analyzer=LocalSmartTurnAnalyzerV3())]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,6 @@ from unittest.mock import MagicMock, patch
|
|||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
# Mock package version check before importing pipecat (development mode)
|
|
||||||
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
|
|
||||||
_version_patcher.start()
|
|
||||||
|
|
||||||
# Mock krisp_audio before any pipecat import that loads krisp_instance / VIVA IP strategy
|
# Mock krisp_audio before any pipecat import that loads krisp_instance / VIVA IP strategy
|
||||||
mock_krisp_audio = MagicMock()
|
mock_krisp_audio = MagicMock()
|
||||||
mock_krisp_audio.SamplingRate.Sr8000Hz = 8000
|
mock_krisp_audio.SamplingRate.Sr8000Hz = 8000
|
||||||
@@ -37,18 +33,22 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
|
|||||||
sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
|
sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
|
||||||
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
|
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
|
||||||
|
|
||||||
from pipecat.frames.frames import (
|
# The version patch is scoped to just the import so it doesn't leak across the
|
||||||
BotStartedSpeakingFrame,
|
# test session and corrupt importlib.metadata.version for other tests
|
||||||
BotStoppedSpeakingFrame,
|
# (e.g. transformers' import-time dependency checks).
|
||||||
InputAudioRawFrame,
|
with patch("importlib.metadata.version", return_value="0.0.0-dev"):
|
||||||
TranscriptionFrame,
|
from pipecat.frames.frames import (
|
||||||
VADUserStartedSpeakingFrame,
|
BotStartedSpeakingFrame,
|
||||||
VADUserStoppedSpeakingFrame,
|
BotStoppedSpeakingFrame,
|
||||||
)
|
InputAudioRawFrame,
|
||||||
from pipecat.turns.types import ProcessFrameResult
|
TranscriptionFrame,
|
||||||
from pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy import (
|
VADUserStartedSpeakingFrame,
|
||||||
KrispVivaIPUserTurnStartStrategy,
|
VADUserStoppedSpeakingFrame,
|
||||||
)
|
)
|
||||||
|
from pipecat.turns.types import ProcessFrameResult
|
||||||
|
from pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy import (
|
||||||
|
KrispVivaIPUserTurnStartStrategy,
|
||||||
|
)
|
||||||
|
|
||||||
STRATEGY_MODULE = "pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy"
|
STRATEGY_MODULE = "pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy"
|
||||||
|
|
||||||
|
|||||||
@@ -11,11 +11,6 @@ from unittest.mock import MagicMock, patch
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
# Mock package version check before importing pipecat
|
|
||||||
# This allows tests to run in development mode without installed package
|
|
||||||
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
|
|
||||||
_version_patcher.start()
|
|
||||||
|
|
||||||
# Mock krisp_audio module BEFORE any pipecat imports
|
# Mock krisp_audio module BEFORE any pipecat imports
|
||||||
# This allows tests to run without krisp_audio installed
|
# This allows tests to run without krisp_audio installed
|
||||||
mock_krisp_audio = MagicMock()
|
mock_krisp_audio = MagicMock()
|
||||||
@@ -48,12 +43,15 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
|
|||||||
sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
|
sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
|
||||||
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
|
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
|
||||||
|
|
||||||
# Now we can safely import
|
# Now we can safely import. The version patch is scoped to just the import so
|
||||||
from pipecat.audio.krisp_instance import (
|
# it doesn't leak across the test session and corrupt importlib.metadata.version
|
||||||
KRISP_SAMPLE_RATES,
|
# for other tests (e.g. transformers' import-time dependency checks).
|
||||||
KrispVivaSDKManager,
|
with patch("importlib.metadata.version", return_value="0.0.0-dev"):
|
||||||
int_to_krisp_sample_rate,
|
from pipecat.audio.krisp_instance import (
|
||||||
)
|
KRISP_SAMPLE_RATES,
|
||||||
|
KrispVivaSDKManager,
|
||||||
|
int_to_krisp_sample_rate,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestKrispVivaSDKManager:
|
class TestKrispVivaSDKManager:
|
||||||
|
|||||||
@@ -13,11 +13,6 @@ from unittest.mock import MagicMock, patch
|
|||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
# Mock package version check before importing pipecat
|
|
||||||
# This allows tests to run in development mode without installed package
|
|
||||||
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
|
|
||||||
_version_patcher.start()
|
|
||||||
|
|
||||||
# Mock krisp_audio module BEFORE any pipecat imports
|
# Mock krisp_audio module BEFORE any pipecat imports
|
||||||
# This allows tests to run without krisp_audio installed
|
# This allows tests to run without krisp_audio installed
|
||||||
mock_krisp_audio = MagicMock()
|
mock_krisp_audio = MagicMock()
|
||||||
@@ -42,9 +37,12 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
|
|||||||
sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
|
sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
|
||||||
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
|
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
|
||||||
|
|
||||||
# Now we can safely import
|
# Now we can safely import. The version patch is scoped to just the import so
|
||||||
from pipecat.audio.filters.krisp_viva_filter import KrispVivaFilter
|
# it doesn't leak across the test session and corrupt importlib.metadata.version
|
||||||
from pipecat.frames.frames import FilterEnableFrame
|
# for other tests (e.g. transformers' import-time dependency checks).
|
||||||
|
with patch("importlib.metadata.version", return_value="0.0.0-dev"):
|
||||||
|
from pipecat.audio.filters.krisp_viva_filter import KrispVivaFilter
|
||||||
|
from pipecat.frames.frames import FilterEnableFrame
|
||||||
|
|
||||||
|
|
||||||
class TestKrispVivaFilter(unittest.IsolatedAsyncioTestCase):
|
class TestKrispVivaFilter(unittest.IsolatedAsyncioTestCase):
|
||||||
|
|||||||
@@ -15,11 +15,6 @@ from unittest.mock import MagicMock, patch
|
|||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
# Mock package version check before importing pipecat
|
|
||||||
# This allows tests to run in development mode without installed package
|
|
||||||
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
|
|
||||||
_version_patcher.start()
|
|
||||||
|
|
||||||
# Mock krisp_audio module BEFORE any pipecat imports
|
# Mock krisp_audio module BEFORE any pipecat imports
|
||||||
# This allows tests to run without krisp_audio installed
|
# This allows tests to run without krisp_audio installed
|
||||||
mock_krisp_audio = MagicMock()
|
mock_krisp_audio = MagicMock()
|
||||||
@@ -44,9 +39,12 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
|
|||||||
sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
|
sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
|
||||||
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
|
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
|
||||||
|
|
||||||
# Now we can safely import
|
# Now we can safely import. The version patch is scoped to just the import so
|
||||||
from pipecat.audio.vad.krisp_viva_vad import KrispVivaVadAnalyzer
|
# it doesn't leak across the test session and corrupt importlib.metadata.version
|
||||||
from pipecat.audio.vad.vad_analyzer import VADParams
|
# for other tests (e.g. transformers' import-time dependency checks).
|
||||||
|
with patch("importlib.metadata.version", return_value="0.0.0-dev"):
|
||||||
|
from pipecat.audio.vad.krisp_viva_vad import KrispVivaVadAnalyzer
|
||||||
|
from pipecat.audio.vad.vad_analyzer import VADParams
|
||||||
|
|
||||||
|
|
||||||
class TestKrispVivaVadAnalyzer(unittest.TestCase):
|
class TestKrispVivaVadAnalyzer(unittest.TestCase):
|
||||||
|
|||||||
Reference in New Issue
Block a user