cartesia 2.0.0b7__tar.gz → 2.0.2__tar.gz

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 (177) hide show
  1. {cartesia-2.0.0b7 → cartesia-2.0.2}/PKG-INFO +68 -63
  2. {cartesia-2.0.0b7 → cartesia-2.0.2}/README.md +67 -62
  3. {cartesia-2.0.0b7 → cartesia-2.0.2}/pyproject.toml +1 -1
  4. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/__init__.py +15 -1
  5. cartesia-2.0.2/src/cartesia/auth/__init__.py +13 -0
  6. cartesia-2.0.2/src/cartesia/auth/client.py +159 -0
  7. cartesia-2.0.2/src/cartesia/auth/requests/__init__.py +7 -0
  8. cartesia-2.0.2/src/cartesia/auth/requests/token_grant.py +10 -0
  9. cartesia-2.0.2/src/cartesia/auth/requests/token_request.py +17 -0
  10. cartesia-2.0.2/src/cartesia/auth/requests/token_response.py +10 -0
  11. cartesia-2.0.2/src/cartesia/auth/types/__init__.py +7 -0
  12. cartesia-2.0.2/src/cartesia/auth/types/token_grant.py +22 -0
  13. cartesia-2.0.2/src/cartesia/auth/types/token_request.py +28 -0
  14. cartesia-2.0.2/src/cartesia/auth/types/token_response.py +22 -0
  15. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/base_client.py +4 -0
  16. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/client_wrapper.py +1 -1
  17. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/_async_websocket.py +8 -0
  18. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/_websocket.py +11 -0
  19. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/client.py +40 -4
  20. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/generation_request.py +19 -1
  21. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/tts_request.py +10 -1
  22. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_tts_request.py +3 -1
  23. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/generation_request.py +19 -1
  24. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/tts_request.py +10 -1
  25. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_tts_request.py +3 -1
  26. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/__init__.py +6 -0
  27. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/client.py +208 -159
  28. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/create_voice_request.py +2 -0
  29. cartesia-2.0.2/src/cartesia/voices/requests/localize_dialect.py +11 -0
  30. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/localize_voice_request.py +15 -2
  31. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/__init__.py +6 -0
  32. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/create_voice_request.py +2 -0
  33. cartesia-2.0.2/src/cartesia/voices/types/localize_dialect.py +11 -0
  34. cartesia-2.0.2/src/cartesia/voices/types/localize_french_dialect.py +5 -0
  35. cartesia-2.0.2/src/cartesia/voices/types/localize_portuguese_dialect.py +5 -0
  36. cartesia-2.0.2/src/cartesia/voices/types/localize_spanish_dialect.py +5 -0
  37. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/localize_voice_request.py +16 -3
  38. cartesia-2.0.0b7/src/cartesia/voices/requests/localize_dialect.py +0 -6
  39. cartesia-2.0.0b7/src/cartesia/voices/types/localize_dialect.py +0 -6
  40. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/api_status/__init__.py +0 -0
  41. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/api_status/client.py +0 -0
  42. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/api_status/requests/__init__.py +0 -0
  43. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/api_status/requests/api_info.py +0 -0
  44. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/api_status/types/__init__.py +0 -0
  45. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/api_status/types/api_info.py +0 -0
  46. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/client.py +0 -0
  47. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/__init__.py +0 -0
  48. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/api_error.py +0 -0
  49. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/datetime_utils.py +0 -0
  50. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/file.py +0 -0
  51. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/http_client.py +0 -0
  52. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/jsonable_encoder.py +0 -0
  53. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/pagination.py +0 -0
  54. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/pydantic_utilities.py +0 -0
  55. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/query_encoder.py +0 -0
  56. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/remove_none_from_dict.py +0 -0
  57. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/request_options.py +0 -0
  58. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/core/serialization.py +0 -0
  59. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/__init__.py +0 -0
  60. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/requests/__init__.py +0 -0
  61. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/requests/create_dataset_request.py +0 -0
  62. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/requests/dataset.py +0 -0
  63. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/requests/dataset_file.py +0 -0
  64. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/requests/paginated_dataset_files.py +0 -0
  65. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/requests/paginated_datasets.py +0 -0
  66. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/types/__init__.py +0 -0
  67. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/types/create_dataset_request.py +0 -0
  68. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/types/dataset.py +0 -0
  69. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/types/dataset_file.py +0 -0
  70. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/types/file_purpose.py +0 -0
  71. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/types/paginated_dataset_files.py +0 -0
  72. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/datasets/types/paginated_datasets.py +0 -0
  73. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/embedding/__init__.py +0 -0
  74. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/embedding/types/__init__.py +0 -0
  75. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/embedding/types/embedding.py +0 -0
  76. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/environment.py +0 -0
  77. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/infill/__init__.py +0 -0
  78. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/infill/client.py +0 -0
  79. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/py.typed +0 -0
  80. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/__init__.py +0 -0
  81. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/__init__.py +0 -0
  82. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/cancel_context_request.py +0 -0
  83. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/controls.py +0 -0
  84. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/mp_3_output_format.py +0 -0
  85. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/output_format.py +0 -0
  86. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/phoneme_timestamps.py +0 -0
  87. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/raw_output_format.py +0 -0
  88. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/speed.py +0 -0
  89. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/tts_request_embedding_specifier.py +0 -0
  90. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/tts_request_id_specifier.py +0 -0
  91. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/tts_request_voice_specifier.py +0 -0
  92. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/wav_output_format.py +0 -0
  93. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_base_response.py +0 -0
  94. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_chunk_response.py +0 -0
  95. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_done_response.py +0 -0
  96. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_error_response.py +0 -0
  97. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_flush_done_response.py +0 -0
  98. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_phoneme_timestamps_response.py +0 -0
  99. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_raw_output_format.py +0 -0
  100. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_request.py +0 -0
  101. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_response.py +0 -0
  102. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_stream_options.py +0 -0
  103. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_timestamps_response.py +0 -0
  104. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/web_socket_tts_output.py +0 -0
  105. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/requests/word_timestamps.py +0 -0
  106. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/socket_client.py +0 -0
  107. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/__init__.py +0 -0
  108. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/cancel_context_request.py +0 -0
  109. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/context_id.py +0 -0
  110. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/controls.py +0 -0
  111. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/emotion.py +0 -0
  112. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/flush_id.py +0 -0
  113. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/mp_3_output_format.py +0 -0
  114. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/natural_specifier.py +0 -0
  115. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/numerical_specifier.py +0 -0
  116. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/output_format.py +0 -0
  117. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/phoneme_timestamps.py +0 -0
  118. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/raw_encoding.py +0 -0
  119. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/raw_output_format.py +0 -0
  120. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/speed.py +0 -0
  121. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/supported_language.py +0 -0
  122. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/tts_request_embedding_specifier.py +0 -0
  123. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/tts_request_id_specifier.py +0 -0
  124. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/tts_request_voice_specifier.py +0 -0
  125. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/wav_output_format.py +0 -0
  126. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_base_response.py +0 -0
  127. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_chunk_response.py +0 -0
  128. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_done_response.py +0 -0
  129. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_error_response.py +0 -0
  130. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_flush_done_response.py +0 -0
  131. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_phoneme_timestamps_response.py +0 -0
  132. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_raw_output_format.py +0 -0
  133. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_request.py +0 -0
  134. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_response.py +0 -0
  135. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_stream_options.py +0 -0
  136. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_timestamps_response.py +0 -0
  137. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/web_socket_tts_output.py +0 -0
  138. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/types/word_timestamps.py +0 -0
  139. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/utils/constants.py +0 -0
  140. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/utils/tts.py +0 -0
  141. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/tts/utils/types.py +0 -0
  142. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/version.py +0 -0
  143. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voice_changer/__init__.py +0 -0
  144. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voice_changer/client.py +0 -0
  145. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voice_changer/requests/__init__.py +0 -0
  146. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voice_changer/requests/streaming_response.py +0 -0
  147. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voice_changer/types/__init__.py +0 -0
  148. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voice_changer/types/output_format_container.py +0 -0
  149. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voice_changer/types/streaming_response.py +0 -0
  150. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/__init__.py +0 -0
  151. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/embedding_response.py +0 -0
  152. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/embedding_specifier.py +0 -0
  153. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/get_voices_response.py +0 -0
  154. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/id_specifier.py +0 -0
  155. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/mix_voice_specifier.py +0 -0
  156. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/mix_voices_request.py +0 -0
  157. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/update_voice_request.py +0 -0
  158. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/voice.py +0 -0
  159. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/requests/voice_metadata.py +0 -0
  160. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/base_voice_id.py +0 -0
  161. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/clone_mode.py +0 -0
  162. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/embedding_response.py +0 -0
  163. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/embedding_specifier.py +0 -0
  164. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/gender.py +0 -0
  165. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/gender_presentation.py +0 -0
  166. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/get_voices_response.py +0 -0
  167. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/id_specifier.py +0 -0
  168. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/localize_english_dialect.py +0 -0
  169. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/localize_target_language.py +0 -0
  170. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/mix_voice_specifier.py +0 -0
  171. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/mix_voices_request.py +0 -0
  172. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/update_voice_request.py +0 -0
  173. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/voice.py +0 -0
  174. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/voice_expand_options.py +0 -0
  175. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/voice_id.py +0 -0
  176. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/voice_metadata.py +0 -0
  177. {cartesia-2.0.0b7 → cartesia-2.0.2}/src/cartesia/voices/types/weight.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cartesia
3
- Version: 2.0.0b7
3
+ Version: 2.0.2
4
4
  Summary:
5
5
  Requires-Python: >=3.8,<4.0
6
6
  Classifier: Intended Audience :: Developers
@@ -47,53 +47,6 @@ Our complete API documentation can be found [on docs.cartesia.ai](https://docs.c
47
47
  pip install cartesia
48
48
  ```
49
49
 
50
- ## Reference
51
-
52
- A full reference for this library is available [here](./reference.md).
53
-
54
- ## Voices
55
-
56
- ```python
57
- from cartesia import Cartesia
58
- import os
59
-
60
- client = Cartesia(api_key=os.getenv("CARTESIA_API_KEY"))
61
-
62
- # Get all available voices
63
- voices = client.voices.list()
64
- print(voices)
65
-
66
- # Get a specific voice
67
- voice = client.voices.get(id="a0e99841-438c-4a64-b679-ae501e7d6091")
68
- print("The embedding for", voice.name, "is", voice.embedding)
69
-
70
- # Clone a voice using file data
71
- cloned_voice = client.voices.clone(
72
- clip=open("path/to/voice.wav", "rb"),
73
- name="Test cloned voice",
74
- language="en",
75
- mode="similarity", # or "stability"
76
- enhance=False, # use enhance=True to clean and denoise the cloning audio
77
- description="Test voice description"
78
- )
79
-
80
- # Mix voices together
81
- mixed_voice = client.voices.mix(
82
- voices=[
83
- {"id": "voice_id_1", "weight": 0.25},
84
- {"id": "voice_id_2", "weight": 0.75}
85
- ]
86
- )
87
-
88
- # Create a new voice from embedding
89
- new_voice = client.voices.create(
90
- name="Test Voice",
91
- description="Test voice description",
92
- embedding=[...], # List[float] with 192 dimensions
93
- language="en"
94
- )
95
- ```
96
-
97
50
  ## Usage
98
51
 
99
52
  Instantiate and use the client with the following:
@@ -112,10 +65,6 @@ client.tts.bytes(
112
65
  voice={
113
66
  "mode": "id",
114
67
  "id": "694f9389-aac1-45b6-b726-9d9369183238",
115
- "experimental_controls": {
116
- "speed": 0.5, # range between [-1.0, 1.0], or "slow", "fastest", etc.
117
- "emotion": ["positivity", "curiosity:low"] # list of emotions with optional intensity
118
- }
119
68
  },
120
69
  language="en",
121
70
  output_format={
@@ -176,7 +125,7 @@ except ApiError as e:
176
125
 
177
126
  ## Streaming
178
127
 
179
- The SDK supports streaming responses, as well, the response will be a generator that you can loop over.
128
+ The SDK supports streaming responses as well, returning a generator that you can iterate over with a `for ... in ...` loop:
180
129
 
181
130
  ```python
182
131
  from cartesia import Cartesia
@@ -215,7 +164,9 @@ for chunk in chunks:
215
164
  print(f"Received chunk of size: {len(chunk.data)}")
216
165
  ```
217
166
 
218
- ## WebSocket
167
+ ## WebSockets
168
+
169
+ For the lowest latency in advanced usecases (such as streaming in an LLM-generated transcript and streaming out audio), you should use our websockets client:
219
170
 
220
171
  ```python
221
172
  from cartesia import Cartesia
@@ -223,15 +174,10 @@ from cartesia.tts import TtsRequestEmbeddingSpecifierParams, OutputFormat_RawPar
223
174
  import pyaudio
224
175
  import os
225
176
 
226
- client = Cartesia(
227
- api_key=os.getenv("CARTESIA_API_KEY"),
228
- )
177
+ client = Cartesia(api_key=os.getenv("CARTESIA_API_KEY"))
229
178
  voice_id = "a0e99841-438c-4a64-b679-ae501e7d6091"
230
179
  transcript = "Hello! Welcome to Cartesia"
231
180
 
232
- # You can check out our models at https://docs.cartesia.ai/getting-started/available-models
233
- model_id = "sonic-2"
234
-
235
181
  p = pyaudio.PyAudio()
236
182
  rate = 22050
237
183
 
@@ -242,14 +188,14 @@ ws = client.tts.websocket()
242
188
 
243
189
  # Generate and stream audio using the websocket
244
190
  for output in ws.send(
245
- model_id=model_id,
191
+ model_id="sonic-2", # see: https://docs.cartesia.ai/getting-started/available-models
246
192
  transcript=transcript,
247
193
  voice={"id": voice_id},
248
194
  stream=True,
249
195
  output_format={
250
196
  "container": "raw",
251
197
  "encoding": "pcm_f32le",
252
- "sample_rate": 22050
198
+ "sample_rate": rate
253
199
  },
254
200
  ):
255
201
  buffer = output.audio
@@ -267,6 +213,40 @@ p.terminate()
267
213
  ws.close() # Close the websocket connection
268
214
  ```
269
215
 
216
+ ## Voices
217
+
218
+ List all available Voices with `client.voices.list`, which returns an iterable that automatically handles pagination:
219
+
220
+ ```python
221
+ from cartesia import Cartesia
222
+ import os
223
+
224
+ client = Cartesia(api_key=os.getenv("CARTESIA_API_KEY"))
225
+
226
+ # Get all available Voices
227
+ voices = client.voices.list()
228
+ for voice in voices:
229
+ print(voice)
230
+ ```
231
+
232
+ You can also get the complete metadata for a specific Voice, or make a new Voice by cloning from an audio sample:
233
+
234
+ ```python
235
+ # Get a specific Voice
236
+ voice = client.voices.get(id="a0e99841-438c-4a64-b679-ae501e7d6091")
237
+ print("The embedding for", voice.name, "is", voice.embedding)
238
+
239
+ # Clone a Voice using file data
240
+ cloned_voice = client.voices.clone(
241
+ clip=open("path/to/voice.wav", "rb"),
242
+ name="Test cloned voice",
243
+ language="en",
244
+ mode="similarity", # or "stability"
245
+ enhance=False, # use enhance=True to clean and denoise the cloning audio
246
+ description="Test voice description"
247
+ )
248
+ ```
249
+
270
250
  ## Requesting Timestamps
271
251
 
272
252
  ```python
@@ -290,7 +270,8 @@ async def main():
290
270
  "encoding": "pcm_f32le",
291
271
  "sample_rate": 44100
292
272
  },
293
- add_timestamps=True, # Enable word-level timestamps
273
+ add_timestamps=True, # Enable word-level timestamps
274
+ add_phoneme_timestamps=True, # Enable phonemized timestamps
294
275
  stream=True
295
276
  )
296
277
 
@@ -358,6 +339,26 @@ client.tts.bytes(..., request_options={
358
339
  })
359
340
  ```
360
341
 
342
+ ### Mixing voices and creating from embeddings
343
+
344
+ ```python
345
+ # Mix voices together
346
+ mixed_voice = client.voices.mix(
347
+ voices=[
348
+ {"id": "voice_id_1", "weight": 0.25},
349
+ {"id": "voice_id_2", "weight": 0.75}
350
+ ]
351
+ )
352
+
353
+ # Create a new voice from embedding
354
+ new_voice = client.voices.create(
355
+ name="Test Voice",
356
+ description="Test voice description",
357
+ embedding=[...], # List[float] with 192 dimensions
358
+ language="en"
359
+ )
360
+ ```
361
+
361
362
  ### Custom Client
362
363
 
363
364
  You can override the `httpx` client to customize it for your use-case. Some common use-cases include support for proxies
@@ -375,6 +376,10 @@ client = Cartesia(
375
376
  )
376
377
  ```
377
378
 
379
+ ## Reference
380
+
381
+ A full reference for this library is available [here](./reference.md).
382
+
378
383
  ## Contributing
379
384
 
380
385
  Note that most of this library is generated programmatically from
@@ -15,53 +15,6 @@ Our complete API documentation can be found [on docs.cartesia.ai](https://docs.c
15
15
  pip install cartesia
16
16
  ```
17
17
 
18
- ## Reference
19
-
20
- A full reference for this library is available [here](./reference.md).
21
-
22
- ## Voices
23
-
24
- ```python
25
- from cartesia import Cartesia
26
- import os
27
-
28
- client = Cartesia(api_key=os.getenv("CARTESIA_API_KEY"))
29
-
30
- # Get all available voices
31
- voices = client.voices.list()
32
- print(voices)
33
-
34
- # Get a specific voice
35
- voice = client.voices.get(id="a0e99841-438c-4a64-b679-ae501e7d6091")
36
- print("The embedding for", voice.name, "is", voice.embedding)
37
-
38
- # Clone a voice using file data
39
- cloned_voice = client.voices.clone(
40
- clip=open("path/to/voice.wav", "rb"),
41
- name="Test cloned voice",
42
- language="en",
43
- mode="similarity", # or "stability"
44
- enhance=False, # use enhance=True to clean and denoise the cloning audio
45
- description="Test voice description"
46
- )
47
-
48
- # Mix voices together
49
- mixed_voice = client.voices.mix(
50
- voices=[
51
- {"id": "voice_id_1", "weight": 0.25},
52
- {"id": "voice_id_2", "weight": 0.75}
53
- ]
54
- )
55
-
56
- # Create a new voice from embedding
57
- new_voice = client.voices.create(
58
- name="Test Voice",
59
- description="Test voice description",
60
- embedding=[...], # List[float] with 192 dimensions
61
- language="en"
62
- )
63
- ```
64
-
65
18
  ## Usage
66
19
 
67
20
  Instantiate and use the client with the following:
@@ -80,10 +33,6 @@ client.tts.bytes(
80
33
  voice={
81
34
  "mode": "id",
82
35
  "id": "694f9389-aac1-45b6-b726-9d9369183238",
83
- "experimental_controls": {
84
- "speed": 0.5, # range between [-1.0, 1.0], or "slow", "fastest", etc.
85
- "emotion": ["positivity", "curiosity:low"] # list of emotions with optional intensity
86
- }
87
36
  },
88
37
  language="en",
89
38
  output_format={
@@ -144,7 +93,7 @@ except ApiError as e:
144
93
 
145
94
  ## Streaming
146
95
 
147
- The SDK supports streaming responses, as well, the response will be a generator that you can loop over.
96
+ The SDK supports streaming responses as well, returning a generator that you can iterate over with a `for ... in ...` loop:
148
97
 
149
98
  ```python
150
99
  from cartesia import Cartesia
@@ -183,7 +132,9 @@ for chunk in chunks:
183
132
  print(f"Received chunk of size: {len(chunk.data)}")
184
133
  ```
185
134
 
186
- ## WebSocket
135
+ ## WebSockets
136
+
137
+ For the lowest latency in advanced usecases (such as streaming in an LLM-generated transcript and streaming out audio), you should use our websockets client:
187
138
 
188
139
  ```python
189
140
  from cartesia import Cartesia
@@ -191,15 +142,10 @@ from cartesia.tts import TtsRequestEmbeddingSpecifierParams, OutputFormat_RawPar
191
142
  import pyaudio
192
143
  import os
193
144
 
194
- client = Cartesia(
195
- api_key=os.getenv("CARTESIA_API_KEY"),
196
- )
145
+ client = Cartesia(api_key=os.getenv("CARTESIA_API_KEY"))
197
146
  voice_id = "a0e99841-438c-4a64-b679-ae501e7d6091"
198
147
  transcript = "Hello! Welcome to Cartesia"
199
148
 
200
- # You can check out our models at https://docs.cartesia.ai/getting-started/available-models
201
- model_id = "sonic-2"
202
-
203
149
  p = pyaudio.PyAudio()
204
150
  rate = 22050
205
151
 
@@ -210,14 +156,14 @@ ws = client.tts.websocket()
210
156
 
211
157
  # Generate and stream audio using the websocket
212
158
  for output in ws.send(
213
- model_id=model_id,
159
+ model_id="sonic-2", # see: https://docs.cartesia.ai/getting-started/available-models
214
160
  transcript=transcript,
215
161
  voice={"id": voice_id},
216
162
  stream=True,
217
163
  output_format={
218
164
  "container": "raw",
219
165
  "encoding": "pcm_f32le",
220
- "sample_rate": 22050
166
+ "sample_rate": rate
221
167
  },
222
168
  ):
223
169
  buffer = output.audio
@@ -235,6 +181,40 @@ p.terminate()
235
181
  ws.close() # Close the websocket connection
236
182
  ```
237
183
 
184
+ ## Voices
185
+
186
+ List all available Voices with `client.voices.list`, which returns an iterable that automatically handles pagination:
187
+
188
+ ```python
189
+ from cartesia import Cartesia
190
+ import os
191
+
192
+ client = Cartesia(api_key=os.getenv("CARTESIA_API_KEY"))
193
+
194
+ # Get all available Voices
195
+ voices = client.voices.list()
196
+ for voice in voices:
197
+ print(voice)
198
+ ```
199
+
200
+ You can also get the complete metadata for a specific Voice, or make a new Voice by cloning from an audio sample:
201
+
202
+ ```python
203
+ # Get a specific Voice
204
+ voice = client.voices.get(id="a0e99841-438c-4a64-b679-ae501e7d6091")
205
+ print("The embedding for", voice.name, "is", voice.embedding)
206
+
207
+ # Clone a Voice using file data
208
+ cloned_voice = client.voices.clone(
209
+ clip=open("path/to/voice.wav", "rb"),
210
+ name="Test cloned voice",
211
+ language="en",
212
+ mode="similarity", # or "stability"
213
+ enhance=False, # use enhance=True to clean and denoise the cloning audio
214
+ description="Test voice description"
215
+ )
216
+ ```
217
+
238
218
  ## Requesting Timestamps
239
219
 
240
220
  ```python
@@ -258,7 +238,8 @@ async def main():
258
238
  "encoding": "pcm_f32le",
259
239
  "sample_rate": 44100
260
240
  },
261
- add_timestamps=True, # Enable word-level timestamps
241
+ add_timestamps=True, # Enable word-level timestamps
242
+ add_phoneme_timestamps=True, # Enable phonemized timestamps
262
243
  stream=True
263
244
  )
264
245
 
@@ -326,6 +307,26 @@ client.tts.bytes(..., request_options={
326
307
  })
327
308
  ```
328
309
 
310
+ ### Mixing voices and creating from embeddings
311
+
312
+ ```python
313
+ # Mix voices together
314
+ mixed_voice = client.voices.mix(
315
+ voices=[
316
+ {"id": "voice_id_1", "weight": 0.25},
317
+ {"id": "voice_id_2", "weight": 0.75}
318
+ ]
319
+ )
320
+
321
+ # Create a new voice from embedding
322
+ new_voice = client.voices.create(
323
+ name="Test Voice",
324
+ description="Test voice description",
325
+ embedding=[...], # List[float] with 192 dimensions
326
+ language="en"
327
+ )
328
+ ```
329
+
329
330
  ### Custom Client
330
331
 
331
332
  You can override the `httpx` client to customize it for your use-case. Some common use-cases include support for proxies
@@ -343,6 +344,10 @@ client = Cartesia(
343
344
  )
344
345
  ```
345
346
 
347
+ ## Reference
348
+
349
+ A full reference for this library is available [here](./reference.md).
350
+
346
351
  ## Contributing
347
352
 
348
353
  Note that most of this library is generated programmatically from
@@ -3,7 +3,7 @@ name = "cartesia"
3
3
 
4
4
  [tool.poetry]
5
5
  name = "cartesia"
6
- version = "2.0.0b7"
6
+ version = "2.0.2"
7
7
  description = ""
8
8
  readme = "README.md"
9
9
  authors = []
@@ -1,7 +1,8 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
- from . import api_status, datasets, embedding, infill, tts, voice_changer, voices
3
+ from . import api_status, auth, datasets, embedding, infill, tts, voice_changer, voices
4
4
  from .api_status import ApiInfo, ApiInfoParams
5
+ from .auth import TokenGrant, TokenGrantParams, TokenRequest, TokenRequestParams, TokenResponse, TokenResponseParams
5
6
  from .client import AsyncCartesia, Cartesia
6
7
  from .datasets import (
7
8
  CreateDatasetRequest,
@@ -129,6 +130,9 @@ from .voices import (
129
130
  LocalizeDialect,
130
131
  LocalizeDialectParams,
131
132
  LocalizeEnglishDialect,
133
+ LocalizeFrenchDialect,
134
+ LocalizePortugueseDialect,
135
+ LocalizeSpanishDialect,
132
136
  LocalizeTargetLanguage,
133
137
  LocalizeVoiceRequest,
134
138
  LocalizeVoiceRequestParams,
@@ -187,6 +191,9 @@ __all__ = [
187
191
  "LocalizeDialect",
188
192
  "LocalizeDialectParams",
189
193
  "LocalizeEnglishDialect",
194
+ "LocalizeFrenchDialect",
195
+ "LocalizePortugueseDialect",
196
+ "LocalizeSpanishDialect",
190
197
  "LocalizeTargetLanguage",
191
198
  "LocalizeVoiceRequest",
192
199
  "LocalizeVoiceRequestParams",
@@ -227,6 +234,12 @@ __all__ = [
227
234
  "StreamingResponse_Error",
228
235
  "StreamingResponse_ErrorParams",
229
236
  "SupportedLanguage",
237
+ "TokenGrant",
238
+ "TokenGrantParams",
239
+ "TokenRequest",
240
+ "TokenRequestParams",
241
+ "TokenResponse",
242
+ "TokenResponseParams",
230
243
  "TtsRequest",
231
244
  "TtsRequestEmbeddingSpecifier",
232
245
  "TtsRequestEmbeddingSpecifierParams",
@@ -288,6 +301,7 @@ __all__ = [
288
301
  "WordTimestampsParams",
289
302
  "__version__",
290
303
  "api_status",
304
+ "auth",
291
305
  "datasets",
292
306
  "embedding",
293
307
  "infill",
@@ -0,0 +1,13 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from .types import TokenGrant, TokenRequest, TokenResponse
4
+ from .requests import TokenGrantParams, TokenRequestParams, TokenResponseParams
5
+
6
+ __all__ = [
7
+ "TokenGrant",
8
+ "TokenGrantParams",
9
+ "TokenRequest",
10
+ "TokenRequestParams",
11
+ "TokenResponse",
12
+ "TokenResponseParams",
13
+ ]
@@ -0,0 +1,159 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from ..core.client_wrapper import SyncClientWrapper
5
+ from .requests.token_grant import TokenGrantParams
6
+ from ..core.request_options import RequestOptions
7
+ from .types.token_response import TokenResponse
8
+ from ..core.serialization import convert_and_respect_annotation_metadata
9
+ from ..core.pydantic_utilities import parse_obj_as
10
+ from json.decoder import JSONDecodeError
11
+ from ..core.api_error import ApiError
12
+ from ..core.client_wrapper import AsyncClientWrapper
13
+
14
+ # this is used as the default value for optional parameters
15
+ OMIT = typing.cast(typing.Any, ...)
16
+
17
+
18
+ class AuthClient:
19
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
20
+ self._client_wrapper = client_wrapper
21
+
22
+ def access_token(
23
+ self,
24
+ *,
25
+ grants: TokenGrantParams,
26
+ expires_in: typing.Optional[int] = OMIT,
27
+ request_options: typing.Optional[RequestOptions] = None,
28
+ ) -> TokenResponse:
29
+ """
30
+ Generates a new Access Token for the client. These tokens are short-lived and should be used to make requests to the API from authenticated clients.
31
+
32
+ Parameters
33
+ ----------
34
+ grants : TokenGrantParams
35
+ The permissions to be granted via the token.
36
+
37
+ expires_in : typing.Optional[int]
38
+ The number of seconds the token will be valid for since the time of generation. The maximum is 1 hour (3600 seconds).
39
+
40
+ request_options : typing.Optional[RequestOptions]
41
+ Request-specific configuration.
42
+
43
+ Returns
44
+ -------
45
+ TokenResponse
46
+
47
+ Examples
48
+ --------
49
+ from cartesia import Cartesia
50
+
51
+ client = Cartesia(
52
+ api_key="YOUR_API_KEY",
53
+ )
54
+ client.auth.access_token(
55
+ grants={"tts": True},
56
+ expires_in=60,
57
+ )
58
+ """
59
+ _response = self._client_wrapper.httpx_client.request(
60
+ "access-token",
61
+ method="POST",
62
+ json={
63
+ "grants": convert_and_respect_annotation_metadata(
64
+ object_=grants, annotation=TokenGrantParams, direction="write"
65
+ ),
66
+ "expires_in": expires_in,
67
+ },
68
+ request_options=request_options,
69
+ omit=OMIT,
70
+ )
71
+ try:
72
+ if 200 <= _response.status_code < 300:
73
+ return typing.cast(
74
+ TokenResponse,
75
+ parse_obj_as(
76
+ type_=TokenResponse, # type: ignore
77
+ object_=_response.json(),
78
+ ),
79
+ )
80
+ _response_json = _response.json()
81
+ except JSONDecodeError:
82
+ raise ApiError(status_code=_response.status_code, body=_response.text)
83
+ raise ApiError(status_code=_response.status_code, body=_response_json)
84
+
85
+
86
+ class AsyncAuthClient:
87
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
88
+ self._client_wrapper = client_wrapper
89
+
90
+ async def access_token(
91
+ self,
92
+ *,
93
+ grants: TokenGrantParams,
94
+ expires_in: typing.Optional[int] = OMIT,
95
+ request_options: typing.Optional[RequestOptions] = None,
96
+ ) -> TokenResponse:
97
+ """
98
+ Generates a new Access Token for the client. These tokens are short-lived and should be used to make requests to the API from authenticated clients.
99
+
100
+ Parameters
101
+ ----------
102
+ grants : TokenGrantParams
103
+ The permissions to be granted via the token.
104
+
105
+ expires_in : typing.Optional[int]
106
+ The number of seconds the token will be valid for since the time of generation. The maximum is 1 hour (3600 seconds).
107
+
108
+ request_options : typing.Optional[RequestOptions]
109
+ Request-specific configuration.
110
+
111
+ Returns
112
+ -------
113
+ TokenResponse
114
+
115
+ Examples
116
+ --------
117
+ import asyncio
118
+
119
+ from cartesia import AsyncCartesia
120
+
121
+ client = AsyncCartesia(
122
+ api_key="YOUR_API_KEY",
123
+ )
124
+
125
+
126
+ async def main() -> None:
127
+ await client.auth.access_token(
128
+ grants={"tts": True},
129
+ expires_in=60,
130
+ )
131
+
132
+
133
+ asyncio.run(main())
134
+ """
135
+ _response = await self._client_wrapper.httpx_client.request(
136
+ "access-token",
137
+ method="POST",
138
+ json={
139
+ "grants": convert_and_respect_annotation_metadata(
140
+ object_=grants, annotation=TokenGrantParams, direction="write"
141
+ ),
142
+ "expires_in": expires_in,
143
+ },
144
+ request_options=request_options,
145
+ omit=OMIT,
146
+ )
147
+ try:
148
+ if 200 <= _response.status_code < 300:
149
+ return typing.cast(
150
+ TokenResponse,
151
+ parse_obj_as(
152
+ type_=TokenResponse, # type: ignore
153
+ object_=_response.json(),
154
+ ),
155
+ )
156
+ _response_json = _response.json()
157
+ except JSONDecodeError:
158
+ raise ApiError(status_code=_response.status_code, body=_response.text)
159
+ raise ApiError(status_code=_response.status_code, body=_response_json)
@@ -0,0 +1,7 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from .token_grant import TokenGrantParams
4
+ from .token_request import TokenRequestParams
5
+ from .token_response import TokenResponseParams
6
+
7
+ __all__ = ["TokenGrantParams", "TokenRequestParams", "TokenResponseParams"]
@@ -0,0 +1,10 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing_extensions
4
+
5
+
6
+ class TokenGrantParams(typing_extensions.TypedDict):
7
+ tts: bool
8
+ """
9
+ The `tts` grant allows the token to be used to access any TTS endpoint.
10
+ """
@@ -0,0 +1,17 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing_extensions
4
+ from .token_grant import TokenGrantParams
5
+ import typing_extensions
6
+
7
+
8
+ class TokenRequestParams(typing_extensions.TypedDict):
9
+ grants: TokenGrantParams
10
+ """
11
+ The permissions to be granted via the token.
12
+ """
13
+
14
+ expires_in: typing_extensions.NotRequired[int]
15
+ """
16
+ The number of seconds the token will be valid for since the time of generation. The maximum is 1 hour (3600 seconds).
17
+ """
@@ -0,0 +1,10 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing_extensions
4
+
5
+
6
+ class TokenResponseParams(typing_extensions.TypedDict):
7
+ token: str
8
+ """
9
+ The generated Access Token.
10
+ """