Merge pull request #1702 from pipecat-ai/mb/stt-mute-transcription-frames
Add InterimTranscriptionFrame and TranscriptionFrame to STTMuteFilter…
This commit is contained in:
@@ -34,6 +34,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
- The `STTMuteFilter` now mutes `InterimTranscriptionFrame` and
|
||||||
|
`TranscriptionFrame` which allows the `STTMuteFilter` to be used in
|
||||||
|
conjunction with transports that generate transcripts, e.g. `DailyTransport`.
|
||||||
|
|
||||||
- Function calls now receive a single parameter `FunctionCallParams` instead of
|
- Function calls now receive a single parameter `FunctionCallParams` instead of
|
||||||
`(function_name, tool_call_id, args, llm, context, result_callback)` which is
|
`(function_name, tool_call_id, args, llm, context, result_callback)` which is
|
||||||
now deprecated.
|
now deprecated.
|
||||||
|
|||||||
@@ -24,10 +24,12 @@ from pipecat.frames.frames import (
|
|||||||
FunctionCallInProgressFrame,
|
FunctionCallInProgressFrame,
|
||||||
FunctionCallResultFrame,
|
FunctionCallResultFrame,
|
||||||
InputAudioRawFrame,
|
InputAudioRawFrame,
|
||||||
|
InterimTranscriptionFrame,
|
||||||
StartFrame,
|
StartFrame,
|
||||||
StartInterruptionFrame,
|
StartInterruptionFrame,
|
||||||
StopInterruptionFrame,
|
StopInterruptionFrame,
|
||||||
STTMuteFrame,
|
STTMuteFrame,
|
||||||
|
TranscriptionFrame,
|
||||||
UserStartedSpeakingFrame,
|
UserStartedSpeakingFrame,
|
||||||
UserStoppedSpeakingFrame,
|
UserStoppedSpeakingFrame,
|
||||||
)
|
)
|
||||||
@@ -175,6 +177,8 @@ class STTMuteFilter(FrameProcessor):
|
|||||||
UserStartedSpeakingFrame,
|
UserStartedSpeakingFrame,
|
||||||
UserStoppedSpeakingFrame,
|
UserStoppedSpeakingFrame,
|
||||||
InputAudioRawFrame,
|
InputAudioRawFrame,
|
||||||
|
InterimTranscriptionFrame,
|
||||||
|
TranscriptionFrame,
|
||||||
),
|
),
|
||||||
):
|
):
|
||||||
# Only pass VAD-related frames when not muted
|
# Only pass VAD-related frames when not muted
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ from pipecat.frames.frames import (
|
|||||||
FunctionCallInProgressFrame,
|
FunctionCallInProgressFrame,
|
||||||
FunctionCallResultFrame,
|
FunctionCallResultFrame,
|
||||||
InputAudioRawFrame,
|
InputAudioRawFrame,
|
||||||
|
InterimTranscriptionFrame,
|
||||||
STTMuteFrame,
|
STTMuteFrame,
|
||||||
|
TranscriptionFrame,
|
||||||
UserStartedSpeakingFrame,
|
UserStartedSpeakingFrame,
|
||||||
UserStoppedSpeakingFrame,
|
UserStoppedSpeakingFrame,
|
||||||
)
|
)
|
||||||
@@ -100,6 +102,45 @@ class TestSTTMuteFilter(unittest.IsolatedAsyncioTestCase):
|
|||||||
expected_down_frames=expected_returned_frames,
|
expected_down_frames=expected_returned_frames,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async def test_transcription_frames_with_always_strategy(self):
|
||||||
|
filter = STTMuteFilter(config=STTMuteConfig(strategies={STTMuteStrategy.ALWAYS}))
|
||||||
|
|
||||||
|
frames_to_send = [
|
||||||
|
# Bot speaking - should mute
|
||||||
|
BotStartedSpeakingFrame(),
|
||||||
|
SleepFrame(sleep=0.1), # Wait for StartedSpeaking to process
|
||||||
|
InterimTranscriptionFrame(
|
||||||
|
user_id="user1", text="This should be suppressed", timestamp="1234567890"
|
||||||
|
),
|
||||||
|
TranscriptionFrame(
|
||||||
|
user_id="user1", text="This should be suppressed", timestamp="1234567890"
|
||||||
|
),
|
||||||
|
SleepFrame(sleep=0.1), # Wait for transcription frames to queue
|
||||||
|
BotStoppedSpeakingFrame(),
|
||||||
|
# Bot not speaking - should pass through
|
||||||
|
InterimTranscriptionFrame(
|
||||||
|
user_id="user1", text="This should pass", timestamp="1234567891"
|
||||||
|
),
|
||||||
|
TranscriptionFrame(
|
||||||
|
user_id="user1", text="This should pass through", timestamp="1234567891"
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_returned_frames = [
|
||||||
|
BotStartedSpeakingFrame,
|
||||||
|
STTMuteFrame, # mute=True
|
||||||
|
BotStoppedSpeakingFrame,
|
||||||
|
STTMuteFrame, # mute=False
|
||||||
|
InterimTranscriptionFrame, # Only passes through after bot stops speaking
|
||||||
|
TranscriptionFrame, # Only passes through after bot stops speaking
|
||||||
|
]
|
||||||
|
|
||||||
|
await run_test(
|
||||||
|
filter,
|
||||||
|
frames_to_send=frames_to_send,
|
||||||
|
expected_down_frames=expected_returned_frames,
|
||||||
|
)
|
||||||
|
|
||||||
# TODO: Revisit once we figure out how to test SystemFrames and DataFrames
|
# TODO: Revisit once we figure out how to test SystemFrames and DataFrames
|
||||||
# async def test_function_call_strategy(self):
|
# async def test_function_call_strategy(self):
|
||||||
# filter = STTMuteFilter(config=STTMuteConfig(strategies={STTMuteStrategy.FUNCTION_CALL}))
|
# filter = STTMuteFilter(config=STTMuteConfig(strategies={STTMuteStrategy.FUNCTION_CALL}))
|
||||||
|
|||||||
Reference in New Issue
Block a user