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.dev297-pp39-pypy39_pp73-macosx_11_0_arm64.whl (909.9 kB view details)

Uploaded PyPymacOS 11.0+ ARM64

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

Uploaded PyPymacOS 11.0+ ARM64

flashlight_text-0.0.4.dev297-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.dev297-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.dev297-cp311-cp311-macosx_11_0_arm64.whl (910.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

flashlight_text-0.0.4.dev297-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.dev297-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.dev297-cp310-cp310-macosx_11_0_arm64.whl (910.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

flashlight_text-0.0.4.dev297-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.dev297-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.dev297-cp39-cp39-macosx_11_0_arm64.whl (910.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

flashlight_text-0.0.4.dev297-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.dev297-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.dev297-cp38-cp38-macosx_11_0_arm64.whl (909.6 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

flashlight_text-0.0.4.dev297-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.dev297-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.dev297-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.dev297-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.dev297-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c5ce5fe14e24b8265d09186398bfb78222145c9a68ac3aac60e1356de8a0aef1
MD5 05145aa6b349ed2b7f9669d755f1b897
BLAKE2b-256 8a58cea981cfb73f0b7f2602bc12b43ccd52bf515cf72f0022b62b4958958971

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-pp39-pypy39_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 baac5f8f2b11341aa326384bcb29939b3b70ffd7fcc911d50ce2e9b2ec58bf25
MD5 99eaef34a41f669ac7da466058b2bcdf
BLAKE2b-256 428baee0fdcf29d466e90bef25572c75c10f671f674c06d4966cc6cea0f524be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 57cc552d3a8d3fc5caa71afd944ab49df1a2a4ef08dd0cfcc2a74aa40f0d563f
MD5 c5d6cc22dfb56300aded6475ade2fee1
BLAKE2b-256 1b06a4e967d883f7474784f0a52d1dd8666332b5fb3840822eb22189ce0ee8bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-pp38-pypy38_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 133642268d3d25f2a3084c22d14fdbe692aedf7675d7b42e20304b7ddda7289a
MD5 49ee0d7c2ff39f6ed24cf0245c7ef146
BLAKE2b-256 6409484b42bf334cac8242f75081bb69b1095c01b78f012e43b72d004650aba1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9c17f61dccff86465f8b8653e93ff542bf4ffda5022bb8f6b1548636471e8319
MD5 ac17735809b6e1c5453ad7756b47d68c
BLAKE2b-256 024bbf6d085a20b4cc99b0613ce1c5838aa6c5939e98d965a216d3ee2d45b825

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp311-cp311-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 15e662ca9c3efa98645b81997cf08db54e98b3d51ac13f38909ec3ed139fa805
MD5 f7cb82686c0c2d9830ad5789d57e1076
BLAKE2b-256 02f0b05481dc0662fb71ac18a65d89f8000b38e60bab84b52c100fe3d7a22d5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0006f4fb03b05aba62ec10a9860f9020d5812b37971fecfdec33d77a92dc843b
MD5 12523f1cae7902330a261cef484e53ad
BLAKE2b-256 0ed47f8b61984aa27706f717084e820ce499d6b8e8c8e84b27c93277f93ce619

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 08c02ec5fcae687075992986c7c998ac5d2e44dbdb1bca213c18be4341b6474c
MD5 096cb28f05480bb6515bdf4577f4e073
BLAKE2b-256 36f6cbf34e03653e91686cc46ddccdf1b59b4fbe308ca12b9548d96a2dce1a6a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 729e9c5b8070cbc71817b9d60cb7859544d1c74a320c92a898b0af261402df41
MD5 a80f1b53dd80d7be4d966e14795f9fcf
BLAKE2b-256 72ab17cdda18dc278ae81dffb19691e5dd61563a2902a587b0ee6f60d6b17150

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 eab353c53cbd2cd0cbb92148ec22007553641e272dc6b96f162424aaaa2c7915
MD5 fb1e112d233b6fdd2ef1fbc584b8c00d
BLAKE2b-256 fe4480ed6757c048300139a505d47e08ab4ef3c972ae4fffbf80a2cf8bc78216

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4e52173de7272c4b11fdf1d0da8850c635ea04272d460c20bb5707ad66acff2b
MD5 701ece586bf32579cedd8c5e8e6d3a9e
BLAKE2b-256 34edd81672da25f8de71b88c87a4b4a50a77532682c1093e4cf65e724492f57b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 393c1743994ae56dd2f6ac2d90b68ea116e10cb3691ae3ff89d08729abb0a596
MD5 73c6cebd7aff3367c5a6a61f2708ea2d
BLAKE2b-256 59094704875fdf6aa8110a0e2357c155fa61cc7a95d35816cd96559176846350

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 338f650a28f23068d4808b91159e06964bc05cc6ee6619087ad699ee571bb381
MD5 56bd7ed2c3bf006e7bd5ce58c7f19a06
BLAKE2b-256 fc29cb064175276fb3866f2939ca01d3e1bc4b1b4cc0f4d2d958f1f7290792b3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2257bfc1cf5320d512c6c15ec54171e12bd82c76641dd5d9bd9b6956575e6b2e
MD5 c5a7323fa6995477afb3918f84a340a3
BLAKE2b-256 d851b03fc5cb7081db102329e4577b0966626f8ed8634052430d1ae6cf8827c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 319f141d89c31933049ab374d806a28106f6d7f36e9114f76806aa8ee3a2dcaf
MD5 ecee82ca752166f43d0397b25f7ab951
BLAKE2b-256 103b45967edf568e51b7116a3e86c3a2c852aaea403ae84184be61662f31aaaf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7acca7a7c674da38dd575afd91b736ea7ff2e7f9edd5cedc6f411c4a34331867
MD5 fb595fc0c306d356b53a2fd5a95dea4c
BLAKE2b-256 28a3f053eac6a998f7f4e24902b5d0f6061972bfb4dee3a3243f068d62353a64

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eaaaf90dbaf5a6b8d924ec96f4745bc74a56b6adb35eb3528249a9d12c30f874
MD5 2c2e1e5e3800b62f85b847461e4f9ae4
BLAKE2b-256 eb5de203866ebb3a24250ac1264246b92ad65d0fa1a7413ff044676c4e462a85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp37-cp37m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 3cf44710c4ea7e21c059df398a9f47d8d7bf0cb5349311352679a5d6171c64df
MD5 24a68dbb4ddcf000e7eddebd952a9a09
BLAKE2b-256 ed5feb23733e21c87333d212cbcc694fa4a748feea9e698b993ce504f896e081

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5506b25400965b1d75a6e2c998da2979e9755e7cec9fadfd4044c44d5c28b139
MD5 8e025a40720443fd56de9650bf4118b2
BLAKE2b-256 f701ed740b3123f1b44d862d15b47cc4330240d46a9bb9c6078a6831a924e385

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp36-cp36m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 a0cbc5f3f8501fb85dd60ba34e3a094986057252e266aa53a2e1692eefaee7f4
MD5 14955798d52a2bc9df77b8836bda1a76
BLAKE2b-256 f4c6aa70488f39ad441eed57b81d85de6b90b8b44663bd72624f633a6154f21a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for flashlight_text-0.0.4.dev297-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 aefdb0f6e5b6609202023820b1689b516c21e50ce55d85bbbd31caafbd8e239b
MD5 e478584d39fe0789b2bf9e2be0317334
BLAKE2b-256 ce80162f81b842bd405d387094c2a9bbabaf49b4440c7f9b085fc45e682ddf29

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