Compare commits
3 Commits
hush/realt
...
cb/test-cl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ff1b2961d8 | ||
|
|
ba42cffcc2 | ||
|
|
9778d86607 |
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
@@ -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")
|
||||||
Reference in New Issue
Block a user