|
import asyncio |
|
import logging |
|
import os |
|
from typing import Tuple |
|
|
|
logging.basicConfig(level=logging.DEBUG) |
|
|
|
import outspeed |
|
from outspeed.plugins.deepgram_stt import DeepgramSTT |
|
from outspeed.plugins.eleven_labs_tts import ElevenLabsTTS |
|
from outspeed.plugins.fireworks_llm import FireworksLLM |
|
from outspeed.plugins.token_aggregator import TokenAggregator |
|
from outspeed.streams import AudioStream, VideoStream, Stream, TextStream, VADStream |
|
from outspeed.plugins.silero_vad import SileroVAD |
|
|
|
SYSTEM_PROMPT = """ |
|
You are Disaster Live Helper, an intelligent assistant designed to provide real-time disaster relief guidance \ |
|
and support. Your primary functions include answering user inquiries about disaster situations, offering practical \ |
|
advice and instructions for emergency responses, and guiding users through specific safety protocols to ensure their \ |
|
well-being. Your goal is to help users navigate and respond effectively during disasters, enhancing their safety and \ |
|
the efficiency of rescue operations. |
|
|
|
Greeting by introducing yourself Frist. Keep the answer short and concise. |
|
""" |
|
|
|
@outspeed.App() |
|
class LiveRescue: |
|
async def setup(self): |
|
self.deepgram_node = DeepgramSTT() |
|
self.llm_node = FireworksLLM( |
|
system_prompt=SYSTEM_PROMPT, |
|
) |
|
self.token_aggregator_node = TokenAggregator() |
|
self.tts_node = ElevenLabsTTS() |
|
self.silero_vad_node = SileroVAD() |
|
|
|
@outspeed.streaming_endpoint() |
|
async def run( |
|
self, audio_input_stream: AudioStream, video_input_stream: VideoStream |
|
) -> Tuple[Stream, ...]: |
|
|
|
deepgram_stream: TextStream = self.deepgram_node.run(audio_input_stream) |
|
|
|
silero_vad_stream: VADStream = self.silero_vad_node.run( |
|
audio_input_stream.clone() |
|
) |
|
|
|
llm_token_stream: TextStream |
|
chat_history_stream: TextStream |
|
llm_token_stream, chat_history_stream = self.llm_node.run(deepgram_stream) |
|
|
|
token_aggregator_stream: TextStream = self.token_aggregator_node.run(llm_token_stream) |
|
tts_stream: AudioStream = self.tts_node.run(token_aggregator_stream) |
|
|
|
self.tts_node.set_interrupt_stream(silero_vad_stream.clone()) |
|
self.token_aggregator_node.set_interrupt_stream(silero_vad_stream.clone()) |
|
|
|
return tts_stream, chat_history_stream |
|
|
|
async def teardown(self): |
|
await self.deepgram_node.close() |
|
await self.llm_node.close() |
|
await self.token_aggregator_node.close() |
|
await self.tts_node.close() |
|
await self.silero_vad_node.close() |
|
|
|
|
|
if __name__ == "__main__": |
|
LiveRescue().start() |