cartesia 1.3.1__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. cartesia/__init__.py +302 -3
  2. cartesia/api_status/__init__.py +6 -0
  3. cartesia/api_status/client.py +104 -0
  4. cartesia/api_status/requests/__init__.py +5 -0
  5. cartesia/api_status/requests/api_info.py +8 -0
  6. cartesia/api_status/types/__init__.py +5 -0
  7. cartesia/api_status/types/api_info.py +20 -0
  8. cartesia/base_client.py +156 -0
  9. cartesia/client.py +163 -40
  10. cartesia/core/__init__.py +50 -0
  11. cartesia/core/api_error.py +15 -0
  12. cartesia/core/client_wrapper.py +55 -0
  13. cartesia/core/datetime_utils.py +28 -0
  14. cartesia/core/file.py +67 -0
  15. cartesia/core/http_client.py +499 -0
  16. cartesia/core/jsonable_encoder.py +101 -0
  17. cartesia/core/pagination.py +88 -0
  18. cartesia/core/pydantic_utilities.py +296 -0
  19. cartesia/core/query_encoder.py +58 -0
  20. cartesia/core/remove_none_from_dict.py +11 -0
  21. cartesia/core/request_options.py +35 -0
  22. cartesia/core/serialization.py +272 -0
  23. cartesia/datasets/__init__.py +24 -0
  24. cartesia/datasets/requests/__init__.py +15 -0
  25. cartesia/datasets/requests/create_dataset_request.py +7 -0
  26. cartesia/datasets/requests/dataset.py +9 -0
  27. cartesia/datasets/requests/dataset_file.py +9 -0
  28. cartesia/datasets/requests/paginated_dataset_files.py +10 -0
  29. cartesia/datasets/requests/paginated_datasets.py +10 -0
  30. cartesia/datasets/types/__init__.py +17 -0
  31. cartesia/datasets/types/create_dataset_request.py +19 -0
  32. cartesia/datasets/types/dataset.py +21 -0
  33. cartesia/datasets/types/dataset_file.py +21 -0
  34. cartesia/datasets/types/file_purpose.py +5 -0
  35. cartesia/datasets/types/paginated_dataset_files.py +21 -0
  36. cartesia/datasets/types/paginated_datasets.py +21 -0
  37. cartesia/embedding/__init__.py +5 -0
  38. cartesia/embedding/types/__init__.py +5 -0
  39. cartesia/embedding/types/embedding.py +201 -0
  40. cartesia/environment.py +7 -0
  41. cartesia/infill/__init__.py +2 -0
  42. cartesia/infill/client.py +318 -0
  43. cartesia/tts/__init__.py +167 -0
  44. cartesia/{_async_websocket.py → tts/_async_websocket.py} +212 -85
  45. cartesia/tts/_websocket.py +479 -0
  46. cartesia/tts/client.py +407 -0
  47. cartesia/tts/requests/__init__.py +76 -0
  48. cartesia/tts/requests/cancel_context_request.py +17 -0
  49. cartesia/tts/requests/controls.py +11 -0
  50. cartesia/tts/requests/generation_request.py +58 -0
  51. cartesia/tts/requests/mp_3_output_format.py +11 -0
  52. cartesia/tts/requests/output_format.py +30 -0
  53. cartesia/tts/requests/phoneme_timestamps.py +10 -0
  54. cartesia/tts/requests/raw_output_format.py +11 -0
  55. cartesia/tts/requests/speed.py +7 -0
  56. cartesia/tts/requests/tts_request.py +24 -0
  57. cartesia/tts/requests/tts_request_embedding_specifier.py +16 -0
  58. cartesia/tts/requests/tts_request_id_specifier.py +16 -0
  59. cartesia/tts/requests/tts_request_voice_specifier.py +7 -0
  60. cartesia/tts/requests/wav_output_format.py +7 -0
  61. cartesia/tts/requests/web_socket_base_response.py +11 -0
  62. cartesia/tts/requests/web_socket_chunk_response.py +11 -0
  63. cartesia/tts/requests/web_socket_done_response.py +7 -0
  64. cartesia/tts/requests/web_socket_error_response.py +7 -0
  65. cartesia/tts/requests/web_socket_flush_done_response.py +9 -0
  66. cartesia/tts/requests/web_socket_phoneme_timestamps_response.py +9 -0
  67. cartesia/tts/requests/web_socket_raw_output_format.py +11 -0
  68. cartesia/tts/requests/web_socket_request.py +7 -0
  69. cartesia/tts/requests/web_socket_response.py +70 -0
  70. cartesia/tts/requests/web_socket_stream_options.py +8 -0
  71. cartesia/tts/requests/web_socket_timestamps_response.py +9 -0
  72. cartesia/tts/requests/web_socket_tts_output.py +18 -0
  73. cartesia/tts/requests/web_socket_tts_request.py +25 -0
  74. cartesia/tts/requests/word_timestamps.py +10 -0
  75. cartesia/tts/socket_client.py +302 -0
  76. cartesia/tts/types/__init__.py +90 -0
  77. cartesia/tts/types/cancel_context_request.py +28 -0
  78. cartesia/tts/types/context_id.py +3 -0
  79. cartesia/tts/types/controls.py +22 -0
  80. cartesia/tts/types/emotion.py +34 -0
  81. cartesia/tts/types/flush_id.py +3 -0
  82. cartesia/tts/types/generation_request.py +71 -0
  83. cartesia/tts/types/mp_3_output_format.py +23 -0
  84. cartesia/tts/types/natural_specifier.py +5 -0
  85. cartesia/tts/types/numerical_specifier.py +3 -0
  86. cartesia/tts/types/output_format.py +58 -0
  87. cartesia/tts/types/phoneme_timestamps.py +21 -0
  88. cartesia/tts/types/raw_encoding.py +5 -0
  89. cartesia/tts/types/raw_output_format.py +22 -0
  90. cartesia/tts/types/speed.py +7 -0
  91. cartesia/tts/types/supported_language.py +7 -0
  92. cartesia/tts/types/tts_request.py +35 -0
  93. cartesia/tts/types/tts_request_embedding_specifier.py +27 -0
  94. cartesia/tts/types/tts_request_id_specifier.py +27 -0
  95. cartesia/tts/types/tts_request_voice_specifier.py +7 -0
  96. cartesia/tts/types/wav_output_format.py +17 -0
  97. cartesia/tts/types/web_socket_base_response.py +22 -0
  98. cartesia/tts/types/web_socket_chunk_response.py +22 -0
  99. cartesia/tts/types/web_socket_done_response.py +17 -0
  100. cartesia/tts/types/web_socket_error_response.py +19 -0
  101. cartesia/tts/types/web_socket_flush_done_response.py +21 -0
  102. cartesia/tts/types/web_socket_phoneme_timestamps_response.py +20 -0
  103. cartesia/tts/types/web_socket_raw_output_format.py +22 -0
  104. cartesia/tts/types/web_socket_request.py +7 -0
  105. cartesia/tts/types/web_socket_response.py +125 -0
  106. cartesia/tts/types/web_socket_stream_options.py +19 -0
  107. cartesia/tts/types/web_socket_timestamps_response.py +20 -0
  108. cartesia/tts/types/web_socket_tts_output.py +29 -0
  109. cartesia/tts/types/web_socket_tts_request.py +37 -0
  110. cartesia/tts/types/word_timestamps.py +21 -0
  111. cartesia/{_constants.py → tts/utils/constants.py} +2 -2
  112. cartesia/tts/utils/tts.py +64 -0
  113. cartesia/tts/utils/types.py +70 -0
  114. cartesia/version.py +3 -1
  115. cartesia/voice_changer/__init__.py +27 -0
  116. cartesia/voice_changer/client.py +395 -0
  117. cartesia/voice_changer/requests/__init__.py +15 -0
  118. cartesia/voice_changer/requests/streaming_response.py +38 -0
  119. cartesia/voice_changer/types/__init__.py +17 -0
  120. cartesia/voice_changer/types/output_format_container.py +5 -0
  121. cartesia/voice_changer/types/streaming_response.py +64 -0
  122. cartesia/voices/__init__.py +81 -0
  123. cartesia/voices/client.py +1218 -0
  124. cartesia/voices/requests/__init__.py +29 -0
  125. cartesia/voices/requests/create_voice_request.py +23 -0
  126. cartesia/voices/requests/embedding_response.py +8 -0
  127. cartesia/voices/requests/embedding_specifier.py +10 -0
  128. cartesia/voices/requests/get_voices_response.py +24 -0
  129. cartesia/voices/requests/id_specifier.py +10 -0
  130. cartesia/voices/requests/localize_dialect.py +11 -0
  131. cartesia/voices/requests/localize_voice_request.py +28 -0
  132. cartesia/voices/requests/mix_voice_specifier.py +7 -0
  133. cartesia/voices/requests/mix_voices_request.py +9 -0
  134. cartesia/voices/requests/update_voice_request.py +15 -0
  135. cartesia/voices/requests/voice.py +43 -0
  136. cartesia/voices/requests/voice_metadata.py +36 -0
  137. cartesia/voices/types/__init__.py +53 -0
  138. cartesia/voices/types/base_voice_id.py +5 -0
  139. cartesia/voices/types/clone_mode.py +5 -0
  140. cartesia/voices/types/create_voice_request.py +34 -0
  141. cartesia/voices/types/embedding_response.py +20 -0
  142. cartesia/voices/types/embedding_specifier.py +22 -0
  143. cartesia/voices/types/gender.py +5 -0
  144. cartesia/voices/types/gender_presentation.py +5 -0
  145. cartesia/voices/types/get_voices_response.py +34 -0
  146. cartesia/voices/types/id_specifier.py +22 -0
  147. cartesia/voices/types/localize_dialect.py +11 -0
  148. cartesia/voices/types/localize_english_dialect.py +5 -0
  149. cartesia/voices/types/localize_french_dialect.py +5 -0
  150. cartesia/voices/types/localize_portuguese_dialect.py +5 -0
  151. cartesia/voices/types/localize_spanish_dialect.py +5 -0
  152. cartesia/voices/types/localize_target_language.py +7 -0
  153. cartesia/voices/types/localize_voice_request.py +39 -0
  154. cartesia/voices/types/mix_voice_specifier.py +7 -0
  155. cartesia/voices/types/mix_voices_request.py +20 -0
  156. cartesia/voices/types/update_voice_request.py +27 -0
  157. cartesia/voices/types/voice.py +54 -0
  158. cartesia/voices/types/voice_expand_options.py +5 -0
  159. cartesia/voices/types/voice_id.py +3 -0
  160. cartesia/voices/types/voice_metadata.py +48 -0
  161. cartesia/voices/types/weight.py +3 -0
  162. cartesia-2.0.0.dist-info/METADATA +414 -0
  163. cartesia-2.0.0.dist-info/RECORD +165 -0
  164. {cartesia-1.3.1.dist-info → cartesia-2.0.0.dist-info}/WHEEL +1 -1
  165. cartesia/_async_sse.py +0 -95
  166. cartesia/_logger.py +0 -3
  167. cartesia/_sse.py +0 -143
  168. cartesia/_types.py +0 -70
  169. cartesia/_websocket.py +0 -358
  170. cartesia/async_client.py +0 -82
  171. cartesia/async_tts.py +0 -63
  172. cartesia/resource.py +0 -44
  173. cartesia/tts.py +0 -137
  174. cartesia/utils/deprecated.py +0 -55
  175. cartesia/utils/retry.py +0 -87
  176. cartesia/utils/tts.py +0 -78
  177. cartesia/voices.py +0 -208
  178. cartesia-1.3.1.dist-info/METADATA +0 -661
  179. cartesia-1.3.1.dist-info/RECORD +0 -23
  180. cartesia-1.3.1.dist-info/licenses/LICENSE.md +0 -21
  181. /cartesia/{utils/__init__.py → py.typed} +0 -0
@@ -0,0 +1,125 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from __future__ import annotations
4
+ from ...core.pydantic_utilities import UniversalBaseModel
5
+ import typing
6
+ from .flush_id import FlushId
7
+ from .context_id import ContextId
8
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2
9
+ import pydantic
10
+ from .word_timestamps import WordTimestamps
11
+ from .phoneme_timestamps import PhonemeTimestamps
12
+
13
+
14
+ class WebSocketResponse_Chunk(UniversalBaseModel):
15
+ type: typing.Literal["chunk"] = "chunk"
16
+ data: str
17
+ step_time: float
18
+ flush_id: typing.Optional[FlushId] = None
19
+ context_id: typing.Optional[ContextId] = None
20
+ status_code: int
21
+ done: bool
22
+
23
+ if IS_PYDANTIC_V2:
24
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
25
+ else:
26
+
27
+ class Config:
28
+ frozen = True
29
+ smart_union = True
30
+ extra = pydantic.Extra.allow
31
+
32
+
33
+ class WebSocketResponse_FlushDone(UniversalBaseModel):
34
+ type: typing.Literal["flush_done"] = "flush_done"
35
+ flush_id: FlushId
36
+ flush_done: bool
37
+ context_id: typing.Optional[ContextId] = None
38
+ status_code: int
39
+ done: bool
40
+
41
+ if IS_PYDANTIC_V2:
42
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
43
+ else:
44
+
45
+ class Config:
46
+ frozen = True
47
+ smart_union = True
48
+ extra = pydantic.Extra.allow
49
+
50
+
51
+ class WebSocketResponse_Done(UniversalBaseModel):
52
+ type: typing.Literal["done"] = "done"
53
+ context_id: typing.Optional[ContextId] = None
54
+ status_code: int
55
+ done: bool
56
+
57
+ if IS_PYDANTIC_V2:
58
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
59
+ else:
60
+
61
+ class Config:
62
+ frozen = True
63
+ smart_union = True
64
+ extra = pydantic.Extra.allow
65
+
66
+
67
+ class WebSocketResponse_Timestamps(UniversalBaseModel):
68
+ type: typing.Literal["timestamps"] = "timestamps"
69
+ word_timestamps: typing.Optional[WordTimestamps] = None
70
+ context_id: typing.Optional[ContextId] = None
71
+ status_code: int
72
+ done: bool
73
+
74
+ if IS_PYDANTIC_V2:
75
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
76
+ else:
77
+
78
+ class Config:
79
+ frozen = True
80
+ smart_union = True
81
+ extra = pydantic.Extra.allow
82
+
83
+
84
+ class WebSocketResponse_Error(UniversalBaseModel):
85
+ type: typing.Literal["error"] = "error"
86
+ error: str
87
+ context_id: typing.Optional[ContextId] = None
88
+ status_code: int
89
+ done: bool
90
+
91
+ if IS_PYDANTIC_V2:
92
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
93
+ else:
94
+
95
+ class Config:
96
+ frozen = True
97
+ smart_union = True
98
+ extra = pydantic.Extra.allow
99
+
100
+
101
+ class WebSocketResponse_PhonemeTimestamps(UniversalBaseModel):
102
+ type: typing.Literal["phoneme_timestamps"] = "phoneme_timestamps"
103
+ phoneme_timestamps: typing.Optional[PhonemeTimestamps] = None
104
+ context_id: typing.Optional[ContextId] = None
105
+ status_code: int
106
+ done: bool
107
+
108
+ if IS_PYDANTIC_V2:
109
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
110
+ else:
111
+
112
+ class Config:
113
+ frozen = True
114
+ smart_union = True
115
+ extra = pydantic.Extra.allow
116
+
117
+
118
+ WebSocketResponse = typing.Union[
119
+ WebSocketResponse_Chunk,
120
+ WebSocketResponse_FlushDone,
121
+ WebSocketResponse_Done,
122
+ WebSocketResponse_Timestamps,
123
+ WebSocketResponse_Error,
124
+ WebSocketResponse_PhonemeTimestamps,
125
+ ]
@@ -0,0 +1,19 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ...core.pydantic_utilities import UniversalBaseModel
4
+ import typing
5
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2
6
+ import pydantic
7
+
8
+
9
+ class WebSocketStreamOptions(UniversalBaseModel):
10
+ timeout: typing.Optional[float] = None
11
+
12
+ if IS_PYDANTIC_V2:
13
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
14
+ else:
15
+
16
+ class Config:
17
+ frozen = True
18
+ smart_union = True
19
+ extra = pydantic.Extra.allow
@@ -0,0 +1,20 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from .web_socket_base_response import WebSocketBaseResponse
4
+ import typing
5
+ from .word_timestamps import WordTimestamps
6
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2
7
+ import pydantic
8
+
9
+
10
+ class WebSocketTimestampsResponse(WebSocketBaseResponse):
11
+ word_timestamps: typing.Optional[WordTimestamps] = None
12
+
13
+ if IS_PYDANTIC_V2:
14
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
15
+ else:
16
+
17
+ class Config:
18
+ frozen = True
19
+ smart_union = True
20
+ extra = pydantic.Extra.allow
@@ -0,0 +1,29 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ import pydantic
6
+
7
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2, UniversalBaseModel
8
+ from .context_id import ContextId
9
+ from .flush_id import FlushId
10
+ from .phoneme_timestamps import PhonemeTimestamps
11
+ from .word_timestamps import WordTimestamps
12
+
13
+
14
+ class WebSocketTtsOutput(UniversalBaseModel):
15
+ word_timestamps: typing.Optional[WordTimestamps] = None
16
+ phoneme_timestamps: typing.Optional[PhonemeTimestamps] = None
17
+ audio: typing.Optional[bytes] = None
18
+ context_id: typing.Optional[ContextId] = None
19
+ flush_id: typing.Optional[FlushId] = None
20
+ flush_done: typing.Optional[bool] = None
21
+
22
+ if IS_PYDANTIC_V2:
23
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
24
+ else:
25
+
26
+ class Config:
27
+ frozen = True
28
+ smart_union = True
29
+ extra = pydantic.Extra.allow
@@ -0,0 +1,37 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ...core.pydantic_utilities import UniversalBaseModel
4
+ import pydantic
5
+ import typing
6
+ from .output_format import OutputFormat
7
+ from .tts_request_voice_specifier import TtsRequestVoiceSpecifier
8
+ import typing_extensions
9
+ from ...core.serialization import FieldMetadata
10
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2
11
+
12
+
13
+ class WebSocketTtsRequest(UniversalBaseModel):
14
+ model_id: str = pydantic.Field()
15
+ """
16
+ The ID of the model to use for the generation. See [Models](/build-with-sonic/models) for available models.
17
+ """
18
+
19
+ output_format: typing.Optional[OutputFormat] = None
20
+ transcript: typing.Optional[str] = None
21
+ voice: TtsRequestVoiceSpecifier
22
+ duration: typing.Optional[int] = None
23
+ language: typing.Optional[str] = None
24
+ add_timestamps: typing.Optional[bool] = None
25
+ use_original_timestamps: typing.Optional[bool] = None
26
+ add_phoneme_timestamps: typing.Optional[bool] = None
27
+ continue_: typing_extensions.Annotated[typing.Optional[bool], FieldMetadata(alias="continue")] = None
28
+ context_id: typing.Optional[str] = None
29
+
30
+ if IS_PYDANTIC_V2:
31
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
32
+ else:
33
+
34
+ class Config:
35
+ frozen = True
36
+ smart_union = True
37
+ extra = pydantic.Extra.allow
@@ -0,0 +1,21 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ...core.pydantic_utilities import UniversalBaseModel
4
+ import typing
5
+ from ...core.pydantic_utilities import IS_PYDANTIC_V2
6
+ import pydantic
7
+
8
+
9
+ class WordTimestamps(UniversalBaseModel):
10
+ words: typing.List[str]
11
+ start: typing.List[float]
12
+ end: typing.List[float]
13
+
14
+ if IS_PYDANTIC_V2:
15
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
16
+ else:
17
+
18
+ class Config:
19
+ frozen = True
20
+ smart_union = True
21
+ extra = pydantic.Extra.allow
@@ -1,5 +1,5 @@
1
- DEFAULT_MODEL_ID = "sonic-english" # latest default model
2
- MULTILINGUAL_MODEL_ID = "sonic-multilingual" # latest multilingual model
1
+ DEFAULT_MODEL_ID = "sonic-2" # latest default model
2
+ MULTILINGUAL_MODEL_ID = "sonic-2" # latest multilingual model
3
3
  DEFAULT_BASE_URL = "api.cartesia.ai"
4
4
  DEFAULT_CARTESIA_VERSION = "2024-06-10" # latest version
5
5
  DEFAULT_OUTPUT_FORMAT = "raw_pcm_f32le_44100"
@@ -0,0 +1,64 @@
1
+ import io
2
+ import typing
3
+
4
+ from pydub import AudioSegment # type: ignore
5
+
6
+ from .types import OutputFormatMapping
7
+
8
+
9
+ def get_output_format(output_format_name: str):
10
+ """Convenience method to get the output_format dictionary from a given output format name.
11
+
12
+ Args:
13
+ output_format_name (str): The name of the output format.
14
+
15
+ Returns:
16
+ OutputFormat: A dictionary containing the details of the output format to be passed into tts.sse() or tts.websocket().send()
17
+
18
+ Raises:
19
+ ValueError: If the output_format name is not supported
20
+ """
21
+ if output_format_name in OutputFormatMapping._format_mapping:
22
+ output_format_obj = OutputFormatMapping.get_format(output_format_name)
23
+ else:
24
+ raise ValueError(f"Unsupported format: {output_format_name}")
25
+
26
+ return output_format_obj
27
+
28
+
29
+ def concat_audio_segments(
30
+ left_audio: typing.Optional[bytes],
31
+ infill_audio: bytes,
32
+ right_audio: typing.Optional[bytes],
33
+ format: str = "wav",
34
+ ) -> bytes:
35
+ """Helper method to concatenate three audio segments while preserving audio format and headers.
36
+
37
+ Args:
38
+ left_audio: The audio segment that comes before the infill
39
+ infill_audio: The generated infill audio segment
40
+ right_audio: The audio segment that comes after the infill
41
+ format: The audio format (e.g., 'wav', 'mp3'). Defaults to 'wav'
42
+
43
+ Returns:
44
+ bytes: The concatenated audio as bytes
45
+
46
+ Raises:
47
+ ValueError: If the audio segments cannot be loaded or concatenated
48
+ """
49
+ try:
50
+ combined = AudioSegment.empty()
51
+ if left_audio:
52
+ combined += AudioSegment.from_file(io.BytesIO(left_audio), format=format)
53
+
54
+ combined += AudioSegment.from_file(io.BytesIO(infill_audio), format=format)
55
+
56
+ if right_audio:
57
+ combined += AudioSegment.from_file(io.BytesIO(right_audio), format=format)
58
+
59
+ output = io.BytesIO()
60
+ combined.export(output, format=format)
61
+ return output.getvalue()
62
+
63
+ except Exception as e:
64
+ raise ValueError(f"Failed to concatenate audio segments: {str(e)}")
@@ -0,0 +1,70 @@
1
+ class OutputFormatMapping:
2
+ _format_mapping = {
3
+ "raw_pcm_f32le_44100": {
4
+ "container": "raw",
5
+ "encoding": "pcm_f32le",
6
+ "sample_rate": 44100,
7
+ },
8
+ "raw_pcm_s16le_44100": {
9
+ "container": "raw",
10
+ "encoding": "pcm_s16le",
11
+ "sample_rate": 44100,
12
+ },
13
+ "raw_pcm_f32le_24000": {
14
+ "container": "raw",
15
+ "encoding": "pcm_f32le",
16
+ "sample_rate": 24000,
17
+ },
18
+ "raw_pcm_s16le_24000": {
19
+ "container": "raw",
20
+ "encoding": "pcm_s16le",
21
+ "sample_rate": 24000,
22
+ },
23
+ "raw_pcm_f32le_22050": {
24
+ "container": "raw",
25
+ "encoding": "pcm_f32le",
26
+ "sample_rate": 22050,
27
+ },
28
+ "raw_pcm_s16le_22050": {
29
+ "container": "raw",
30
+ "encoding": "pcm_s16le",
31
+ "sample_rate": 22050,
32
+ },
33
+ "raw_pcm_f32le_16000": {
34
+ "container": "raw",
35
+ "encoding": "pcm_f32le",
36
+ "sample_rate": 16000,
37
+ },
38
+ "raw_pcm_s16le_16000": {
39
+ "container": "raw",
40
+ "encoding": "pcm_s16le",
41
+ "sample_rate": 16000,
42
+ },
43
+ "raw_pcm_f32le_8000": {
44
+ "container": "raw",
45
+ "encoding": "pcm_f32le",
46
+ "sample_rate": 8000,
47
+ },
48
+ "raw_pcm_s16le_8000": {
49
+ "container": "raw",
50
+ "encoding": "pcm_s16le",
51
+ "sample_rate": 8000,
52
+ },
53
+ "raw_pcm_mulaw_8000": {
54
+ "container": "raw",
55
+ "encoding": "pcm_mulaw",
56
+ "sample_rate": 8000,
57
+ },
58
+ "raw_pcm_alaw_8000": {
59
+ "container": "raw",
60
+ "encoding": "pcm_alaw",
61
+ "sample_rate": 8000,
62
+ },
63
+ }
64
+
65
+ @classmethod
66
+ def get_format(cls, format_name):
67
+ if format_name in cls._format_mapping:
68
+ return cls._format_mapping[format_name]
69
+ else:
70
+ raise ValueError(f"Unsupported format: {format_name}")
cartesia/version.py CHANGED
@@ -1 +1,3 @@
1
- __version__ = "1.3.1"
1
+ from importlib import metadata
2
+
3
+ __version__ = metadata.version("cartesia")
@@ -0,0 +1,27 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from .types import (
4
+ OutputFormatContainer,
5
+ StreamingResponse,
6
+ StreamingResponse_Chunk,
7
+ StreamingResponse_Done,
8
+ StreamingResponse_Error,
9
+ )
10
+ from .requests import (
11
+ StreamingResponseParams,
12
+ StreamingResponse_ChunkParams,
13
+ StreamingResponse_DoneParams,
14
+ StreamingResponse_ErrorParams,
15
+ )
16
+
17
+ __all__ = [
18
+ "OutputFormatContainer",
19
+ "StreamingResponse",
20
+ "StreamingResponseParams",
21
+ "StreamingResponse_Chunk",
22
+ "StreamingResponse_ChunkParams",
23
+ "StreamingResponse_Done",
24
+ "StreamingResponse_DoneParams",
25
+ "StreamingResponse_Error",
26
+ "StreamingResponse_ErrorParams",
27
+ ]