Compare commits

...

3 Commits

Author SHA1 Message Date
Chad Bailey
ff1b2961d8 fixup 2024-05-31 14:23:56 +00:00
Chad Bailey
ba42cffcc2 test cleanup 2024-05-31 14:23:56 +00:00
Chad Bailey
9778d86607 everything but audioframe and endpipeframe 2024-05-31 14:23:52 +00:00
17 changed files with 48 additions and 49 deletions

View File

@@ -3,14 +3,14 @@ import aiohttp
import asyncio import asyncio
import logging import logging
import os import os
from pipecat.pipeline.aggregators import SentenceAggregator from pipecat.processors.aggregators import SentenceAggregator
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
from pipecat.transports.daily_transport import DailyTransport from pipecat.transports.daily_transport import DailyTransport
from pipecat.services.azure_ai_services import AzureLLMService, AzureTTSService from pipecat.services.azure_ai_services import AzureLLMService, AzureTTSService
from pipecat.services.elevenlabs_ai_services import ElevenLabsTTSService from pipecat.services.elevenlabs_ai_services import ElevenLabsTTSService
from pipecat.services.fal_ai_services import FalImageGenService from pipecat.services.fal_ai_services import FalImageGenService
from pipecat.pipeline.frames import AudioFrame, EndFrame, ImageFrame, LLMMessagesFrame, TextFrame from pipecat.frames.frames import AudioFrame, EndFrame, ImageFrame, LLMMessagesFrame, TextFrame
from runner import configure from runner import configure

View File

@@ -2,8 +2,8 @@ import asyncio
import aiohttp import aiohttp
import logging import logging
import os import os
from pipecat.pipeline.frame_processor import FrameProcessor from pipeline.processors.frame_processor import FrameProcessor
from pipecat.pipeline.frames import TextFrame, TranscriptionFrame from pipecat.frames.frames import TextFrame, TranscriptionFrame
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
from pipecat.services.elevenlabs_ai_services import ElevenLabsTTSService from pipecat.services.elevenlabs_ai_services import ElevenLabsTTSService
from pipecat.transports.websocket_transport import WebsocketTransport from pipecat.transports.websocket_transport import WebsocketTransport

View File

@@ -307,7 +307,7 @@ class UserStoppedSpeakingFrame(ControlFrame):
@dataclass @dataclass
class TTSStartedFrame(ControlFrame): class TTSStartedFrame(ControlFrame):
"""Used to indicate the beginning of a TTS response. Following """Used to indicate the beginning of a TTS response. Following
AudioRawFrames are part of the TTS response until an TTSEndFrame. These AudioRawFrames are part of the TTS response until an TTSStoppedFrame. These
frames can be used for aggregating audio frames in a transport to optimize frames can be used for aggregating audio frames in a transport to optimize
the size of frames sent to the session, without needing to control this in the size of frames sent to the session, without needing to control this in
the TTS service. the TTS service.

View File

@@ -1,5 +1,5 @@
from typing import List from typing import List
from pipecat.pipeline.frames import EndFrame, EndPipeFrame from pipecat.frames.frames import EndFrame
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
@@ -16,8 +16,7 @@ class SequentialMergePipeline(Pipeline):
while True: while True:
frame = await pipeline.sink.get() frame = await pipeline.sink.get()
if isinstance( if isinstance(
frame, EndFrame) or isinstance( frame, EndFrame):
frame, EndPipeFrame):
break break
await self.sink.put(frame) await self.sink.put(frame)

View File

@@ -17,7 +17,7 @@ class GatedAggregator(FrameProcessor):
Yields gate-opening frame before any accumulated frames, then ensuing frames Yields gate-opening frame before any accumulated frames, then ensuing frames
until and not including the gate-closed frame. until and not including the gate-closed frame.
>>> from pipecat.pipeline.frames import ImageFrame >>> from pipecat.frames.frames import ImageFrame
>>> async def print_frames(aggregator, frame): >>> async def print_frames(aggregator, frame):
... async for frame in aggregator.process_frame(frame): ... async for frame in aggregator.process_frame(frame):

View File

@@ -12,7 +12,7 @@ class VisionImageFrameAggregator(FrameProcessor):
"""This aggregator waits for a consecutive TextFrame and an """This aggregator waits for a consecutive TextFrame and an
ImageFrame. After the ImageFrame arrives it will output a VisionImageFrame. ImageFrame. After the ImageFrame arrives it will output a VisionImageFrame.
>>> from pipecat.pipeline.frames import ImageFrame >>> from pipecat.frames.frames import ImageFrame
>>> async def print_frames(aggregator, frame): >>> async def print_frames(aggregator, frame):
... async for frame in aggregator.process_frame(frame): ... async for frame in aggregator.process_frame(frame):

View File

@@ -1,6 +1,6 @@
from abc import abstractmethod from abc import abstractmethod
from pipecat.pipeline.frames import Frame from pipecat.frames.frames import Frame
class FrameSerializer: class FrameSerializer:

View File

@@ -1,14 +1,14 @@
import dataclasses import dataclasses
from typing import Text from typing import Text
from pipecat.pipeline.frames import AudioFrame, Frame, TextFrame, TranscriptionFrame from pipecat.frames.frames import AudioRawFrame, Frame, TextFrame, TranscriptionFrame
import pipecat.pipeline.protobufs.frames_pb2 as frame_protos import pipecat.frames.protobufs.frames_pb2 as frame_protos
from pipecat.serializers.abstract_frame_serializer import FrameSerializer from pipecat.serializers.abstract_frame_serializer import FrameSerializer
class ProtobufFrameSerializer(FrameSerializer): class ProtobufFrameSerializer(FrameSerializer):
SERIALIZABLE_TYPES = { SERIALIZABLE_TYPES = {
TextFrame: "text", TextFrame: "text",
AudioFrame: "audio", AudioRawFrame: "audio",
TranscriptionFrame: "transcription" TranscriptionFrame: "transcription"
} }

View File

@@ -17,8 +17,8 @@ from functools import partial
from typing import Any, Callable, Mapping from typing import Any, Callable, Mapping
from daily import ( from daily import (
CallClient,
Daily, Daily,
CallClient,
EventHandler, EventHandler,
VirtualCameraDevice, VirtualCameraDevice,
VirtualMicrophoneDevice, VirtualMicrophoneDevice,

View File

@@ -1,8 +1,8 @@
import asyncio import asyncio
import os import os
from pipecat.pipeline.openai_frames import OpenAILLMContextFrame from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContextFrame
from pipecat.services.azure_ai_services import AzureLLMService from pipecat.services.azure import AzureLLMService
from pipecat.services.openai_llm_context import OpenAILLMContext from pipecat.services.openai import OpenAILLMContext
from openai.types.chat import ( from openai.types.chat import (
ChatCompletionSystemMessageParam, ChatCompletionSystemMessageParam,

View File

@@ -1,11 +1,10 @@
import asyncio import asyncio
from pipecat.pipeline.openai_frames import OpenAILLMContextFrame from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContextFrame, OpenAILLMContext
from pipecat.services.openai_llm_context import OpenAILLMContext
from openai.types.chat import ( from openai.types.chat import (
ChatCompletionSystemMessageParam, ChatCompletionSystemMessageParam,
) )
from pipecat.services.ollama_ai_services import OLLamaLLMService from pipecat.services.ollama import OLLamaLLMService
if __name__ == "__main__": if __name__ == "__main__":
async def test_chat(): async def test_chat():

View File

@@ -3,6 +3,7 @@ import json
import os import os
from typing import List from typing import List
from pipecat.services.openai import OpenAILLMContextFrame, OpenAILLMContext from pipecat.services.openai import OpenAILLMContextFrame, OpenAILLMContext
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
from pipecat.frames.frames import ( from pipecat.frames.frames import (

View File

@@ -3,16 +3,15 @@ import doctest
import functools import functools
import unittest import unittest
from pipecat.pipeline.aggregators import ( from pipecat.processors.aggregators.sentence import SentenceAggregator
GatedAggregator, from pipecat.processors.text_transformer import StatelessTextTransformer
ParallelPipeline, from pipecat.processors.aggregators.gated import GatedAggregator
SentenceAggregator, from pipecat.pipeline.parallel_pipeline import ParallelPipeline
StatelessTextTransformer,
) from pipecat.frames.frames import (
from pipecat.pipeline.frames import ( AudioRawFrame,
AudioFrame,
EndFrame, EndFrame,
ImageFrame, ImageRawFrame,
LLMResponseEndFrame, LLMResponseEndFrame,
LLMResponseStartFrame, LLMResponseStartFrame,
Frame, Frame,
@@ -46,26 +45,26 @@ class TestDailyFrameAggregators(unittest.IsolatedAsyncioTestCase):
async def test_gated_accumulator(self): async def test_gated_accumulator(self):
gated_aggregator = GatedAggregator( gated_aggregator = GatedAggregator(
gate_open_fn=lambda frame: isinstance( gate_open_fn=lambda frame: isinstance(
frame, ImageFrame), gate_close_fn=lambda frame: isinstance( frame, ImageRawFrame), gate_close_fn=lambda frame: isinstance(
frame, LLMResponseStartFrame), start_open=False, ) frame, LLMResponseStartFrame), start_open=False, )
frames = [ frames = [
LLMResponseStartFrame(), LLMResponseStartFrame(),
TextFrame("Hello, "), TextFrame("Hello, "),
TextFrame("world."), TextFrame("world."),
AudioFrame(b"hello"), AudioRawFrame(b"hello", 1, 1),
ImageFrame(b"image", (0, 0)), ImageRawFrame(b"image", (0, 0)),
AudioFrame(b"world"), AudioRawFrame(b"world", 1, 1),
LLMResponseEndFrame(), LLMResponseEndFrame(),
] ]
expected_output_frames = [ expected_output_frames = [
ImageFrame(b"image", (0, 0)), ImageRawFrame(b"image", (0, 0)),
LLMResponseStartFrame(), LLMResponseStartFrame(),
TextFrame("Hello, "), TextFrame("Hello, "),
TextFrame("world."), TextFrame("world."),
AudioFrame(b"hello"), AudioRawFrame(b"hello", 1, 1),
AudioFrame(b"world"), AudioRawFrame(b"world", 1, 1),
LLMResponseEndFrame(), LLMResponseEndFrame(),
] ]
for frame in frames: for frame in frames:

View File

@@ -3,7 +3,7 @@ import unittest
from typing import AsyncGenerator from typing import AsyncGenerator
from pipecat.services.ai_services import AIService from pipecat.services.ai_services import AIService
from pipecat.pipeline.frames import EndFrame, Frame, TextFrame from pipecat.frames.frames import EndFrame, Frame, TextFrame
class SimpleAIService(AIService): class SimpleAIService(AIService):

View File

@@ -2,9 +2,10 @@ import asyncio
import unittest import unittest
from unittest.mock import Mock from unittest.mock import Mock
from pipecat.pipeline.aggregators import SentenceAggregator, StatelessTextTransformer from pipecat.processors.text_transformer import StatelessTextTransformer
from pipecat.pipeline.frame_processor import FrameProcessor from pipecat.processors.aggregators.sentence import SentenceAggregator
from pipecat.pipeline.frames import EndFrame, TextFrame from pipecat.processors.frame_processor import FrameProcessor
from pipecat.frames.frames import EndFrame, TextFrame
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline

View File

@@ -1,6 +1,6 @@
import unittest import unittest
from pipecat.pipeline.frames import AudioFrame, TextFrame, TranscriptionFrame from pipecat.frames.frames import AudioFrame, TextFrame, TranscriptionFrame
from pipecat.serializers.protobuf_serializer import ProtobufFrameSerializer from pipecat.serializers.protobuf_serializer import ProtobufFrameSerializer

View File

@@ -2,7 +2,7 @@ import asyncio
import unittest import unittest
from unittest.mock import AsyncMock, patch, Mock from unittest.mock import AsyncMock, patch, Mock
from pipecat.pipeline.frames import AudioFrame, EndFrame, TextFrame, TTSEndFrame, TTSStartFrame from pipecat.frames.frames import AudioRawFrame, EndFrame, TextFrame, TTSStoppedFrame, TTSStartedFrame
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
from pipecat.transports.websocket_transport import WebSocketFrameProcessor, WebsocketTransport from pipecat.transports.websocket_transport import WebSocketFrameProcessor, WebsocketTransport
@@ -52,10 +52,10 @@ class TestWebSocketTransportService(unittest.IsolatedAsyncioTestCase):
processor = WebSocketFrameProcessor(audio_frame_size=4) processor = WebSocketFrameProcessor(audio_frame_size=4)
source_frames = [ source_frames = [
TTSStartFrame(), TTSStartedFrame(),
AudioFrame(b"1234"), AudioRawFrame(b"1234", 1, 1),
AudioFrame(b"5678"), AudioRawFrame(b"5678", 1, 1),
TTSEndFrame(), TTSStoppedFrame(),
TextFrame("hello world") TextFrame("hello world")
] ]
@@ -65,9 +65,9 @@ class TestWebSocketTransportService(unittest.IsolatedAsyncioTestCase):
frames.append(output_frame) frames.append(output_frame)
self.assertEqual(len(frames), 3) self.assertEqual(len(frames), 3)
self.assertIsInstance(frames[0], AudioFrame) self.assertIsInstance(frames[0], AudioRawFrame)
self.assertEqual(frames[0].data, b"1234") self.assertEqual(frames[0].data, b"1234")
self.assertIsInstance(frames[1], AudioFrame) self.assertIsInstance(frames[1], AudioRawFrame)
self.assertEqual(frames[1].data, b"5678") self.assertEqual(frames[1].data, b"5678")
self.assertIsInstance(frames[2], TextFrame) self.assertIsInstance(frames[2], TextFrame)
self.assertEqual(frames[2].text, "hello world") self.assertEqual(frames[2].text, "hello world")