Skip to main content

Flashlight Text bindings for Python

Project description

Flashlight Text Python Bindings

Quickstart

The Flashlight Text Python package containing beam search decoder and Dictionary components is available on PyPI:

pip install flashlight-text

To enable optional KenLM support in Python with the decoder, KenLM must be installed via pip:

pip install git+https://github.com/kpu/kenlm.git

Contents

Installation

Dependencies

We require python >= 3.6 with the following packages installed:

  • cmake >= 3.18, and make (installable via pip install cmake)
  • KenLM (must be installed pip install git+https://github.com/kpu/kenlm.git)

Build Instructions

Once the dependencies are satisfied, from the project root, use:

pip install .

Using the environment variable USE_KENLM=0 removes the KenLM dependency but precludes using the decoder with a language model unless you write C++/pybind11 bindings for your own language model.

Install in editable mode for development:

pip install -e .

(pypi installation coming soon)

Note: if you encounter errors, you'll probably have to rm -rf build dist before retrying the install.

Python API Documentation

Beam Search Decoder

Bindings for the lexicon and lexicon-free beam search decoders are supported for CTC/ASG models only (no seq2seq model support). Out-of-the-box language model support includes KenLM; users can define custom a language model in Python and use it for decoding; see the documentation below.

To run decoder one first should define options:

    from flashlight.lib.text.decoder import LexiconDecoderOptions, LexiconFreeDecoderOptions

    # for lexicon-based decoder
    options = LexiconDecoderOptions(
        beam_size, # number of top hypothesis to preserve at each decoding step
        token_beam_size, # restrict number of tokens by top am scores (if you have a huge token set)
        beam_threshold, # preserve a hypothesis only if its score is not far away from the current best hypothesis score
        lm_weight, # language model weight for LM score
        word_score, # score for words appearance in the transcription
        unk_score, # score for unknown word appearance in the transcription
        sil_score, # score for silence appearance in the transcription
        log_add, # the way how to combine scores during hypotheses merging (log add operation, max)
        criterion_type # supports only CriterionType.ASG or CriterionType.CTC
    )
    # for lexicon free-based decoder
    options = LexiconFreeDecoderOptions(
        beam_size, # number of top hypothesis to preserve at each decoding step
        token_beam_size, # restrict number of tokens by top am scores (if you have a huge token set)
        beam_threshold, # preserve a hypothesis only if its score is not far away from the current best hypothesis score
        lm_weight, # language model weight for LM score
        sil_score, # score for silence appearance in the transcription
        log_add, # the way how to combine scores during hypotheses merging (log add operation, max)
        criterion_type # supports only CriterionType.ASG or CriterionType.CTC
    )

Now, prepare a tokens dictionary (tokens for which a model returns probability for each frame) and a lexicon (mapping between words and their spellings within a tokens set).

For further details on tokens and lexicon file formats, see the Data Preparation documentation in Flashlight.

from flashlight.lib.text.dictionary import Dictionary, load_words, create_word_dict

tokens_dict = Dictionary("path/tokens.txt")
# for ASG add used repetition symbols, for example
# token_dict.add_entry("1")
# token_dict.add_entry("2")

lexicon = load_words("path/lexicon.txt") # returns LexiconMap
word_dict = create_word_dict(lexicon) # returns Dictionary

To create a KenLM language model, use:

from flashlight.lib.text.decoder import KenLM
lm = KenLM("path/lm.arpa", word_dict) # or "path/lm.bin"

Get the unknown and silence token indices from the token and word dictionaries to pass to the decoder:

sil_idx = token_dict.get_index("|")
unk_idx = word_dict.get_index("<unk>")

Now, define the lexicon Trie to restrict the beam search decoder search:

from flashlight.lib.text.decoder import Trie, SmearingMode
from flashlight.lib.text.dictionary import pack_replabels

trie = Trie(token_dict.index_size(), sil_idx)
start_state = lm.start(False)

def tkn_to_idx(spelling: list, token_dict : Dictionary, maxReps : int = 0):
    result = []
    for token in spelling:
        result.append(token_dict.get_index(token))
    return pack_replabels(result, token_dict, maxReps)


for word, spellings in lexicon.items():
    usr_idx = word_dict.get_index(word)
    _, score = lm.score(start_state, usr_idx)
    for spelling in spellings:
        # convert spelling string into vector of indices
        spelling_idxs = tkn_to_idx(spelling, token_dict, 1)
        trie.insert(spelling_idxs, usr_idx, score)

    trie.smear(SmearingMode.MAX) # propagate word score to each spelling node to have some lm proxy score in each node.

Finally, we can run lexicon-based decoder:

import numpy
from flashlight.lib.text.decoder import LexiconDecoder


blank_idx = token_dict.get_index("#") # for CTC
transitions = numpy.zeros((token_dict.index_size(), token_dict.index_size()) # for ASG fill up with correct values
is_token_lm = False # we use word-level LM
decoder = LexiconDecoder(options, trie, lm, sil_idx, blank_idx, unk_idx, transitions, is_token_lm)
# emissions is numpy.array of emitting model predictions with shape [T, N], where T is time, N is number of tokens
results = decoder.decode(emissions.ctypes.data, T, N)
# results[i].tokens contains tokens sequence (with length T)
# results[i].score contains score of the hypothesis
# results is sorted array with the best hypothesis stored with index=0.

Decoding with your own language model

One can define custom language model in python and use it for beam search decoding.

To store language model state, derive from the LMState base class and define additional data corresponding to each state by creating dict(LMState, info) inside the language model class:

import numpy
from flashlight.lib.text.decoder import LM


class MyPyLM(LM):
    mapping_states = dict() # store simple additional int for each state

    def __init__(self):
        LM.__init__(self)

    def start(self, start_with_nothing):
        state = LMState()
        self.mapping_states[state] = 0
        return state

    def score(self, state : LMState, token_index : int):
        """
        Evaluate language model based on the current lm state and new word
        Parameters:
        -----------
        state: current lm state
        token_index: index of the word
                    (can be lexicon index then you should store inside LM the
                    mapping between indices of lexicon and lm, or lm index of a word)

        Returns:
        --------
        (LMState, float): pair of (new state, score for the current word)
        """
        outstate = state.child(token_index)
        if outstate not in self.mapping_states:
            self.mapping_states[outstate] = self.mapping_states[state] + 1
        return (outstate, -numpy.random.random())

    def finish(self, state: LMState):
        """
        Evaluate eos for language model based on the current lm state

        Returns:
        --------
        (LMState, float): pair of (new state, score for the current word)
        """
        outstate = state.child(-1)
        if outstate not in self.mapping_states:
            self.mapping_states[outstate] = self.mapping_states[state] + 1
        return (outstate, -1)

LMState is a C++ base class for language model state. Its compare method (for comparing one state with another) is used inside the beam search decoder. It also has a LMState child(int index) method which returns a state obtained by following the token with this index from current state.

All LM states are organized as a trie. We use the child method in python to properly create this trie (which will be used inside the decoder to compare states) and can store additional state data in mapping_states.

This language model can be used as follows. Here, we print the state and its additional stored info inside lm.mapping_states:

custom_lm = MyLM()

state = custom_lm.start(True)
print(state, custom_lm.mapping_states[state])

for i in range(5):
    state, score = custom_lm.score(state, i)
    print(state, custom_lm.mapping_states[state], score)

state, score = custom_lm.finish(state)
print(state, custom_lm.mapping_states[state], score)

and for the decoder:

decoder = LexiconDecoder(options, trie, custom_lm, sil_idx, blank_inx, unk_idx, transitions, False)

Tests and Examples

An integration test for Python decoder bindings can be found in bindings/python/test/test_decoder.py. To run, use:

cd bindings/python/test
python3 -m unittest discover -v .

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

flashlight_text-0.0.4.dev299-pp39-pypy39_pp73-macosx_11_0_arm64.whl (909.9 kB view details)

Uploaded PyPymacOS 11.0+ ARM64

flashlight_text-0.0.4.dev299-pp38-pypy38_pp73-macosx_11_0_arm64.whl (909.9 kB view details)

Uploaded PyPymacOS 11.0+ ARM64

flashlight_text-0.0.4.dev299-cp311-cp311-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev299-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

flashlight_text-0.0.4.dev299-cp311-cp311-macosx_11_0_arm64.whl (910.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

flashlight_text-0.0.4.dev299-cp310-cp310-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev299-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

flashlight_text-0.0.4.dev299-cp310-cp310-macosx_11_0_arm64.whl (910.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

flashlight_text-0.0.4.dev299-cp39-cp39-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev299-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

flashlight_text-0.0.4.dev299-cp39-cp39-macosx_11_0_arm64.whl (910.3 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

flashlight_text-0.0.4.dev299-cp38-cp38-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev299-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

flashlight_text-0.0.4.dev299-cp38-cp38-macosx_11_0_arm64.whl (909.6 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

flashlight_text-0.0.4.dev299-cp37-cp37m-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev299-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

flashlight_text-0.0.4.dev299-cp36-cp36m-musllinux_1_1_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.6mmusllinux: musl 1.1+ ARM64

flashlight_text-0.0.4.dev299-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ ARM64

File details

Details for the file flashlight_text-0.0.4.dev299-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c1cb1dd66d59d0a4f0ec89c740079486c21e8396db748e4d1cf25b1c50fe4601
MD5 cace3d34cd1ebd8a8b1e36a21d6ce4c3
BLAKE2b-256 dcca21a44fba3cc34dd0101f080e86956cfc5502bf4951276eecb1050c40eb74

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-pp39-pypy39_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-pp39-pypy39_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 51ba062999024abc2575d4e77472204b15d797fd2c6841fa496b0db7082e70a9
MD5 09abb0463358d0992c32807d200ad26f
BLAKE2b-256 ceb748548d39ceaf443823f06f312eaa018cd76d8e3af12dc0b57d82ff518e55

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4ff364d7efc84c7f5fa3c4180daa2c65c47cfc41c56d1fc83983391cf6e60f44
MD5 f1a14ea4ad1d5750161bfab779c27a86
BLAKE2b-256 baa1760cb54db79103e5517497d69e3fa65797aeb6680fbb5f7cec23f7fddf76

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-pp38-pypy38_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-pp38-pypy38_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cf53cd312d3862e38f235694c9ff1cbb2f7574175c4f6a6c7b274eb23d943cce
MD5 17ef72a74e42b63f635d0ba1d5e11cf7
BLAKE2b-256 585812ebabb137bfbbb8c6df95ad50927ba0697db4ae8b71588e818d6cfdd010

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 95bf0b5facee20a23b0bee9d001d5d5fe9ee70b01fce7d6852bd0bd528fbd31a
MD5 19a208224b7211faa320cecd5286013b
BLAKE2b-256 3209d952d097c75c6e7535bc1205e128712d85419b9a587c5b25748d35b1456b

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp311-cp311-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp311-cp311-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 37554e0adbc0fdafec0ec82e3165892d789e9ddf0c86e746fc1683cb34cf7ba2
MD5 70ef27d036580288a75a9757dc23181e
BLAKE2b-256 035444d7dacac188e748a058859b88d3618552f890b4b569e7c93611911463a9

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e89f816ca6d9237cfd20b5a3953a509d458779b4187aa4d110af3acf713e2197
MD5 104fb0d5894fa312c8c526302b04a2c1
BLAKE2b-256 6f95da0621fd2cd725a272c4284e23ffc5866ce82bd94167a7c19bd53e82a045

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5a414f2d549db09ec59de2a72390dfe27057e623394b36601c0124e3cf80ed76
MD5 ff39216e35b28075d42b99b2719c8323
BLAKE2b-256 e468bb8ca2bc379551f95c93b1af5d4492d06a5d3b9a46e95e3b1ab57c71d248

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp310-cp310-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 37d266148edb3226dcc552627e5034a0a032ed60d659383afb79ea3c9b030af1
MD5 4947e70b5d96b83a208239d31feaaa47
BLAKE2b-256 2bae58ae744e4f9f2ed6be4b1dbef60606a5d9891ae59cc6ae69994f8f9fa74b

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a8d60d10b8a5275ce953fa6eef45d1ed190e43c273c27951686df8d4c0033fd4
MD5 90081dfc4b7dbb13fc509f0a19555601
BLAKE2b-256 6ae2e7e7537944594bc7c67dce6559035eb0de5ec62b7ccf50a670c62d7eda76

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6661c8ebf7b37c7d84c8764e24ff097621ed2ab89798c456ff0763f4c5e78202
MD5 a5faf43c062e43a732687184397e47d9
BLAKE2b-256 376fadc57c3e2050ebe2e756a43b2576ef9acb29bb8c9071ceb42136e0a2ccfe

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp39-cp39-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 2e1f384ceced33091e512de4ac3992da489d533484ed4f047b4d4057deadfa42
MD5 6237e8358e7bea77aa9fdf6e039120a6
BLAKE2b-256 7761d114a73d4d2156708aa38bba3fa7f8b2265d457ae73eaece7e565142ba0c

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3e8aec7ba77a4773f9c90bbcbc65c588fc7caac043cde79fabac695a8fcb3f04
MD5 05fd821efd7d6421c52b74971047a09d
BLAKE2b-256 8b264876f059026599abf71d7f1c2f9968a179cd05dfba10de698c67e1b77c50

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 94ca0625ce423116bd9253e9a1b56cc8ab9b972b9551cb6f3afe3fe4f7a09502
MD5 b91c6e6aaa2ec8e3a67acee044a434a0
BLAKE2b-256 9222c0eb1c9f0551af85a4c92660c7d0728426207580be82adab44b0d7086db5

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp38-cp38-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 ec6ab83eaa3728b3302ab996c00a8f87dab02dac4edaf96a90f59c66e6332c9d
MD5 1de8bec5a1b0c61f3e1f310965452b7a
BLAKE2b-256 16768e3c790860e29bb46e93c963efff1fcdb2600b0a06289e97263b0b6d67af

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1479e98982f917be93db34253500cf78bb8a51bf1fc88031f0e8ac096e2054d0
MD5 1aad7ef43e05a40de1cc4ac50b318a25
BLAKE2b-256 2953515554ae09a4348558425c6ce7dce98b08641fcc59136e594b9d8ca026f3

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dd936b030657f200de233be1e2fb89b3032f022e9e226802301b6146a7086b8b
MD5 5054c3b02e666d7b29abf9ee050e4409
BLAKE2b-256 4cb5c940d6f5fbc2f1c4627423832456d7ff843e0bc2734582ad2fca6c1a2d35

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp37-cp37m-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp37-cp37m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 2cb64e93f856d54f4430706a60f7feb291faf83b867e30e5ee1a55d73c110086
MD5 86aaf0f6600c036665adf664d15d9aa9
BLAKE2b-256 6bca2b189f052cbba956ea7c41f41483546c7541fc1c8f7e3ab70883d1809b0a

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9afaa9cdf3270e58b20398b2d4efea9f1250d436efd0d754cea5f86e8a9d9c2d
MD5 6638eebbd7715cc3f1b6bdcef2c928f3
BLAKE2b-256 e6e5aa853245c3582eddd045e9d27d5bc800dd543f3c13eb11eb48b00ca1f875

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp36-cp36m-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp36-cp36m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 1ed40c199b7ec88d165de8ca3c9736281f6966a9cf4d2efe25e2f3a3b66699cf
MD5 79348633f0f1eaa17309a3f86900e611
BLAKE2b-256 0da245ec8dd2c70ec030c3361b26d17c87da3b40efc9af04a0156bd45aebabc2

See more details on using hashes here.

File details

Details for the file flashlight_text-0.0.4.dev299-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev299-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9c87c6f4d0a7cc2bd2e3af956fb3e20153eb4539c2858058394ddb99de7a9161
MD5 5210a3529d956de6471dffbdb7702c79
BLAKE2b-256 c2c29ad0a0456547d034cb8d9a40575a82c4e37c529adfeb3daa509d1e83b8cf

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page