murf 1.0.2__py3-none-any.whl → 1.1.1__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.

Potentially problematic release.


This version of murf might be problematic. Click here for more details.

Files changed (36) hide show
  1. murf/__init__.py +28 -1
  2. murf/base_client.py +4 -0
  3. murf/client.py +3 -1
  4. murf/core/client_wrapper.py +1 -1
  5. murf/dubbing/__init__.py +14 -0
  6. murf/dubbing/client.py +26 -0
  7. murf/dubbing/jobs/__init__.py +5 -0
  8. murf/dubbing/jobs/client.py +712 -0
  9. murf/dubbing/jobs/types/__init__.py +6 -0
  10. murf/dubbing/jobs/types/jobs_create_request_priority.py +5 -0
  11. murf/dubbing/jobs/types/jobs_create_with_project_id_request_priority.py +5 -0
  12. murf/dubbing/languages/__init__.py +2 -0
  13. murf/dubbing/languages/client.py +369 -0
  14. murf/dubbing/projects/__init__.py +5 -0
  15. murf/dubbing/projects/client.py +682 -0
  16. murf/dubbing/projects/types/__init__.py +5 -0
  17. murf/dubbing/projects/types/api_create_project_request_dubbing_type.py +5 -0
  18. murf/dubbing_client.py +120 -0
  19. murf/types/__init__.py +24 -0
  20. murf/types/api_job_response.py +53 -0
  21. murf/types/api_job_response_dubbing_type.py +5 -0
  22. murf/types/api_job_response_priority.py +5 -0
  23. murf/types/api_project_response.py +44 -0
  24. murf/types/api_project_response_dubbing_type.py +5 -0
  25. murf/types/dub_api_detail_response.py +23 -0
  26. murf/types/dub_job_status_response.py +39 -0
  27. murf/types/form_data_content_disposition.py +31 -0
  28. murf/types/group_api_project_response.py +24 -0
  29. murf/types/locale_response.py +25 -0
  30. murf/types/locale_response_supports_item.py +5 -0
  31. murf/types/source_locale_response.py +20 -0
  32. {murf-1.0.2.dist-info → murf-1.1.1.dist-info}/METADATA +65 -15
  33. murf-1.1.1.dist-info/RECORD +70 -0
  34. murf-1.0.2.dist-info/RECORD +0 -44
  35. {murf-1.0.2.dist-info → murf-1.1.1.dist-info}/LICENSE +0 -0
  36. {murf-1.0.2.dist-info → murf-1.1.1.dist-info}/WHEEL +0 -0
murf/dubbing_client.py ADDED
@@ -0,0 +1,120 @@
1
+ from .base_client import BaseClient, AsyncBaseClient
2
+ from .environment import MurfEnvironment
3
+ import typing
4
+ import os
5
+ import httpx
6
+
7
+ class MurfDub(BaseClient):
8
+ """
9
+ Use this class to access the different functions within the SDK. You can instantiate any number of clients with different configuration that will propagate to these functions.
10
+
11
+ Parameters
12
+ ----------
13
+ base_url : typing.Optional[str]
14
+ The base url to use for requests from the client.
15
+
16
+ environment : MurfEnvironment
17
+ The environment to use for requests from the client. from .environment import MurfEnvironment
18
+
19
+
20
+
21
+ Defaults to MurfEnvironment.DEFAULT
22
+
23
+
24
+
25
+ api_key : typing.Optional[str]
26
+ timeout : typing.Optional[float]
27
+ The timeout to be used, in seconds, for requests. By default the timeout is 60 seconds, unless a custom httpx client is used, in which case this default is not enforced.
28
+
29
+ follow_redirects : typing.Optional[bool]
30
+ Whether the default httpx client follows redirects or not, this is irrelevant if a custom httpx client is passed in.
31
+
32
+ httpx_client : typing.Optional[httpx.Client]
33
+ The httpx client to use for making requests, a preconfigured client is used by default, however this is useful should you want to pass in any custom httpx configuration.
34
+
35
+ Examples
36
+ --------
37
+ from murf import MurfDub
38
+
39
+ client = MurfDub(
40
+ api_key="YOUR_API_KEY",
41
+ )
42
+ """
43
+
44
+ def __init__(
45
+ self,
46
+ *,
47
+ base_url: typing.Optional[str] = None,
48
+ environment: MurfEnvironment = MurfEnvironment.DEFAULT,
49
+ api_key: typing.Optional[str] = os.getenv("MURFDUB_API_KEY"),
50
+ timeout: typing.Optional[float] = 60,
51
+ follow_redirects: typing.Optional[bool] = True,
52
+ httpx_client: typing.Optional[httpx.Client] = None,
53
+ ):
54
+ super().__init__(
55
+ base_url=base_url,
56
+ environment=environment,
57
+ api_key=api_key,
58
+ timeout=timeout,
59
+ follow_redirects=follow_redirects,
60
+ httpx_client=httpx_client
61
+ )
62
+ self.text_to_speech = None # type: ignore
63
+
64
+
65
+ class AsyncMurfDub(AsyncBaseClient):
66
+ """
67
+ Use this class to access the different functions within the SDK. You can instantiate any number of clients with different configuration that will propagate to these functions.
68
+
69
+ Parameters
70
+ ----------
71
+ base_url : typing.Optional[str]
72
+ The base url to use for requests from the client.
73
+
74
+ environment : MurfEnvironment
75
+ The environment to use for requests from the client. from .environment import MurfEnvironment
76
+
77
+
78
+
79
+ Defaults to MurfEnvironment.DEFAULT
80
+
81
+
82
+
83
+ api_key : typing.Optional[str]
84
+ timeout : typing.Optional[float]
85
+ The timeout to be used, in seconds, for requests. By default the timeout is 60 seconds, unless a custom httpx client is used, in which case this default is not enforced.
86
+
87
+ follow_redirects : typing.Optional[bool]
88
+ Whether the default httpx client follows redirects or not, this is irrelevant if a custom httpx client is passed in.
89
+
90
+ httpx_client : typing.Optional[httpx.AsyncClient]
91
+ The httpx client to use for making requests, a preconfigured client is used by default, however this is useful should you want to pass in any custom httpx configuration.
92
+
93
+ Examples
94
+ --------
95
+ from murf import AsyncMurfDub
96
+
97
+ client = AsyncMurfDub(
98
+ api_key="YOUR_API_KEY",
99
+ )
100
+ """
101
+
102
+ def __init__(
103
+ self,
104
+ *,
105
+ base_url: typing.Optional[str] = None,
106
+ environment: MurfEnvironment = MurfEnvironment.DEFAULT,
107
+ api_key: typing.Optional[str] = os.getenv("MURFDUB_API_KEY"),
108
+ timeout: typing.Optional[float] = 60,
109
+ follow_redirects: typing.Optional[bool] = True,
110
+ httpx_client: typing.Optional[httpx.AsyncClient] = None,
111
+ ):
112
+ super().__init__(
113
+ base_url=base_url,
114
+ environment=environment,
115
+ api_key=api_key,
116
+ timeout=timeout,
117
+ follow_redirects=follow_redirects,
118
+ httpx_client=httpx_client
119
+ )
120
+ self.text_to_speech = None # type: ignore
murf/types/__init__.py CHANGED
@@ -1,21 +1,45 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
+ from .api_job_response import ApiJobResponse
4
+ from .api_job_response_dubbing_type import ApiJobResponseDubbingType
5
+ from .api_job_response_priority import ApiJobResponsePriority
6
+ from .api_project_response import ApiProjectResponse
7
+ from .api_project_response_dubbing_type import ApiProjectResponseDubbingType
3
8
  from .api_voice import ApiVoice
4
9
  from .api_voice_gender import ApiVoiceGender
5
10
  from .auth_token_response import AuthTokenResponse
11
+ from .dub_api_detail_response import DubApiDetailResponse
12
+ from .dub_job_status_response import DubJobStatusResponse
13
+ from .form_data_content_disposition import FormDataContentDisposition
6
14
  from .generate_speech_response import GenerateSpeechResponse
15
+ from .group_api_project_response import GroupApiProjectResponse
16
+ from .locale_response import LocaleResponse
17
+ from .locale_response_supports_item import LocaleResponseSupportsItem
7
18
  from .pronunciation_detail import PronunciationDetail
8
19
  from .pronunciation_detail_type import PronunciationDetailType
20
+ from .source_locale_response import SourceLocaleResponse
9
21
  from .style_details import StyleDetails
10
22
  from .word_duration import WordDuration
11
23
 
12
24
  __all__ = [
25
+ "ApiJobResponse",
26
+ "ApiJobResponseDubbingType",
27
+ "ApiJobResponsePriority",
28
+ "ApiProjectResponse",
29
+ "ApiProjectResponseDubbingType",
13
30
  "ApiVoice",
14
31
  "ApiVoiceGender",
15
32
  "AuthTokenResponse",
33
+ "DubApiDetailResponse",
34
+ "DubJobStatusResponse",
35
+ "FormDataContentDisposition",
16
36
  "GenerateSpeechResponse",
37
+ "GroupApiProjectResponse",
38
+ "LocaleResponse",
39
+ "LocaleResponseSupportsItem",
17
40
  "PronunciationDetail",
18
41
  "PronunciationDetailType",
42
+ "SourceLocaleResponse",
19
43
  "StyleDetails",
20
44
  "WordDuration",
21
45
  ]
@@ -0,0 +1,53 @@
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 .api_job_response_dubbing_type import ApiJobResponseDubbingType
6
+ import pydantic
7
+ from .api_job_response_priority import ApiJobResponsePriority
8
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2
9
+
10
+
11
+ class ApiJobResponse(UniversalBaseModel):
12
+ file_url: typing.Optional[str] = None
13
+ dubbing_type: ApiJobResponseDubbingType = pydantic.Field()
14
+ """
15
+ Dubbing Type
16
+ """
17
+
18
+ webhook_url: typing.Optional[str] = None
19
+ file_name: str = pydantic.Field()
20
+ """
21
+ Your Uploaded File Name
22
+ """
23
+
24
+ priority: ApiJobResponsePriority = pydantic.Field()
25
+ """
26
+ Priority of the job. Allowed values: LOW, NORMAL, HIGH
27
+ """
28
+
29
+ source_locale: typing.Optional[str] = pydantic.Field(default=None)
30
+ """
31
+ Source locale
32
+ """
33
+
34
+ job_id: str = pydantic.Field()
35
+ """
36
+ Your Job Id
37
+ """
38
+
39
+ target_locales: typing.List[str] = pydantic.Field()
40
+ """
41
+ List of target locales
42
+ """
43
+
44
+ warning: typing.Optional[str] = None
45
+
46
+ if IS_PYDANTIC_V2:
47
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
48
+ else:
49
+
50
+ class Config:
51
+ frozen = True
52
+ smart_union = True
53
+ extra = pydantic.Extra.allow
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ ApiJobResponseDubbingType = typing.Union[typing.Literal["AUTOMATED", "QA"], typing.Any]
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ ApiJobResponsePriority = typing.Union[typing.Literal["LOW", "NORMAL", "HIGH"], typing.Any]
@@ -0,0 +1,44 @@
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 .api_project_response_dubbing_type import ApiProjectResponseDubbingType
7
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2
8
+
9
+
10
+ class ApiProjectResponse(UniversalBaseModel):
11
+ project_id: str = pydantic.Field()
12
+ """
13
+ Your Project Id
14
+ """
15
+
16
+ name: typing.Optional[str] = pydantic.Field(default=None)
17
+ """
18
+ Project Name
19
+ """
20
+
21
+ description: typing.Optional[str] = None
22
+ source_locale: typing.Optional[str] = pydantic.Field(default=None)
23
+ """
24
+ Source Locale
25
+ """
26
+
27
+ dubbing_type: ApiProjectResponseDubbingType = pydantic.Field()
28
+ """
29
+ Dubbing Type
30
+ """
31
+
32
+ target_locales: typing.List[str] = pydantic.Field()
33
+ """
34
+ List of target locales
35
+ """
36
+
37
+ if IS_PYDANTIC_V2:
38
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
39
+ else:
40
+
41
+ class Config:
42
+ frozen = True
43
+ smart_union = True
44
+ extra = pydantic.Extra.allow
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ ApiProjectResponseDubbingType = typing.Union[typing.Literal["AUTOMATED", "QA"], typing.Any]
@@ -0,0 +1,23 @@
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 DubApiDetailResponse(UniversalBaseModel):
10
+ locale: typing.Optional[str] = None
11
+ status: typing.Optional[str] = None
12
+ error_message: typing.Optional[str] = None
13
+ download_url: typing.Optional[str] = None
14
+ download_srt_url: typing.Optional[str] = None
15
+
16
+ if IS_PYDANTIC_V2:
17
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
18
+ else:
19
+
20
+ class Config:
21
+ frozen = True
22
+ smart_union = True
23
+ extra = pydantic.Extra.allow
@@ -0,0 +1,39 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ..core.pydantic_utilities import UniversalBaseModel
4
+ import typing
5
+ import pydantic
6
+ from .dub_api_detail_response import DubApiDetailResponse
7
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2
8
+
9
+
10
+ class DubJobStatusResponse(UniversalBaseModel):
11
+ project_id: typing.Optional[str] = pydantic.Field(default=None)
12
+ """
13
+ Your Project Id
14
+ """
15
+
16
+ job_id: str = pydantic.Field()
17
+ """
18
+ Your Job Id
19
+ """
20
+
21
+ status: str = pydantic.Field()
22
+ """
23
+ Your Job Status
24
+ """
25
+
26
+ download_details: typing.Optional[typing.List[DubApiDetailResponse]] = None
27
+ credits_used: typing.Optional[int] = None
28
+ credits_remaining: typing.Optional[int] = None
29
+ failure_reason: typing.Optional[str] = None
30
+ failure_code: typing.Optional[str] = None
31
+
32
+ if IS_PYDANTIC_V2:
33
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
34
+ else:
35
+
36
+ class Config:
37
+ frozen = True
38
+ smart_union = True
39
+ extra = pydantic.Extra.allow
@@ -0,0 +1,31 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ..core.pydantic_utilities import UniversalBaseModel
4
+ import typing
5
+ import typing_extensions
6
+ from ..core.serialization import FieldMetadata
7
+ import datetime as dt
8
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2
9
+ import pydantic
10
+
11
+
12
+ class FormDataContentDisposition(UniversalBaseModel):
13
+ type: typing.Optional[str] = None
14
+ parameters: typing.Optional[typing.Dict[str, str]] = None
15
+ file_name: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="fileName")] = None
16
+ creation_date: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="creationDate")] = None
17
+ modification_date: typing_extensions.Annotated[
18
+ typing.Optional[dt.datetime], FieldMetadata(alias="modificationDate")
19
+ ] = None
20
+ read_date: typing_extensions.Annotated[typing.Optional[dt.datetime], FieldMetadata(alias="readDate")] = None
21
+ size: typing.Optional[int] = None
22
+ name: typing.Optional[str] = None
23
+
24
+ if IS_PYDANTIC_V2:
25
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
26
+ else:
27
+
28
+ class Config:
29
+ frozen = True
30
+ smart_union = True
31
+ extra = pydantic.Extra.allow
@@ -0,0 +1,24 @@
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 .api_project_response import ApiProjectResponse
6
+ import pydantic
7
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2
8
+
9
+
10
+ class GroupApiProjectResponse(UniversalBaseModel):
11
+ next: typing.Optional[str] = None
12
+ projects: typing.List[ApiProjectResponse] = pydantic.Field()
13
+ """
14
+ List of Projects
15
+ """
16
+
17
+ if IS_PYDANTIC_V2:
18
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
19
+ else:
20
+
21
+ class Config:
22
+ frozen = True
23
+ smart_union = True
24
+ extra = pydantic.Extra.allow
@@ -0,0 +1,25 @@
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 .locale_response_supports_item import LocaleResponseSupportsItem
6
+ import pydantic
7
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2
8
+
9
+
10
+ class LocaleResponse(UniversalBaseModel):
11
+ locale: str
12
+ language: str
13
+ supports: typing.List[LocaleResponseSupportsItem] = pydantic.Field()
14
+ """
15
+ Dubbing Type supported by locale
16
+ """
17
+
18
+ if IS_PYDANTIC_V2:
19
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
20
+ else:
21
+
22
+ class Config:
23
+ frozen = True
24
+ smart_union = True
25
+ extra = pydantic.Extra.allow
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ LocaleResponseSupportsItem = typing.Union[typing.Literal["AUTOMATED", "QA"], typing.Any]
@@ -0,0 +1,20 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ..core.pydantic_utilities import UniversalBaseModel
4
+ from ..core.pydantic_utilities import IS_PYDANTIC_V2
5
+ import typing
6
+ import pydantic
7
+
8
+
9
+ class SourceLocaleResponse(UniversalBaseModel):
10
+ locale: str
11
+ language: str
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: murf
3
- Version: 1.0.2
3
+ Version: 1.1.1
4
4
  Summary:
5
5
  Requires-Python: >=3.8,<4.0
6
6
  Classifier: Intended Audience :: Developers
@@ -24,26 +24,49 @@ Requires-Dist: pydantic-core (>=2.18.2,<3.0.0)
24
24
  Requires-Dist: typing_extensions (>=4.0.0)
25
25
  Description-Content-Type: text/markdown
26
26
 
27
- # Murf Python Library
27
+ # Murf Python SDK
28
+
29
+ ![Murf AI Logo](https://murf.ai/public-assets/home/Murf_Logo.png)
28
30
 
29
31
  [![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-Built%20with%20Fern-brightgreen)](https://buildwithfern.com?utm_source=github&utm_medium=github&utm_campaign=readme&utm_source=https%3A%2F%2Fgithub.com%2Fmurf-ai%2Fmurf-python-sdk)
30
32
  [![pypi](https://img.shields.io/pypi/v/murf)](https://pypi.python.org/pypi/murf)
33
+ [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/gist/devgeetech-murf/bbe2c7eb01433f4a151f0fd2be23b1c8/murf-python-sdk.ipynb)
34
+
35
+ ## Table of Contents
36
+
37
+ - [Overview](#overview)
38
+ - [Installation](#installation)
39
+ - [Getting Started](#getting-started)
40
+ - [Features](#features)
41
+ - [Asynchronous Usage](#async-client)
42
+ - [Exception Handling](#exception-handling)
43
+ - [Advanced Configuration](#advanced)
44
+ - [Contributing](#contributing)
45
+ - [License](#license)
46
+
47
+ ---
48
+
49
+ ## Overview
50
+
51
+ The Murf Python SDK offers seamless integration with the [Murf AI](https://murf.ai/) [text-to-speech software](https://murf.ai/text-to-speech), enabling developers and creators to convert text into lifelike speech effortlessly. With over 130 natural-sounding voices across 13+ languages and 20+ speaking styles, Murf provides unparalleled speech customization for a wide range of applications. The SDK is designed for both synchronous and asynchronous workflows, featuring robust error handling, advanced configuration options, and support for real-time applications.
31
52
 
32
- The Murf Python library provides convenient access to the Murf API from Python.
53
+ ---
33
54
 
34
55
  ## Installation
35
56
 
36
- ```sh
57
+ Check out the [HTTP API documentation](https://murf.ai/api/docs/introduction/quickstart).
58
+
59
+ Install the SDK using pip:
60
+
61
+ ```bash
37
62
  pip install murf
38
63
  ```
39
64
 
40
- ## Reference
41
-
42
- A full reference for this library is available [here](./reference.md).
65
+ ---
43
66
 
44
- ## Usage
67
+ ## Getting Started
45
68
 
46
- Instantiate and use the client with the following:
69
+ Here's a quick example to get you started with the Murf SDK:
47
70
 
48
71
  ```python
49
72
  from murf import Murf
@@ -59,6 +82,25 @@ client.text_to_speech.generate(
59
82
  )
60
83
  ```
61
84
 
85
+ For more detailed information, refer to the [official documentation](https://murf.ai/api/docs/introduction/quickstart).
86
+
87
+ ---
88
+
89
+ ## Features
90
+
91
+ - **Text-to-Speech Conversion:** Transform text into natural-sounding speech.
92
+ - **Multilingual Support:** Access voices in over 13 languages, including English, French, German, Spanish, Italian, Hindi, Portuguese, Dutch, Korean, Chinese (Mandarin), Bengali, Tamil, and Polish.
93
+
94
+ ![Murf AI Languages](https://murf.ai/public-assets/home/Murf_Lang.png)
95
+
96
+ - **Multiple Voice Styles:** Choose from 20+ speaking styles to suit your application's needs.
97
+ - **Advanced Voice Customization:** Adjust parameters like pitch, speed, pauses, and pronunciation for optimal output. Fine-grained controls let you tailor the voice output to match your specific requirements.
98
+ - **Multiple Audio Formats:** Generate audio in various formats (e.g., MP3, WAV) with configurable sample rates for optimal quality.
99
+ - **Real-Time Processing:** Benefit from asynchronous API calls that support non-blocking, real-time audio generation and streaming scenarios.
100
+
101
+
102
+ ---
103
+
62
104
  ## Async Client
63
105
 
64
106
  The SDK also exports an `async` client so that you can make non-blocking calls to our API.
@@ -85,6 +127,8 @@ async def main() -> None:
85
127
  asyncio.run(main())
86
128
  ```
87
129
 
130
+ ---
131
+
88
132
  ## Exception Handling
89
133
 
90
134
  When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error
@@ -100,6 +144,8 @@ except ApiError as e:
100
144
  print(e.body)
101
145
  ```
102
146
 
147
+ ---
148
+
103
149
  ## Advanced
104
150
 
105
151
  ### Retries
@@ -159,13 +205,17 @@ client = Murf(
159
205
  )
160
206
  ```
161
207
 
208
+ ---
209
+
162
210
  ## Contributing
163
211
 
164
- While we value open-source contributions to this SDK, this library is generated programmatically.
165
- Additions made directly to this library would have to be moved over to our generation code,
166
- otherwise they would be overwritten upon the next generated release. Feel free to open a PR as
167
- a proof of concept, but know that we will not be able to merge it as-is. We suggest opening
168
- an issue first to discuss with us!
212
+ We welcome contributions to enhance the Murf Python SDK. Please note that this library is generated programmatically, so direct modifications may be overwritten. We suggest opening an issue first to discuss your ideas or improvements. Contributions to the documentation are especially appreciated! For any support queries email to support@murf.ai
213
+
214
+ ---
215
+
216
+ ## License
217
+
218
+ Murf Python SDK is released under the [MIT License](LICENSE).
169
219
 
170
- On the other hand, contributions to the README are always very welcome!
220
+ ---
171
221
 
@@ -0,0 +1,70 @@
1
+ murf/__init__.py,sha256=IepqxLmdc9lP3m0ZnupKAhEf_h8zYflsnYBBp38nzYY,1903
2
+ murf/auth/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
3
+ murf/auth/client.py,sha256=mXUOPNju_oGpemo5yb-psqdru7b409R-smTw9heBh54,6118
4
+ murf/base_client.py,sha256=6c3P8YIxMWr-VDE8e3DTEj8SydR9ij9KD0gtyyj9I-4,5839
5
+ murf/client.py,sha256=sE8Ob-pPnAIpHwxyvCpYOgheNsjH5DwD_ei__8il5Yo,4109
6
+ murf/core/__init__.py,sha256=SQ85PF84B9MuKnBwHNHWemSGuy-g_515gFYNFhvEE0I,1438
7
+ murf/core/api_error.py,sha256=RE8LELok2QCjABadECTvtDp7qejA1VmINCh6TbqPwSE,426
8
+ murf/core/client_wrapper.py,sha256=wBwQwEOUORKDXvwMzf6Fm1oUNd-HjeU9380N2i3MAIo,1995
9
+ murf/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
10
+ murf/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
11
+ murf/core/http_client.py,sha256=siUQ6UV0ARZALlxubqWSSAAPC9B4VW8y6MGlHStfaeo,19552
12
+ murf/core/jsonable_encoder.py,sha256=qaF1gtgH-kQZb4kJskETwcCsOPUof-NnYVdszHkb-dM,3656
13
+ murf/core/pydantic_utilities.py,sha256=Pj_AIcjRR-xc28URvV4t2XssDPjLvpN6HAcsY3MVLRM,11973
14
+ murf/core/query_encoder.py,sha256=ekulqNd0j8TgD7ox-Qbz7liqX8-KP9blvT9DsRCenYM,2144
15
+ murf/core/remove_none_from_dict.py,sha256=EU9SGgYidWq7SexuJbNs4-PZ-5Bl3Vppd864mS6vQZw,342
16
+ murf/core/request_options.py,sha256=h0QUNCFVdCW_7GclVySCAY2w4NhtXVBUCmHgmzaxpcg,1681
17
+ murf/core/serialization.py,sha256=D9h_t-RQON3-CHWs1C4ESY9B-Yd5d-l5lnTLb_X896g,9601
18
+ murf/dubbing/__init__.py,sha256=nyJUo0t4Z_4LyOGqEQIUwsKcOGDvYn9kQueQ27lwaos,427
19
+ murf/dubbing/client.py,sha256=MjhDQHdZdAnuSmlz-6O2uSIFpd12cG62KDdMdarPXXo,1164
20
+ murf/dubbing/jobs/__init__.py,sha256=tCnld9WPopucbecyb-MqLCmND-I8TZUOgNhlbsHjgIo,233
21
+ murf/dubbing/jobs/client.py,sha256=zLrnB03yEXAtH33Een9gCWU8hAiz2711ahgfTCpV4fM,24364
22
+ murf/dubbing/jobs/types/__init__.py,sha256=AmEepTMwyEn2mMDgFB3RD--Xfw5EN7ppC-dLbMA-iQk,313
23
+ murf/dubbing/jobs/types/jobs_create_request_priority.py,sha256=Z_6ojVLfhFtvBk8d6xLBx55NeDb7dHW2SrTICjMLk3E,174
24
+ murf/dubbing/jobs/types/jobs_create_with_project_id_request_priority.py,sha256=G_wLjL3kUZLhr1Z7wP3DRiwtEMHsOgSUf_ZSlgJlrJw,187
25
+ murf/dubbing/languages/__init__.py,sha256=FTtvy8EDg9nNNg9WCatVgKTRYV8-_v1roeGPAKoa_pw,65
26
+ murf/dubbing/languages/client.py,sha256=4rwg8mzD44fkzoh-6kxAxKad5rSdmhtr6msHzoInVL4,13353
27
+ murf/dubbing/projects/__init__.py,sha256=fNaAsaAco0NlcwZdDcT8yD5Ihe9G6mOdGI5u_bQgtn4,169
28
+ murf/dubbing/projects/client.py,sha256=f3qscfYlyZnVSxNqhactECe79KUflCr0qeb5vZ4TMcs,23090
29
+ murf/dubbing/projects/types/__init__.py,sha256=JGWNZtycIzMF9Fkro47ZhMDtrHDK71jrbiulgVd8N4c,203
30
+ murf/dubbing/projects/types/api_create_project_request_dubbing_type.py,sha256=tcXNZRPd_7cYdkJYKekwmc2or9AAXGpf8kEXu31f094,177
31
+ murf/dubbing_client.py,sha256=BRdYiR4cdrpx27wGPdVI9aKtErLJBerwQJk-TJNjJPo,4147
32
+ murf/environment.py,sha256=UJ2CmhHv79L09Ug4ygReh0SKr4sS0OUcAXja9u_lQ4U,149
33
+ murf/errors/__init__.py,sha256=Y88-JEjEvw-fav3aqMuQEKFf54uKkKUYELJ0yQNQ710,552
34
+ murf/errors/bad_request_error.py,sha256=_EbO8mWqN9kFZPvIap8qa1lL_EWkRcsZe1HKV9GDWJY,264
35
+ murf/errors/forbidden_error.py,sha256=QO1kKlhClAPES6zsEK7g9pglWnxn3KWaOCAawWOg6Aw,263
36
+ murf/errors/internal_server_error.py,sha256=8USCagXyJJ1MOm9snpcXIUt6eNXvrd_aq7Gfcu1vlOI,268
37
+ murf/errors/payment_required_error.py,sha256=7xjVK_OFqWNU7L0BloP5ns1kavWIbC2XMfbBVgK6rr4,269
38
+ murf/errors/service_unavailable_error.py,sha256=aiWJkLwL3ZF8DUhnHA7DncgPR-gAA9Omj86XByHSVlg,272
39
+ murf/errors/unauthorized_error.py,sha256=1ewNCqSG1P-uogB5yCNwreq4Bf3VRor0woSOXS4NjPU,266
40
+ murf/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ murf/text_to_speech/__init__.py,sha256=Xv0-uZoCGDrfYszMbB2sh5nsApPBrcmek6SDgljYfxA,167
42
+ murf/text_to_speech/client.py,sha256=OiOPwUpWJHUbHoT0WEKPTd_a9PGJhXT83W3zRXnpBGs,22731
43
+ murf/text_to_speech/types/__init__.py,sha256=Hq1g0iZQ8sHQVU32Pt6lEetGXKEUUntytBmIq4bVK0A,199
44
+ murf/text_to_speech/types/generate_speech_request_model_version.py,sha256=y0NvjvNgtPrNcywVnq11MjANl-hJ7m-S5M_Ik5NP7c8,173
45
+ murf/types/__init__.py,sha256=Kc02Akdh0GXjD3Ppd5Vw8sVNS-Jg7Umw4U1cxK6aPAk,1737
46
+ murf/types/api_job_response.py,sha256=-0sasAgDmTzyn_7KVpYcRC5pCzm-QowtQNmrG6qpz6s,1388
47
+ murf/types/api_job_response_dubbing_type.py,sha256=-tnqFfuSOXSZngLhHBLg0Dn_X4fP5XIGMsI1TewVxig,168
48
+ murf/types/api_job_response_priority.py,sha256=27xuE25oMRVKzRXc-CLv_mu7ADr_PRsvNDXa4aFbt-k,171
49
+ murf/types/api_project_response.py,sha256=7PGbi1Bmk-okT6U8t0UI7VfVGoERNL0tWOLEkJsDJao,1147
50
+ murf/types/api_project_response_dubbing_type.py,sha256=ir-drn3sD8Qdbe6RWeJdPQyxx8hwSRV4U0Db22OGkw4,172
51
+ murf/types/api_voice.py,sha256=q56eq_iz_NnSCDWzxRvsJKFOU2Tje8vCrXHg1AmKf4U,1920
52
+ murf/types/api_voice_gender.py,sha256=d0HtLLsXDckaiNE3mb7wojzRi6YwqzFiEnqdNecfo-E,169
53
+ murf/types/auth_token_response.py,sha256=kc04BEfbgsTMuEnxGhs1hI3-4gtrOTOaKpR16Mg9Cc8,916
54
+ murf/types/dub_api_detail_response.py,sha256=7Rgy1ygNuWGVPmnEUoQYh3B7owBrlpFKZ_PvvUZf-YA,772
55
+ murf/types/dub_job_status_response.py,sha256=TNqCSOnO3kANySbyynNxQDYXpb_ewPp-meD1TFtV6NE,1123
56
+ murf/types/form_data_content_disposition.py,sha256=kecApnkfJhGUcM9lP1Yc7khTrA5C-uMzaLeUH3TfQBI,1307
57
+ murf/types/generate_speech_response.py,sha256=Ogcal0BKGW0m6kEuZIf7_k_wnEpyHFHJED8HmIzuWsU,1762
58
+ murf/types/group_api_project_response.py,sha256=cgKB9I02vDH_t1rYOSM5z6p25CzDOZrZjASQpt-HWyA,745
59
+ murf/types/locale_response.py,sha256=2ix9RuJ_-Qw95XWTeTP-15a6kFTROReEQS0vn3Da2uU,773
60
+ murf/types/locale_response_supports_item.py,sha256=yxGwpkzpeIfpG1KzygTHGjU1nK3U_plweHpxrbUWyT4,169
61
+ murf/types/pronunciation_detail.py,sha256=wm8asAQsYkL6O7QIhFl9tDEvo23r50-BUWamzdybHcg,937
62
+ murf/types/pronunciation_detail_type.py,sha256=ihRcpMJJBEZGo59TFZefg_tfl_LeU0wlOXfMjkUNmh0,164
63
+ murf/types/source_locale_response.py,sha256=hCIpMkpAKfCy2jqMCCLLqNnC_E0h-gDRyATnmDHNR2g,583
64
+ murf/types/style_details.py,sha256=Gh2ev6dv5K0uZU1ZRViWfITpJ5r7LmQvwV3PcxF1RKE,799
65
+ murf/types/word_duration.py,sha256=RY29DhDLNnqg42Xt0vF0nq-qoLjXzCz_eWHbL5qvTjE,1253
66
+ murf/version.py,sha256=pVGisqquGqFs8v4SJPE2o540FaaDKHWfOikWf4-9KKk,71
67
+ murf-1.1.1.dist-info/LICENSE,sha256=SxRdfCVAmnkiSsVHJHhXmRX0yqidcRlBMjy-R2GZFdM,1066
68
+ murf-1.1.1.dist-info/METADATA,sha256=huCK0HiMxb2yiRdDZRatPiTTZ_D8uHWXEY_POnTbOvQ,6764
69
+ murf-1.1.1.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
70
+ murf-1.1.1.dist-info/RECORD,,