# Play API SDK
**pyht** is a Python SDK for [Play's AI Text-to-Speech API](https://play.ht/text-to-speech-api/). Play builds conversational voice AI models for realtime use cases. With **pyht**, you can easily convert text into high-quality audio streams with humanlike voices.
Currently the library supports only streaming and non-streaming text-to-speech. For the full set of functionalities provided by the Play API such as [Voice Cloning](https://docs.play.ht/reference/api-create-instant-voice-clone), see the [Play docs](https://docs.play.ht/reference/api-getting-started)
## Features
- Stream text-to-speech in real-time, synchronous or asynchronous.
- Generate non-streaming text-to-speech, synchronous or asynchronous.
- Use Play's pre-built voices or your own custom voice clones.
- Stream text from LLM, and generate audio stream in real-time.
- Supports WAV, MP3, Mulaw, FLAC, and OGG audio formats as well as raw audio.
- Supports 8KHz, 16KHz, 24KHz, 44.1KHz and 48KHz sample rates.
## Requirements
- Python 3.8+
- `aiohttp`
- `filelock`
- `grpc`
- `requests`
- `websockets`
## Installation
You can install the **pyht** SDK using pip:
```shell
pip install pyht
```
## Usage
You can use the **pyht** SDK by creating a `Client` instance and calling its `tts` method. Here's a simple example:
```python
from pyht import Client
from dotenv import load_dotenv
from pyht.client import TTSOptions
import os
load_dotenv()
client = Client(
user_id=os.getenv("PLAY_HT_USER_ID"),
api_key=os.getenv("PLAY_HT_API_KEY"),
)
options = TTSOptions(voice="s3://voice-cloning-zero-shot/775ae416-49bb-4fb6-bd45-740f205d20a1/jennifersaad/manifest.json")
for chunk in client.tts("Hi, I'm Jennifer from Play. How can I help you today?", options):
# do something with the audio chunk
print(type(chunk))
```
It is also possible to stream text instead of submitting it as a string all at once:
```python
for chunk in client.stream_tts_input(some_iterable_text_stream, options):
# do something with the audio chunk
print(type(chunk))
```
An asyncio version of the client is also available:
```python
from pyht import AsyncClient
client = AsyncClient(
user_id=os.getenv("PLAY_HT_USER_ID"),
api_key=os.getenv("PLAY_HT_API_KEY"),
)
options = TTSOptions(voice="s3://voice-cloning-zero-shot/775ae416-49bb-4fb6-bd45-740f205d20a1/jennifersaad/manifest.json")
async for chunk in client.tts("Hi, I'm Jennifer from Play. How can I help you today?", options):
# do something with the audio chunk
print(type(chunk))
```
The `tts` method takes the following arguments:
- `text`: The text to be converted to speech; a string or list of strings.
- `options`: The options to use for the TTS request; a `TTSOptions` object [(see below)](#ttsoptions).
- `voice_engine`: The voice engine to use for the TTS request; a string (default `Play3.0-mini-http`).
- `PlayDialog`: Our large, expressive English model, which also supports multi-turn two-speaker dialogues.
- `PlayDialogMultilingual`: Our large, expressive multilingual model, which also supports multi-turn two-speaker dialogues.
- `Play3.0-mini`: Our small, fast multilingual model.
- `PlayHT2.0-turbo`: Our legacy English-only model
- `protocol`: The protocol to use to communicate with the Play API (`http` by default except for `PlayHT2.0-turbo` which is `grpc` by default).
- `http`: Streaming and non-streaming audio over HTTP (supports `Play3.0-mini`, `PlayDialog`, and `PlayDialogMultilingual`).
- `ws`: Streaming audio over WebSockets (supports `Play3.0-mini`, `PlayDialog`, and `PlayDialogMultilingual`).
- `grpc`: Streaming audio over gRPC (supports `PlayHT2.0-turbo` for all, and `Play3.0-mini` ONLY for Play On-Prem customers).
- `streaming`: Whether or not to stream the audio in chunks (default True); non-streaming is only enabled for HTTP endpoints.
### TTSOptions
The `TTSOptions` class is used to specify the options for the TTS request. It has the following members, with these supported values:
- `voice`: The voice to use for the TTS request; a string.
- A URL pointing to a Play voice manifest file.
- `format`: The format of the audio to be returned; a `Format` enum value.
- `FORMAT_MP3` (default)
- `FORMAT_WAV`
- `FORMAT_MULAW`
- `FORMAT_FLAC`
- `FORMAT_OGG`
- `FORMAT_RAW`
- `sample_rate`: The sample rate of the audio to be returned; an integer or `None` (Play backend will choose by default).
- 8000
- 16000
- 24000
- 44100
- 48000
- `quality`: DEPRECATED (use sample rate to adjust audio quality)
- `speed`: The speed of the audio to be returned, a float (default `1.0`).
- `seed`: Random seed to use for audio generation, an integer (default `None`, will be randomly generated).
- The following options are inference-time hyperparameters of the text-to-speech model; if unset, the model will use default values chosen by Play.
- `temperature` (all models): The temperature of the model, a float.
- `top_p` (all models): The top_p of the model, a float.
- `text_guidance` (`Play3.0-mini` and `PlayHT2.0-turbo` only): The text_guidance of the model, a float.
- `voice_guidance` (`Play3.0-mini` and `PlayHT2.0-turbo` only): The voice_guidance of the model, a float.
- `style_guidance` (`Play3.0-mini` only): The style_guidance of the model, a float.
- `repetition_penalty` (`Play3.0-mini` and `PlayHT2.0-turbo` only): The repetition_penalty of the model, a float.
- `disable_stabilization` (`PlayHT2.0-turbo` only): Disable the audio stabilization process, a boolean (default `False`).
- `language` (`Play3.0` and `PlayDialogMultilingual` only): The language of the text to be spoken, a `Language` enum value or `None` (default `ENGLISH`).
- `AFRIKAANS`
- `ALBANIAN`
- `AMHARIC`
- `ARABIC`
- `BENGALI`
- `BULGARIAN`
- `CATALAN`
- `CROATIAN`
- `CZECH`
- `DANISH`
- `DUTCH`
- `ENGLISH`
- `FRENCH`
- `GALICIAN`
- `GERMAN`
- `GREEK`
- `HEBREW`
- `HINDI`
- `HUNGARIAN`
- `INDONESIAN`
- `ITALIAN`
- `JAPANESE`
- `KOREAN`
- `MALAY`
- `MANDARIN`
- `POLISH`
- `PORTUGUESE`
- `RUSSIAN`
- `SERBIAN`
- `SPANISH`
- `SWEDISH`
- `TAGALOG`
- `THAI`
- `TURKISH`
- `UKRAINIAN`
- `URDU`
- `XHOSA`
- The following options are additional inference-time hyperparameters which only apply to the `PlayDialog` and `PlayDialogMultilingual` models; if unset, the model will use default values chosen by Play.
- `voice_2` (multi-turn dialogue only): The second voice to use for a multi-turn TTS request; a string.
- A URL pointing to a Play voice manifest file.
- `turn_prefix` (multi-turn dialogue only): The prefix for the first speaker's turns in a multi-turn TTS request; a string.
- `turn_prefix_2` (multi-turn dialogue only): The prefix for the second speaker's turns in a multi-turn TTS request; a string.
- `voice_conditioning_seconds`: How much of the voice's reference audio to pass to the model as a guide; an integer.
- `voice_conditioning_seconds_2` (multi-turn dialogue only): How much of the second voice's reference audio to pass to the model as a guide; an integer.
- `scene_description`: A description of the overall scene (single- or multi-turn) to guide the model; a string (NOTE: currently not recommended).
- `turn_clip_description` (multi-turn dialogue only): A description of each turn (with turn prefixes) to guide the model; a string (NOTE: currently not recommended).
- `num_candidates`: How many candidates to rank to choose the best one; an integer.
- `candidate_ranking_method`: The method for the model to use to rank candidates; a `CandidateRankingMethod` enum value or `None` (let Play choose the method by default).
- Methods valid for streaming and non-streaming requests:
- `MeanProbRank`: Rank candidates based on mean probability of the output sequence.
- Methods valid for streaming requests only:
- `EndProbRank`: Rank candidates based on probability of end of sequence.
- `MeanProbWithEndProbRank`: Combination of `MeanProbRank` and `EndProbRank`.
- Methods valid for non-streaming requests only:
- `DescriptionRank`: Rank candidates based on adherence to description.
- `ASRRank`: Rank candidates based on comparison of ASR transcription with the ground-truth text.
- `DescriptionASRRank`: Combination of `DescriptionRank` and `ASRRank`.
- `ASRWithMeanProbRank`: Combination of `ASRRank` and `MeanProbRank`.
- `DescriptionASRWithMeanProbRank`: Combination of `DescriptionASRRank` and `MeanProbRank`.
## Command-Line Demo
You can run the provided [demo](https://github.com/playht/pyht/tree/master/demo/) from the command line.
**Note:** This demo depends on the following packages:
```shell
pip install numpy soundfile
```
```shell
python demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text "Hello from Play!"
```
To run with the asyncio client, use the `--async` flag:
```shell
python demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text "Hello from Play!" --async
```
To run with the HTTP API, which uses our latest Play3.0-mini model, use the `--http` flag:
```shell
python demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text "Hello from Play!" --http
```
To run with the WebSockets API, which also uses our latest Play3.0-mini model, use the `--ws` flag:
```shell
python demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text "Hello from Play!" --ws
```
The HTTP and WebSockets APIs can also be used with the async client:
```shell
python demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text "Hello from Play!" --http --async
python demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text "Hello from Play!" --ws --async
```
Alternatively, you can run the demo in interactive mode:
```shell
python demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --interactive
```
In interactive mode, you can input text lines to generate and play audio on-the-fly. An empty line will exit the interactive session.
## Get an API Key
To get started with the **pyht** SDK, you'll need your API Secret Key and User ID. Follow these steps to obtain them:
1. **Access the API Page**:
Navigate to the [API Access page](https://play.ht/studio/api-access).
2. **Generate Your API Secret Key**:
- Click the "Generate Secret Key" button under the "Secret Key" section.
- Your API Secret Key will be displayed. Ensure you copy it and store it securely.
3. **Locate Your User ID**:
Find and copy your User ID, which can be found on the same page under the "User ID" section.
_**Keep your API Secret Key confidential**. It's crucial not to share it with anyone or include it in publicly accessible code repositories._
Raw data
{
"_id": null,
"home_page": "https://github.com/playht/pyht",
"name": "pyht",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.8",
"maintainer_email": null,
"keywords": null,
"author": "Playht Inc.",
"author_email": "oss@play.ht",
"download_url": "https://files.pythonhosted.org/packages/1e/ce/f319ae21d1e94d34cbe8940e63bf0a7f8696dc913ca3a1a79232537ab4d8/pyht-0.1.11.tar.gz",
"platform": null,
"description": "# Play API SDK\n\n**pyht** is a Python SDK for [Play's AI Text-to-Speech API](https://play.ht/text-to-speech-api/). Play builds conversational voice AI models for realtime use cases. With **pyht**, you can easily convert text into high-quality audio streams with humanlike voices.\n\nCurrently the library supports only streaming and non-streaming text-to-speech. For the full set of functionalities provided by the Play API such as [Voice Cloning](https://docs.play.ht/reference/api-create-instant-voice-clone), see the [Play docs](https://docs.play.ht/reference/api-getting-started)\n\n## Features\n\n- Stream text-to-speech in real-time, synchronous or asynchronous.\n- Generate non-streaming text-to-speech, synchronous or asynchronous.\n- Use Play's pre-built voices or your own custom voice clones.\n- Stream text from LLM, and generate audio stream in real-time.\n- Supports WAV, MP3, Mulaw, FLAC, and OGG audio formats as well as raw audio.\n- Supports 8KHz, 16KHz, 24KHz, 44.1KHz and 48KHz sample rates.\n\n## Requirements\n\n- Python 3.8+\n- `aiohttp`\n- `filelock`\n- `grpc`\n- `requests`\n- `websockets`\n\n## Installation\n\nYou can install the **pyht** SDK using pip:\n\n```shell\npip install pyht\n```\n\n## Usage\n\nYou can use the **pyht** SDK by creating a `Client` instance and calling its `tts` method. Here's a simple example:\n\n```python\nfrom pyht import Client\nfrom dotenv import load_dotenv\nfrom pyht.client import TTSOptions\nimport os\nload_dotenv()\n\nclient = Client(\n user_id=os.getenv(\"PLAY_HT_USER_ID\"),\n api_key=os.getenv(\"PLAY_HT_API_KEY\"),\n)\noptions = TTSOptions(voice=\"s3://voice-cloning-zero-shot/775ae416-49bb-4fb6-bd45-740f205d20a1/jennifersaad/manifest.json\")\nfor chunk in client.tts(\"Hi, I'm Jennifer from Play. How can I help you today?\", options):\n # do something with the audio chunk\n print(type(chunk))\n```\n\nIt is also possible to stream text instead of submitting it as a string all at once:\n\n```python\nfor chunk in client.stream_tts_input(some_iterable_text_stream, options):\n # do something with the audio chunk\n print(type(chunk))\n```\n\nAn asyncio version of the client is also available:\n\n```python\nfrom pyht import AsyncClient\n\nclient = AsyncClient(\n user_id=os.getenv(\"PLAY_HT_USER_ID\"),\n api_key=os.getenv(\"PLAY_HT_API_KEY\"),\n)\noptions = TTSOptions(voice=\"s3://voice-cloning-zero-shot/775ae416-49bb-4fb6-bd45-740f205d20a1/jennifersaad/manifest.json\")\nasync for chunk in client.tts(\"Hi, I'm Jennifer from Play. How can I help you today?\", options):\n # do something with the audio chunk\n print(type(chunk))\n```\n\nThe `tts` method takes the following arguments:\n\n- `text`: The text to be converted to speech; a string or list of strings.\n- `options`: The options to use for the TTS request; a `TTSOptions` object [(see below)](#ttsoptions).\n- `voice_engine`: The voice engine to use for the TTS request; a string (default `Play3.0-mini-http`).\n - `PlayDialog`: Our large, expressive English model, which also supports multi-turn two-speaker dialogues.\n - `PlayDialogMultilingual`: Our large, expressive multilingual model, which also supports multi-turn two-speaker dialogues.\n - `Play3.0-mini`: Our small, fast multilingual model.\n - `PlayHT2.0-turbo`: Our legacy English-only model\n- `protocol`: The protocol to use to communicate with the Play API (`http` by default except for `PlayHT2.0-turbo` which is `grpc` by default).\n - `http`: Streaming and non-streaming audio over HTTP (supports `Play3.0-mini`, `PlayDialog`, and `PlayDialogMultilingual`).\n - `ws`: Streaming audio over WebSockets (supports `Play3.0-mini`, `PlayDialog`, and `PlayDialogMultilingual`).\n - `grpc`: Streaming audio over gRPC (supports `PlayHT2.0-turbo` for all, and `Play3.0-mini` ONLY for Play On-Prem customers).\n- `streaming`: Whether or not to stream the audio in chunks (default True); non-streaming is only enabled for HTTP endpoints.\n\n### TTSOptions\n\nThe `TTSOptions` class is used to specify the options for the TTS request. It has the following members, with these supported values:\n\n- `voice`: The voice to use for the TTS request; a string.\n - A URL pointing to a Play voice manifest file.\n- `format`: The format of the audio to be returned; a `Format` enum value.\n - `FORMAT_MP3` (default)\n - `FORMAT_WAV`\n - `FORMAT_MULAW`\n - `FORMAT_FLAC`\n - `FORMAT_OGG`\n - `FORMAT_RAW`\n- `sample_rate`: The sample rate of the audio to be returned; an integer or `None` (Play backend will choose by default).\n - 8000\n - 16000\n - 24000\n - 44100\n - 48000\n- `quality`: DEPRECATED (use sample rate to adjust audio quality)\n- `speed`: The speed of the audio to be returned, a float (default `1.0`).\n- `seed`: Random seed to use for audio generation, an integer (default `None`, will be randomly generated).\n- The following options are inference-time hyperparameters of the text-to-speech model; if unset, the model will use default values chosen by Play.\n - `temperature` (all models): The temperature of the model, a float.\n - `top_p` (all models): The top_p of the model, a float.\n - `text_guidance` (`Play3.0-mini` and `PlayHT2.0-turbo` only): The text_guidance of the model, a float.\n - `voice_guidance` (`Play3.0-mini` and `PlayHT2.0-turbo` only): The voice_guidance of the model, a float.\n - `style_guidance` (`Play3.0-mini` only): The style_guidance of the model, a float.\n - `repetition_penalty` (`Play3.0-mini` and `PlayHT2.0-turbo` only): The repetition_penalty of the model, a float.\n- `disable_stabilization` (`PlayHT2.0-turbo` only): Disable the audio stabilization process, a boolean (default `False`).\n- `language` (`Play3.0` and `PlayDialogMultilingual` only): The language of the text to be spoken, a `Language` enum value or `None` (default `ENGLISH`).\n - `AFRIKAANS`\n - `ALBANIAN`\n - `AMHARIC`\n - `ARABIC`\n - `BENGALI`\n - `BULGARIAN`\n - `CATALAN`\n - `CROATIAN`\n - `CZECH`\n - `DANISH`\n - `DUTCH`\n - `ENGLISH`\n - `FRENCH`\n - `GALICIAN`\n - `GERMAN`\n - `GREEK`\n - `HEBREW`\n - `HINDI`\n - `HUNGARIAN`\n - `INDONESIAN`\n - `ITALIAN`\n - `JAPANESE`\n - `KOREAN`\n - `MALAY`\n - `MANDARIN`\n - `POLISH`\n - `PORTUGUESE`\n - `RUSSIAN`\n - `SERBIAN`\n - `SPANISH`\n - `SWEDISH`\n - `TAGALOG`\n - `THAI`\n - `TURKISH`\n - `UKRAINIAN`\n - `URDU`\n - `XHOSA`\n- The following options are additional inference-time hyperparameters which only apply to the `PlayDialog` and `PlayDialogMultilingual` models; if unset, the model will use default values chosen by Play.\n - `voice_2` (multi-turn dialogue only): The second voice to use for a multi-turn TTS request; a string.\n - A URL pointing to a Play voice manifest file.\n - `turn_prefix` (multi-turn dialogue only): The prefix for the first speaker's turns in a multi-turn TTS request; a string.\n - `turn_prefix_2` (multi-turn dialogue only): The prefix for the second speaker's turns in a multi-turn TTS request; a string.\n - `voice_conditioning_seconds`: How much of the voice's reference audio to pass to the model as a guide; an integer.\n - `voice_conditioning_seconds_2` (multi-turn dialogue only): How much of the second voice's reference audio to pass to the model as a guide; an integer.\n - `scene_description`: A description of the overall scene (single- or multi-turn) to guide the model; a string (NOTE: currently not recommended).\n - `turn_clip_description` (multi-turn dialogue only): A description of each turn (with turn prefixes) to guide the model; a string (NOTE: currently not recommended).\n - `num_candidates`: How many candidates to rank to choose the best one; an integer.\n - `candidate_ranking_method`: The method for the model to use to rank candidates; a `CandidateRankingMethod` enum value or `None` (let Play choose the method by default).\n - Methods valid for streaming and non-streaming requests:\n - `MeanProbRank`: Rank candidates based on mean probability of the output sequence.\n - Methods valid for streaming requests only:\n - `EndProbRank`: Rank candidates based on probability of end of sequence.\n - `MeanProbWithEndProbRank`: Combination of `MeanProbRank` and `EndProbRank`.\n - Methods valid for non-streaming requests only:\n - `DescriptionRank`: Rank candidates based on adherence to description.\n - `ASRRank`: Rank candidates based on comparison of ASR transcription with the ground-truth text.\n - `DescriptionASRRank`: Combination of `DescriptionRank` and `ASRRank`.\n - `ASRWithMeanProbRank`: Combination of `ASRRank` and `MeanProbRank`.\n - `DescriptionASRWithMeanProbRank`: Combination of `DescriptionASRRank` and `MeanProbRank`.\n\n\n## Command-Line Demo\n\nYou can run the provided [demo](https://github.com/playht/pyht/tree/master/demo/) from the command line.\n\n**Note:** This demo depends on the following packages:\n\n```shell\npip install numpy soundfile\n```\n\n```shell\npython demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text \"Hello from Play!\"\n```\n\nTo run with the asyncio client, use the `--async` flag:\n\n```shell\npython demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text \"Hello from Play!\" --async\n```\n\nTo run with the HTTP API, which uses our latest Play3.0-mini model, use the `--http` flag:\n\n```shell\npython demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text \"Hello from Play!\" --http\n```\n\nTo run with the WebSockets API, which also uses our latest Play3.0-mini model, use the `--ws` flag:\n\n```shell\npython demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text \"Hello from Play!\" --ws\n```\n\nThe HTTP and WebSockets APIs can also be used with the async client:\n\n```shell\npython demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text \"Hello from Play!\" --http --async\npython demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --text \"Hello from Play!\" --ws --async\n```\n\nAlternatively, you can run the demo in interactive mode:\n\n```shell\npython demo/main.py --user $PLAY_HT_USER_ID --key $PLAY_HT_API_KEY --interactive\n```\n\nIn interactive mode, you can input text lines to generate and play audio on-the-fly. An empty line will exit the interactive session.\n\n## Get an API Key\n\nTo get started with the **pyht** SDK, you'll need your API Secret Key and User ID. Follow these steps to obtain them:\n\n1. **Access the API Page**:\n Navigate to the [API Access page](https://play.ht/studio/api-access).\n\n2. **Generate Your API Secret Key**:\n\n - Click the \"Generate Secret Key\" button under the \"Secret Key\" section.\n - Your API Secret Key will be displayed. Ensure you copy it and store it securely.\n\n3. **Locate Your User ID**:\n Find and copy your User ID, which can be found on the same page under the \"User ID\" section.\n\n_**Keep your API Secret Key confidential**. It's crucial not to share it with anyone or include it in publicly accessible code repositories._\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": null,
"version": "0.1.11",
"project_urls": {
"Homepage": "https://github.com/playht/pyht",
"Repository": "https://github.com/playht/pyht"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "e874a6534fe5e09b50c038bb63980d5a5fdc169b343e24257e2d6eb653d11a37",
"md5": "772d1340d95894b3a8e9bd5216665d67",
"sha256": "561389a1d8dca6ae7a196da23103984105343bfa395978fc8a76d3bd42f2fce3"
},
"downloads": -1,
"filename": "pyht-0.1.11-py3-none-any.whl",
"has_sig": false,
"md5_digest": "772d1340d95894b3a8e9bd5216665d67",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.8",
"size": 32264,
"upload_time": "2025-01-16T22:16:55",
"upload_time_iso_8601": "2025-01-16T22:16:55.098890Z",
"url": "https://files.pythonhosted.org/packages/e8/74/a6534fe5e09b50c038bb63980d5a5fdc169b343e24257e2d6eb653d11a37/pyht-0.1.11-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1ecef319ae21d1e94d34cbe8940e63bf0a7f8696dc913ca3a1a79232537ab4d8",
"md5": "04e4b0e4bf51615d5b0cdfe1ce9d5e16",
"sha256": "1e1a7842a1d69b415958355d6742d39e39f11df40d7c7350e80645139813fae7"
},
"downloads": -1,
"filename": "pyht-0.1.11.tar.gz",
"has_sig": false,
"md5_digest": "04e4b0e4bf51615d5b0cdfe1ce9d5e16",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.8",
"size": 31813,
"upload_time": "2025-01-16T22:16:57",
"upload_time_iso_8601": "2025-01-16T22:16:57.189605Z",
"url": "https://files.pythonhosted.org/packages/1e/ce/f319ae21d1e94d34cbe8940e63bf0a7f8696dc913ca3a1a79232537ab4d8/pyht-0.1.11.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-16 22:16:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "playht",
"github_project": "pyht",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pyht"
}