Created
March 13, 2025 21:18
-
-
Save kwindla/a6c2fccf4b3f8ec51bfc6c3987a9f6b8 to your computer and use it in GitHub Desktop.
Gemini Multimodal Live French tutor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import asyncio | |
import os | |
import sys | |
from dataclasses import dataclass | |
import aiohttp | |
from dotenv import load_dotenv | |
from loguru import logger | |
from pipecat.audio.vad.silero import SileroVADAnalyzer | |
from pipecat.frames.frames import LLMMessagesAppendFrame | |
from pipecat.pipeline.pipeline import Pipeline | |
from pipecat.pipeline.runner import PipelineRunner | |
from pipecat.pipeline.task import PipelineParams, PipelineTask | |
from pipecat.services.gemini_multimodal_live.gemini import GeminiMultimodalLiveLLMService | |
from pipecat.transports.services.daily import DailyParams, DailyTransport | |
load_dotenv(override=True) | |
logger.remove(0) | |
logger.add(sys.stderr, level="DEBUG") | |
conversation_system_message = """ | |
Vous êtes un professeur de langue patient. Votre élève est anglophone et souhaite apprendre le français. Votre élève s'exprimera en français et en anglais. Répondez en français à moins qu'on vous demande expressément de parler anglais. | |
""" | |
async def main(): | |
print("room", os.getenv("DAILY_ROOM_URL")) | |
print("token", os.getenv("DAILY_TOKEN")) | |
async with aiohttp.ClientSession() as session: | |
transport = DailyTransport( | |
os.getenv("DAILY_ROOM_URL"), | |
os.getenv("DAILY_TOKEN"), | |
"Respond bot", | |
DailyParams( | |
audio_out_enabled=True, | |
vad_enabled=True, | |
vad_analyzer=SileroVADAnalyzer(), | |
vad_audio_passthrough=True, | |
), | |
) | |
llm = GeminiMultimodalLiveLLMService( | |
api_key=os.getenv("GOOGLE_API_KEY"), | |
system_instruction=conversation_system_message, | |
) | |
pipeline = Pipeline( | |
[ | |
transport.input(), | |
llm, | |
transport.output(), | |
] | |
) | |
task = PipelineTask( | |
pipeline, | |
params=PipelineParams( | |
allow_interruptions=True, | |
enable_metrics=True, | |
enable_usage_metrics=True, | |
), | |
) | |
@transport.event_handler("on_first_participant_joined") | |
async def on_first_participant_joined(transport, participant): | |
# Kick off the conversation. | |
await task.queue_frames( | |
[ | |
LLMMessagesAppendFrame( | |
messages=[ | |
{ | |
"role": "user", | |
"content": "Saluez l'utilisateur.", | |
} | |
] | |
) | |
] | |
) | |
runner = PipelineRunner() | |
await runner.run(task) | |
if __name__ == "__main__": | |
asyncio.run(main()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment