92 lines
2.8 KiB
Python
92 lines
2.8 KiB
Python
#
|
||
# Copyright (c) 2024–2025, Daily
|
||
#
|
||
# SPDX-License-Identifier: BSD 2-Clause License
|
||
#
|
||
|
||
import argparse
|
||
import os
|
||
|
||
from dotenv import load_dotenv
|
||
from loguru import logger
|
||
|
||
from pipecat.frames.frames import Frame, TranscriptionFrame, TranslationFrame
|
||
from pipecat.pipeline.pipeline import Pipeline
|
||
from pipecat.pipeline.runner import PipelineRunner
|
||
from pipecat.pipeline.task import PipelineTask
|
||
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
|
||
from pipecat.services.gladia.config import (
|
||
GladiaInputParams,
|
||
LanguageConfig,
|
||
RealtimeProcessingConfig,
|
||
TranslationConfig,
|
||
)
|
||
from pipecat.services.gladia.stt import GladiaSTTService
|
||
from pipecat.transcriptions.language import Language
|
||
from pipecat.transports.base_transport import TransportParams
|
||
from pipecat.transports.network.small_webrtc import SmallWebRTCTransport
|
||
from pipecat.transports.network.webrtc_connection import SmallWebRTCConnection
|
||
|
||
load_dotenv(override=True)
|
||
|
||
|
||
class TranscriptionLogger(FrameProcessor):
|
||
async def process_frame(self, frame: Frame, direction: FrameDirection):
|
||
await super().process_frame(frame, direction)
|
||
|
||
if isinstance(frame, TranscriptionFrame):
|
||
print(f"Transcription ({frame.language}): {frame.text}")
|
||
elif isinstance(frame, TranslationFrame):
|
||
print(f"Translation ({frame.language}): {frame.text}")
|
||
|
||
|
||
async def run_bot(webrtc_connection: SmallWebRTCConnection, _: argparse.Namespace):
|
||
logger.info(f"Starting bot")
|
||
|
||
transport = SmallWebRTCTransport(
|
||
webrtc_connection=webrtc_connection,
|
||
params=TransportParams(audio_in_enabled=True),
|
||
)
|
||
|
||
stt = GladiaSTTService(
|
||
api_key=os.getenv("GLADIA_API_KEY"),
|
||
params=GladiaInputParams(
|
||
language_config=LanguageConfig(
|
||
languages=[Language.EN], # Input in English
|
||
code_switching=False,
|
||
),
|
||
realtime_processing=RealtimeProcessingConfig(
|
||
translation=True, # Enable translation
|
||
translation_config=TranslationConfig(
|
||
target_languages=[Language.ES], # Translate to Spanish
|
||
model="enhanced", # Use the enhanced translation model
|
||
),
|
||
),
|
||
),
|
||
)
|
||
|
||
tl = TranscriptionLogger()
|
||
|
||
pipeline = Pipeline([transport.input(), stt, tl])
|
||
|
||
task = PipelineTask(pipeline)
|
||
|
||
@transport.event_handler("on_client_disconnected")
|
||
async def on_client_disconnected(transport, client):
|
||
logger.info(f"Client disconnected")
|
||
|
||
@transport.event_handler("on_client_closed")
|
||
async def on_client_closed(transport, client):
|
||
logger.info(f"Client closed connection")
|
||
await task.cancel()
|
||
|
||
runner = PipelineRunner(handle_sigint=False)
|
||
|
||
await runner.run(task)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
from run import main
|
||
|
||
main()
|