diff --git a/api/services/configuration/registry.py b/api/services/configuration/registry.py index aba0b7c7..bcb18911 100644 --- a/api/services/configuration/registry.py +++ b/api/services/configuration/registry.py @@ -1332,7 +1332,6 @@ class XAITTSConfiguration(BaseServiceConfiguration): description="BCP-47 language code for synthesis (e.g. 'en', 'fr', 'de'), or 'auto' for automatic language detection.", json_schema_extra={"allow_custom_input": True}, ) - @computed_field @property def model(self) -> str: diff --git a/api/services/pipecat/service_factory.py b/api/services/pipecat/service_factory.py index d34abd48..b76d58e8 100644 --- a/api/services/pipecat/service_factory.py +++ b/api/services/pipecat/service_factory.py @@ -86,7 +86,7 @@ from pipecat.services.speechmatics.stt import ( SpeechmaticsSTTService, SpeechmaticsSTTSettings, ) -from pipecat.services.xai.tts import XAIHttpTTSService, XAITTSSettings +from pipecat.services.xai.tts import XAITTSService, XAIWebsocketTTSSettings from pipecat.transcriptions.language import Language from pipecat.utils.text.xml_function_tag_filter import XMLFunctionTagFilter @@ -817,11 +817,9 @@ def create_tts_service( pipecat_language = Language(language_code) except ValueError: pipecat_language = Language.EN - return XAIHttpTTSService( + return XAITTSService( api_key=user_config.tts.api_key, - sample_rate=audio_config.transport_out_sample_rate, - encoding="pcm", - settings=XAITTSSettings( + settings=XAIWebsocketTTSSettings( voice=voice, language=pipecat_language, ), diff --git a/api/tests/test_xai_tts_service_factory.py b/api/tests/test_xai_tts_service_factory.py index 2a53c038..e6b0a369 100644 --- a/api/tests/test_xai_tts_service_factory.py +++ b/api/tests/test_xai_tts_service_factory.py @@ -24,10 +24,7 @@ def test_xai_tts_configuration_defaults(): assert XAI_TTS_VOICES == ["eve", "ara", "leo", "rex", "sal"] -@pytest.mark.parametrize("transport_out_sample_rate", [8000, 16000]) -def test_create_xai_tts_service_uses_pipeline_compatible_audio_format( - transport_out_sample_rate, -): +def test_create_xai_tts_service_uses_websocket_streaming(): user_config = SimpleNamespace( tts=SimpleNamespace( provider=ServiceProviders.XAI.value, @@ -38,20 +35,18 @@ def test_create_xai_tts_service_uses_pipeline_compatible_audio_format( ) ) audio_config = SimpleNamespace( - transport_out_sample_rate=transport_out_sample_rate, + transport_out_sample_rate=24000, transport_in_sample_rate=16000, ) - with patch( - "api.services.pipecat.service_factory.XAIHttpTTSService" - ) as mock_service: + with patch("api.services.pipecat.service_factory.XAITTSService") as mock_service: create_tts_service(user_config, audio_config) assert mock_service.call_count == 1 kwargs = mock_service.call_args.kwargs assert kwargs["api_key"] == "test-key" - assert kwargs["sample_rate"] == transport_out_sample_rate - assert kwargs["encoding"] == "pcm" + # Sample rate is resolved from the pipeline StartFrame, like other providers. + assert "sample_rate" not in kwargs assert kwargs["settings"].voice == "rex" assert kwargs["settings"].language == Language.EN @@ -71,9 +66,7 @@ def test_create_xai_tts_service_converts_language(): transport_in_sample_rate=16000, ) - with patch( - "api.services.pipecat.service_factory.XAIHttpTTSService" - ) as mock_service: + with patch("api.services.pipecat.service_factory.XAITTSService") as mock_service: create_tts_service(user_config, audio_config) kwargs = mock_service.call_args.kwargs @@ -95,9 +88,7 @@ def test_create_xai_tts_service_falls_back_to_english_for_unknown_language(): transport_in_sample_rate=16000, ) - with patch( - "api.services.pipecat.service_factory.XAIHttpTTSService" - ) as mock_service: + with patch("api.services.pipecat.service_factory.XAITTSService") as mock_service: create_tts_service(user_config, audio_config) kwargs = mock_service.call_args.kwargs @@ -119,9 +110,7 @@ def test_create_xai_tts_service_preserves_auto_language(): transport_in_sample_rate=16000, ) - with patch( - "api.services.pipecat.service_factory.XAIHttpTTSService" - ) as mock_service: + with patch("api.services.pipecat.service_factory.XAITTSService") as mock_service: create_tts_service(user_config, audio_config) kwargs = mock_service.call_args.kwargs diff --git a/ui/package-lock.json b/ui/package-lock.json index 37af242c..fcdae1e3 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "ui", - "version": "1.41.0", + "version": "1.42.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ui", - "version": "1.41.0", + "version": "1.42.0", "dependencies": { "@calcom/embed-react": "^1.5.3", "@dagrejs/dagre": "^1.1.4",