Fixing to respect the stop_secs.
This commit is contained in:
@@ -40,12 +40,11 @@ class BaseSmartTurn(ABC):
|
|||||||
self._params = params
|
self._params = params
|
||||||
# Configuration
|
# Configuration
|
||||||
self._sample_rate = 0
|
self._sample_rate = 0
|
||||||
self._chunk_size_ms = 0
|
|
||||||
self._stop_ms = self._params.stop_secs * 1000 # silence threshold in ms
|
self._stop_ms = self._params.stop_secs * 1000 # silence threshold in ms
|
||||||
# Inference state
|
# Inference state
|
||||||
self._audio_buffer = []
|
self._audio_buffer = []
|
||||||
self._speech_triggered = False
|
self._speech_triggered = False
|
||||||
self._silence_frames = 0
|
self._silence_ms = 0
|
||||||
self._speech_start_time = None
|
self._speech_start_time = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -55,13 +54,6 @@ class BaseSmartTurn(ABC):
|
|||||||
def set_sample_rate(self, sample_rate: int):
|
def set_sample_rate(self, sample_rate: int):
|
||||||
self._sample_rate = sample_rate
|
self._sample_rate = sample_rate
|
||||||
|
|
||||||
@property
|
|
||||||
def chunk_size_ms(self) -> int:
|
|
||||||
return self._chunk_size_ms
|
|
||||||
|
|
||||||
def set_chunk_size_ms(self, chunk_size_ms: int):
|
|
||||||
self._chunk_size_ms = chunk_size_ms
|
|
||||||
|
|
||||||
def append_audio(self, buffer: bytes, is_speech: bool) -> EndOfTurnState:
|
def append_audio(self, buffer: bytes, is_speech: bool) -> EndOfTurnState:
|
||||||
# Convert raw audio to float32 format and append to the buffer
|
# Convert raw audio to float32 format and append to the buffer
|
||||||
audio_int16 = np.frombuffer(buffer, dtype=np.int16)
|
audio_int16 = np.frombuffer(buffer, dtype=np.int16)
|
||||||
@@ -72,18 +64,19 @@ class BaseSmartTurn(ABC):
|
|||||||
|
|
||||||
if is_speech:
|
if is_speech:
|
||||||
# Reset silence tracking on speech
|
# Reset silence tracking on speech
|
||||||
self._silence_frames = 0
|
self._silence_ms = 0
|
||||||
self._speech_triggered = True
|
self._speech_triggered = True
|
||||||
if self._speech_start_time is None:
|
if self._speech_start_time is None:
|
||||||
self._speech_start_time = time.time()
|
self._speech_start_time = time.time()
|
||||||
logger.debug(f"Speech started at {self._speech_start_time}")
|
logger.debug(f"Speech started at {self._speech_start_time}")
|
||||||
else:
|
else:
|
||||||
if self._speech_triggered:
|
if self._speech_triggered:
|
||||||
self._silence_frames += 1
|
chunk_duration_ms = len(audio_int16) / (self._sample_rate / 1000)
|
||||||
|
self._silence_ms += chunk_duration_ms
|
||||||
# If silence exceeds threshold, mark end of turn
|
# If silence exceeds threshold, mark end of turn
|
||||||
if self._silence_frames * self._chunk_size_ms >= self._stop_ms:
|
if self._silence_ms >= self._stop_ms:
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"End of Turn complete due to stop_secs. Silence: {self._silence_frames}, chunk_size_ms: {self._chunk_size_ms}"
|
f"End of Turn complete due to stop_secs. Silence in ms: {self._silence_ms}"
|
||||||
)
|
)
|
||||||
state = EndOfTurnState.COMPLETE
|
state = EndOfTurnState.COMPLETE
|
||||||
self._clear()
|
self._clear()
|
||||||
@@ -115,7 +108,7 @@ class BaseSmartTurn(ABC):
|
|||||||
self._speech_triggered = False
|
self._speech_triggered = False
|
||||||
self._audio_buffer = []
|
self._audio_buffer = []
|
||||||
self._speech_start_time = None
|
self._speech_start_time = None
|
||||||
self._silence_frames = 0
|
self._silence_ms = 0
|
||||||
|
|
||||||
def _process_speech_segment(self, audio_buffer) -> EndOfTurnState:
|
def _process_speech_segment(self, audio_buffer) -> EndOfTurnState:
|
||||||
state = EndOfTurnState.INCOMPLETE
|
state = EndOfTurnState.INCOMPLETE
|
||||||
|
|||||||
@@ -79,9 +79,6 @@ class BaseInputTransport(FrameProcessor):
|
|||||||
# Configure End of turn analyzer.
|
# Configure End of turn analyzer.
|
||||||
if self._params.end_of_turn_analyzer:
|
if self._params.end_of_turn_analyzer:
|
||||||
self._params.end_of_turn_analyzer.set_sample_rate(self._sample_rate)
|
self._params.end_of_turn_analyzer.set_sample_rate(self._sample_rate)
|
||||||
self._params.end_of_turn_analyzer.set_chunk_size_ms(
|
|
||||||
self._params.audio_out_10ms_chunks * 10
|
|
||||||
)
|
|
||||||
# Start audio filter.
|
# Start audio filter.
|
||||||
if self._params.audio_in_filter:
|
if self._params.audio_in_filter:
|
||||||
await self._params.audio_in_filter.start(self._sample_rate)
|
await self._params.audio_in_filter.start(self._sample_rate)
|
||||||
|
|||||||
Reference in New Issue
Block a user