examples: use Cartesia TTS in most examples

This commit is contained in:
Aleix Conchillo Flaqué
2024-08-19 15:31:34 -07:00
parent 1d24f926ec
commit 1a662376fc
30 changed files with 124 additions and 169 deletions

View File

@@ -98,6 +98,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Other ### Other
- Most examples now use Cartesia.
- Added examples `foundational/19a-tools-anthropic.py`, - Added examples `foundational/19a-tools-anthropic.py`,
`foundational/19b-tools-video-anthropic.py` and `foundational/19b-tools-video-anthropic.py` and
`foundational/19a-tools-togetherai.py`. `foundational/19a-tools-togetherai.py`.

View File

@@ -9,11 +9,11 @@ import aiohttp
import os import os
import sys import sys
from pipecat.frames.frames import EndFrame, TextFrame from pipecat.frames.frames import TextFrame
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.task import PipelineTask from pipecat.pipeline.task import PipelineTask
from pipecat.pipeline.runner import PipelineRunner from pipecat.pipeline.runner import PipelineRunner
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from runner import configure from runner import configure
@@ -34,10 +34,9 @@ async def main():
transport = DailyTransport( transport = DailyTransport(
room_url, None, "Say One Thing", DailyParams(audio_out_enabled=True)) room_url, None, "Say One Thing", DailyParams(audio_out_enabled=True))
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
runner = PipelineRunner() runner = PipelineRunner()
@@ -49,7 +48,7 @@ async def main():
@transport.event_handler("on_participant_joined") @transport.event_handler("on_participant_joined")
async def on_new_participant_joined(transport, participant): async def on_new_participant_joined(transport, participant):
participant_name = participant["info"]["userName"] or '' participant_name = participant["info"]["userName"] or ''
await task.queue_frames([TextFrame(f"Hello there, {participant_name}!"), EndFrame()]) await task.queue_frame(TextFrame(f"Hello there, {participant_name}!"))
await runner.run(task) await runner.run(task)

View File

@@ -9,11 +9,11 @@ import aiohttp
import os import os
import sys import sys
from pipecat.frames.frames import EndFrame, TextFrame from pipecat.frames.frames import TextFrame
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.runner import PipelineRunner from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineTask from pipecat.pipeline.task import PipelineTask
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.transports.base_transport import TransportParams from pipecat.transports.base_transport import TransportParams
from pipecat.transports.local.audio import LocalAudioTransport from pipecat.transports.local.audio import LocalAudioTransport
@@ -30,10 +30,9 @@ async def main():
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session:
transport = LocalAudioTransport(TransportParams(audio_out_enabled=True)) transport = LocalAudioTransport(TransportParams(audio_out_enabled=True))
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
pipeline = Pipeline([tts, transport.output()]) pipeline = Pipeline([tts, transport.output()])
@@ -42,7 +41,7 @@ async def main():
async def say_something(): async def say_something():
await asyncio.sleep(1) await asyncio.sleep(1)
await task.queue_frames([TextFrame("Hello there!"), EndFrame()]) await task.queue_frame(TextFrame("Hello there!"))
runner = PipelineRunner() runner = PipelineRunner()

View File

@@ -9,11 +9,11 @@ import aiohttp
import os import os
import sys import sys
from pipecat.frames.frames import EndFrame, LLMMessagesFrame from pipecat.frames.frames import LLMMessagesFrame
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.runner import PipelineRunner from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineTask from pipecat.pipeline.task import PipelineTask
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
@@ -38,10 +38,9 @@ async def main():
"Say One Thing From an LLM", "Say One Thing From an LLM",
DailyParams(audio_out_enabled=True)) DailyParams(audio_out_enabled=True))
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
llm = OpenAILLMService( llm = OpenAILLMService(
@@ -60,7 +59,7 @@ async def main():
@transport.event_handler("on_first_participant_joined") @transport.event_handler("on_first_participant_joined")
async def on_first_participant_joined(transport, participant): async def on_first_participant_joined(transport, participant):
await task.queue_frames([LLMMessagesFrame(messages), EndFrame()]) await task.queue_frame(LLMMessagesFrame(messages))
await runner.run(task) await runner.run(task)

View File

@@ -56,7 +56,7 @@ async def main():
runner = PipelineRunner() runner = PipelineRunner()
async def run_tk(): async def run_tk():
while runner.is_active(): while not task.has_finished():
tk_root.update() tk_root.update()
tk_root.update_idletasks() tk_root.update_idletasks()
await asyncio.sleep(0.1) await asyncio.sleep(0.1)

View File

@@ -13,7 +13,6 @@ from dataclasses import dataclass
from pipecat.frames.frames import ( from pipecat.frames.frames import (
AppFrame, AppFrame,
EndFrame,
Frame, Frame,
ImageRawFrame, ImageRawFrame,
LLMFullResponseStartFrame, LLMFullResponseStartFrame,
@@ -152,8 +151,6 @@ async def main():
frames.append(MonthFrame(month=month)) frames.append(MonthFrame(month=month))
frames.append(LLMMessagesFrame(messages)) frames.append(LLMMessagesFrame(messages))
frames.append(EndFrame())
runner = PipelineRunner() runner = PipelineRunner()
task = PipelineTask(pipeline) task = PipelineTask(pipeline)

View File

@@ -137,14 +137,11 @@ async def main():
task = PipelineTask(pipeline) task = PipelineTask(pipeline)
# We only specify 5 months as we create tasks all at once and we might # We only specify a few months as we create tasks all at once and we
# get rate limited otherwise. # might get rate limited otherwise.
months: list[str] = [ months: list[str] = [
"January", "January",
"February", "February",
# "March",
# "April",
# "May",
] ]
# We create one task per month. This will be executed concurrently. # We create one task per month. This will be executed concurrently.

View File

@@ -18,8 +18,7 @@ from pipecat.processors.aggregators.llm_response import (
LLMUserResponseAggregator, LLMUserResponseAggregator,
) )
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
from pipecat.processors.logger import FrameLogger from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.elevenlabs import ElevenLabsTTSService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -59,10 +58,9 @@ async def main():
) )
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
llm = OpenAILLMService( llm = OpenAILLMService(

View File

@@ -15,7 +15,7 @@ from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.llm_response import ( from pipecat.processors.aggregators.llm_response import (
LLMAssistantResponseAggregator, LLMUserResponseAggregator) LLMAssistantResponseAggregator, LLMUserResponseAggregator)
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -47,10 +47,9 @@ async def main():
) )
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
llm = OpenAILLMService( llm = OpenAILLMService(

View File

@@ -15,7 +15,7 @@ from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.llm_response import ( from pipecat.processors.aggregators.llm_response import (
LLMAssistantResponseAggregator, LLMUserResponseAggregator) LLMAssistantResponseAggregator, LLMUserResponseAggregator)
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.anthropic import AnthropicLLMService from pipecat.services.anthropic import AnthropicLLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -47,10 +47,9 @@ async def main():
) )
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
llm = AnthropicLLMService( llm = AnthropicLLMService(

View File

@@ -17,6 +17,7 @@ from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.llm_response import ( from pipecat.processors.aggregators.llm_response import (
LLMAssistantResponseAggregator, LLMUserResponseAggregator) LLMAssistantResponseAggregator, LLMUserResponseAggregator)
from pipecat.processors.frameworks.langchain import LangchainProcessor from pipecat.processors.frameworks.langchain import LangchainProcessor
from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.elevenlabs import ElevenLabsTTSService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -63,10 +64,9 @@ async def main():
), ),
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
prompt = ChatPromptTemplate.from_messages( prompt = ChatPromptTemplate.from_messages(

View File

@@ -17,7 +17,7 @@ from pipecat.processors.aggregators.llm_response import (
LLMAssistantResponseAggregator, LLMAssistantResponseAggregator,
LLMUserResponseAggregator, LLMUserResponseAggregator,
) )
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.openpipe import OpenPipeLLMService from pipecat.services.openpipe import OpenPipeLLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -50,10 +50,9 @@ async def main():
) )
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
timestamp = int(time.time()) timestamp = int(time.time())

View File

@@ -15,10 +15,9 @@ from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.llm_response import ( from pipecat.processors.aggregators.llm_response import (
LLMAssistantResponseAggregator, LLMUserResponseAggregator) LLMAssistantResponseAggregator, LLMUserResponseAggregator)
from pipecat.services.deepgram import DeepgramSTTService, DeepgramTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.gladia import GladiaSTTService from pipecat.services.gladia import GladiaSTTService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.services.xtts import XTTSService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -53,10 +52,9 @@ async def main():
api_key=os.getenv("GLADIA_API_KEY"), api_key=os.getenv("GLADIA_API_KEY"),
) )
tts = DeepgramTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("DEEPGRAM_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice="aura-helios-en"
) )
llm = OpenAILLMService( llm = OpenAILLMService(

View File

@@ -15,7 +15,7 @@ from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.llm_response import ( from pipecat.processors.aggregators.llm_response import (
LLMAssistantResponseAggregator, LLMUserResponseAggregator) LLMAssistantResponseAggregator, LLMUserResponseAggregator)
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -47,10 +47,9 @@ async def main():
) )
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
llm = OpenAILLMService( llm = OpenAILLMService(

View File

@@ -16,7 +16,7 @@ from pipecat.pipeline.task import PipelineTask
from pipecat.processors.aggregators.user_response import UserResponseAggregator from pipecat.processors.aggregators.user_response import UserResponseAggregator
from pipecat.processors.aggregators.vision_image_frame import VisionImageFrameAggregator from pipecat.processors.aggregators.vision_image_frame import VisionImageFrameAggregator
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.moondream import MoondreamService from pipecat.services.moondream import MoondreamService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -65,12 +65,6 @@ async def main():
) )
) )
tts = ElevenLabsTTSService(
aiohttp_session=session,
api_key=os.getenv("ELEVENLABS_API_KEY"),
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
)
user_response = UserResponseAggregator() user_response = UserResponseAggregator()
image_requester = UserImageRequester() image_requester = UserImageRequester()
@@ -80,10 +74,9 @@ async def main():
# If you run into weird description, try with use_cpu=True # If you run into weird description, try with use_cpu=True
moondream = MoondreamService() moondream = MoondreamService()
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
@transport.event_handler("on_first_participant_joined") @transport.event_handler("on_first_participant_joined")

View File

@@ -16,7 +16,7 @@ from pipecat.pipeline.task import PipelineTask
from pipecat.processors.aggregators.user_response import UserResponseAggregator from pipecat.processors.aggregators.user_response import UserResponseAggregator
from pipecat.processors.aggregators.vision_image_frame import VisionImageFrameAggregator from pipecat.processors.aggregators.vision_image_frame import VisionImageFrameAggregator
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.google import GoogleLLMService from pipecat.services.google import GoogleLLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -76,10 +76,9 @@ async def main():
model="gemini-1.5-flash-latest", model="gemini-1.5-flash-latest",
api_key=os.getenv("GOOGLE_API_KEY")) api_key=os.getenv("GOOGLE_API_KEY"))
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
@transport.event_handler("on_first_participant_joined") @transport.event_handler("on_first_participant_joined")

View File

@@ -16,7 +16,7 @@ from pipecat.pipeline.task import PipelineTask
from pipecat.processors.aggregators.user_response import UserResponseAggregator from pipecat.processors.aggregators.user_response import UserResponseAggregator
from pipecat.processors.aggregators.vision_image_frame import VisionImageFrameAggregator from pipecat.processors.aggregators.vision_image_frame import VisionImageFrameAggregator
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -76,10 +76,9 @@ async def main():
model="gpt-4o" model="gpt-4o"
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
@transport.event_handler("on_first_participant_joined") @transport.event_handler("on_first_participant_joined")

View File

@@ -14,7 +14,7 @@ from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.runner import PipelineRunner from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineTask from pipecat.pipeline.task import PipelineTask
from pipecat.processors.logger import FrameLogger from pipecat.processors.logger import FrameLogger
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.openai import OpenAILLMContext, OpenAILLMService from pipecat.services.openai import OpenAILLMContext, OpenAILLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -56,10 +56,9 @@ async def main():
) )
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
llm = OpenAILLMService( llm = OpenAILLMService(

View File

@@ -16,7 +16,7 @@ from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.processors.filters.function_filter import FunctionFilter from pipecat.processors.filters.function_filter import FunctionFilter
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.services.whisper import Model, WhisperSTTService from pipecat.services.whisper import Model, WhisperSTTService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
@@ -70,17 +70,14 @@ async def main():
stt = WhisperSTTService(model=Model.LARGE) stt = WhisperSTTService(model=Model.LARGE)
english_tts = ElevenLabsTTSService( english_tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id="pNInz6obpgDQGcFmaJgB",
) )
spanish_tts = ElevenLabsTTSService( spanish_tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="846d6cb0-2301-48b6-9683-48f5618ea2f6", # Spanish-speaking Lady
model="eleven_multilingual_v2",
voice_id="9F4C8ztpNUmXkdDDbz3J",
) )
llm = OpenAILLMService( llm = OpenAILLMService(

View File

@@ -15,9 +15,8 @@ from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.llm_response import ( from pipecat.processors.aggregators.llm_response import (
LLMAssistantResponseAggregator, LLMUserResponseAggregator) LLMAssistantResponseAggregator, LLMUserResponseAggregator)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.processors.user_idle_processor import UserIdleProcessor from pipecat.processors.user_idle_processor import UserIdleProcessor
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -49,10 +48,9 @@ async def main():
) )
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
llm = OpenAILLMService( llm = OpenAILLMService(

View File

@@ -12,15 +12,12 @@ import sys
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.runner import PipelineRunner from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.services.cartesia import CartesiaTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.anthropic import AnthropicLLMService from pipecat.services.anthropic import AnthropicLLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from runner import configure from runner import configure
from loguru import logger from loguru import logger
@@ -56,7 +53,6 @@ async def main():
tts = CartesiaTTSService( tts = CartesiaTTSService(
api_key=os.getenv("CARTESIA_API_KEY"), api_key=os.getenv("CARTESIA_API_KEY"),
voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
sample_rate=16000,
) )
llm = AnthropicLLMService( llm = AnthropicLLMService(

View File

@@ -9,20 +9,15 @@ import aiohttp
import os import os
import sys import sys
from pipecat.frames.frames import LLMMessagesFrame
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.runner import PipelineRunner from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.services.cartesia import CartesiaTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.anthropic import AnthropicLLMService
from pipecat.services.anthropic import AnthropicLLMService, AnthropicUserContextAggregator, AnthropicAssistantContextAggregator
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
from runner import configure from runner import configure
from loguru import logger from loguru import logger
@@ -67,7 +62,6 @@ async def main():
tts = CartesiaTTSService( tts = CartesiaTTSService(
api_key=os.getenv("CARTESIA_API_KEY"), api_key=os.getenv("CARTESIA_API_KEY"),
voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
sample_rate=16000,
) )
llm = AnthropicLLMService( llm = AnthropicLLMService(

View File

@@ -14,16 +14,12 @@ from pipecat.frames.frames import LLMMessagesFrame
from pipecat.pipeline.pipeline import Pipeline from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.runner import PipelineRunner from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.services.cartesia import CartesiaTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.together import TogetherLLMService
from pipecat.services.together import TogetherLLMService, TogetherContextAggregatorPair
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
from runner import configure from runner import configure
from loguru import logger from loguru import logger
@@ -66,7 +62,6 @@ async def main():
tts = CartesiaTTSService( tts = CartesiaTTSService(
api_key=os.getenv("CARTESIA_API_KEY"), api_key=os.getenv("CARTESIA_API_KEY"),
voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
sample_rate=16000,
) )
llm = TogetherLLMService( llm = TogetherLLMService(

View File

@@ -31,7 +31,7 @@ from pipecat.processors.aggregators.llm_response import LLMUserResponseAggregato
from pipecat.processors.aggregators.sentence import SentenceAggregator from pipecat.processors.aggregators.sentence import SentenceAggregator
from pipecat.processors.aggregators.vision_image_frame import VisionImageFrameAggregator from pipecat.processors.aggregators.vision_image_frame import VisionImageFrameAggregator
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.moondream import MoondreamService from pipecat.services.moondream import MoondreamService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
@@ -153,10 +153,9 @@ async def main():
) )
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id="pNInz6obpgDQGcFmaJgB",
) )
llm = OpenAILLMService( llm = OpenAILLMService(

View File

@@ -16,7 +16,7 @@ from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.logger import FrameLogger from pipecat.processors.logger import FrameLogger
from pipecat.processors.frame_processor import FrameDirection from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.openai import OpenAILLMContext, OpenAILLMContextFrame, OpenAILLMService from pipecat.services.openai import OpenAILLMContext, OpenAILLMContextFrame, OpenAILLMService
from pipecat.transports.services.daily import DailyParams, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -263,21 +263,16 @@ async def main():
) )
) )
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
#
# English
#
voice_id="pNInz6obpgDQGcFmaJgB",
#
# Spanish
#
# model="eleven_multilingual_v2",
# voice_id="gD1IexrzCvsXPHUuT0s3",
) )
# tts = CartesiaTTSService(
# api_key=os.getenv("CARTESIA_API_KEY"),
# voice_id="846d6cb0-2301-48b6-9683-48f5618ea2f6", # Spanish-speaking Lady
# )
llm = OpenAILLMService( llm = OpenAILLMService(
api_key=os.getenv("OPENAI_API_KEY"), api_key=os.getenv("OPENAI_API_KEY"),
model="gpt-4o") model="gpt-4o")

View File

@@ -26,7 +26,7 @@ from pipecat.frames.frames import (
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
from pipecat.services.elevenlabs import ElevenLabsTTSService from pipecat.services.elevenlabs import ElevenLabsTTSService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.transports.services.daily import DailyParams, DailyTranscriptionSettings, DailyTransport from pipecat.transports.services.daily import DailyParams, DailyTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
from runner import configure from runner import configure

View File

@@ -10,9 +10,9 @@ from pipecat.processors.aggregators.llm_response import (
LLMAssistantResponseAggregator, LLMAssistantResponseAggregator,
LLMUserResponseAggregator LLMUserResponseAggregator
) )
from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.services.deepgram import DeepgramSTTService from pipecat.services.deepgram import DeepgramSTTService
from pipecat.services.elevenlabs import ElevenLabsTTSService
from pipecat.transports.network.fastapi_websocket import FastAPIWebsocketTransport, FastAPIWebsocketParams from pipecat.transports.network.fastapi_websocket import FastAPIWebsocketTransport, FastAPIWebsocketParams
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
from pipecat.serializers.twilio import TwilioFrameSerializer from pipecat.serializers.twilio import TwilioFrameSerializer
@@ -46,10 +46,9 @@ async def run_bot(websocket_client, stream_sid):
stt = DeepgramSTTService(api_key=os.getenv('DEEPGRAM_API_KEY')) stt = DeepgramSTTService(api_key=os.getenv('DEEPGRAM_API_KEY'))
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
messages = [ messages = [

View File

@@ -17,8 +17,8 @@ from pipecat.processors.aggregators.llm_response import (
LLMAssistantResponseAggregator, LLMAssistantResponseAggregator,
LLMUserResponseAggregator LLMUserResponseAggregator
) )
from pipecat.services.cartesia import CartesiaTTSService
from pipecat.services.deepgram import DeepgramSTTService from pipecat.services.deepgram import DeepgramSTTService
from pipecat.services.elevenlabs import ElevenLabsTTSService
from pipecat.services.openai import OpenAILLMService from pipecat.services.openai import OpenAILLMService
from pipecat.transports.network.websocket_server import WebsocketServerParams, WebsocketServerTransport from pipecat.transports.network.websocket_server import WebsocketServerParams, WebsocketServerTransport
from pipecat.vad.silero import SileroVADAnalyzer from pipecat.vad.silero import SileroVADAnalyzer
@@ -50,10 +50,9 @@ async def main():
stt = DeepgramSTTService(api_key=os.getenv("DEEPGRAM_API_KEY")) stt = DeepgramSTTService(api_key=os.getenv("DEEPGRAM_API_KEY"))
tts = ElevenLabsTTSService( tts = CartesiaTTSService(
aiohttp_session=session, api_key=os.getenv("CARTESIA_API_KEY"),
api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id="79a125e8-cd45-4c13-8a67-188112f4dd22", # British Lady
voice_id=os.getenv("ELEVENLABS_VOICE_ID"),
) )
messages = [ messages = [

View File

@@ -57,6 +57,7 @@ class ParallelTask(BasePipeline):
raise Exception(f"ParallelTask needs at least one argument") raise Exception(f"ParallelTask needs at least one argument")
self._sinks = [] self._sinks = []
self._sources = []
self._pipelines = [] self._pipelines = []
self._up_queue = asyncio.Queue() self._up_queue = asyncio.Queue()
@@ -70,10 +71,10 @@ class ParallelTask(BasePipeline):
# We add a source at the beginning of the pipeline and a sink at the end. # We add a source at the beginning of the pipeline and a sink at the end.
source = Source(self._up_queue) source = Source(self._up_queue)
sink = Sink(self._down_queue) sink = Sink(self._down_queue)
processors: List[FrameProcessor] = [source] + processors processors: List[FrameProcessor] = [source] + processors + [sink]
processors.append(sink)
# Keep track of sinks. We access the source through the pipeline. # Keep track of sources and sinks.
self._sources.append(source)
self._sinks.append(sink) self._sinks.append(sink)
# Create pipeline # Create pipeline
@@ -99,8 +100,8 @@ class ParallelTask(BasePipeline):
# If we get an upstream frame we process it in each sink. # If we get an upstream frame we process it in each sink.
await asyncio.gather(*[s.process_frame(frame, direction) for s in self._sinks]) await asyncio.gather(*[s.process_frame(frame, direction) for s in self._sinks])
elif direction == FrameDirection.DOWNSTREAM: elif direction == FrameDirection.DOWNSTREAM:
# If we get a downstream frame we process it in each source (using the pipeline). # If we get a downstream frame we process it in each source.
await asyncio.gather(*[p.process_frame(frame, direction) for p in self._pipelines]) await asyncio.gather(*[s.process_frame(frame, direction) for s in self._sources])
seen_ids = set() seen_ids = set()
while not self._up_queue.empty(): while not self._up_queue.empty():

View File

@@ -4,7 +4,7 @@
# SPDX-License-Identifier: BSD 2-Clause License # SPDX-License-Identifier: BSD 2-Clause License
# #
from typing import List from typing import List, Tuple
from pipecat.frames.frames import Frame, SystemFrame from pipecat.frames.frames import Frame, SystemFrame
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
@@ -40,12 +40,14 @@ class GatedAggregator(FrameProcessor):
Goodbye. Goodbye.
""" """
def __init__(self, gate_open_fn, gate_close_fn, start_open): def __init__(self, gate_open_fn, gate_close_fn, start_open,
direction: FrameDirection = FrameDirection.DOWNSTREAM):
super().__init__() super().__init__()
self._gate_open_fn = gate_open_fn self._gate_open_fn = gate_open_fn
self._gate_close_fn = gate_close_fn self._gate_close_fn = gate_close_fn
self._gate_open = start_open self._gate_open = start_open
self._accumulator: List[Frame] = [] self._direction = direction
self._accumulator: List[Tuple[Frame, FrameDirection]] = []
async def process_frame(self, frame: Frame, direction: FrameDirection): async def process_frame(self, frame: Frame, direction: FrameDirection):
await super().process_frame(frame, direction) await super().process_frame(frame, direction)
@@ -55,6 +57,11 @@ class GatedAggregator(FrameProcessor):
await self.push_frame(frame, direction) await self.push_frame(frame, direction)
return return
# Ignore frames that are not following the direction of this gate.
if direction != self._direction:
await self.push_frame(frame, direction)
return
old_state = self._gate_open old_state = self._gate_open
if self._gate_open: if self._gate_open:
self._gate_open = not self._gate_close_fn(frame) self._gate_open = not self._gate_close_fn(frame)
@@ -67,8 +74,8 @@ class GatedAggregator(FrameProcessor):
if self._gate_open: if self._gate_open:
await self.push_frame(frame, direction) await self.push_frame(frame, direction)
for frame in self._accumulator: for (f, d) in self._accumulator:
await self.push_frame(frame, direction) await self.push_frame(f, d)
self._accumulator = [] self._accumulator = []
else: else:
self._accumulator.append(frame) self._accumulator.append((frame, direction))