|
67 | 67 | TTSStartedFrame, |
68 | 68 | TTSStoppedFrame, |
69 | 69 | TTSTextFrame, |
| 70 | + UserMuteStartedFrame, |
| 71 | + UserMuteStoppedFrame, |
70 | 72 | UserStartedSpeakingFrame, |
71 | 73 | UserStoppedSpeakingFrame, |
72 | 74 | ) |
@@ -891,6 +893,20 @@ class RTVIUserStoppedSpeakingMessage(BaseModel): |
891 | 893 | type: Literal["user-stopped-speaking"] = "user-stopped-speaking" |
892 | 894 |
|
893 | 895 |
|
| 896 | +class RTVIUserMuteStartedMessage(BaseModel): |
| 897 | + """Message indicating user has been muted.""" |
| 898 | + |
| 899 | + label: RTVIMessageLiteral = RTVI_MESSAGE_LABEL |
| 900 | + type: Literal["user-mute-started"] = "user-mute-started" |
| 901 | + |
| 902 | + |
| 903 | +class RTVIUserMuteStoppedMessage(BaseModel): |
| 904 | + """Message indicating user has been unmuted.""" |
| 905 | + |
| 906 | + label: RTVIMessageLiteral = RTVI_MESSAGE_LABEL |
| 907 | + type: Literal["user-mute-stopped"] = "user-mute-stopped" |
| 908 | + |
| 909 | + |
894 | 910 | class RTVIBotStartedSpeakingMessage(BaseModel): |
895 | 911 | """Message indicating bot has started speaking.""" |
896 | 912 |
|
@@ -1043,6 +1059,7 @@ class RTVIObserverParams: |
1043 | 1059 | bot_audio_level_enabled: bool = False |
1044 | 1060 | user_llm_enabled: bool = True |
1045 | 1061 | user_speaking_enabled: bool = True |
| 1062 | + user_mute_enabled: bool = True |
1046 | 1063 | user_transcription_enabled: bool = True |
1047 | 1064 | user_audio_level_enabled: bool = False |
1048 | 1065 | metrics_enabled: bool = True |
@@ -1218,6 +1235,11 @@ async def on_push_frame(self, data: FramePushed): |
1218 | 1235 | and self._params.user_speaking_enabled |
1219 | 1236 | ): |
1220 | 1237 | await self._handle_interruptions(frame) |
| 1238 | + elif ( |
| 1239 | + isinstance(frame, (UserMuteStartedFrame, UserMuteStoppedFrame)) |
| 1240 | + and self._params.user_mute_enabled |
| 1241 | + ): |
| 1242 | + await self._handle_user_mute(frame) |
1221 | 1243 | elif ( |
1222 | 1244 | isinstance(frame, (BotStartedSpeakingFrame, BotStoppedSpeakingFrame)) |
1223 | 1245 | and self._params.bot_speaking_enabled |
@@ -1349,6 +1371,17 @@ async def _handle_interruptions(self, frame: Frame): |
1349 | 1371 | if message: |
1350 | 1372 | await self.send_rtvi_message(message) |
1351 | 1373 |
|
| 1374 | + async def _handle_user_mute(self, frame: Frame): |
| 1375 | + """Handle user mute/unmute frames.""" |
| 1376 | + message = None |
| 1377 | + if isinstance(frame, UserMuteStartedFrame): |
| 1378 | + message = RTVIUserMuteStartedMessage() |
| 1379 | + elif isinstance(frame, UserMuteStoppedFrame): |
| 1380 | + message = RTVIUserMuteStoppedMessage() |
| 1381 | + |
| 1382 | + if message: |
| 1383 | + await self.send_rtvi_message(message) |
| 1384 | + |
1352 | 1385 | async def _handle_bot_speaking(self, frame: Frame): |
1353 | 1386 | """Handle bot speaking event frames.""" |
1354 | 1387 | message = None |
|
0 commit comments