I’m currently looking to track when a conversation happens between two or multiples users in space. And store back the conversation start time, end time, and the participants who were in.
I’ve tried different methods, but none seems to really respond to my use case.
1/ I’ve played with ‘playerEntersWhisper’. It was promising as it returns the two participants in the discussion (the player/the target).
Unfortunately, I realized later that the ‘bubble’/‘whisper’ event is quite specific and require the user to click ‘Start Bubble’ where I want to get informed when players enter in a discussion as they are closed together (so without creating a so-called bubble).
2/ I’ve played then with ‘playerSetsInConversation’. When two players start discussing, I receive two events, one for each participant, that their status change to ‘inConversation’.
So I was thinking first that I can derivate from this that those two are actually in conversation together. Unfortunately, it becomes messy and unpredictable when for example a third participant comes in or when two groups enter in two separate discussions.
I thought I would need to fetch the location of the users to validate that two users are actually discussing together. The problem that arises was if those users are in a ‘private space’, even if they are not side by side, they can have a discussion too - and I dont know how to track if a user is in a private space or not.
3/ I’ve played with “playerActivelySpeaks”. But all in all, I feel the same limitation that 2/, and also I received too much events here as it is triggered each time a user emit a sound in his/her mic.
Would be grateful if someone can steer me in the right discussion or maybe have an idea about a possible solution that I missed!
Looks like you have done a lot of rundown on this, which is basically the same place I am at with it. This is a rabbit hole I have had my eye on for a while, hoping something Gather side would make it simpler.
As I see it, there are 3 ‘types’ of conversations, so maybe we start there and define them so we have an understanding of use-case:
1-to-1 conversations: This is between 2 users, both speaking regularly(ish).
Many-to-Many conversations: This is a group meeting, where many people might speak, while many listen.
1-to-Many conversations: This is normally done via spotlight, and is usually intended to allow one user to speak to many, without expecting cross talk or discussion. This can also be termed Few-to-Many, as you can have multiple spotlights.
Alright, we have use cases. For each of these, however, there are different issues with tracking useful information. Let’s start with #3. We can easily track:
When/If a player is spotlighted
If they are actively speaking
What room they are in
Who else is in that room
Problems: How do you establish a conversation ‘start time’ and ‘end time’. Do you care about that? Or could you just look at the amount of time someone was spotlighted, and assume that whole time was intended to be a Few-to-Many conversation. Maybe you put some logic on it, like < 5 seconds of being spotlighted probably means someone accidentally stepped on the wrong tile.
And here we hit some snags that will trouble us throughout the other 2 use-cases: Conversation durations, and false positives. Not to mention private spaces.
Here is where I have hoped we might get some extra tools from Gather, though it is unlikely to be one of their priorities. Websocket API access to whether or not a player has an A/V connection to another player would solve “most” of the issues the 1-to-1 and Many-to-Many use-cases. By being able to say “Player A is connected to [Array of Players]” you would be able to establish “meetings” without having to track audio triggers.
Anyway, that is the hope. In absence of that, there is a lot of logic you can throw at who is where and how you classify a conversation. I have tinkered with a number of styles of data capture, but I have not really found anything that felt elegant.
Side note: Considering Gather really cares about conversations within spaces (it is a spatial A/V platform), I would be interested to hear what their internal metric is for that type of activity.
We did discover that ‘in conversation’ is actually when users have their video on. So if you have your video off and are talking to someone, you are not ‘in conversation’ (you can see this in the participants UI).
There is also playerSetsIsAlone which you can use to determine if someone is ‘connected’ to anyone else, although it doesn’t mean they are speaking. I believe this would also work for private spaces and spotlight. This doesn’t really help determining if 4 users are not alone (playerSetIsAlone == false), and speaking, if they in one conversation or two.
To my knowledge the only way to determine what private space someone is in, is to read the map definition (gather REST api) and work it out from their location.
As @Bill_Uncork-It says some Gather helper functions would be really useful. Specifically something like a list of users in a conversation (regardless of video) - so connected to each other and actively speaking would be very helpful.