Minor code cleanup
This commit is contained in:
@@ -1,13 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (c) 2024–2025, Daily
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD 2-Clause License
|
|
||||||
#
|
|
||||||
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from pipecat.services import DeprecatedModuleProxy
|
|
||||||
|
|
||||||
from .stt import *
|
|
||||||
|
|
||||||
sys.modules[__name__] = DeprecatedModuleProxy(globals(), "soniox", "soniox.stt")
|
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ class SonioxSTTService(STTService):
|
|||||||
api_key: str,
|
api_key: str,
|
||||||
url: str = "wss://stt-rt.soniox.com/transcribe-websocket",
|
url: str = "wss://stt-rt.soniox.com/transcribe-websocket",
|
||||||
sample_rate: Optional[int] = None,
|
sample_rate: Optional[int] = None,
|
||||||
params: SonioxInputParams = SonioxInputParams(),
|
params: Optional[SonioxInputParams] = None,
|
||||||
enable_vad: bool = True,
|
enable_vad: bool = True,
|
||||||
auto_finalize_delay_ms: Optional[int] = 3000,
|
auto_finalize_delay_ms: Optional[int] = 3000,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
@@ -98,6 +98,7 @@ class SonioxSTTService(STTService):
|
|||||||
api_key: Soniox API key.
|
api_key: Soniox API key.
|
||||||
url: Soniox WebSocket API URL.
|
url: Soniox WebSocket API URL.
|
||||||
model: Transcription model to use.
|
model: Transcription model to use.
|
||||||
|
sample_rate: Audio sample rate. If None, uses value from `params`.
|
||||||
params: Additional configuration parameters, such as language hints, context and
|
params: Additional configuration parameters, such as language hints, context and
|
||||||
speaker diarization.
|
speaker diarization.
|
||||||
enable_vad: Listen to `UserStoppedSpeakingFrame` to send finalize message to Soniox.
|
enable_vad: Listen to `UserStoppedSpeakingFrame` to send finalize message to Soniox.
|
||||||
@@ -109,6 +110,7 @@ class SonioxSTTService(STTService):
|
|||||||
"""
|
"""
|
||||||
sample_rate = sample_rate or (params.sample_rate if params.sample_rate else None)
|
sample_rate = sample_rate or (params.sample_rate if params.sample_rate else None)
|
||||||
super().__init__(sample_rate=sample_rate, **kwargs)
|
super().__init__(sample_rate=sample_rate, **kwargs)
|
||||||
|
params = params or SonioxInputParams()
|
||||||
|
|
||||||
self._api_key = api_key
|
self._api_key = api_key
|
||||||
self._url = url
|
self._url = url
|
||||||
@@ -123,7 +125,6 @@ class SonioxSTTService(STTService):
|
|||||||
|
|
||||||
self._receive_task = None
|
self._receive_task = None
|
||||||
self._keepalive_task = None
|
self._keepalive_task = None
|
||||||
self._finalize_if_no_tokens_task = None
|
|
||||||
|
|
||||||
async def start(self, frame: StartFrame):
|
async def start(self, frame: StartFrame):
|
||||||
"""Start the Soniox STT websocket connection."""
|
"""Start the Soniox STT websocket connection."""
|
||||||
@@ -158,14 +159,6 @@ class SonioxSTTService(STTService):
|
|||||||
self._receive_task = self.create_task(self._receive_task_handler())
|
self._receive_task = self.create_task(self._receive_task_handler())
|
||||||
if self._websocket and not self._keepalive_task:
|
if self._websocket and not self._keepalive_task:
|
||||||
self._keepalive_task = self.create_task(self._keepalive_task_handler())
|
self._keepalive_task = self.create_task(self._keepalive_task_handler())
|
||||||
if (
|
|
||||||
self._websocket
|
|
||||||
and not self._finalize_if_no_tokens_task
|
|
||||||
and self._auto_finalize_delay_ms is not None
|
|
||||||
):
|
|
||||||
self._finalize_if_no_tokens_task = self.create_task(
|
|
||||||
self._finalize_if_no_tokens_task_handler()
|
|
||||||
)
|
|
||||||
|
|
||||||
async def _cleanup(self):
|
async def _cleanup(self):
|
||||||
if self._keepalive_task:
|
if self._keepalive_task:
|
||||||
@@ -176,10 +169,6 @@ class SonioxSTTService(STTService):
|
|||||||
await self._websocket.close()
|
await self._websocket.close()
|
||||||
self._websocket = None
|
self._websocket = None
|
||||||
|
|
||||||
if self._finalize_if_no_tokens_task:
|
|
||||||
await self.cancel_task(self._finalize_if_no_tokens_task)
|
|
||||||
self._finalize_if_no_tokens_task = None
|
|
||||||
|
|
||||||
if self._receive_task:
|
if self._receive_task:
|
||||||
# Task cannot cancel itself. If task called _cleanup() we expect it to cancel itself.
|
# Task cannot cancel itself. If task called _cleanup() we expect it to cancel itself.
|
||||||
if self._receive_task != asyncio.current_task():
|
if self._receive_task != asyncio.current_task():
|
||||||
@@ -260,7 +249,7 @@ class SonioxSTTService(STTService):
|
|||||||
await self.push_frame(
|
await self.push_frame(
|
||||||
TranscriptionFrame(
|
TranscriptionFrame(
|
||||||
self._final_transcription_buffer,
|
self._final_transcription_buffer,
|
||||||
"",
|
self._user_id,
|
||||||
time_now_iso8601(),
|
time_now_iso8601(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -300,7 +289,7 @@ class SonioxSTTService(STTService):
|
|||||||
# Even final tokens are sent as interim tokens as we want to send
|
# Even final tokens are sent as interim tokens as we want to send
|
||||||
# nicely formatted messages - therefore waiting for the endpoint.
|
# nicely formatted messages - therefore waiting for the endpoint.
|
||||||
self._final_transcription_buffer + non_final_transcription,
|
self._final_transcription_buffer + non_final_transcription,
|
||||||
"",
|
self._user_id,
|
||||||
time_now_iso8601(),
|
time_now_iso8601(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -333,37 +322,3 @@ class SonioxSTTService(STTService):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"{self} error: {e}")
|
logger.error(f"{self} error: {e}")
|
||||||
await self.push_error(ErrorFrame(f"{self} error: {e}"))
|
await self.push_error(ErrorFrame(f"{self} error: {e}"))
|
||||||
|
|
||||||
async def _finalize_if_no_tokens_task_handler(self):
|
|
||||||
"""Call finalize if no new tokens are received for a configured duration."""
|
|
||||||
if not self._websocket or self._websocket.closed or self._auto_finalize_delay_ms is None:
|
|
||||||
return
|
|
||||||
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
await asyncio.sleep(0.5)
|
|
||||||
|
|
||||||
if not self._websocket or self._websocket.closed:
|
|
||||||
break
|
|
||||||
|
|
||||||
# Check if we have anything to send.
|
|
||||||
if not self._final_transcription_buffer:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Check if enough time has passed since the last tokens were received.
|
|
||||||
if self._last_tokens_received:
|
|
||||||
last_token_age_ms = (time.time() - self._last_tokens_received) * 1000
|
|
||||||
|
|
||||||
if last_token_age_ms > self._auto_finalize_delay_ms:
|
|
||||||
# No new tokens received for a while, finalize the transcription.
|
|
||||||
logger.debug("No pending frames, sending finalize message")
|
|
||||||
self._last_tokens_received = None
|
|
||||||
await self._websocket.send(FINALIZE_MESSAGE)
|
|
||||||
except websockets.exceptions.ConnectionClosed:
|
|
||||||
# Expected when closing the connection.
|
|
||||||
pass
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"{self} error (_finalize_if_no_tokens_task_handler): {e}")
|
|
||||||
await self.push_error(
|
|
||||||
ErrorFrame(f"{self} error (_finalize_if_no_tokens_task_handler): {e}")
|
|
||||||
)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user