server: implement status update in model and websocket

This commit is contained in:
Mathieu Virbel
2023-08-09 11:21:48 +02:00
parent 7f807c8f5f
commit a9e0c9aa03
4 changed files with 52 additions and 9 deletions

View File

@@ -52,10 +52,15 @@ class RtcOffer(BaseModel):
type: str
class StrValue(BaseModel):
value: str
class PipelineEvent(StrEnum):
TRANSCRIPT = "TRANSCRIPT"
TOPIC = "TOPIC"
FINAL_SUMMARY = "FINAL_SUMMARY"
STATUS = "STATUS"
async def rtc_offer_base(
@@ -70,6 +75,17 @@ async def rtc_offer_base(
ctx = TranscriptionContext(logger=logger.bind(client=clientid))
ctx.topics = []
async def update_status(status: str):
changed = ctx.status != status
if changed:
ctx.status = status
if event_callback:
await event_callback(
event=PipelineEvent.STATUS,
args=event_callback_args,
data=StrValue(value=status),
)
# build pipeline callback
async def on_transcript(transcript: Transcript):
ctx.logger.info("Transcript", transcript=transcript)
@@ -148,10 +164,12 @@ async def rtc_offer_base(
pc = RTCPeerConnection()
async def flush_pipeline_and_quit(close=True):
await update_status("processing")
await ctx.pipeline.flush()
if close:
ctx.logger.debug("Closing peer connection")
await pc.close()
await update_status("ended")
@pc.on("datachannel")
def on_datachannel(channel):
@@ -181,6 +199,7 @@ async def rtc_offer_base(
def on_track(track):
ctx.logger.info(f"Track {track.kind} received")
pc.addTrack(AudioStreamTrack(ctx, track))
asyncio.get_event_loop().create_task(update_status("recording"))
await pc.setRemoteDescription(offer)

View File

@@ -280,6 +280,9 @@ async def handle_rtc_event(event: PipelineEvent, args, data):
resp = transcript.add_event(event=event, data=final_summary)
transcript.summary = final_summary
elif event == PipelineEvent.STATUS:
resp = transcript.add_event(event=event, data=data)
else:
logger.warning(f"Unknown event: {event}")
return