@@ -108,7 +108,7 @@ riva = [ "pipecat-ai[nvidia]" ]
|
|||||||
runner = [ "python-dotenv>=1.0.0,<2.0.0", "uvicorn>=0.32.0,<1.0.0", "fastapi>=0.115.6,<0.128.0", "pipecat-ai-small-webrtc-prebuilt>=2.2.0"]
|
runner = [ "python-dotenv>=1.0.0,<2.0.0", "uvicorn>=0.32.0,<1.0.0", "fastapi>=0.115.6,<0.128.0", "pipecat-ai-small-webrtc-prebuilt>=2.2.0"]
|
||||||
sagemaker = ["aws_sdk_sagemaker_runtime_http2; python_version>='3.12'"]
|
sagemaker = ["aws_sdk_sagemaker_runtime_http2; python_version>='3.12'"]
|
||||||
sambanova = []
|
sambanova = []
|
||||||
sarvam = [ "sarvamai==0.1.21", "pipecat-ai[websockets-base]" ]
|
sarvam = [ "sarvamai==0.1.26a2", "pipecat-ai[websockets-base]" ]
|
||||||
sentry = [ "sentry-sdk>=2.28.0,<3" ]
|
sentry = [ "sentry-sdk>=2.28.0,<3" ]
|
||||||
silero = [ "onnxruntime~=1.23.2" ]
|
silero = [ "onnxruntime~=1.23.2" ]
|
||||||
simli = [ "simli-ai~=2.0.1"]
|
simli = [ "simli-ai~=2.0.1"]
|
||||||
|
|||||||
@@ -119,10 +119,10 @@ MODEL_CONFIGS: Dict[str, ModelConfig] = {
|
|||||||
use_translate_method=True,
|
use_translate_method=True,
|
||||||
),
|
),
|
||||||
"saaras:v3": ModelConfig(
|
"saaras:v3": ModelConfig(
|
||||||
supports_prompt=True,
|
supports_prompt=False,
|
||||||
supports_mode=True,
|
supports_mode=True,
|
||||||
supports_language=True,
|
supports_language=True,
|
||||||
default_language="en-IN",
|
default_language="unknown",
|
||||||
default_mode="transcribe",
|
default_mode="transcribe",
|
||||||
use_translate_endpoint=False,
|
use_translate_endpoint=False,
|
||||||
use_translate_method=False,
|
use_translate_method=False,
|
||||||
@@ -155,9 +155,9 @@ class SarvamSTTService(STTService):
|
|||||||
language: Target language for transcription.
|
language: Target language for transcription.
|
||||||
- saarika:v2.5: Defaults to "unknown" (auto-detect supported)
|
- saarika:v2.5: Defaults to "unknown" (auto-detect supported)
|
||||||
- saaras:v2.5: Not used (auto-detects language)
|
- saaras:v2.5: Not used (auto-detects language)
|
||||||
- saaras:v3: Defaults to "en-IN"
|
- saaras:v3: Defaults to "unknown" (auto-detect supported)
|
||||||
prompt: Optional prompt to guide transcription/translation style/context.
|
prompt: Optional prompt to guide transcription/translation style/context.
|
||||||
Only applicable to saaras models (v2.5 and v3). Defaults to None.
|
Only applicable to saaras:v2.5. Defaults to None.
|
||||||
mode: Mode of operation for saaras:v3 models only. Options: transcribe, translate,
|
mode: Mode of operation for saaras:v3 models only. Options: transcribe, translate,
|
||||||
verbatim, translit, codemix. Defaults to "transcribe" for saaras:v3.
|
verbatim, translit, codemix. Defaults to "transcribe" for saaras:v3.
|
||||||
vad_signals: Enable VAD signals in response. Defaults to None.
|
vad_signals: Enable VAD signals in response. Defaults to None.
|
||||||
@@ -190,7 +190,7 @@ class SarvamSTTService(STTService):
|
|||||||
model: Sarvam model to use for transcription. Allowed values:
|
model: Sarvam model to use for transcription. Allowed values:
|
||||||
- "saarika:v2.5": Standard STT model
|
- "saarika:v2.5": Standard STT model
|
||||||
- "saaras:v2.5": STT-Translate model (auto-detects language, supports prompts)
|
- "saaras:v2.5": STT-Translate model (auto-detects language, supports prompts)
|
||||||
- "saaras:v3": Advanced STT model (supports mode and prompts)
|
- "saaras:v3": Advanced STT model (supports mode)
|
||||||
sample_rate: Audio sample rate. Defaults to 16000 if not specified.
|
sample_rate: Audio sample rate. Defaults to 16000 if not specified.
|
||||||
input_audio_codec: Audio codec/format of the input file. Defaults to "wav".
|
input_audio_codec: Audio codec/format of the input file. Defaults to "wav".
|
||||||
params: Configuration parameters for Sarvam STT service.
|
params: Configuration parameters for Sarvam STT service.
|
||||||
@@ -447,13 +447,32 @@ class SarvamSTTService(STTService):
|
|||||||
if self._config.supports_mode and self._mode is not None:
|
if self._config.supports_mode and self._mode is not None:
|
||||||
connect_kwargs["mode"] = self._mode
|
connect_kwargs["mode"] = self._mode
|
||||||
|
|
||||||
|
# Prompt support differs across sarvamai versions. Prefer connect-time prompt
|
||||||
|
# when available and gracefully degrade if the SDK doesn't accept it.
|
||||||
|
if self._prompt is not None and self._config.supports_prompt:
|
||||||
|
connect_kwargs["prompt"] = self._prompt
|
||||||
|
|
||||||
def _connect_with_sdk_headers(connect_fn, **kwargs):
|
def _connect_with_sdk_headers(connect_fn, **kwargs):
|
||||||
# Different SDK versions may use different kwarg names.
|
# Different SDK versions may use different kwarg names.
|
||||||
for header_kw in ("headers", "additional_headers", "extra_headers"):
|
# If prompt is unsupported at connect-time, retry without it.
|
||||||
|
attempts = [kwargs]
|
||||||
|
if "prompt" in kwargs:
|
||||||
|
attempts.append({k: v for k, v in kwargs.items() if k != "prompt"})
|
||||||
|
|
||||||
|
last_type_error = None
|
||||||
|
for attempt_kwargs in attempts:
|
||||||
|
for header_kw in ("headers", "additional_headers", "extra_headers"):
|
||||||
|
try:
|
||||||
|
return connect_fn(**attempt_kwargs, **{header_kw: self._sdk_headers})
|
||||||
|
except TypeError as e:
|
||||||
|
last_type_error = e
|
||||||
try:
|
try:
|
||||||
return connect_fn(**kwargs, **{header_kw: self._sdk_headers})
|
return connect_fn(**attempt_kwargs)
|
||||||
except TypeError:
|
except TypeError as e:
|
||||||
pass
|
last_type_error = e
|
||||||
|
|
||||||
|
if last_type_error is not None:
|
||||||
|
raise last_type_error
|
||||||
return connect_fn(**kwargs)
|
return connect_fn(**kwargs)
|
||||||
|
|
||||||
# Choose the appropriate endpoint based on model configuration
|
# Choose the appropriate endpoint based on model configuration
|
||||||
@@ -471,9 +490,11 @@ class SarvamSTTService(STTService):
|
|||||||
# Enter the async context manager
|
# Enter the async context manager
|
||||||
self._socket_client = await self._websocket_context.__aenter__()
|
self._socket_client = await self._websocket_context.__aenter__()
|
||||||
|
|
||||||
# Set prompt if provided (only for models that support prompts)
|
# Fallback for SDKs that support runtime prompt updates.
|
||||||
if self._prompt is not None and self._config.supports_prompt:
|
if self._prompt is not None and self._config.supports_prompt:
|
||||||
await self._socket_client.set_prompt(self._prompt)
|
prompt_setter = getattr(self._socket_client, "set_prompt", None)
|
||||||
|
if callable(prompt_setter):
|
||||||
|
await prompt_setter(self._prompt)
|
||||||
|
|
||||||
# Register event handler for incoming messages
|
# Register event handler for incoming messages
|
||||||
def _message_handler(message):
|
def _message_handler(message):
|
||||||
|
|||||||
Reference in New Issue
Block a user