vad: use exponential smoothing to avoid sudden changes
This commit is contained in:
@@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
- Added `VADParams` so you can control voice confidence level and others.
|
- Added `VADParams` so you can control voice confidence level and others.
|
||||||
|
|
||||||
|
- `VADAnalyzer` now uses an exponential smoothing to avoid sudden changes.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Fixed issues with Ctrl-C program termination.
|
- Fixed issues with Ctrl-C program termination.
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ from dotenv import load_dotenv
|
|||||||
load_dotenv(override=True)
|
load_dotenv(override=True)
|
||||||
|
|
||||||
logger.remove(0)
|
logger.remove(0)
|
||||||
logger.add(sys.stderr, level="TRACE")
|
logger.add(sys.stderr, level="DEBUG")
|
||||||
|
|
||||||
|
|
||||||
async def main(room_url: str, token):
|
async def main(room_url: str, token):
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class VADState(Enum):
|
|||||||
|
|
||||||
|
|
||||||
class VADParams(BaseModel):
|
class VADParams(BaseModel):
|
||||||
confidence: float = 0.8
|
confidence: float = 0.6
|
||||||
start_secs: float = 0.2
|
start_secs: float = 0.2
|
||||||
stop_secs: float = 0.8
|
stop_secs: float = 0.8
|
||||||
|
|
||||||
@@ -43,6 +43,10 @@ class VADAnalyzer:
|
|||||||
|
|
||||||
self._vad_buffer = b""
|
self._vad_buffer = b""
|
||||||
|
|
||||||
|
# Exponential smoothing
|
||||||
|
self._smoothing_factor = 0.6
|
||||||
|
self._prev_confidence = 1 - self._smoothing_factor
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def sample_rate(self):
|
def sample_rate(self):
|
||||||
return self._sample_rate
|
return self._sample_rate
|
||||||
@@ -55,6 +59,11 @@ class VADAnalyzer:
|
|||||||
def voice_confidence(self, buffer) -> float:
|
def voice_confidence(self, buffer) -> float:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def _smoothed_confidence(self, audio_frames, prev_confidence, factor):
|
||||||
|
confidence = self.voice_confidence(audio_frames)
|
||||||
|
smoothed = exp_smoothing(confidence, prev_confidence, factor)
|
||||||
|
return smoothed
|
||||||
|
|
||||||
def analyze_audio(self, buffer) -> VADState:
|
def analyze_audio(self, buffer) -> VADState:
|
||||||
self._vad_buffer += buffer
|
self._vad_buffer += buffer
|
||||||
|
|
||||||
@@ -65,7 +74,10 @@ class VADAnalyzer:
|
|||||||
audio_frames = self._vad_buffer[:num_required_bytes]
|
audio_frames = self._vad_buffer[:num_required_bytes]
|
||||||
self._vad_buffer = self._vad_buffer[num_required_bytes:]
|
self._vad_buffer = self._vad_buffer[num_required_bytes:]
|
||||||
|
|
||||||
confidence = self.voice_confidence(audio_frames)
|
confidence = self._smoothed_confidence(
|
||||||
|
audio_frames, self._prev_confidence, self._smoothing_factor)
|
||||||
|
self._prev_confidence = confidence
|
||||||
|
|
||||||
speaking = confidence >= self._params.confidence
|
speaking = confidence >= self._params.confidence
|
||||||
|
|
||||||
if speaking:
|
if speaking:
|
||||||
|
|||||||
Reference in New Issue
Block a user