summaryrefslogtreecommitdiff
path: root/indra/newview/llvoicevivox.cpp
diff options
context:
space:
mode:
authorCallum Prentice <callum@lindenlab.com>2021-04-20 15:52:00 -0700
committerCallum Prentice <callum@lindenlab.com>2021-04-20 15:52:00 -0700
commit6e7b0fc8823118127b3d182bbe13c43304f918b1 (patch)
treece22d8f912102a735191bc6961ca9ed194c724fc /indra/newview/llvoicevivox.cpp
parent167e45e309ebeaccb346b8ca05884b8e10bf05eb (diff)
SL-15072: First part of adding ability to disable the VIVOX auto VAD feature and set our own values via Debug Settings - hardcoded currently for testing but will be pulled from global settings eventually
Diffstat (limited to 'indra/newview/llvoicevivox.cpp')
-rw-r--r--indra/newview/llvoicevivox.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index a8d668420e..39d6868b5c 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -1883,6 +1883,13 @@ bool LLVivoxVoiceClient::runSession(const sessionStatePtr_t &session)
notifyParticipantObservers();
notifyVoiceFontObservers();
+ // disable the automatic VAD and explicitly set the VAD variables ourselves
+ // see SL-15072 for more details
+ unsigned int vad_hangover = 2001;
+ unsigned int vad_noise_floor = 577;
+ unsigned int vad_sensitivity = 44;
+ setupVADParams(vad_hangover, vad_noise_floor, vad_sensitivity);
+
LLSD timeoutEvent(LLSDMap("timeout", LLSD::Boolean(true)));
mIsInChannel = true;
@@ -3217,6 +3224,56 @@ void LLVivoxVoiceClient::sendLocalAudioUpdates()
}
}
+/**
+ * Because of the recurring voice cutout issues (SL-15072) we are going to try
+ * to disable the automatic VAD (Voice Activity Detection) and set the associated
+ * parameters directly. We will expose them via Debug Settings and that should
+ * let us iterate on a collection of values that work for us. Hopefully!
+ *
+ * From the VIVOX Docs:
+ *
+ * vad_hangover: The 'Hangover time' - the time (in milliseconds) that it takes
+ * for the VAD to switch back to silence from speech mode after the last speech
+ * frame has been detected.
+ *
+ * vad_noise_floor: The 'vad noise floor' - A dimensionless value between 0 and
+ * 20000 (default 576) that controls the maximum level at which the noise floor
+ * may be set at by the VAD's noise tracking. Too low of a value will make noise
+ * tracking ineffective (A value of 0 disables noise tracking and the VAD then
+ * relies purely on the sensitivity property). Too high of a value will make
+ * long speech classifiable as noise.
+ *
+ * vad_sensitivity: The 'vad sensitivity' - A dimensionless value between 0 and
+ * 100, indicating the 'sensitivity of the VAD'. Increasing this value corresponds
+ * to decreasing the sensitivity of the VAD (i.e. '0' is most sensitive,
+ * while 100 is 'least sensitive')
+ */
+void LLVivoxVoiceClient::setupVADParams(unsigned int vad_hangover,
+ unsigned int vad_noise_floor,
+ unsigned int vad_sensitivity)
+{
+ std::ostringstream stream;
+
+ // explicitly turn off the automatic VAD even though the
+ // default state is also disabled.
+ const unsigned int vad_auto_enabled = 0;
+
+ // Create a request to set the VAD parameters:
+ LL_INFOS("Voice") << "Disabling the automatic VAD and setting the parameters explicitly." << LL_ENDL;
+
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetVadProperties.1\">"
+ << "<VadAuto>" << vad_auto_enabled << "</VadAuto>"
+ << "<VadHangover>" << vad_hangover << "</VadHangover>"
+ << "<vad_noise_floor>" << vad_hangover << "</vad_noise_floor>"
+ << "<vad_sensitivity>" << vad_hangover << "</vad_sensitivity>"
+ << "</Request>\n\n\n";
+
+ if (!stream.str().empty())
+ {
+ writeString(stream.str());
+ }
+}
+
/////////////////////////////
// Response/Event handlers
@@ -7569,6 +7626,14 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
{
LLVivoxVoiceClient::getInstance()->accountGetTemplateFontsResponse(statusCode, statusString);
}
+ else if (!stricmp(actionCstr, "Aux.SetVadProperties.1"))
+ {
+ std::cout << "@@@----" << std::endl;
+ std::cout << " Response for Aux.SetVadProperties.1 was" << std::endl;
+ std::cout << " statusCode: " << statusCode << std::endl;
+ std::cout << " statusString: " << statusString << std::endl;
+ std::cout << "----@@@" << std::endl;
+ }
/*
else if (!stricmp(actionCstr, "Account.ChannelGetList.1"))
{