Merge pull request #3197 from pipecat-ai/mb/cartesia-stt-cleanup
Clean up CartesiaSTTService
This commit is contained in:
@@ -10,7 +10,6 @@ This module provides a WebSocket-based STT service that integrates with
|
|||||||
the Cartesia Live transcription API for real-time speech recognition.
|
the Cartesia Live transcription API for real-time speech recognition.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import asyncio
|
|
||||||
import json
|
import json
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
from typing import AsyncGenerator, Optional
|
from typing import AsyncGenerator, Optional
|
||||||
@@ -159,20 +158,16 @@ class CartesiaSTTService(WebsocketSTTService):
|
|||||||
sample_rate=sample_rate,
|
sample_rate=sample_rate,
|
||||||
)
|
)
|
||||||
|
|
||||||
merged_options = default_options
|
merged_options = default_options.to_dict()
|
||||||
if live_options:
|
if live_options:
|
||||||
merged_options_dict = default_options.to_dict()
|
merged_options.update(live_options.to_dict())
|
||||||
merged_options_dict.update(live_options.to_dict())
|
# Filter out "None" string values
|
||||||
merged_options = CartesiaLiveOptions(
|
merged_options = {
|
||||||
**{
|
k: v for k, v in merged_options.items() if not isinstance(v, str) or v != "None"
|
||||||
k: v
|
}
|
||||||
for k, v in merged_options_dict.items()
|
|
||||||
if not isinstance(v, str) or v != "None"
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
self._settings = merged_options
|
self._settings = merged_options
|
||||||
self.set_model_name(merged_options.model)
|
self.set_model_name(merged_options["model"])
|
||||||
self._api_key = api_key
|
self._api_key = api_key
|
||||||
self._base_url = base_url or "api.cartesia.ai"
|
self._base_url = base_url or "api.cartesia.ai"
|
||||||
self._receive_task = None
|
self._receive_task = None
|
||||||
@@ -253,7 +248,7 @@ class CartesiaSTTService(WebsocketSTTService):
|
|||||||
await self._connect_websocket()
|
await self._connect_websocket()
|
||||||
|
|
||||||
if self._websocket and not self._receive_task:
|
if self._websocket and not self._receive_task:
|
||||||
self._receive_task = asyncio.create_task(self._receive_task_handler(self._report_error))
|
self._receive_task = self.create_task(self._receive_task_handler(self._report_error))
|
||||||
|
|
||||||
async def _disconnect(self):
|
async def _disconnect(self):
|
||||||
if self._receive_task:
|
if self._receive_task:
|
||||||
@@ -268,7 +263,7 @@ class CartesiaSTTService(WebsocketSTTService):
|
|||||||
return
|
return
|
||||||
logger.debug("Connecting to Cartesia STT")
|
logger.debug("Connecting to Cartesia STT")
|
||||||
|
|
||||||
params = self._settings.to_dict()
|
params = self._settings
|
||||||
ws_url = f"wss://{self._base_url}/stt/websocket?{urllib.parse.urlencode(params)}"
|
ws_url = f"wss://{self._base_url}/stt/websocket?{urllib.parse.urlencode(params)}"
|
||||||
headers = {"Cartesia-Version": "2025-04-16", "X-API-Key": self._api_key}
|
headers = {"Cartesia-Version": "2025-04-16", "X-API-Key": self._api_key}
|
||||||
|
|
||||||
@@ -294,12 +289,15 @@ class CartesiaSTTService(WebsocketSTTService):
|
|||||||
raise Exception("Websocket not connected")
|
raise Exception("Websocket not connected")
|
||||||
|
|
||||||
async def _process_messages(self):
|
async def _process_messages(self):
|
||||||
|
"""Process incoming WebSocket messages."""
|
||||||
async for message in self._get_websocket():
|
async for message in self._get_websocket():
|
||||||
try:
|
try:
|
||||||
data = json.loads(message)
|
data = json.loads(message)
|
||||||
await self._process_response(data)
|
await self._process_response(data)
|
||||||
except json.JSONDecodeError:
|
except json.JSONDecodeError:
|
||||||
logger.warning(f"Received non-JSON message: {message}")
|
logger.warning(f"Received non-JSON message: {message}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error processing message: {e}")
|
||||||
|
|
||||||
async def _receive_messages(self):
|
async def _receive_messages(self):
|
||||||
while True:
|
while True:
|
||||||
|
|||||||
Reference in New Issue
Block a user