revert-breaking-changes (#24)
Browse files- Revert "Single User Mode (#21)" (66487d614d5dfaa0ec19e01304cc65cc9c95a366)
Co-authored-by: m0wer <[email protected]>
seamless_server/app_pubsub.py
CHANGED
|
@@ -123,12 +123,12 @@ class ServerLock(TypedDict):
|
|
| 123 |
client_id: str
|
| 124 |
member_object: Member
|
| 125 |
|
| 126 |
-
|
| 127 |
|
| 128 |
if os.environ.get("LOCK_SERVER_COMPLETELY", "0") == "1":
|
| 129 |
logger.info("LOCK_SERVER_COMPLETELY is set. Server will be locked on startup.")
|
| 130 |
-
if
|
| 131 |
-
logger.info(f"
|
| 132 |
dummy_server_lock_member_object = Member(
|
| 133 |
client_id="seamless_user", session_id="dummy", name="Seamless User"
|
| 134 |
)
|
|
@@ -428,7 +428,6 @@ async def join_room(sid, client_id, room_id_from_client, config_dict):
|
|
| 428 |
}
|
| 429 |
logger.info(f"[event: join_room] {args}")
|
| 430 |
session_data = await get_session_data(sid)
|
| 431 |
-
|
| 432 |
logger.info(f"session_data: {session_data}")
|
| 433 |
|
| 434 |
room_id = room_id_from_client
|
|
@@ -460,13 +459,6 @@ async def join_room(sid, client_id, room_id_from_client, config_dict):
|
|
| 460 |
session_id=sid,
|
| 461 |
name=name,
|
| 462 |
)
|
| 463 |
-
allow_user = check_and_lock_single_user(client_id, member)
|
| 464 |
-
if not allow_user:
|
| 465 |
-
logger.error(
|
| 466 |
-
f"In SINGLE_USER mode we only allow one user at a time. Ignoring request to configure stream from client {client_id}."
|
| 467 |
-
)
|
| 468 |
-
return {"status": "error", "message": "max_users"}
|
| 469 |
-
|
| 470 |
logger.info(f"Created a new Member object: {member}")
|
| 471 |
logger.info(f"Adding {member} to room {room_id}")
|
| 472 |
room.members[client_id] = member
|
|
@@ -508,6 +500,15 @@ async def join_room(sid, client_id, room_id_from_client, config_dict):
|
|
| 508 |
speaker_id for speaker_id in room.speakers if speaker_id != client_id
|
| 509 |
]
|
| 510 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 511 |
# Only speakers should be able to lock the server
|
| 512 |
if config_dict.get("lockServerName") is not None and "speaker" in config_dict.get(
|
| 513 |
"roles", {}
|
|
@@ -558,21 +559,12 @@ async def join_room(sid, client_id, room_id_from_client, config_dict):
|
|
| 558 |
|
| 559 |
return {"roomsJoined": sio.rooms(sid), "roomID": room_id}
|
| 560 |
|
| 561 |
-
def
|
| 562 |
-
|
| 563 |
-
|
| 564 |
-
|
| 565 |
-
return
|
| 566 |
-
|
| 567 |
-
if server_lock is None:
|
| 568 |
-
server_lock = {
|
| 569 |
-
"name": "single_user",
|
| 570 |
-
"client_id": client_id,
|
| 571 |
-
"member_object": member,
|
| 572 |
-
}
|
| 573 |
-
return True
|
| 574 |
-
|
| 575 |
-
return server_lock["client_id"] == client_id
|
| 576 |
|
| 577 |
# TODO: Add code to prevent more than one speaker from connecting/streaming at a time
|
| 578 |
@sio.event
|
|
|
|
| 123 |
client_id: str
|
| 124 |
member_object: Member
|
| 125 |
|
| 126 |
+
MAX_SPEAKERS = os.environ.get("MAX_SPEAKERS")
|
| 127 |
|
| 128 |
if os.environ.get("LOCK_SERVER_COMPLETELY", "0") == "1":
|
| 129 |
logger.info("LOCK_SERVER_COMPLETELY is set. Server will be locked on startup.")
|
| 130 |
+
if MAX_SPEAKERS is not None and int(MAX_SPEAKERS):
|
| 131 |
+
logger.info(f"MAX_SPEAKERS is set to: {MAX_SPEAKERS}")
|
| 132 |
dummy_server_lock_member_object = Member(
|
| 133 |
client_id="seamless_user", session_id="dummy", name="Seamless User"
|
| 134 |
)
|
|
|
|
| 428 |
}
|
| 429 |
logger.info(f"[event: join_room] {args}")
|
| 430 |
session_data = await get_session_data(sid)
|
|
|
|
| 431 |
logger.info(f"session_data: {session_data}")
|
| 432 |
|
| 433 |
room_id = room_id_from_client
|
|
|
|
| 459 |
session_id=sid,
|
| 460 |
name=name,
|
| 461 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 462 |
logger.info(f"Created a new Member object: {member}")
|
| 463 |
logger.info(f"Adding {member} to room {room_id}")
|
| 464 |
room.members[client_id] = member
|
|
|
|
| 500 |
speaker_id for speaker_id in room.speakers if speaker_id != client_id
|
| 501 |
]
|
| 502 |
|
| 503 |
+
# If we currently own the server lock and are updating roles and we no longer have server lock specified, release it
|
| 504 |
+
if (
|
| 505 |
+
server_lock is not None
|
| 506 |
+
and server_lock["client_id"] == client_id
|
| 507 |
+
and config_dict.get("lockServerName") is None
|
| 508 |
+
):
|
| 509 |
+
logger.info(f"[join_room] Releasing server lock: {pformat(server_lock)}")
|
| 510 |
+
server_lock = None
|
| 511 |
+
|
| 512 |
# Only speakers should be able to lock the server
|
| 513 |
if config_dict.get("lockServerName") is not None and "speaker" in config_dict.get(
|
| 514 |
"roles", {}
|
|
|
|
| 559 |
|
| 560 |
return {"roomsJoined": sio.rooms(sid), "roomID": room_id}
|
| 561 |
|
| 562 |
+
def allow_speaker(room, client_id):
|
| 563 |
+
if MAX_SPEAKERS is not None and client_id in room.speakers:
|
| 564 |
+
room_statuses = {room_id: room.get_room_status_dict() for room_id, room in rooms.items()}
|
| 565 |
+
speakers = sum(room_status["activeTranscoders"] for room_status in room_statuses.values())
|
| 566 |
+
return speakers < int(MAX_SPEAKERS)
|
| 567 |
+
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 568 |
|
| 569 |
# TODO: Add code to prevent more than one speaker from connecting/streaming at a time
|
| 570 |
@sio.event
|
streaming-react-app/src/RoomConfig.tsx
CHANGED
|
@@ -27,14 +27,12 @@ type Props = {
|
|
| 27 |
serverState: ServerState | null;
|
| 28 |
onJoinRoomOrUpdateRoles?: () => void;
|
| 29 |
streamingStatus: StreamingStatus;
|
| 30 |
-
setHasMaxUsers: (hasMaxUsers: boolean) => void;
|
| 31 |
};
|
| 32 |
|
| 33 |
export default function RoomConfig({
|
| 34 |
roomState,
|
| 35 |
serverState,
|
| 36 |
onJoinRoomOrUpdateRoles,
|
| 37 |
-
setHasMaxUsers,
|
| 38 |
streamingStatus,
|
| 39 |
}: Props) {
|
| 40 |
const {socket, clientID} = useSocket();
|
|
@@ -92,13 +90,6 @@ export default function RoomConfig({
|
|
| 92 |
configObject,
|
| 93 |
(result) => {
|
| 94 |
console.log('join_room result:', result);
|
| 95 |
-
if (result.message === 'max_users') {
|
| 96 |
-
setHasMaxUsers(true);
|
| 97 |
-
setJoinInProgress(false);
|
| 98 |
-
return;
|
| 99 |
-
} else {
|
| 100 |
-
setHasMaxUsers(false);
|
| 101 |
-
}
|
| 102 |
if (createNewRoom) {
|
| 103 |
setRoomID(result.roomID);
|
| 104 |
}
|
|
|
|
| 27 |
serverState: ServerState | null;
|
| 28 |
onJoinRoomOrUpdateRoles?: () => void;
|
| 29 |
streamingStatus: StreamingStatus;
|
|
|
|
| 30 |
};
|
| 31 |
|
| 32 |
export default function RoomConfig({
|
| 33 |
roomState,
|
| 34 |
serverState,
|
| 35 |
onJoinRoomOrUpdateRoles,
|
|
|
|
| 36 |
streamingStatus,
|
| 37 |
}: Props) {
|
| 38 |
const {socket, clientID} = useSocket();
|
|
|
|
| 90 |
configObject,
|
| 91 |
(result) => {
|
| 92 |
console.log('join_room result:', result);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
if (createNewRoom) {
|
| 94 |
setRoomID(result.roomID);
|
| 95 |
}
|
streaming-react-app/src/SocketWrapper.tsx
CHANGED
|
@@ -13,7 +13,7 @@ import {getURLParams} from './URLParams';
|
|
| 13 |
const INITIAL_DISCONNECT_SCREEN_DELAY = 2000;
|
| 14 |
const SERVER_URL_DEFAULT = `${window.location.protocol === "https:" ? "wss" : "ws"
|
| 15 |
}://${window.location.host}`;
|
| 16 |
-
|
| 17 |
export default function SocketWrapper({children}) {
|
| 18 |
const [socket, setSocket] = useState<Socket | null>(null);
|
| 19 |
const [connected, setConnected] = useState<boolean | null>(null);
|
|
|
|
| 13 |
const INITIAL_DISCONNECT_SCREEN_DELAY = 2000;
|
| 14 |
const SERVER_URL_DEFAULT = `${window.location.protocol === "https:" ? "wss" : "ws"
|
| 15 |
}://${window.location.host}`;
|
| 16 |
+
|
| 17 |
export default function SocketWrapper({children}) {
|
| 18 |
const [socket, setSocket] = useState<Socket | null>(null);
|
| 19 |
const [connected, setConnected] = useState<boolean | null>(null);
|
streaming-react-app/src/StreamingInterface.tsx
CHANGED
|
@@ -152,7 +152,7 @@ export default function StreamingInterface() {
|
|
| 152 |
useState<StreamingStatus>('stopped');
|
| 153 |
|
| 154 |
const isStreamConfiguredRef = useRef<boolean>(false);
|
| 155 |
-
const [
|
| 156 |
|
| 157 |
const [outputMode, setOutputMode] = useState<SupportedOutputMode>('s2s&t');
|
| 158 |
const [inputSource, setInputSource] =
|
|
@@ -309,6 +309,7 @@ export default function StreamingInterface() {
|
|
| 309 |
console.log('[configureStreamAsync] sending config', config);
|
| 310 |
|
| 311 |
socket.emit('configure_stream', config, (statusObject) => {
|
|
|
|
| 312 |
if (statusObject.status === 'ok') {
|
| 313 |
isStreamConfiguredRef.current = true;
|
| 314 |
console.debug(
|
|
@@ -756,20 +757,20 @@ export default function StreamingInterface() {
|
|
| 756 |
<div className="header-container-sra">
|
| 757 |
<div>
|
| 758 |
<Typography variant="body2" sx={{color: '#65676B'}}>
|
| 759 |
-
Welcome! This space is limited to one
|
| 760 |
-
If using the live HF space, sharing room code to listeners on another
|
| 761 |
-
IP address may not work because it's running on different replicas.
|
| 762 |
Use headphones if you are both speaker and listener to prevent feedback.
|
| 763 |
<br/>
|
| 764 |
-
If max
|
| 765 |
-
In your duplicated space, join a room as speaker or listener (or both),
|
| 766 |
and share the room code to invite listeners.
|
| 767 |
<br/>
|
| 768 |
Check out the seamless_communication <a target="_blank" rel="noopener noreferrer" href="https://github.com/facebookresearch/seamless_communication/tree/main">README</a> for more information.
|
| 769 |
<br/>
|
| 770 |
SeamlessStreaming model is a research model and is not released
|
| 771 |
-
for production deployment. It is important to use a microphone with
|
| 772 |
-
noise cancellation (for e.g. a smartphone), otherwise you may see model hallucination on noises.
|
| 773 |
It works best if you pause every couple of sentences, or you may wish adjust the VAD threshold
|
| 774 |
in the model config. The real-time performance will degrade
|
| 775 |
if you try streaming multiple speakers at the same time.
|
|
@@ -782,7 +783,6 @@ export default function StreamingInterface() {
|
|
| 782 |
roomState={roomState}
|
| 783 |
serverState={serverState}
|
| 784 |
streamingStatus={streamingStatus}
|
| 785 |
-
setHasMaxUsers={setHasMaxUsers}
|
| 786 |
onJoinRoomOrUpdateRoles={() => {
|
| 787 |
// If the user has switched from speaker to listener we need to tell the
|
| 788 |
// player to play eagerly, since currently the listener doesn't have any stop/start controls
|
|
@@ -1120,6 +1120,13 @@ export default function StreamingInterface() {
|
|
| 1120 |
</Alert>
|
| 1121 |
</div>
|
| 1122 |
)}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1123 |
{serverState != null &&
|
| 1124 |
serverState.totalActiveTranscoders >=
|
| 1125 |
TOTAL_ACTIVE_TRANSCODER_WARNING_THRESHOLD && (
|
|
@@ -1149,13 +1156,6 @@ export default function StreamingInterface() {
|
|
| 1149 |
)}
|
| 1150 |
</div>
|
| 1151 |
|
| 1152 |
-
{hasMaxUsers && (
|
| 1153 |
-
<div>
|
| 1154 |
-
<Alert severity="error">
|
| 1155 |
-
{`Maximum number of users reached. Please try again at a later time.`}
|
| 1156 |
-
</Alert>
|
| 1157 |
-
</div>
|
| 1158 |
-
)}
|
| 1159 |
{debugParam && roomID != null && <DebugSection />}
|
| 1160 |
|
| 1161 |
<div className="translation-text-container-sra horizontal-padding-sra">
|
|
|
|
| 152 |
useState<StreamingStatus>('stopped');
|
| 153 |
|
| 154 |
const isStreamConfiguredRef = useRef<boolean>(false);
|
| 155 |
+
const [hasMaxSpeakers, setHasMaxSpeakers] = useState<boolean>(false);
|
| 156 |
|
| 157 |
const [outputMode, setOutputMode] = useState<SupportedOutputMode>('s2s&t');
|
| 158 |
const [inputSource, setInputSource] =
|
|
|
|
| 309 |
console.log('[configureStreamAsync] sending config', config);
|
| 310 |
|
| 311 |
socket.emit('configure_stream', config, (statusObject) => {
|
| 312 |
+
setHasMaxSpeakers(statusObject.message === 'max_speakers')
|
| 313 |
if (statusObject.status === 'ok') {
|
| 314 |
isStreamConfiguredRef.current = true;
|
| 315 |
console.debug(
|
|
|
|
| 757 |
<div className="header-container-sra">
|
| 758 |
<div>
|
| 759 |
<Typography variant="body2" sx={{color: '#65676B'}}>
|
| 760 |
+
Welcome! This space is limited to one speaker at a time.
|
| 761 |
+
If using the live HF space, sharing room code to listeners on another
|
| 762 |
+
IP address may not work because it's running on different replicas.
|
| 763 |
Use headphones if you are both speaker and listener to prevent feedback.
|
| 764 |
<br/>
|
| 765 |
+
If max speakers reached, please duplicate the space <a target="_blank" rel="noopener noreferrer" href="https://huggingface.co/spaces/facebook/seamless-streaming?duplicate=true">here</a>.
|
| 766 |
+
In your duplicated space, join a room as speaker or listener (or both),
|
| 767 |
and share the room code to invite listeners.
|
| 768 |
<br/>
|
| 769 |
Check out the seamless_communication <a target="_blank" rel="noopener noreferrer" href="https://github.com/facebookresearch/seamless_communication/tree/main">README</a> for more information.
|
| 770 |
<br/>
|
| 771 |
SeamlessStreaming model is a research model and is not released
|
| 772 |
+
for production deployment. It is important to use a microphone with
|
| 773 |
+
noise cancellation (for e.g. a smartphone), otherwise you may see model hallucination on noises.
|
| 774 |
It works best if you pause every couple of sentences, or you may wish adjust the VAD threshold
|
| 775 |
in the model config. The real-time performance will degrade
|
| 776 |
if you try streaming multiple speakers at the same time.
|
|
|
|
| 783 |
roomState={roomState}
|
| 784 |
serverState={serverState}
|
| 785 |
streamingStatus={streamingStatus}
|
|
|
|
| 786 |
onJoinRoomOrUpdateRoles={() => {
|
| 787 |
// If the user has switched from speaker to listener we need to tell the
|
| 788 |
// player to play eagerly, since currently the listener doesn't have any stop/start controls
|
|
|
|
| 1120 |
</Alert>
|
| 1121 |
</div>
|
| 1122 |
)}
|
| 1123 |
+
{serverState != null && hasMaxSpeakers && (
|
| 1124 |
+
<div>
|
| 1125 |
+
<Alert severity="error">
|
| 1126 |
+
{`Maximum number of speakers reached. Please try again at a later time.`}
|
| 1127 |
+
</Alert>
|
| 1128 |
+
</div>
|
| 1129 |
+
)}
|
| 1130 |
{serverState != null &&
|
| 1131 |
serverState.totalActiveTranscoders >=
|
| 1132 |
TOTAL_ACTIVE_TRANSCODER_WARNING_THRESHOLD && (
|
|
|
|
| 1156 |
)}
|
| 1157 |
</div>
|
| 1158 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1159 |
{debugParam && roomID != null && <DebugSection />}
|
| 1160 |
|
| 1161 |
<div className="translation-text-container-sra horizontal-padding-sra">
|