diff --git a/examples/foundational/07u-interruptible-ultravox.py b/examples/foundational/07u-interruptible-ultravox.py new file mode 100644 index 000000000..195eaf197 --- /dev/null +++ b/examples/foundational/07u-interruptible-ultravox.py @@ -0,0 +1,93 @@ +# +# Copyright (c) 2024–2025, Daily +# +# SPDX-License-Identifier: BSD 2-Clause License +# + +import asyncio +import os +import sys + +import aiohttp +from dotenv import load_dotenv +from loguru import logger +from runner import configure + +from pipecat.audio.vad.silero import SileroVADAnalyzer +from pipecat.pipeline.pipeline import Pipeline +from pipecat.pipeline.runner import PipelineRunner +from pipecat.pipeline.task import PipelineParams, PipelineTask +from pipecat.transports.services.daily import DailyParams, DailyTransport +from pipecat.services.ultravox import UltravoxSTTService +from pipecat.services.cartesia import CartesiaTTSService + +load_dotenv(override=True) + +# NOTE: This example requires GPU resources to run efficiently. +# The Ultravox model is compute-intensive and performs best with GPU acceleration. +# This can be deployed on cloud GPU providers like Cerebrium.ai for optimal performance. + +logger.remove(0) +logger.add(sys.stderr, level="DEBUG") + +#Want to initialize the ultravox processor since it takes time to load the model and dont +#want to load it every time the pipeline is run +ultravox_processor = UltravoxSTTService( + model_size="fixie-ai/ultravox-v0_4_1-llama-3_1-8b", + hf_token=os.getenv("HF_TOKEN"), +) + +async def main(): + async with aiohttp.ClientSession() as session: + (room_url, token) = await configure(session) + + transport = DailyTransport( + room_url, + token, + "Respond bot", + DailyParams( + audio_out_enabled=True, + transcription_enabled=False, + vad_enabled=True, + vad_analyzer=SileroVADAnalyzer(params=VADParams(stop_secs=0.2)), + vad_audio_passthrough=True, + ), + ) + + tts = CartesiaTTSService( + api_key=os.environ.get("CARTESIA_API_KEY"), + voice_id='97f4b8fb-f2fe-444b-bb9a-c109783a857a', + + ) + + + pipeline = Pipeline( + [ + transport.input(), # Transport user input + ultravox_processor, + tts, # TTS + transport.output(), # Transport bot output + ] + ) + + task = PipelineTask( + pipeline, + params=PipelineParams( + allow_interruptions=True, + enable_metrics=True, + ), + ) + + @transport.event_handler("on_participant_left") + async def on_participant_left(transport, participant, reason): + await task.cancel() + + runner = PipelineRunner() + + await runner.run(task) + + +if __name__ == "__main__": + asyncio.run(main()) + +