diff --git a/.mock/definition/empathic-voice/configs.yml b/.mock/definition/empathic-voice/configs.yml index 79e7fdc7..e0f3341e 100644 --- a/.mock/definition/empathic-voice/configs.yml +++ b/.mock/definition/empathic-voice/configs.yml @@ -664,6 +664,7 @@ service: response: docs: Success type: text + status-code: 200 errors: - root.BadRequestError examples: diff --git a/.mock/definition/empathic-voice/prompts.yml b/.mock/definition/empathic-voice/prompts.yml index f6c2ff6c..bffa148e 100644 --- a/.mock/definition/empathic-voice/prompts.yml +++ b/.mock/definition/empathic-voice/prompts.yml @@ -377,6 +377,7 @@ service: response: docs: Success type: text + status-code: 200 errors: - root.BadRequestError examples: diff --git a/.mock/definition/empathic-voice/tools.yml b/.mock/definition/empathic-voice/tools.yml index eab4e6f1..c0da0592 100644 --- a/.mock/definition/empathic-voice/tools.yml +++ b/.mock/definition/empathic-voice/tools.yml @@ -430,6 +430,8 @@ service: content-type: application/json response: docs: Success + type: text + status-code: 200 errors: - root.BadRequestError examples: diff --git a/.mock/definition/tts/__package__.yml b/.mock/definition/tts/__package__.yml index 5142f8ce..0f8ba9f1 100644 --- a/.mock/definition/tts/__package__.yml +++ b/.mock/definition/tts/__package__.yml @@ -21,9 +21,9 @@ service: auth: true docs: >- Synthesizes one or more input texts into speech using the specified - voice. If no voice is provided, a novel voice will be generated + voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence - the speech's style and prosody. + the speech's style and prosody. The response includes the base64-encoded audio and metadata in JSON @@ -49,14 +49,14 @@ service: the mind which contemplates them. description: >- Middle-aged masculine voice with a clear, rhythmic Scots lilt, - rounded vowels, and a warm, steady tone with an articulate, + rounded vowels, and a warm, steady tone with an articulate, academic quality. context: utterances: - text: How can people see beauty so differently? description: >- A curious student with a clear and respectful tone, seeking - clarification on Hume's ideas with a straightforward + clarification on Hume's ideas with a straightforward question. format: type: mp3 @@ -86,9 +86,9 @@ service: auth: true docs: >- Synthesizes one or more input texts into speech using the specified - voice. If no voice is provided, a novel voice will be generated + voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence - the speech's style and prosody. + the speech's style and prosody. The response contains the generated audio file in the requested format. @@ -113,7 +113,7 @@ service: the mind which contemplates them. description: >- Middle-aged masculine voice with a clear, rhythmic Scots lilt, - rounded vowels, and a warm, steady tone with an articulate, + rounded vowels, and a warm, steady tone with an articulate, academic quality. context: generation_id: 09ad914d-8e7f-40f8-a279-e34f07f7dab2 @@ -126,7 +126,7 @@ service: auth: true docs: >- Streams synthesized speech using the specified voice. If no voice is - provided, a novel voice will be generated dynamically. Optionally, + provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. source: @@ -150,7 +150,7 @@ service: the mind which contemplates them. description: >- Middle-aged masculine voice with a clear, rhythmic Scots lilt, - rounded vowels, and a warm, steady tone with an articulate, + rounded vowels, and a warm, steady tone with an articulate, academic quality. context: generation_id: 09ad914d-8e7f-40f8-a279-e34f07f7dab2 @@ -163,8 +163,8 @@ service: auth: true docs: >- Streams synthesized speech using the specified voice. If no voice is - provided, a novel voice will be generated dynamically. Optionally, - additional context can be included to influence the speech's style and + provided, a novel voice will be generated dynamically. Optionally, + additional context can be included to influence the speech's style and prosody. @@ -191,14 +191,14 @@ service: the mind which contemplates them. description: >- Middle-aged masculine voice with a clear, rhythmic Scots lilt, - rounded vowels, and a warm, steady tone with an articulate, + rounded vowels, and a warm, steady tone with an articulate, academic quality. context: utterances: - text: How can people see beauty so differently? description: >- A curious student with a clear and respectful tone, seeking - clarification on Hume's ideas with a straightforward + clarification on Hume's ideas with a straightforward question. format: type: mp3 @@ -267,7 +267,7 @@ types: snippets: docs: >- A list of snippet groups where each group corresponds to an utterance - in the request. Each group contains segmented snippets that represent + in the request. Each group contains segmented snippets that represent the original utterance divided into more natural-sounding units optimized for speech delivery. type: list> @@ -330,19 +330,19 @@ types: Controls how audio output is segmented in the response. - - When **enabled** (`true`), input utterances are automatically split + - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. - - When **disabled** (`false`), the response maintains a strict + - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. This setting affects how the `snippets` array is structured in the - response, which may be important for applications that need to track - the relationship between input text and generated audio segments. - When setting to `false`, avoid including utterances with long `text`, - as this can result in distorted output. + response, which may be important for applications that need to track + the relationship between input text and generated audio segments. When + setting to `false`, avoid including utterances with long `text`, as + this can result in distorted output. default: true strip_headers: type: optional @@ -357,9 +357,9 @@ types: A list of **Utterances** to be converted to speech output. - An **Utterance** is a unit of input for + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input - `text`, an optional `description` to serve as the prompt for how the + `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. @@ -374,11 +374,11 @@ types: mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). - Dynamic voice generation is not supported with this mode; a - predefined - [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) + predefined + [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. - - This mode is only supported for streaming endpoints (e.g., + - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). @@ -399,7 +399,7 @@ types: type: optional docs: >- A unique ID associated with this request for tracking and - troubleshooting. Use this ID when contacting [support](/support) for + troubleshooting. Use this ID when contacting [support](/support) for troubleshooting assistance. source: openapi: tts-openapi.yml @@ -414,16 +414,12 @@ types: docs: Name of the voice in the `Voice Library`. provider: type: optional - docs: |- - Specifies the provider of the voice. - - - **HUME_AI**: Preset voices generated by Hume. - - - **CUSTOM_VOICE**: Voices you have generated and saved to your `Voice library`. + docs: >- + The provider associated with the created voice. - If a provider is not specified, the provider will default to `CUSTOM_VOICE`. - While Hume's preset voices are shared and usable by anyone, your custom voices are only available to calls made with your API key. + Voices created through this endpoint will always have the provider set + to `CUSTOM_VOICE`, indicating a custom voice stored in your account. source: openapi: tts-openapi.yml FormatPcm: @@ -490,15 +486,15 @@ types: type: optional docs: >- Natural language instructions describing how the synthesized speech - should sound, including but not limited to tone, intonation, pacing, - and accent (e.g., 'a soft, gentle voice with a strong British + should sound, including but not limited to tone, intonation, pacing, + and accent (e.g., 'a soft, gentle voice with a strong British accent'). - If a Voice is specified in the request, this description serves as - acting instructions. For tips on how to effectively guide speech + acting instructions. For tips on how to effectively guide speech delivery, see our guide on [Acting instructions](/docs/text-to-speech-tts/acting-instructions). - - If no Voice is specified, a new voice is generated based on this description. See our [prompting guide](/docs/text-to-speech-tts/prompting) for tips on designing a voice. + - If no Voice is specified, a new voice is generated based on this description. See our [prompting guide](/docs/text-to-speech-tts/prompting) for tips on designing a voice. validation: maxLength: 1000 speed: @@ -524,10 +520,10 @@ types: type: optional docs: >- The `name` or `id` associated with a **Voice** from the **Voice - Library** to be used as the speaker for this and all subsequent + Library** to be used as the speaker for this and all subsequent `utterances`, until the `voice` field is updated again. - See our [voices guide](/docs/text-to-speech-tts/voices) for more details on generating and specifying **Voices**. + See our [voices guide](/docs/text-to-speech-tts/voices) for more details on generating and specifying **Voices**. source: openapi: tts-openapi.yml ValidationErrorLocItem: @@ -550,38 +546,58 @@ types: properties: id: type: string - docs: The ID of a **Voice** within the **Voice Library**. + docs: The unique ID associated with the **Voice**. provider: type: optional - docs: |- - Specifies the provider of the voice associated with this voice ID. + docs: >- + Specifies the source provider associated with the chosen voice. + - - **HUME_AI**: Preset voices generated by Hume. + - **`HUME_AI`**: Select voices from Hume's [Voice + Library](https://platform.hume.ai/tts/voice-library), containing a + variety of preset, shared voices. - - **CUSTOM_VOICE**: Voices you have generated and saved to your `Voice library`. + - **`CUSTOM_VOICE`**: Select from voices you've personally generated + and saved in your account. - If a provider is not specified, the provider will default to `CUSTOM_VOICE`. - While Hume's preset voices are shared and usable by anyone, your custom voices are only available to calls made with your API key. + If no provider is explicitly set, the default provider is + `CUSTOM_VOICE`. When using voices from Hume's **Voice Library**, you + must explicitly set the provider to `HUME_AI`. + + + Preset voices from Hume's **Voice Library** are accessible by all + users. In contrast, your custom voices are private and accessible only + via requests authenticated with your API key. source: openapi: tts-openapi.yml PostedUtteranceVoiceWithName: properties: name: type: string - docs: The name of a **Voice** within the **Voice Library**. + docs: The name of a **Voice**. provider: type: optional - docs: |- - Specifies the provider of the voice associated with this voice name. + docs: >- + Specifies the source provider associated with the chosen voice. + + + - **`HUME_AI`**: Select voices from Hume's [Voice + Library](https://platform.hume.ai/tts/voice-library), containing a + variety of preset, shared voices. + + - **`CUSTOM_VOICE`**: Select from voices you've personally generated + and saved in your account. - - **HUME_AI**: Preset voices generated by Hume. - - **CUSTOM_VOICE**: Voices you have generated and saved to your `Voice library`. + If no provider is explicitly set, the default provider is + `CUSTOM_VOICE`. When using voices from Hume's **Voice Library**, you + must explicitly set the provider to `HUME_AI`. - If a provider is not specified, the provider will default to `CUSTOM_VOICE`. - While Hume's preset voices are shared and usable by anyone, your custom voices are only available to calls made with your API key. + Preset voices from Hume's **Voice Library** are accessible by all + users. In contrast, your custom voices are private and accessible only + via requests authenticated with your API key. source: openapi: tts-openapi.yml VoiceProvider: diff --git a/.mock/definition/tts/voices.yml b/.mock/definition/tts/voices.yml index b5e787f2..89b4f745 100644 --- a/.mock/definition/tts/voices.yml +++ b/.mock/definition/tts/voices.yml @@ -1,3 +1,10 @@ +types: + VoicesListRequestProvider: + enum: + - HUME_AI + - CUSTOM_VOICE + source: + openapi: tts-openapi.yml imports: root: __package__.yml service: @@ -9,9 +16,8 @@ service: method: GET auth: true docs: >- - Lists voices in your **Voice Library**. Set provider to `HUME_AI` to - list Hume's preset voices, or to `CUSTOM_VOICE` to a custom voice - created in your account. + Lists voices you have saved in your account, or voices from the [Voice + Library](https://platform.hume.ai/tts/voice-library). pagination: offset: $request.page_number results: $response.voices_page @@ -22,10 +28,17 @@ service: name: VoicesListRequest query-parameters: provider: - type: root.VoiceProvider + type: VoicesListRequestProvider docs: >- - Specifies whether to return custom voices created in your account - or shared voices provided by Hume + Specify the voice provider to filter voices returned by the + endpoint: + + + - **`HUME_AI`**: Lists preset, shared voices from Hume's [Voice + Library](https://platform.hume.ai/tts/voice-library). + + - **`CUSTOM_VOICE`**: Lists custom voices created and saved to + your account. page_number: type: optional docs: >- @@ -74,9 +87,13 @@ service: method: POST auth: true docs: >- - Creates a new voice from a specified TTS generation ID and saves it to - your **Voice Library**. This allows for consistent speech style and - prosody across multiple requests. + Saves a new custom voice to your account using the specified TTS + generation ID. + + + Once saved, this voice can be reused in subsequent TTS requests, + ensuring consistent speech style and prosody. For more details on voice + creation, see the [Voices Guide](/docs/text-to-speech-tts/voices). source: openapi: tts-openapi.yml display-name: Create voice @@ -113,7 +130,7 @@ service: path: /v0/tts/voices method: DELETE auth: true - docs: Removes a custom voice from your **Voice Library**. + docs: Deletes a previously generated custom voice. source: openapi: tts-openapi.yml display-name: Delete voice diff --git a/poetry.lock b/poetry.lock index 160e6e06..066962a5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiofiles" @@ -6,7 +6,6 @@ version = "24.1.0" description = "File support for asyncio." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"}, {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"}, @@ -18,7 +17,6 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -30,7 +28,6 @@ version = "4.9.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, @@ -44,7 +41,7 @@ typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] +test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -53,8 +50,6 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"examples\" and platform_system == \"Darwin\"" files = [ {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, @@ -66,8 +61,6 @@ version = "23.1.0" description = "Argon2 for Python" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, @@ -88,8 +81,6 @@ version = "21.2.0" description = "Low-level CFFI bindings for Argon2" optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, @@ -127,8 +118,6 @@ version = "1.3.0" description = "Better dates & times for Python" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, @@ -148,7 +137,6 @@ version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.7.2" -groups = ["dev"] files = [ {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, @@ -168,8 +156,6 @@ version = "3.0.0" description = "Annotate AST trees with source code positions" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, @@ -185,8 +171,6 @@ version = "2.0.5" description = "Simple LRU cache for asyncio" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "async_lru-2.0.5-py3-none-any.whl", hash = "sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943"}, {file = "async_lru-2.0.5.tar.gz", hash = "sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb"}, @@ -201,20 +185,18 @@ version = "25.3.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, ] -markers = {main = "extra == \"examples\""} [package.extras] -benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "babel" @@ -222,15 +204,13 @@ version = "2.17.0" description = "Internationalization utilities" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, ] [package.extras] -dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] +dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] [[package]] name = "beautifulsoup4" @@ -238,8 +218,6 @@ version = "4.13.4" description = "Screen-scraping library" optional = true python-versions = ">=3.7.0" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b"}, {file = "beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195"}, @@ -262,8 +240,6 @@ version = "6.2.0" description = "An easy safelist-based HTML-sanitizing tool." optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, @@ -282,7 +258,6 @@ version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, @@ -294,7 +269,6 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -364,7 +338,6 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] -markers = {main = "extra == \"examples\" or extra == \"microphone\"", dev = "implementation_name == \"pypy\""} [package.dependencies] pycparser = "*" @@ -375,8 +348,6 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -478,12 +449,10 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "extra == \"examples\" and sys_platform == \"win32\"", dev = "sys_platform == \"win32\""} [[package]] name = "comm" @@ -491,8 +460,6 @@ version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, @@ -510,7 +477,6 @@ version = "0.4.3" description = "Code coverage validation" optional = false python-versions = ">=3.8.1" -groups = ["dev"] files = [ {file = "covcheck-0.4.3-py3-none-any.whl", hash = "sha256:31cc069b779840b2d758f434bee3bc83b47a4ce8f3161bac32b88dc7fd82543a"}, {file = "covcheck-0.4.3.tar.gz", hash = "sha256:2c7bbb7e6a5f6992b63cae75a319fa8c883161401ac7035f577b5ec0f2ad0b90"}, @@ -528,7 +494,6 @@ version = "7.8.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "coverage-7.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2931f66991175369859b5fd58529cd4b73582461877ecfd859b6549869287ffe"}, {file = "coverage-7.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52a523153c568d2c0ef8826f6cc23031dc86cffb8c6aeab92c4ff776e7951b28"}, @@ -599,7 +564,7 @@ files = [ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] -toml = ["tomli ; python_full_version <= \"3.11.0a6\""] +toml = ["tomli"] [[package]] name = "debugpy" @@ -607,8 +572,6 @@ version = "1.8.14" description = "An implementation of the Debug Adapter Protocol for Python" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "debugpy-1.8.14-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:93fee753097e85623cab1c0e6a68c76308cd9f13ffdf44127e6fab4fbf024339"}, {file = "debugpy-1.8.14-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d937d93ae4fa51cdc94d3e865f535f185d5f9748efb41d0d49e33bf3365bd79"}, @@ -644,8 +607,6 @@ version = "5.2.1" description = "Decorators for Humans" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -657,8 +618,6 @@ version = "0.7.1" description = "XML bomb protection for Python stdlib modules" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -670,7 +629,6 @@ version = "0.4.0" description = "serialize all of Python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049"}, {file = "dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0"}, @@ -686,7 +644,6 @@ version = "0.2.2" description = "Like `typing._eval_type`, but lets older Python versions use newer typing features." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a"}, {file = "eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1"}, @@ -701,8 +658,6 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["main", "dev"] -markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -717,15 +672,13 @@ version = "2.2.0" description = "Get the currently executing AST node of a frame, and other information" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, ] [package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "fastjsonschema" @@ -733,12 +686,10 @@ version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" -groups = ["main", "dev"] files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, ] -markers = {main = "extra == \"examples\""} [package.extras] devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] @@ -749,8 +700,6 @@ version = "1.5.1" description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" optional = true python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, @@ -758,31 +707,29 @@ files = [ [[package]] name = "h11" -version = "0.14.0" +version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false -python-versions = ">=3.7" -groups = ["main"] +python-versions = ">=3.8" files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] [[package]] name = "httpcore" -version = "1.0.8" +version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ - {file = "httpcore-1.0.8-py3-none-any.whl", hash = "sha256:5254cf149bcb5f75e9d1b2b9f729ea4a4b883d1ad7379fc632b727cec23674be"}, - {file = "httpcore-1.0.8.tar.gz", hash = "sha256:86e94505ed24ea06514883fd44d2bc02d90e77e7979c8eb71b90f41d364a1bad"}, + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, ] [package.dependencies] certifi = "*" -h11 = ">=0.13,<0.15" +h11 = ">=0.16" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] @@ -796,7 +743,6 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -809,7 +755,7 @@ httpcore = "==1.*" idna = "*" [package.extras] -brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] +brotli = ["brotli", "brotlicffi"] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -821,7 +767,6 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -836,23 +781,21 @@ version = "8.6.1" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, ] -markers = {main = "extra == \"examples\" and python_version < \"3.10\"", dev = "python_version < \"3.10\""} [package.dependencies] zipp = ">=3.20" [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] [[package]] @@ -861,7 +804,6 @@ version = "2.1.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, @@ -873,8 +815,6 @@ version = "6.29.5" description = "IPython Kernel for Jupyter" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, @@ -908,8 +848,6 @@ version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, @@ -947,8 +885,6 @@ version = "8.1.6" description = "Jupyter interactive widgets" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "ipywidgets-8.1.6-py3-none-any.whl", hash = "sha256:446e7630a1d025bdc7635e1169fcc06f2ce33b5bd41c2003edeb4a47c8d4bbb1"}, {file = "ipywidgets-8.1.6.tar.gz", hash = "sha256:d8ace49c66f14419fc66071371b99d01bed230bbc15d8a60233b18bfbd782851"}, @@ -970,8 +906,6 @@ version = "20.11.0" description = "Operations with ISO 8601 durations" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, @@ -986,7 +920,6 @@ version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" -groups = ["dev"] files = [ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, @@ -1001,8 +934,6 @@ version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, @@ -1022,8 +953,6 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1041,15 +970,13 @@ version = "0.12.0" description = "A Python implementation of the JSON5 data format." optional = true python-versions = ">=3.8.0" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "json5-0.12.0-py3-none-any.whl", hash = "sha256:6d37aa6c08b0609f16e1ec5ff94697e2cbbfbad5ac112afa05794da9ab7810db"}, {file = "json5-0.12.0.tar.gz", hash = "sha256:0b4b6ff56801a1c7dc817b0241bca4ce474a0e6a163bfef3fc594d3fd263ff3a"}, ] [package.extras] -dev = ["build (==1.2.2.post1)", "coverage (==7.5.4) ; python_version < \"3.9\"", "coverage (==7.8.0) ; python_version >= \"3.9\"", "mypy (==1.14.1) ; python_version < \"3.9\"", "mypy (==1.15.0) ; python_version >= \"3.9\"", "pip (==25.0.1)", "pylint (==3.2.7) ; python_version < \"3.9\"", "pylint (==3.3.6) ; python_version >= \"3.9\"", "ruff (==0.11.2)", "twine (==6.1.0)", "uv (==0.6.11)"] +dev = ["build (==1.2.2.post1)", "coverage (==7.5.4)", "coverage (==7.8.0)", "mypy (==1.14.1)", "mypy (==1.15.0)", "pip (==25.0.1)", "pylint (==3.2.7)", "pylint (==3.3.6)", "ruff (==0.11.2)", "twine (==6.1.0)", "uv (==0.6.11)"] [[package]] name = "jsonpointer" @@ -1057,8 +984,6 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -1070,12 +995,10 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] -markers = {main = "extra == \"examples\""} [package.dependencies] attrs = ">=22.2.0" @@ -1097,16 +1020,14 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2024.10.1" +version = "2025.4.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ - {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, - {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, + {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, + {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, ] -markers = {main = "extra == \"examples\""} [package.dependencies] referencing = ">=0.31.0" @@ -1117,8 +1038,6 @@ version = "1.1.1" description = "Jupyter metapackage. Install all the Jupyter components in one go." optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83"}, {file = "jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a"}, @@ -1138,12 +1057,10 @@ version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, ] -markers = {main = "extra == \"examples\""} [package.dependencies] importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} @@ -1155,7 +1072,7 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-console" @@ -1163,8 +1080,6 @@ version = "6.6.3" description = "Jupyter terminal console" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, @@ -1189,12 +1104,10 @@ version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, ] -markers = {main = "extra == \"examples\""} [package.dependencies] platformdirs = ">=2.5" @@ -1211,8 +1124,6 @@ version = "0.12.0" description = "Jupyter Event System library" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb"}, {file = "jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b"}, @@ -1239,8 +1150,6 @@ version = "2.2.5" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, @@ -1256,8 +1165,6 @@ version = "2.15.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3"}, {file = "jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084"}, @@ -1294,8 +1201,6 @@ version = "0.5.3" description = "A Jupyter Server Extension Providing Terminals." optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, @@ -1311,15 +1216,13 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.4.0" +version = "4.4.1" description = "JupyterLab computational environment" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\"" files = [ - {file = "jupyterlab-4.4.0-py3-none-any.whl", hash = "sha256:61d33991fbb352cc7caac08bd0c34577fea86d8d5d9772600d9d5a6bcbc882c0"}, - {file = "jupyterlab-4.4.0.tar.gz", hash = "sha256:f1767d5f0104e40f3b4a63bf6892bbef8e4704dcabf0c78408a3bdc411792f04"}, + {file = "jupyterlab-4.4.1-py3-none-any.whl", hash = "sha256:989bca3f9cf2d04b2022e7e657e2df6d4aca808b364810d31c4865edd968a5f7"}, + {file = "jupyterlab-4.4.1.tar.gz", hash = "sha256:c75c4f33056fbd84f0b31eb44622a00c7a5f981b85adfeb198a83721f0465808"}, ] [package.dependencies] @@ -1340,7 +1243,7 @@ tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.9.9)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.11.4)"] docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.2.0)", "sphinx-copybutton"] docs-screenshots = ["altair (==5.5.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.3.post1)", "matplotlib (==3.10.0)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.15.1)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] @@ -1352,8 +1255,6 @@ version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, @@ -1365,8 +1266,6 @@ version = "2.27.3" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, @@ -1393,8 +1292,6 @@ version = "3.0.14" description = "Jupyter interactive widgets for JupyterLab" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "jupyterlab_widgets-3.0.14-py3-none-any.whl", hash = "sha256:54c33e3306b7fca139d165d6190dc6c0627aafa5d14adfc974a4e9a3d26cb703"}, {file = "jupyterlab_widgets-3.0.14.tar.gz", hash = "sha256:bad03e59546869f026e537e0d170e454259e6dc7048e14041707ca31e523c8a1"}, @@ -1406,7 +1303,6 @@ version = "1.11.0" description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "lazy_object_proxy-1.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:132bc8a34f2f2d662a851acfd1b93df769992ed1b81e2b1fda7db3e73b0d5a18"}, {file = "lazy_object_proxy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:01261a3afd8621a1accb5682df2593dc7ec7d21d38f411011a5712dcd418fbed"}, @@ -1430,8 +1326,6 @@ version = "3.0.2" description = "Safely add untrusted strings to HTML/XML markup." optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, @@ -1502,8 +1396,6 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, @@ -1518,7 +1410,6 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -1530,8 +1421,6 @@ version = "3.1.3" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9"}, {file = "mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0"}, @@ -1546,7 +1435,6 @@ version = "1.0.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "mypy-1.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:71a808334d3f41ef011faa5a5cd8153606df5fc0b56de5b2e89566c8093a0c9a"}, {file = "mypy-1.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:920169f0184215eef19294fa86ea49ffd4635dedfdea2b57e45cb4ee85d5ccaf"}, @@ -1589,14 +1477,13 @@ reports = ["lxml"] [[package]] name = "mypy-extensions" -version = "1.0.0" +version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = ">=3.5" -groups = ["dev"] +python-versions = ">=3.8" files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, ] [[package]] @@ -1605,12 +1492,10 @@ version = "0.10.2" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.9.0" -groups = ["main", "dev"] files = [ {file = "nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d"}, {file = "nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193"}, ] -markers = {main = "extra == \"examples\""} [package.dependencies] jupyter-client = ">=6.1.12" @@ -1629,8 +1514,6 @@ version = "7.16.6" description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b"}, {file = "nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582"}, @@ -1668,12 +1551,10 @@ version = "5.10.4" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, ] -markers = {main = "extra == \"examples\""} [package.dependencies] fastjsonschema = ">=2.15" @@ -1691,8 +1572,6 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = true python-versions = ">=3.5" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, @@ -1700,15 +1579,13 @@ files = [ [[package]] name = "notebook" -version = "7.4.0" +version = "7.4.1" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ - {file = "notebook-7.4.0-py3-none-any.whl", hash = "sha256:005fd21f4db6093a7b739b17df5fe60597811adb07e8255f458db4035d208e3a"}, - {file = "notebook-7.4.0.tar.gz", hash = "sha256:581d88f83709d90ce738dfd1d759892b96e3cbbc9c4a989912ed6c6a08f0d3e8"}, + {file = "notebook-7.4.1-py3-none-any.whl", hash = "sha256:498f12cf567d95b20e780d62d52564ee4310248b3175e996b667b5808028e5d3"}, + {file = "notebook-7.4.1.tar.gz", hash = "sha256:96894962b230013ea0c0a466e4e642c5aace25ba8c86686175b69990ef628ff9"}, ] [package.dependencies] @@ -1721,7 +1598,7 @@ tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0) ; python_version < \"3.10\"", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -1729,8 +1606,6 @@ version = "0.2.4" description = "A shim layer for notebook traits and config" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, @@ -1748,8 +1623,6 @@ version = "7.7.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, @@ -1757,16 +1630,14 @@ files = [ [[package]] name = "packaging" -version = "24.2" +version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] -markers = {main = "extra == \"examples\""} [[package]] name = "pandocfilters" @@ -1774,8 +1645,6 @@ version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, @@ -1787,8 +1656,6 @@ version = "0.8.4" description = "A Python Parser" optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -1804,8 +1671,6 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"examples\" and sys_platform != \"win32\"" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, @@ -1820,12 +1685,10 @@ version = "4.3.7" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"}, {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"}, ] -markers = {main = "extra == \"examples\""} [package.extras] docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] @@ -1838,7 +1701,6 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -1854,8 +1716,6 @@ version = "0.21.1" description = "Python client for the Prometheus monitoring system." optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, @@ -1870,8 +1730,6 @@ version = "3.0.51" description = "Library for building powerful interactive command lines in Python" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"}, {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"}, @@ -1886,8 +1744,6 @@ version = "7.0.0" description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, @@ -1911,8 +1767,6 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"examples\" and (os_name != \"nt\" or sys_platform != \"win32\")" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -1924,8 +1778,6 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, @@ -1940,12 +1792,10 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -markers = {main = "extra == \"examples\" or extra == \"microphone\"", dev = "implementation_name == \"pypy\""} [[package]] name = "pydantic" @@ -1953,7 +1803,6 @@ version = "2.11.3" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f"}, {file = "pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3"}, @@ -1967,7 +1816,7 @@ typing-inspection = ">=0.4.0" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] +timezone = ["tzdata"] [[package]] name = "pydantic-core" @@ -1975,7 +1824,6 @@ version = "2.33.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pydantic_core-2.33.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26"}, {file = "pydantic_core-2.33.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927"}, @@ -2087,7 +1935,6 @@ version = "6.3.0" description = "Python docstring style checker" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, @@ -2097,7 +1944,7 @@ files = [ snowballstemmer = ">=2.2.0" [package.extras] -toml = ["tomli (>=1.2.3) ; python_version < \"3.11\""] +toml = ["tomli (>=1.2.3)"] [[package]] name = "pydub" @@ -2105,8 +1952,6 @@ version = "0.25.1" description = "Manipulate audio with an simple and easy high level interface" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"microphone\" or extra == \"legacy\"" files = [ {file = "pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6"}, {file = "pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f"}, @@ -2118,7 +1963,6 @@ version = "0.25.1.6" description = "Stub-only package containing type information for pydub" optional = false python-versions = "<4.0,>=3.9" -groups = ["dev"] files = [ {file = "pydub_stubs-0.25.1.6-py3-none-any.whl", hash = "sha256:235be0707485c48fe3d6537c751171bfeca21480c914e7e7bc9db2d6ed65f8ae"}, {file = "pydub_stubs-0.25.1.6.tar.gz", hash = "sha256:38e9a1e490b11e9fdd3c5a0b01667e2d959c817aadb56555b124c6c8be028ff5"}, @@ -2133,8 +1977,6 @@ version = "2.19.1" description = "Pygments is a syntax highlighting package written in Python." optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, @@ -2149,7 +1991,6 @@ version = "2.17.7" description = "python code static checker" optional = false python-versions = ">=3.7.2" -groups = ["dev"] files = [ {file = "pylint-2.17.7-py3-none-any.whl", hash = "sha256:27a8d4c7ddc8c2f8c18aa0050148f89ffc09838142193fdbe98f172781a3ff87"}, {file = "pylint-2.17.7.tar.gz", hash = "sha256:f4fcac7ae74cfe36bc8451e931d8438e4a476c20314b1101c458ad0f05191fad"}, @@ -2179,7 +2020,6 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -2202,7 +2042,6 @@ version = "0.23.8" description = "Pytest support for asyncio" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"}, {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"}, @@ -2221,7 +2060,6 @@ version = "4.1.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, @@ -2240,7 +2078,6 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -2255,8 +2092,6 @@ version = "3.3.0" description = "JSON Log Formatter for the Python Logging Package" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7"}, {file = "python_json_logger-3.3.0.tar.gz", hash = "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84"}, @@ -2266,7 +2101,7 @@ files = [ typing_extensions = {version = "*", markers = "python_version < \"3.10\""} [package.extras] -dev = ["backports.zoneinfo ; python_version < \"3.9\"", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec ; implementation_name != \"pypy\"", "mypy", "orjson ; implementation_name != \"pypy\"", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] +dev = ["backports.zoneinfo", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec", "mypy", "orjson", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] [[package]] name = "pywin32" @@ -2274,7 +2109,6 @@ version = "310" description = "Python for Window Extensions" optional = false python-versions = "*" -groups = ["main", "dev"] files = [ {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, @@ -2293,7 +2127,6 @@ files = [ {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, ] -markers = {main = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\" and extra == \"examples\"", dev = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} [[package]] name = "pywinpty" @@ -2301,8 +2134,6 @@ version = "2.0.15" description = "Pseudo terminal support for Windows from Python." optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\" and os_name == \"nt\"" files = [ {file = "pywinpty-2.0.15-cp310-cp310-win_amd64.whl", hash = "sha256:8e7f5de756a615a38b96cd86fa3cd65f901ce54ce147a3179c45907fa11b4c4e"}, {file = "pywinpty-2.0.15-cp311-cp311-win_amd64.whl", hash = "sha256:9a6bcec2df2707aaa9d08b86071970ee32c5026e10bcc3cc5f6f391d85baf7ca"}, @@ -2319,8 +2150,6 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -2383,7 +2212,6 @@ version = "26.4.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "pyzmq-26.4.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:0329bdf83e170ac133f44a233fc651f6ed66ef8e66693b5af7d54f45d1ef5918"}, {file = "pyzmq-26.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:398a825d2dea96227cf6460ce0a174cf7657d6f6827807d4d1ae9d0f9ae64315"}, @@ -2479,7 +2307,6 @@ files = [ {file = "pyzmq-26.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:49b6ca2e625b46f499fb081aaf7819a177f41eeb555acb05758aa97f4f95d147"}, {file = "pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d"}, ] -markers = {main = "extra == \"examples\""} [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} @@ -2490,12 +2317,10 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, ] -markers = {main = "extra == \"examples\""} [package.dependencies] attrs = ">=22.2.0" @@ -2508,8 +2333,6 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -2531,8 +2354,6 @@ version = "0.1.4" description = "A pure python RFC3339 validator" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, @@ -2547,8 +2368,6 @@ version = "0.1.1" description = "Pure python rfc3986 validator" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, @@ -2560,7 +2379,6 @@ version = "0.24.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "rpds_py-0.24.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:006f4342fe729a368c6df36578d7a348c7c716be1da0a1a0f86e3021f8e98724"}, {file = "rpds_py-0.24.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2d53747da70a4e4b17f559569d5f9506420966083a31c5fbd84e764461c4444b"}, @@ -2677,7 +2495,6 @@ files = [ {file = "rpds_py-0.24.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:24795c099453e3721fda5d8ddd45f5dfcc8e5a547ce7b8e9da06fecc3832e26f"}, {file = "rpds_py-0.24.0.tar.gz", hash = "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e"}, ] -markers = {main = "extra == \"examples\""} [[package]] name = "ruff" @@ -2685,7 +2502,6 @@ version = "0.5.7" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "ruff-0.5.7-py3-none-linux_armv6l.whl", hash = "sha256:548992d342fc404ee2e15a242cdbea4f8e39a52f2e7752d0e4cbe88d2d2f416a"}, {file = "ruff-0.5.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00cc8872331055ee017c4f1071a8a31ca0809ccc0657da1d154a1d2abac5c0be"}, @@ -2713,7 +2529,6 @@ version = "2.13.0" description = "Python helper for Semantic Versioning (http://semver.org/)" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["dev"] files = [ {file = "semver-2.13.0-py2.py3-none-any.whl", hash = "sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4"}, {file = "semver-2.13.0.tar.gz", hash = "sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f"}, @@ -2725,39 +2540,35 @@ version = "1.8.3" description = "Send file to trash natively under Mac OS X, Windows and Linux" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, ] [package.extras] -nativelib = ["pyobjc-framework-Cocoa ; sys_platform == \"darwin\"", "pywin32 ; sys_platform == \"win32\""] -objc = ["pyobjc-framework-Cocoa ; sys_platform == \"darwin\""] -win32 = ["pywin32 ; sys_platform == \"win32\""] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] [[package]] name = "setuptools" -version = "78.1.0" +version = "79.0.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\"" files = [ - {file = "setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8"}, - {file = "setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54"}, + {file = "setuptools-79.0.1-py3-none-any.whl", hash = "sha256:e147c0549f27767ba362f9da434eab9c5dc0045d5304feb602a0af001089fc51"}, + {file = "setuptools-79.0.1.tar.gz", hash = "sha256:128ce7b8f33c3079fd1b067ecbb4051a66e8526e7b65f6cec075dfc650ddfa88"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] -core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "simpleaudio" @@ -2765,8 +2576,6 @@ version = "1.0.4" description = "Simple, asynchronous audio playback for Python 3." optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"microphone\"" files = [ {file = "simpleaudio-1.0.4-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:05b63da515f5fc7c6f40e4d9673d22239c5e03e2bda200fc09fd21c185d73713"}, {file = "simpleaudio-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:f1a4fe3358429b2ea3181fd782e4c4fff5c123ca86ec7fc29e01ee9acd8a227a"}, @@ -2783,7 +2592,6 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -2795,7 +2603,6 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -2807,7 +2614,6 @@ version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." optional = false python-versions = "*" -groups = ["dev"] files = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, @@ -2819,8 +2625,6 @@ version = "0.4.7" description = "Play and Record Sound with Python" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"microphone\"" files = [ {file = "sounddevice-0.4.7-py3-none-any.whl", hash = "sha256:1c3f18bfa4d9a257f5715f2ab83f2c0eb412a09f3e6a9fa73720886ca88f6bc7"}, {file = "sounddevice-0.4.7-py3-none-macosx_10_6_x86_64.macosx_10_6_universal2.whl", hash = "sha256:d6ddfd341ad7412b14ca001f2c4dbf5fa2503bdc9eb15ad2c3105f6c260b698a"}, @@ -2837,15 +2641,13 @@ numpy = ["NumPy"] [[package]] name = "soupsieve" -version = "2.6" +version = "2.7" description = "A modern CSS selector implementation for Beautiful Soup." optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ - {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, - {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, + {file = "soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4"}, + {file = "soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a"}, ] [[package]] @@ -2854,8 +2656,6 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, @@ -2875,8 +2675,6 @@ version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, @@ -2898,7 +2696,6 @@ version = "0.4.2" description = "A unit testing framework for Jupyter Notebooks" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "testbook-0.4.2-py3-none-any.whl", hash = "sha256:21e03818017d1315607e117c101cf4b5f5b6dcd5ead77eab65ac9508a281f644"}, ] @@ -2908,9 +2705,9 @@ nbclient = ">=0.4.0" nbformat = ">=5.0.4" [package.extras] -dev = ["black ; python_version >= \"3.6\"", "bumpversion", "check-manifest", "codecov", "coverage", "flake8", "ipykernel", "ipython", "ipywidgets", "pandas", "pip (>=18.1)", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "setuptools (>=38.6.0)", "tox", "twine (>=1.11.0)", "wheel (>=0.31.0)", "xmltodict"] +dev = ["black", "bumpversion", "check-manifest", "codecov", "coverage", "flake8", "ipykernel", "ipython", "ipywidgets", "pandas", "pip (>=18.1)", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "setuptools (>=38.6.0)", "tox", "twine (>=1.11.0)", "wheel (>=0.31.0)", "xmltodict"] sphinx = ["Sphinx (>=1.7,<3.0)", "myst-parser (==0.9.1)", "sphinx-book-theme (==0.0.35)"] -test = ["black ; python_version >= \"3.6\"", "bumpversion", "check-manifest", "codecov", "coverage", "flake8", "ipykernel", "ipython", "ipywidgets", "pandas", "pip (>=18.1)", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "setuptools (>=38.6.0)", "tox", "twine (>=1.11.0)", "wheel (>=0.31.0)", "xmltodict"] +test = ["black", "bumpversion", "check-manifest", "codecov", "coverage", "flake8", "ipykernel", "ipython", "ipywidgets", "pandas", "pip (>=18.1)", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "setuptools (>=38.6.0)", "tox", "twine (>=1.11.0)", "wheel (>=0.31.0)", "xmltodict"] [[package]] name = "tinycss2" @@ -2918,8 +2715,6 @@ version = "1.4.0" description = "A tiny CSS parser" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, @@ -2938,7 +2733,6 @@ version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -groups = ["dev"] files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -2950,7 +2744,6 @@ version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -2985,7 +2778,6 @@ files = [ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] -markers = {main = "python_version < \"3.11\" and extra == \"examples\"", dev = "python_version < \"3.11\""} [[package]] name = "tomlkit" @@ -2993,7 +2785,6 @@ version = "0.13.2" description = "Style preserving TOML library" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, @@ -3005,7 +2796,6 @@ version = "6.4.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, @@ -3019,7 +2809,6 @@ files = [ {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, ] -markers = {main = "extra == \"examples\""} [[package]] name = "traitlets" @@ -3027,12 +2816,10 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] -markers = {main = "extra == \"examples\""} [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] @@ -3044,7 +2831,6 @@ version = "24.1.0.20250326" description = "Typing stubs for aiofiles" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "types_aiofiles-24.1.0.20250326-py3-none-any.whl", hash = "sha256:dfb58c9aa18bd449e80fb5d7f49dc3dd20d31de920a46223a61798ee4a521a70"}, {file = "types_aiofiles-24.1.0.20250326.tar.gz", hash = "sha256:c4bbe432fd043911ba83fb635456f5cc54f6d05fda2aadf6bef12a84f07a6efe"}, @@ -3056,7 +2842,6 @@ version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, @@ -3068,7 +2853,6 @@ version = "4.13.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, @@ -3080,7 +2864,6 @@ version = "0.4.0" description = "Runtime typing introspection tools" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f"}, {file = "typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122"}, @@ -3095,8 +2878,6 @@ version = "1.3.0" description = "RFC 6570 URI Template Processor" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, @@ -3111,15 +2892,13 @@ version = "2.4.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"}, {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -3130,8 +2909,6 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -3143,8 +2920,6 @@ version = "24.11.1" description = "A library for working with the color formats defined by HTML and CSS." optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, @@ -3156,8 +2931,6 @@ version = "0.5.1" description = "Character encoding aliases for legacy web content" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -3169,8 +2942,6 @@ version = "1.8.0" description = "WebSocket client for Python with low level API options" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, @@ -3187,7 +2958,6 @@ version = "13.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee"}, {file = "websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7"}, @@ -3283,8 +3053,6 @@ version = "4.0.14" description = "Jupyter interactive widgets for Jupyter Notebook" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"examples\"" files = [ {file = "widgetsnbextension-4.0.14-py3-none-any.whl", hash = "sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575"}, {file = "widgetsnbextension-4.0.14.tar.gz", hash = "sha256:a3629b04e3edb893212df862038c7232f62973373869db5084aed739b437b5af"}, @@ -3296,7 +3064,6 @@ version = "1.17.2" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, @@ -3385,19 +3152,17 @@ version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" -groups = ["main", "dev"] files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] -markers = {main = "extra == \"examples\" and python_version < \"3.10\"", dev = "python_version < \"3.10\""} [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] type = ["pytest-mypy"] [extras] @@ -3406,6 +3171,6 @@ legacy = ["pydub"] microphone = ["pydub", "simpleaudio", "sounddevice"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = ">=3.9,<4" -content-hash = "4649aa2c71b508c0a5970bc26e1b77e038b6c4eb6f92ea0791e369df42b37bed" +content-hash = "cbdd29699ab2c443a7fc5bf4fe84bc269419c369424c5d64e7362a1803d441f9" diff --git a/pyproject.toml b/pyproject.toml index 18153ea1..81a80440 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,31 +1,10 @@ [tool.poetry] name = "hume" -version = "0.8.3" -description = "A Python SDK for Hume AI" +version = "0.0.0" +description = "" readme = "README.md" authors = [] -keywords = [ - "hume", - "ai", - "evi", - "empathic", - "multimodal", - "expression", - "analysis", - "sentiment", - "voice", - "recognition", - "detection", - "emotion", - "interface", - "speech", - "audio", - "vision", - "expressive", - "embeddings", - "communication", - "learning" -] +keywords = [] license = "MIT" classifiers = [ "Intended Audience :: Developers", @@ -50,8 +29,6 @@ packages = [ ] [project.urls] -Documentation = 'https://dev.hume.ai' -Homepage = 'https://www.hume.ai/' Repository = 'https://github.com/HumeAI/hume-python-sdk' [tool.poetry.dependencies] @@ -66,7 +43,7 @@ pydub = { version = "^0.25.1", optional = true} simpleaudio = { version = "^1.0.4", optional = true} sounddevice = { version = "^0.4.6", optional = true} typing_extensions = ">= 4.0.0" -websockets = "^13.1" +websockets = "13.1" [tool.poetry.dev-dependencies] mypy = "1.0.1" diff --git a/reference.md b/reference.md index 2a20e171..b54f5111 100644 --- a/reference.md +++ b/reference.md @@ -12,7 +12,7 @@
-Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. +Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. The response includes the base64-encoded audio and metadata in JSON format.
@@ -39,14 +39,14 @@ client.tts.synthesize_json( utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithUtterances( utterances=[ PostedUtterance( text="How can people see beauty so differently?", - description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", + description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", ) ], ), @@ -72,7 +72,7 @@ client.tts.synthesize_json( A list of **Utterances** to be converted to speech output. -An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. +An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`.
@@ -108,11 +108,11 @@ An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overv Controls how audio output is segmented in the response. -- When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. +- When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. -- When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. +- When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. -This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. +This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. @@ -131,8 +131,8 @@ This setting affects how the `snippets` array is structured in the response, whi **instant_mode:** `typing.Optional[bool]` Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). -- Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. -- This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). +- Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. +- This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -166,7 +166,7 @@ Enables ultra-low latency streaming, significantly reducing the time until the f
-Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. +Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. The response contains the generated audio file in the requested format.
@@ -193,7 +193,7 @@ client.tts.synthesize_file( utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithGenerationId( @@ -221,7 +221,7 @@ client.tts.synthesize_file( A list of **Utterances** to be converted to speech output. -An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. +An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`.
@@ -257,11 +257,11 @@ An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overv Controls how audio output is segmented in the response. -- When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. +- When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. -- When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. +- When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. -This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. +This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. @@ -280,8 +280,8 @@ This setting affects how the `snippets` array is structured in the response, whi **instant_mode:** `typing.Optional[bool]` Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). -- Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. -- This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). +- Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. +- This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -315,7 +315,7 @@ Enables ultra-low latency streaming, significantly reducing the time until the f
-Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. +Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody.
@@ -340,7 +340,7 @@ client.tts.synthesize_file_streaming( utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithGenerationId( @@ -368,7 +368,7 @@ client.tts.synthesize_file_streaming( A list of **Utterances** to be converted to speech output. -An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. +An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. @@ -404,11 +404,11 @@ An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overv Controls how audio output is segmented in the response. -- When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. +- When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. -- When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. +- When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. -This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. +This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. @@ -427,8 +427,8 @@ This setting affects how the `snippets` array is structured in the response, whi **instant_mode:** `typing.Optional[bool]` Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). -- Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. -- This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). +- Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. +- This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -462,7 +462,7 @@ Enables ultra-low latency streaming, significantly reducing the time until the f
-Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. +Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. The response is a stream of JSON objects including audio encoded in base64.
@@ -489,14 +489,14 @@ response = client.tts.synthesize_json_streaming( utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithUtterances( utterances=[ PostedUtterance( text="How can people see beauty so differently?", - description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", + description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", ) ], ), @@ -523,7 +523,7 @@ for chunk in response: A list of **Utterances** to be converted to speech output. -An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. +An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`.
@@ -559,11 +559,11 @@ An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overv Controls how audio output is segmented in the response. -- When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. +- When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. -- When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. +- When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. -This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. +This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. @@ -582,8 +582,8 @@ This setting affects how the `snippets` array is structured in the response, whi **instant_mode:** `typing.Optional[bool]` Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). -- Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. -- This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). +- Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. +- This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -618,7 +618,7 @@ Enables ultra-low latency streaming, significantly reducing the time until the f
-Lists voices in your **Voice Library**. Set provider to `HUME_AI` to list Hume's preset voices, or to `CUSTOM_VOICE` to a custom voice created in your account. +Lists voices you have saved in your account, or voices from the [Voice Library](https://platform.hume.ai/tts/voice-library).
@@ -661,7 +661,12 @@ for page in response.iter_pages():
-**provider:** `VoiceProvider` — Specifies whether to return custom voices created in your account or shared voices provided by Hume +**provider:** `VoicesListRequestProvider` + +Specify the voice provider to filter voices returned by the endpoint: + +- **`HUME_AI`**: Lists preset, shared voices from Hume's [Voice Library](https://platform.hume.ai/tts/voice-library). +- **`CUSTOM_VOICE`**: Lists custom voices created and saved to your account.
@@ -725,7 +730,9 @@ For example, if `page_size` is set to 10, each page will include up to 10 items.
-Creates a new voice from a specified TTS generation ID and saves it to your **Voice Library**. This allows for consistent speech style and prosody across multiple requests. +Saves a new custom voice to your account using the specified TTS generation ID. + +Once saved, this voice can be reused in subsequent TTS requests, ensuring consistent speech style and prosody. For more details on voice creation, see the [Voices Guide](/docs/text-to-speech-tts/voices).
@@ -804,7 +811,7 @@ client.tts.voices.create(
-Removes a custom voice from your **Voice Library**. +Deletes a previously generated custom voice.
diff --git a/src/hume/tts/__init__.py b/src/hume/tts/__init__.py index 10c04a75..39ebab82 100644 --- a/src/hume/tts/__init__.py +++ b/src/hume/tts/__init__.py @@ -29,6 +29,7 @@ ) from .errors import BadRequestError, UnprocessableEntityError from . import voices +from .voices import VoicesListRequestProvider __all__ = [ "AudioEncoding", @@ -58,5 +59,6 @@ "ValidationError", "ValidationErrorLocItem", "VoiceProvider", + "VoicesListRequestProvider", "voices", ] diff --git a/src/hume/tts/client.py b/src/hume/tts/client.py index 2fc9c7d4..a3af6acd 100644 --- a/src/hume/tts/client.py +++ b/src/hume/tts/client.py @@ -41,7 +41,7 @@ def synthesize_json( request_options: typing.Optional[RequestOptions] = None, ) -> ReturnTts: """ - Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. + Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. The response includes the base64-encoded audio and metadata in JSON format. @@ -50,7 +50,7 @@ def synthesize_json( utterances : typing.Sequence[PostedUtterance] A list of **Utterances** to be converted to speech output. - An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -64,19 +64,19 @@ def synthesize_json( split_utterances : typing.Optional[bool] Controls how audio output is segmented in the response. - - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. + - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. - - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. + - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. - This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. + This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. strip_headers : typing.Optional[bool] If enabled, the audio for all the chunks of a generation, once concatenated together, will constitute a single audio file. Otherwise, if disabled, each chunk's audio will be its own audio file, each with its own headers (if applicable). instant_mode : typing.Optional[bool] Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). - - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. - - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). + - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. + - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -100,14 +100,14 @@ def synthesize_json( utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithUtterances( utterances=[ PostedUtterance( text="How can people see beauty so differently?", - description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", + description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", ) ], ), @@ -171,7 +171,7 @@ def synthesize_file( request_options: typing.Optional[RequestOptions] = None, ) -> typing.Iterator[bytes]: """ - Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. + Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. The response contains the generated audio file in the requested format. @@ -180,7 +180,7 @@ def synthesize_file( utterances : typing.Sequence[PostedUtterance] A list of **Utterances** to be converted to speech output. - An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -194,19 +194,19 @@ def synthesize_file( split_utterances : typing.Optional[bool] Controls how audio output is segmented in the response. - - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. + - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. - - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. + - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. - This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. + This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. strip_headers : typing.Optional[bool] If enabled, the audio for all the chunks of a generation, once concatenated together, will constitute a single audio file. Otherwise, if disabled, each chunk's audio will be its own audio file, each with its own headers (if applicable). instant_mode : typing.Optional[bool] Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). - - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. - - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). + - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. + - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -230,7 +230,7 @@ def synthesize_file( utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithGenerationId( @@ -293,14 +293,14 @@ def synthesize_file_streaming( request_options: typing.Optional[RequestOptions] = None, ) -> typing.Iterator[bytes]: """ - Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. + Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. Parameters ---------- utterances : typing.Sequence[PostedUtterance] A list of **Utterances** to be converted to speech output. - An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -314,19 +314,19 @@ def synthesize_file_streaming( split_utterances : typing.Optional[bool] Controls how audio output is segmented in the response. - - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. + - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. - - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. + - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. - This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. + This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. strip_headers : typing.Optional[bool] If enabled, the audio for all the chunks of a generation, once concatenated together, will constitute a single audio file. Otherwise, if disabled, each chunk's audio will be its own audio file, each with its own headers (if applicable). instant_mode : typing.Optional[bool] Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). - - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. - - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). + - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. + - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -350,7 +350,7 @@ def synthesize_file_streaming( utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithGenerationId( @@ -413,7 +413,7 @@ def synthesize_json_streaming( request_options: typing.Optional[RequestOptions] = None, ) -> typing.Iterator[SnippetAudioChunk]: """ - Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. + Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. The response is a stream of JSON objects including audio encoded in base64. @@ -422,7 +422,7 @@ def synthesize_json_streaming( utterances : typing.Sequence[PostedUtterance] A list of **Utterances** to be converted to speech output. - An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -436,19 +436,19 @@ def synthesize_json_streaming( split_utterances : typing.Optional[bool] Controls how audio output is segmented in the response. - - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. + - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. - - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. + - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. - This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. + This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. strip_headers : typing.Optional[bool] If enabled, the audio for all the chunks of a generation, once concatenated together, will constitute a single audio file. Otherwise, if disabled, each chunk's audio will be its own audio file, each with its own headers (if applicable). instant_mode : typing.Optional[bool] Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). - - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. - - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). + - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. + - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -472,14 +472,14 @@ def synthesize_json_streaming( utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithUtterances( utterances=[ PostedUtterance( text="How can people see beauty so differently?", - description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", + description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", ) ], ), @@ -558,7 +558,7 @@ async def synthesize_json( request_options: typing.Optional[RequestOptions] = None, ) -> ReturnTts: """ - Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. + Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. The response includes the base64-encoded audio and metadata in JSON format. @@ -567,7 +567,7 @@ async def synthesize_json( utterances : typing.Sequence[PostedUtterance] A list of **Utterances** to be converted to speech output. - An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -581,19 +581,19 @@ async def synthesize_json( split_utterances : typing.Optional[bool] Controls how audio output is segmented in the response. - - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. + - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. - - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. + - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. - This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. + This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. strip_headers : typing.Optional[bool] If enabled, the audio for all the chunks of a generation, once concatenated together, will constitute a single audio file. Otherwise, if disabled, each chunk's audio will be its own audio file, each with its own headers (if applicable). instant_mode : typing.Optional[bool] Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). - - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. - - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). + - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. + - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -622,14 +622,14 @@ async def main() -> None: utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithUtterances( utterances=[ PostedUtterance( text="How can people see beauty so differently?", - description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", + description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", ) ], ), @@ -696,7 +696,7 @@ async def synthesize_file( request_options: typing.Optional[RequestOptions] = None, ) -> typing.AsyncIterator[bytes]: """ - Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. + Synthesizes one or more input texts into speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. The response contains the generated audio file in the requested format. @@ -705,7 +705,7 @@ async def synthesize_file( utterances : typing.Sequence[PostedUtterance] A list of **Utterances** to be converted to speech output. - An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -719,19 +719,19 @@ async def synthesize_file( split_utterances : typing.Optional[bool] Controls how audio output is segmented in the response. - - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. + - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. - - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. + - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. - This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. + This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. strip_headers : typing.Optional[bool] If enabled, the audio for all the chunks of a generation, once concatenated together, will constitute a single audio file. Otherwise, if disabled, each chunk's audio will be its own audio file, each with its own headers (if applicable). instant_mode : typing.Optional[bool] Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). - - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. - - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). + - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. + - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -760,7 +760,7 @@ async def main() -> None: utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithGenerationId( @@ -826,14 +826,14 @@ async def synthesize_file_streaming( request_options: typing.Optional[RequestOptions] = None, ) -> typing.AsyncIterator[bytes]: """ - Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. + Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. Parameters ---------- utterances : typing.Sequence[PostedUtterance] A list of **Utterances** to be converted to speech output. - An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -847,19 +847,19 @@ async def synthesize_file_streaming( split_utterances : typing.Optional[bool] Controls how audio output is segmented in the response. - - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. + - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. - - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. + - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. - This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. + This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. strip_headers : typing.Optional[bool] If enabled, the audio for all the chunks of a generation, once concatenated together, will constitute a single audio file. Otherwise, if disabled, each chunk's audio will be its own audio file, each with its own headers (if applicable). instant_mode : typing.Optional[bool] Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). - - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. - - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). + - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. + - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -888,7 +888,7 @@ async def main() -> None: utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithGenerationId( @@ -954,7 +954,7 @@ async def synthesize_json_streaming( request_options: typing.Optional[RequestOptions] = None, ) -> typing.AsyncIterator[SnippetAudioChunk]: """ - Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. + Streams synthesized speech using the specified voice. If no voice is provided, a novel voice will be generated dynamically. Optionally, additional context can be included to influence the speech's style and prosody. The response is a stream of JSON objects including audio encoded in base64. @@ -963,7 +963,7 @@ async def synthesize_json_streaming( utterances : typing.Sequence[PostedUtterance] A list of **Utterances** to be converted to speech output. - An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. context : typing.Optional[PostedContext] Utterances to use as context for generating consistent speech style and prosody across multiple requests. These will not be converted to speech output. @@ -977,19 +977,19 @@ async def synthesize_json_streaming( split_utterances : typing.Optional[bool] Controls how audio output is segmented in the response. - - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. + - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. - - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. + - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. - This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. + This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. strip_headers : typing.Optional[bool] If enabled, the audio for all the chunks of a generation, once concatenated together, will constitute a single audio file. Otherwise, if disabled, each chunk's audio will be its own audio file, each with its own headers (if applicable). instant_mode : typing.Optional[bool] Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). - - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. - - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). + - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. + - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. @@ -1018,14 +1018,14 @@ async def main() -> None: utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithUtterances( utterances=[ PostedUtterance( text="How can people see beauty so differently?", - description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", + description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", ) ], ), diff --git a/src/hume/tts/types/posted_tts.py b/src/hume/tts/types/posted_tts.py index 16f2c625..2d351c2d 100644 --- a/src/hume/tts/types/posted_tts.py +++ b/src/hume/tts/types/posted_tts.py @@ -29,11 +29,11 @@ class PostedTts(UniversalBaseModel): """ Controls how audio output is segmented in the response. - - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. + - When **enabled** (`true`), input utterances are automatically split into natural-sounding speech segments. - - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. + - When **disabled** (`false`), the response maintains a strict one-to-one mapping between input utterances and output snippets. - This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. + This setting affects how the `snippets` array is structured in the response, which may be important for applications that need to track the relationship between input text and generated audio segments. When setting to `false`, avoid including utterances with long `text`, as this can result in distorted output. """ strip_headers: typing.Optional[bool] = pydantic.Field(default=None) @@ -45,14 +45,14 @@ class PostedTts(UniversalBaseModel): """ A list of **Utterances** to be converted to speech output. - An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. + An **Utterance** is a unit of input for [Octave](/docs/text-to-speech-tts/overview), and includes input `text`, an optional `description` to serve as the prompt for how the speech should be delivered, an optional `voice` specification, and additional controls to guide delivery for `speed` and `trailing_silence`. """ instant_mode: typing.Optional[bool] = pydantic.Field(default=None) """ Enables ultra-low latency streaming, significantly reducing the time until the first audio chunk is received. Recommended for real-time applications requiring immediate audio playback. For further details, see our documentation on [instant mode](/docs/text-to-speech-tts/overview#ultra-low-latency-streaming-instant-mode). - - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. - - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). + - Dynamic voice generation is not supported with this mode; a predefined [voice](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.utterances.voice) must be specified in your request. + - This mode is only supported for streaming endpoints (e.g., [/v0/tts/stream/json](/reference/text-to-speech-tts/synthesize-json-streaming), [/v0/tts/stream/file](/reference/text-to-speech-tts/synthesize-file-streaming)). - Ensure only a single generation is requested ([num_generations](/reference/text-to-speech-tts/synthesize-json-streaming#request.body.num_generations) must be `1` or omitted). - With `instant_mode` enabled, **requests incur a 10% higher cost** due to increased compute and resource requirements. """ diff --git a/src/hume/tts/types/posted_utterance.py b/src/hume/tts/types/posted_utterance.py index 7f5289b8..f4da520f 100644 --- a/src/hume/tts/types/posted_utterance.py +++ b/src/hume/tts/types/posted_utterance.py @@ -10,9 +10,9 @@ class PostedUtterance(UniversalBaseModel): description: typing.Optional[str] = pydantic.Field(default=None) """ - Natural language instructions describing how the synthesized speech should sound, including but not limited to tone, intonation, pacing, and accent (e.g., 'a soft, gentle voice with a strong British accent'). - - If a Voice is specified in the request, this description serves as acting instructions. For tips on how to effectively guide speech delivery, see our guide on [Acting instructions](/docs/text-to-speech-tts/acting-instructions). - - If no Voice is specified, a new voice is generated based on this description. See our [prompting guide](/docs/text-to-speech-tts/prompting) for tips on designing a voice. + Natural language instructions describing how the synthesized speech should sound, including but not limited to tone, intonation, pacing, and accent (e.g., 'a soft, gentle voice with a strong British accent'). + - If a Voice is specified in the request, this description serves as acting instructions. For tips on how to effectively guide speech delivery, see our guide on [Acting instructions](/docs/text-to-speech-tts/acting-instructions). + - If no Voice is specified, a new voice is generated based on this description. See our [prompting guide](/docs/text-to-speech-tts/prompting) for tips on designing a voice. """ speed: typing.Optional[float] = pydantic.Field(default=None) @@ -32,9 +32,9 @@ class PostedUtterance(UniversalBaseModel): voice: typing.Optional[PostedUtteranceVoice] = pydantic.Field(default=None) """ - The `name` or `id` associated with a **Voice** from the **Voice Library** to be used as the speaker for this and all subsequent `utterances`, until the `voice` field is updated again. + The `name` or `id` associated with a **Voice** from the **Voice Library** to be used as the speaker for this and all subsequent `utterances`, until the `voice` field is updated again. - See our [voices guide](/docs/text-to-speech-tts/voices) for more details on generating and specifying **Voices**. + See our [voices guide](/docs/text-to-speech-tts/voices) for more details on generating and specifying **Voices**. """ if IS_PYDANTIC_V2: diff --git a/src/hume/tts/types/posted_utterance_voice_with_id.py b/src/hume/tts/types/posted_utterance_voice_with_id.py index 64bd4f84..6e255f84 100644 --- a/src/hume/tts/types/posted_utterance_voice_with_id.py +++ b/src/hume/tts/types/posted_utterance_voice_with_id.py @@ -10,20 +10,19 @@ class PostedUtteranceVoiceWithId(UniversalBaseModel): id: str = pydantic.Field() """ - The ID of a **Voice** within the **Voice Library**. + The unique ID associated with the **Voice**. """ provider: typing.Optional[VoiceProvider] = pydantic.Field(default=None) """ - Specifies the provider of the voice associated with this voice ID. + Specifies the source provider associated with the chosen voice. - - **HUME_AI**: Preset voices generated by Hume. + - **`HUME_AI`**: Select voices from Hume's [Voice Library](https://platform.hume.ai/tts/voice-library), containing a variety of preset, shared voices. + - **`CUSTOM_VOICE`**: Select from voices you've personally generated and saved in your account. - - **CUSTOM_VOICE**: Voices you have generated and saved to your `Voice library`. + If no provider is explicitly set, the default provider is `CUSTOM_VOICE`. When using voices from Hume's **Voice Library**, you must explicitly set the provider to `HUME_AI`. - If a provider is not specified, the provider will default to `CUSTOM_VOICE`. - - While Hume's preset voices are shared and usable by anyone, your custom voices are only available to calls made with your API key. + Preset voices from Hume's **Voice Library** are accessible by all users. In contrast, your custom voices are private and accessible only via requests authenticated with your API key. """ if IS_PYDANTIC_V2: diff --git a/src/hume/tts/types/posted_utterance_voice_with_name.py b/src/hume/tts/types/posted_utterance_voice_with_name.py index 0435b147..02cf91a3 100644 --- a/src/hume/tts/types/posted_utterance_voice_with_name.py +++ b/src/hume/tts/types/posted_utterance_voice_with_name.py @@ -10,20 +10,19 @@ class PostedUtteranceVoiceWithName(UniversalBaseModel): name: str = pydantic.Field() """ - The name of a **Voice** within the **Voice Library**. + The name of a **Voice**. """ provider: typing.Optional[VoiceProvider] = pydantic.Field(default=None) """ - Specifies the provider of the voice associated with this voice name. + Specifies the source provider associated with the chosen voice. - - **HUME_AI**: Preset voices generated by Hume. + - **`HUME_AI`**: Select voices from Hume's [Voice Library](https://platform.hume.ai/tts/voice-library), containing a variety of preset, shared voices. + - **`CUSTOM_VOICE`**: Select from voices you've personally generated and saved in your account. - - **CUSTOM_VOICE**: Voices you have generated and saved to your `Voice library`. + If no provider is explicitly set, the default provider is `CUSTOM_VOICE`. When using voices from Hume's **Voice Library**, you must explicitly set the provider to `HUME_AI`. - If a provider is not specified, the provider will default to `CUSTOM_VOICE`. - - While Hume's preset voices are shared and usable by anyone, your custom voices are only available to calls made with your API key. + Preset voices from Hume's **Voice Library** are accessible by all users. In contrast, your custom voices are private and accessible only via requests authenticated with your API key. """ if IS_PYDANTIC_V2: diff --git a/src/hume/tts/types/return_generation.py b/src/hume/tts/types/return_generation.py index 13af43e1..2e3ecce0 100644 --- a/src/hume/tts/types/return_generation.py +++ b/src/hume/tts/types/return_generation.py @@ -32,7 +32,7 @@ class ReturnGeneration(UniversalBaseModel): snippets: typing.List[typing.List[Snippet]] = pydantic.Field() """ - A list of snippet groups where each group corresponds to an utterance in the request. Each group contains segmented snippets that represent the original utterance divided into more natural-sounding units optimized for speech delivery. + A list of snippet groups where each group corresponds to an utterance in the request. Each group contains segmented snippets that represent the original utterance divided into more natural-sounding units optimized for speech delivery. """ if IS_PYDANTIC_V2: diff --git a/src/hume/tts/types/return_tts.py b/src/hume/tts/types/return_tts.py index fac924fc..ddea9fec 100644 --- a/src/hume/tts/types/return_tts.py +++ b/src/hume/tts/types/return_tts.py @@ -11,7 +11,7 @@ class ReturnTts(UniversalBaseModel): generations: typing.List[ReturnGeneration] request_id: typing.Optional[str] = pydantic.Field(default=None) """ - A unique ID associated with this request for tracking and troubleshooting. Use this ID when contacting [support](/support) for troubleshooting assistance. + A unique ID associated with this request for tracking and troubleshooting. Use this ID when contacting [support](/support) for troubleshooting assistance. """ if IS_PYDANTIC_V2: diff --git a/src/hume/tts/types/return_voice.py b/src/hume/tts/types/return_voice.py index 1c80846c..1a548599 100644 --- a/src/hume/tts/types/return_voice.py +++ b/src/hume/tts/types/return_voice.py @@ -24,15 +24,9 @@ class ReturnVoice(UniversalBaseModel): provider: typing.Optional[VoiceProvider] = pydantic.Field(default=None) """ - Specifies the provider of the voice. + The provider associated with the created voice. - - **HUME_AI**: Preset voices generated by Hume. - - - **CUSTOM_VOICE**: Voices you have generated and saved to your `Voice library`. - - If a provider is not specified, the provider will default to `CUSTOM_VOICE`. - - While Hume's preset voices are shared and usable by anyone, your custom voices are only available to calls made with your API key. + Voices created through this endpoint will always have the provider set to `CUSTOM_VOICE`, indicating a custom voice stored in your account. """ if IS_PYDANTIC_V2: diff --git a/src/hume/tts/voices/__init__.py b/src/hume/tts/voices/__init__.py index f3ea2659..27d673d0 100644 --- a/src/hume/tts/voices/__init__.py +++ b/src/hume/tts/voices/__init__.py @@ -1,2 +1,5 @@ # This file was auto-generated by Fern from our API Definition. +from .types import VoicesListRequestProvider + +__all__ = ["VoicesListRequestProvider"] diff --git a/src/hume/tts/voices/client.py b/src/hume/tts/voices/client.py index 313096f0..1b1188c2 100644 --- a/src/hume/tts/voices/client.py +++ b/src/hume/tts/voices/client.py @@ -2,7 +2,7 @@ import typing from ...core.client_wrapper import SyncClientWrapper -from ..types.voice_provider import VoiceProvider +from .types.voices_list_request_provider import VoicesListRequestProvider from ...core.request_options import RequestOptions from ...core.pagination import SyncPager from ..types.return_voice import ReturnVoice @@ -28,19 +28,22 @@ def __init__(self, *, client_wrapper: SyncClientWrapper): def list( self, *, - provider: VoiceProvider, + provider: VoicesListRequestProvider, page_number: typing.Optional[int] = None, page_size: typing.Optional[int] = None, ascending_order: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None, ) -> SyncPager[ReturnVoice]: """ - Lists voices in your **Voice Library**. Set provider to `HUME_AI` to list Hume's preset voices, or to `CUSTOM_VOICE` to a custom voice created in your account. + Lists voices you have saved in your account, or voices from the [Voice Library](https://platform.hume.ai/tts/voice-library). Parameters ---------- - provider : VoiceProvider - Specifies whether to return custom voices created in your account or shared voices provided by Hume + provider : VoicesListRequestProvider + Specify the voice provider to filter voices returned by the endpoint: + + - **`HUME_AI`**: Lists preset, shared voices from Hume's [Voice Library](https://platform.hume.ai/tts/voice-library). + - **`CUSTOM_VOICE`**: Lists custom voices created and saved to your account. page_number : typing.Optional[int] Specifies the page number to retrieve, enabling pagination. @@ -128,7 +131,9 @@ def create( self, *, generation_id: str, name: str, request_options: typing.Optional[RequestOptions] = None ) -> ReturnVoice: """ - Creates a new voice from a specified TTS generation ID and saves it to your **Voice Library**. This allows for consistent speech style and prosody across multiple requests. + Saves a new custom voice to your account using the specified TTS generation ID. + + Once saved, this voice can be reused in subsequent TTS requests, ensuring consistent speech style and prosody. For more details on voice creation, see the [Voices Guide](/docs/text-to-speech-tts/voices). Parameters ---------- @@ -194,7 +199,7 @@ def create( def delete(self, *, name: str, request_options: typing.Optional[RequestOptions] = None) -> None: """ - Removes a custom voice from your **Voice Library**. + Deletes a previously generated custom voice. Parameters ---------- @@ -253,19 +258,22 @@ def __init__(self, *, client_wrapper: AsyncClientWrapper): async def list( self, *, - provider: VoiceProvider, + provider: VoicesListRequestProvider, page_number: typing.Optional[int] = None, page_size: typing.Optional[int] = None, ascending_order: typing.Optional[bool] = None, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncPager[ReturnVoice]: """ - Lists voices in your **Voice Library**. Set provider to `HUME_AI` to list Hume's preset voices, or to `CUSTOM_VOICE` to a custom voice created in your account. + Lists voices you have saved in your account, or voices from the [Voice Library](https://platform.hume.ai/tts/voice-library). Parameters ---------- - provider : VoiceProvider - Specifies whether to return custom voices created in your account or shared voices provided by Hume + provider : VoicesListRequestProvider + Specify the voice provider to filter voices returned by the endpoint: + + - **`HUME_AI`**: Lists preset, shared voices from Hume's [Voice Library](https://platform.hume.ai/tts/voice-library). + - **`CUSTOM_VOICE`**: Lists custom voices created and saved to your account. page_number : typing.Optional[int] Specifies the page number to retrieve, enabling pagination. @@ -361,7 +369,9 @@ async def create( self, *, generation_id: str, name: str, request_options: typing.Optional[RequestOptions] = None ) -> ReturnVoice: """ - Creates a new voice from a specified TTS generation ID and saves it to your **Voice Library**. This allows for consistent speech style and prosody across multiple requests. + Saves a new custom voice to your account using the specified TTS generation ID. + + Once saved, this voice can be reused in subsequent TTS requests, ensuring consistent speech style and prosody. For more details on voice creation, see the [Voices Guide](/docs/text-to-speech-tts/voices). Parameters ---------- @@ -435,7 +445,7 @@ async def main() -> None: async def delete(self, *, name: str, request_options: typing.Optional[RequestOptions] = None) -> None: """ - Removes a custom voice from your **Voice Library**. + Deletes a previously generated custom voice. Parameters ---------- diff --git a/src/hume/tts/voices/types/__init__.py b/src/hume/tts/voices/types/__init__.py new file mode 100644 index 00000000..09d826f6 --- /dev/null +++ b/src/hume/tts/voices/types/__init__.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +from .voices_list_request_provider import VoicesListRequestProvider + +__all__ = ["VoicesListRequestProvider"] diff --git a/src/hume/tts/voices/types/voices_list_request_provider.py b/src/hume/tts/voices/types/voices_list_request_provider.py new file mode 100644 index 00000000..f0ce5f21 --- /dev/null +++ b/src/hume/tts/voices/types/voices_list_request_provider.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +VoicesListRequestProvider = typing.Union[typing.Literal["HUME_AI", "CUSTOM_VOICE"], typing.Any] diff --git a/tests/tts/test_root.py b/tests/tts/test_root.py index 009eaf9a..17f859ff 100644 --- a/tests/tts/test_root.py +++ b/tests/tts/test_root.py @@ -69,14 +69,14 @@ async def test_synthesize_json(client: HumeClient, async_client: AsyncHumeClient utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithUtterances( utterances=[ PostedUtterance( text="How can people see beauty so differently?", - description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", + description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", ) ] ), @@ -89,14 +89,14 @@ async def test_synthesize_json(client: HumeClient, async_client: AsyncHumeClient utterances=[ PostedUtterance( text="Beauty is no quality in things themselves: It exists merely in the mind which contemplates them.", - description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", + description="Middle-aged masculine voice with a clear, rhythmic Scots lilt, rounded vowels, and a warm, steady tone with an articulate, academic quality.", ) ], context=PostedContextWithUtterances( utterances=[ PostedUtterance( text="How can people see beauty so differently?", - description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", + description="A curious student with a clear and respectful tone, seeking clarification on Hume's ideas with a straightforward question.", ) ] ),