.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "tutorials/ctc_forced_alignment_api_tutorial.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_tutorials_ctc_forced_alignment_api_tutorial.py: CTC forced alignment API tutorial ================================= **Author**: `Xiaohui Zhang `__, `Moto Hira `__ .. warning:: Starting with version 2.9, we have transitioned TorchAudio into a maintenance phase. As a result: - The APIs described in this tutorial were deprecated in 2.8 and have been removed in 2.9. - The decoding and encoding capabilities of PyTorch for both audio and video have been consolidated into TorchCodec. Please see https://github.com/pytorch/audio/issues/3902 for more information. The forced alignment is a process to align transcript with speech. This tutorial shows how to align transcripts to speech using :py:func:`torchaudio.functional.forced_align` which was developed along the work of `Scaling Speech Technology to 1,000+ Languages `__. :py:func:`~torchaudio.functional.forced_align` has custom CPU and CUDA implementations which are more performant than the vanilla Python implementation above, and are more accurate. It can also handle missing transcript with special ```` token. There is also a high-level API, :py:class:`torchaudio.pipelines.Wav2Vec2FABundle`, which wraps the pre/post-processing explained in this tutorial and makes it easy to run forced-alignments. `Forced alignment for multilingual data <./forced_alignment_for_multilingual_data_tutorial.html>`__ uses this API to illustrate how to align non-English transcripts. .. GENERATED FROM PYTHON SOURCE LINES 36-38 Preparation ----------- .. GENERATED FROM PYTHON SOURCE LINES 38-45 .. code-block:: default import torch import torchaudio print(torch.__version__) print(torchaudio.__version__) .. rst-class:: sphx-glr-script-out .. code-block:: none 2.10.0.dev20251013+cu126 2.8.0a0+1d65bbe .. GENERATED FROM PYTHON SOURCE LINES 47-51 .. code-block:: default device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print(device) .. rst-class:: sphx-glr-script-out .. code-block:: none cuda .. GENERATED FROM PYTHON SOURCE LINES 53-59 .. code-block:: default import IPython import matplotlib.pyplot as plt import torchaudio.functional as F .. GENERATED FROM PYTHON SOURCE LINES 60-63 First we prepare the speech data and the transcript we area going to use. .. GENERATED FROM PYTHON SOURCE LINES 63-69 .. code-block:: default SPEECH_FILE = torchaudio.utils._download_asset("tutorial-assets/Lab41-SRI-VOiCES-src-sp0307-ch127535-sg0042.wav") waveform, _ = torchaudio.load(SPEECH_FILE) TRANSCRIPT = "i had that curiosity beside me at this moment".split() .. GENERATED FROM PYTHON SOURCE LINES 70-89 Generating emissions ~~~~~~~~~~~~~~~~~~~~ :py:func:`~torchaudio.functional.forced_align` takes emission and token sequences and outputs timestaps of the tokens and their scores. Emission reperesents the frame-wise probability distribution over tokens, and it can be obtained by passing waveform to an acoustic model. Tokens are numerical expression of transcripts. There are many ways to tokenize transcripts, but here, we simply map alphabets into integer, which is how labels were constructed when the acoustice model we are going to use was trained. We will use a pre-trained Wav2Vec2 model, :py:data:`torchaudio.pipelines.MMS_FA`, to obtain emission and tokenize the transcript. .. GENERATED FROM PYTHON SOURCE LINES 89-97 .. code-block:: default bundle = torchaudio.pipelines.MMS_FA model = bundle.get_model(with_star=False).to(device) with torch.inference_mode(): emission, _ = model(waveform.to(device)) .. rst-class:: sphx-glr-script-out .. code-block:: none Downloading: "https://dl.fbaipublicfiles.com/mms/torchaudio/ctc_alignment_mling_uroman/model.pt" to /root/.cache/torch/hub/checkpoints/model.pt 0.0% 0.0% 0.0% 0.0% 0.1% 0.1% 0.1% 0.1% 0.1% 0.1% 0.1% 0.1% 0.1% 0.1% 0.2% 0.2% 0.2% 0.2% 0.2% 0.2% 0.2% 0.2% 0.2% 0.2% 0.3% 0.3% 0.3% 0.3% 0.3% 0.3% 0.3% 0.3% 0.3% 0.4% 0.4% 0.4% 0.4% 0.4% 0.4% 0.4% 0.4% 0.4% 0.4% 0.5% 0.5% 0.5% 0.5% 0.5% 0.5% 0.5% 0.5% 0.5% 0.6% 0.6% 0.6% 0.6% 0.6% 0.6% 0.6% 0.6% 0.6% 0.6% 0.7% 0.7% 0.7% 0.7% 0.7% 0.7% 0.7% 0.7% 0.7% 0.7% 0.8% 0.8% 0.8% 0.8% 0.8% 0.8% 0.8% 0.8% 0.8% 0.9% 0.9% 0.9% 0.9% 0.9% 0.9% 0.9% 0.9% 0.9% 0.9% 1.0% 1.0% 1.0% 1.0% 1.0% 1.0% 1.0% 1.0% 1.0% 1.0% 1.1% 1.1% 1.1% 1.1% 1.1% 1.1% 1.1% 1.1% 1.1% 1.2% 1.2% 1.2% 1.2% 1.2% 1.2% 1.2% 1.2% 1.2% 1.2% 1.3% 1.3% 1.3% 1.3% 1.3% 1.3% 1.3% 1.3% 1.3% 1.4% 1.4% 1.4% 1.4% 1.4% 1.4% 1.4% 1.4% 1.4% 1.4% 1.5% 1.5% 1.5% 1.5% 1.5% 1.5% 1.5% 1.5% 1.5% 1.5% 1.6% 1.6% 1.6% 1.6% 1.6% 1.6% 1.6% 1.6% 1.6% 1.7% 1.7% 1.7% 1.7% 1.7% 1.7% 1.7% 1.7% 1.7% 1.7% 1.8% 1.8% 1.8% 1.8% 1.8% 1.8% 1.8% 1.8% 1.8% 1.8% 1.9% 1.9% 1.9% 1.9% 1.9% 1.9% 1.9% 1.9% 1.9% 2.0% 2.0% 2.0% 2.0% 2.0% 2.0% 2.0% 2.0% 2.0% 2.0% 2.1% 2.1% 2.1% 2.1% 2.1% 2.1% 2.1% 2.1% 2.1% 2.1% 2.2% 2.2% 2.2% 2.2% 2.2% 2.2% 2.2% 2.2% 2.2% 2.3% 2.3% 2.3% 2.3% 2.3% 2.3% 2.3% 2.3% 2.3% 2.3% 2.4% 2.4% 2.4% 2.4% 2.4% 2.4% 2.4% 2.4% 2.4% 2.5% 2.5% 2.5% 2.5% 2.5% 2.5% 2.5% 2.5% 2.5% 2.5% 2.6% 2.6% 2.6% 2.6% 2.6% 2.6% 2.6% 2.6% 2.6% 2.6% 2.7% 2.7% 2.7% 2.7% 2.7% 2.7% 2.7% 2.7% 2.7% 2.8% 2.8% 2.8% 2.8% 2.8% 2.8% 2.8% 2.8% 2.8% 2.8% 2.9% 2.9% 2.9% 2.9% 2.9% 2.9% 2.9% 2.9% 2.9% 2.9% 3.0% 3.0% 3.0% 3.0% 3.0% 3.0% 3.0% 3.0% 3.0% 3.1% 3.1% 3.1% 3.1% 3.1% 3.1% 3.1% 3.1% 3.1% 3.1% 3.2% 3.2% 3.2% 3.2% 3.2% 3.2% 3.2% 3.2% 3.2% 3.3% 3.3% 3.3% 3.3% 3.3% 3.3% 3.3% 3.3% 3.3% 3.3% 3.4% 3.4% 3.4% 3.4% 3.4% 3.4% 3.4% 3.4% 3.4% 3.4% 3.5% 3.5% 3.5% 3.5% 3.5% 3.5% 3.5% 3.5% 3.5% 3.6% 3.6% 3.6% 3.6% 3.6% 3.6% 3.6% 3.6% 3.6% 3.6% 3.7% 3.7% 3.7% 3.7% 3.7% 3.7% 3.7% 3.7% 3.7% 3.7% 3.8% 3.8% 3.8% 3.8% 3.8% 3.8% 3.8% 3.8% 3.8% 3.9% 3.9% 3.9% 3.9% 3.9% 3.9% 3.9% 3.9% 3.9% 3.9% 4.0% 4.0% 4.0% 4.0% 4.0% 4.0% 4.0% 4.0% 4.0% 4.1% 4.1% 4.1% 4.1% 4.1% 4.1% 4.1% 4.1% 4.1% 4.1% 4.2% 4.2% 4.2% 4.2% 4.2% 4.2% 4.2% 4.2% 4.2% 4.2% 4.3% 4.3% 4.3% 4.3% 4.3% 4.3% 4.3% 4.3% 4.3% 4.4% 4.4% 4.4% 4.4% 4.4% 4.4% 4.4% 4.4% 4.4% 4.4% 4.5% 4.5% 4.5% 4.5% 4.5% 4.5% 4.5% 4.5% 4.5% 4.5% 4.6% 4.6% 4.6% 4.6% 4.6% 4.6% 4.6% 4.6% 4.6% 4.7% 4.7% 4.7% 4.7% 4.7% 4.7% 4.7% 4.7% 4.7% 4.7% 4.8% 4.8% 4.8% 4.8% 4.8% 4.8% 4.8% 4.8% 4.8% 4.9% 4.9% 4.9% 4.9% 4.9% 4.9% 4.9% 4.9% 4.9% 4.9% 5.0% 5.0% 5.0% 5.0% 5.0% 5.0% 5.0% 5.0% 5.0% 5.0% 5.1% 5.1% 5.1% 5.1% 5.1% 5.1% 5.1% 5.1% 5.1% 5.2% 5.2% 5.2% 5.2% 5.2% 5.2% 5.2% 5.2% 5.2% 5.2% 5.3% 5.3% 5.3% 5.3% 5.3% 5.3% 5.3% 5.3% 5.3% 5.3% 5.4% 5.4% 5.4% 5.4% 5.4% 5.4% 5.4% 5.4% 5.4% 5.5% 5.5% 5.5% 5.5% 5.5% 5.5% 5.5% 5.5% 5.5% 5.5% 5.6% 5.6% 5.6% 5.6% 5.6% 5.6% 5.6% 5.6% 5.6% 5.6% 5.7% 5.7% 5.7% 5.7% 5.7% 5.7% 5.7% 5.7% 5.7% 5.8% 5.8% 5.8% 5.8% 5.8% 5.8% 5.8% 5.8% 5.8% 5.8% 5.9% 5.9% 5.9% 5.9% 5.9% 5.9% 5.9% 5.9% 5.9% 6.0% 6.0% 6.0% 6.0% 6.0% 6.0% 6.0% 6.0% 6.0% 6.0% 6.1% 6.1% 6.1% 6.1% 6.1% 6.1% 6.1% 6.1% 6.1% 6.1% 6.2% 6.2% 6.2% 6.2% 6.2% 6.2% 6.2% 6.2% 6.2% 6.3% 6.3% 6.3% 6.3% 6.3% 6.3% 6.3% 6.3% 6.3% 6.3% 6.4% 6.4% 6.4% 6.4% 6.4% 6.4% 6.4% 6.4% 6.4% 6.4% 6.5% 6.5% 6.5% 6.5% 6.5% 6.5% 6.5% 6.5% 6.5% 6.6% 6.6% 6.6% 6.6% 6.6% 6.6% 6.6% 6.6% 6.6% 6.6% 6.7% 6.7% 6.7% 6.7% 6.7% 6.7% 6.7% 6.7% 6.7% 6.8% 6.8% 6.8% 6.8% 6.8% 6.8% 6.8% 6.8% 6.8% 6.8% 6.9% 6.9% 6.9% 6.9% 6.9% 6.9% 6.9% 6.9% 6.9% 6.9% 7.0% 7.0% 7.0% 7.0% 7.0% 7.0% 7.0% 7.0% 7.0% 7.1% 7.1% 7.1% 7.1% 7.1% 7.1% 7.1% 7.1% 7.1% 7.1% 7.2% 7.2% 7.2% 7.2% 7.2% 7.2% 7.2% 7.2% 7.2% 7.2% 7.3% 7.3% 7.3% 7.3% 7.3% 7.3% 7.3% 7.3% 7.3% 7.4% 7.4% 7.4% 7.4% 7.4% 7.4% 7.4% 7.4% 7.4% 7.4% 7.5% 7.5% 7.5% 7.5% 7.5% 7.5% 7.5% 7.5% 7.5% 7.6% 7.6% 7.6% 7.6% 7.6% 7.6% 7.6% 7.6% 7.6% 7.6% 7.7% 7.7% 7.7% 7.7% 7.7% 7.7% 7.7% 7.7% 7.7% 7.7% 7.8% 7.8% 7.8% 7.8% 7.8% 7.8% 7.8% 7.8% 7.8% 7.9% 7.9% 7.9% 7.9% 7.9% 7.9% 7.9% 7.9% 7.9% 7.9% 8.0% 8.0% 8.0% 8.0% 8.0% 8.0% 8.0% 8.0% 8.0% 8.0% 8.1% 8.1% 8.1% 8.1% 8.1% 8.1% 8.1% 8.1% 8.1% 8.2% 8.2% 8.2% 8.2% 8.2% 8.2% 8.2% 8.2% 8.2% 8.2% 8.3% 8.3% 8.3% 8.3% 8.3% 8.3% 8.3% 8.3% 8.3% 8.4% 8.4% 8.4% 8.4% 8.4% 8.4% 8.4% 8.4% 8.4% 8.4% 8.5% 8.5% 8.5% 8.5% 8.5% 8.5% 8.5% 8.5% 8.5% 8.5% 8.6% 8.6% 8.6% 8.6% 8.6% 8.6% 8.6% 8.6% 8.6% 8.7% 8.7% 8.7% 8.7% 8.7% 8.7% 8.7% 8.7% 8.7% 8.7% 8.8% 8.8% 8.8% 8.8% 8.8% 8.8% 8.8% 8.8% 8.8% 8.8% 8.9% 8.9% 8.9% 8.9% 8.9% 8.9% 8.9% 8.9% 8.9% 9.0% 9.0% 9.0% 9.0% 9.0% 9.0% 9.0% 9.0% 9.0% 9.0% 9.1% 9.1% 9.1% 9.1% 9.1% 9.1% 9.1% 9.1% 9.1% 9.1% 9.2% 9.2% 9.2% 9.2% 9.2% 9.2% 9.2% 9.2% 9.2% 9.3% 9.3% 9.3% 9.3% 9.3% 9.3% 9.3% 9.3% 9.3% 9.3% 9.4% 9.4% 9.4% 9.4% 9.4% 9.4% 9.4% 9.4% 9.4% 9.5% 9.5% 9.5% 9.5% 9.5% 9.5% 9.5% 9.5% 9.5% 9.5% 9.6% 9.6% 9.6% 9.6% 9.6% 9.6% 9.6% 9.6% 9.6% 9.6% 9.7% 9.7% 9.7% 9.7% 9.7% 9.7% 9.7% 9.7% 9.7% 9.8% 9.8% 9.8% 9.8% 9.8% 9.8% 9.8% 9.8% 9.8% 9.8% 9.9% 9.9% 9.9% 9.9% 9.9% 9.9% 9.9% 9.9% 9.9% 9.9% 10.0% 10.0% 10.0% 10.0% 10.0% 10.0% 10.0% 10.0% 10.0% 10.1% 10.1% 10.1% 10.1% 10.1% 10.1% 10.1% 10.1% 10.1% 10.1% 10.2% 10.2% 10.2% 10.2% 10.2% 10.2% 10.2% 10.2% 10.2% 10.3% 10.3% 10.3% 10.3% 10.3% 10.3% 10.3% 10.3% 10.3% 10.3% 10.4% 10.4% 10.4% 10.4% 10.4% 10.4% 10.4% 10.4% 10.4% 10.4% 10.5% 10.5% 10.5% 10.5% 10.5% 10.5% 10.5% 10.5% 10.5% 10.6% 10.6% 10.6% 10.6% 10.6% 10.6% 10.6% 10.6% 10.6% 10.6% 10.7% 10.7% 10.7% 10.7% 10.7% 10.7% 10.7% 10.7% 10.7% 10.7% 10.8% 10.8% 10.8% 10.8% 10.8% 10.8% 10.8% 10.8% 10.8% 10.9% 10.9% 10.9% 10.9% 10.9% 10.9% 10.9% 10.9% 10.9% 10.9% 11.0% 11.0% 11.0% 11.0% 11.0% 11.0% 11.0% 11.0% 11.0% 11.1% 11.1% 11.1% 11.1% 11.1% 11.1% 11.1% 11.1% 11.1% 11.1% 11.2% 11.2% 11.2% 11.2% 11.2% 11.2% 11.2% 11.2% 11.2% 11.2% 11.3% 11.3% 11.3% 11.3% 11.3% 11.3% 11.3% 11.3% 11.3% 11.4% 11.4% 11.4% 11.4% 11.4% 11.4% 11.4% 11.4% 11.4% 11.4% 11.5% 11.5% 11.5% 11.5% 11.5% 11.5% 11.5% 11.5% 11.5% 11.5% 11.6% 11.6% 11.6% 11.6% 11.6% 11.6% 11.6% 11.6% 11.6% 11.7% 11.7% 11.7% 11.7% 11.7% 11.7% 11.7% 11.7% 11.7% 11.7% 11.8% 11.8% 11.8% 11.8% 11.8% 11.8% 11.8% 11.8% 11.8% 11.9% 11.9% 11.9% 11.9% 11.9% 11.9% 11.9% 11.9% 11.9% 11.9% 12.0% 12.0% 12.0% 12.0% 12.0% 12.0% 12.0% 12.0% 12.0% 12.0% 12.1% 12.1% 12.1% 12.1% 12.1% 12.1% 12.1% 12.1% 12.1% 12.2% 12.2% 12.2% 12.2% 12.2% 12.2% 12.2% 12.2% 12.2% 12.2% 12.3% 12.3% 12.3% 12.3% 12.3% 12.3% 12.3% 12.3% 12.3% 12.3% 12.4% 12.4% 12.4% 12.4% 12.4% 12.4% 12.4% 12.4% 12.4% 12.5% 12.5% 12.5% 12.5% 12.5% 12.5% 12.5% 12.5% 12.5% 12.5% 12.6% 12.6% 12.6% 12.6% 12.6% 12.6% 12.6% 12.6% 12.6% 12.6% 12.7% 12.7% 12.7% 12.7% 12.7% 12.7% 12.7% 12.7% 12.7% 12.8% 12.8% 12.8% 12.8% 12.8% 12.8% 12.8% 12.8% 12.8% 12.8% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 12.9% 13.0% 13.0% 13.0% 13.0% 13.0% 13.0% 13.0% 13.0% 13.0% 13.0% 13.1% 13.1% 13.1% 13.1% 13.1% 13.1% 13.1% 13.1% 13.1% 13.1% 13.2% 13.2% 13.2% 13.2% 13.2% 13.2% 13.2% 13.2% 13.2% 13.3% 13.3% 13.3% 13.3% 13.3% 13.3% 13.3% 13.3% 13.3% 13.3% 13.4% 13.4% 13.4% 13.4% 13.4% 13.4% 13.4% 13.4% 13.4% 13.4% 13.5% 13.5% 13.5% 13.5% 13.5% 13.5% 13.5% 13.5% 13.5% 13.6% 13.6% 13.6% 13.6% 13.6% 13.6% 13.6% 13.6% 13.6% 13.6% 13.7% 13.7% 13.7% 13.7% 13.7% 13.7% 13.7% 13.7% 13.7% 13.8% 13.8% 13.8% 13.8% 13.8% 13.8% 13.8% 13.8% 13.8% 13.8% 13.9% 13.9% 13.9% 13.9% 13.9% 13.9% 13.9% 13.9% 13.9% 13.9% 14.0% 14.0% 14.0% 14.0% 14.0% 14.0% 14.0% 14.0% 14.0% 14.1% 14.1% 14.1% 14.1% 14.1% 14.1% 14.1% 14.1% 14.1% 14.1% 14.2% 14.2% 14.2% 14.2% 14.2% 14.2% 14.2% 14.2% 14.2% 14.2% 14.3% 14.3% 14.3% 14.3% 14.3% 14.3% 14.3% 14.3% 14.3% 14.4% 14.4% 14.4% 14.4% 14.4% 14.4% 14.4% 14.4% 14.4% 14.4% 14.5% 14.5% 14.5% 14.5% 14.5% 14.5% 14.5% 14.5% 14.5% 14.6% 14.6% 14.6% 14.6% 14.6% 14.6% 14.6% 14.6% 14.6% 14.6% 14.7% 14.7% 14.7% 14.7% 14.7% 14.7% 14.7% 14.7% 14.7% 14.7% 14.8% 14.8% 14.8% 14.8% 14.8% 14.8% 14.8% 14.8% 14.8% 14.9% 14.9% 14.9% 14.9% 14.9% 14.9% 14.9% 14.9% 14.9% 14.9% 15.0% 15.0% 15.0% 15.0% 15.0% 15.0% 15.0% 15.0% 15.0% 15.0% 15.1% 15.1% 15.1% 15.1% 15.1% 15.1% 15.1% 15.1% 15.1% 15.2% 15.2% 15.2% 15.2% 15.2% 15.2% 15.2% 15.2% 15.2% 15.2% 15.3% 15.3% 15.3% 15.3% 15.3% 15.3% 15.3% 15.3% 15.3% 15.4% 15.4% 15.4% 15.4% 15.4% 15.4% 15.4% 15.4% 15.4% 15.4% 15.5% 15.5% 15.5% 15.5% 15.5% 15.5% 15.5% 15.5% 15.5% 15.5% 15.6% 15.6% 15.6% 15.6% 15.6% 15.6% 15.6% 15.6% 15.6% 15.7% 15.7% 15.7% 15.7% 15.7% 15.7% 15.7% 15.7% 15.7% 15.7% 15.8% 15.8% 15.8% 15.8% 15.8% 15.8% 15.8% 15.8% 15.8% 15.8% 15.9% 15.9% 15.9% 15.9% 15.9% 15.9% 15.9% 15.9% 15.9% 16.0% 16.0% 16.0% 16.0% 16.0% 16.0% 16.0% 16.0% 16.0% 16.0% 16.1% 16.1% 16.1% 16.1% 16.1% 16.1% 16.1% 16.1% 16.1% 16.1% 16.2% 16.2% 16.2% 16.2% 16.2% 16.2% 16.2% 16.2% 16.2% 16.3% 16.3% 16.3% 16.3% 16.3% 16.3% 16.3% 16.3% 16.3% 16.3% 16.4% 16.4% 16.4% 16.4% 16.4% 16.4% 16.4% 16.4% 16.4% 16.5% 16.5% 16.5% 16.5% 16.5% 16.5% 16.5% 16.5% 16.5% 16.5% 16.6% 16.6% 16.6% 16.6% 16.6% 16.6% 16.6% 16.6% 16.6% 16.6% 16.7% 16.7% 16.7% 16.7% 16.7% 16.7% 16.7% 16.7% 16.7% 16.8% 16.8% 16.8% 16.8% 16.8% 16.8% 16.8% 16.8% 16.8% 16.8% 16.9% 16.9% 16.9% 16.9% 16.9% 16.9% 16.9% 16.9% 16.9% 16.9% 17.0% 17.0% 17.0% 17.0% 17.0% 17.0% 17.0% 17.0% 17.0% 17.1% 17.1% 17.1% 17.1% 17.1% 17.1% 17.1% 17.1% 17.1% 17.1% 17.2% 17.2% 17.2% 17.2% 17.2% 17.2% 17.2% 17.2% 17.2% 17.3% 17.3% 17.3% 17.3% 17.3% 17.3% 17.3% 17.3% 17.3% 17.3% 17.4% 17.4% 17.4% 17.4% 17.4% 17.4% 17.4% 17.4% 17.4% 17.4% 17.5% 17.5% 17.5% 17.5% 17.5% 17.5% 17.5% 17.5% 17.5% 17.6% 17.6% 17.6% 17.6% 17.6% 17.6% 17.6% 17.6% 17.6% 17.6% 17.7% 17.7% 17.7% 17.7% 17.7% 17.7% 17.7% 17.7% 17.7% 17.7% 17.8% 17.8% 17.8% 17.8% 17.8% 17.8% 17.8% 17.8% 17.8% 17.9% 17.9% 17.9% 17.9% 17.9% 17.9% 17.9% 17.9% 17.9% 17.9% 18.0% 18.0% 18.0% 18.0% 18.0% 18.0% 18.0% 18.0% 18.0% 18.1% 18.1% 18.1% 18.1% 18.1% 18.1% 18.1% 18.1% 18.1% 18.1% 18.2% 18.2% 18.2% 18.2% 18.2% 18.2% 18.2% 18.2% 18.2% 18.2% 18.3% 18.3% 18.3% 18.3% 18.3% 18.3% 18.3% 18.3% 18.3% 18.4% 18.4% 18.4% 18.4% 18.4% 18.4% 18.4% 18.4% 18.4% 18.4% 18.5% 18.5% 18.5% 18.5% 18.5% 18.5% 18.5% 18.5% 18.5% 18.5% 18.6% 18.6% 18.6% 18.6% 18.6% 18.6% 18.6% 18.6% 18.6% 18.7% 18.7% 18.7% 18.7% 18.7% 18.7% 18.7% 18.7% 18.7% 18.7% 18.8% 18.8% 18.8% 18.8% 18.8% 18.8% 18.8% 18.8% 18.8% 18.8% 18.9% 18.9% 18.9% 18.9% 18.9% 18.9% 18.9% 18.9% 18.9% 19.0% 19.0% 19.0% 19.0% 19.0% 19.0% 19.0% 19.0% 19.0% 19.0% 19.1% 19.1% 19.1% 19.1% 19.1% 19.1% 19.1% 19.1% 19.1% 19.2% 19.2% 19.2% 19.2% 19.2% 19.2% 19.2% 19.2% 19.2% 19.2% 19.3% 19.3% 19.3% 19.3% 19.3% 19.3% 19.3% 19.3% 19.3% 19.3% 19.4% 19.4% 19.4% 19.4% 19.4% 19.4% 19.4% 19.4% 19.4% 19.5% 19.5% 19.5% 19.5% 19.5% 19.5% 19.5% 19.5% 19.5% 19.5% 19.6% 19.6% 19.6% 19.6% 19.6% 19.6% 19.6% 19.6% 19.6% 19.6% 19.7% 19.7% 19.7% 19.7% 19.7% 19.7% 19.7% 19.7% 19.7% 19.8% 19.8% 19.8% 19.8% 19.8% 19.8% 19.8% 19.8% 19.8% 19.8% 19.9% 19.9% 19.9% 19.9% 19.9% 19.9% 19.9% 19.9% 19.9% 20.0% 20.0% 20.0% 20.0% 20.0% 20.0% 20.0% 20.0% 20.0% 20.0% 20.1% 20.1% 20.1% 20.1% 20.1% 20.1% 20.1% 20.1% 20.1% 20.1% 20.2% 20.2% 20.2% 20.2% 20.2% 20.2% 20.2% 20.2% 20.2% 20.3% 20.3% 20.3% 20.3% 20.3% 20.3% 20.3% 20.3% 20.3% 20.3% 20.4% 20.4% 20.4% 20.4% 20.4% 20.4% 20.4% 20.4% 20.4% 20.4% 20.5% 20.5% 20.5% 20.5% 20.5% 20.5% 20.5% 20.5% 20.5% 20.6% 20.6% 20.6% 20.6% 20.6% 20.6% 20.6% 20.6% 20.6% 20.6% 20.7% 20.7% 20.7% 20.7% 20.7% 20.7% 20.7% 20.7% 20.7% 20.8% 20.8% 20.8% 20.8% 20.8% 20.8% 20.8% 20.8% 20.8% 20.8% 20.9% 20.9% 20.9% 20.9% 20.9% 20.9% 20.9% 20.9% 20.9% 20.9% 21.0% 21.0% 21.0% 21.0% 21.0% 21.0% 21.0% 21.0% 21.0% 21.1% 21.1% 21.1% 21.1% 21.1% 21.1% 21.1% 21.1% 21.1% 21.1% 21.2% 21.2% 21.2% 21.2% 21.2% 21.2% 21.2% 21.2% 21.2% 21.2% 21.3% 21.3% 21.3% 21.3% 21.3% 21.3% 21.3% 21.3% 21.3% 21.4% 21.4% 21.4% 21.4% 21.4% 21.4% 21.4% 21.4% 21.4% 21.4% 21.5% 21.5% 21.5% 21.5% 21.5% 21.5% 21.5% 21.5% 21.5% 21.6% 21.6% 21.6% 21.6% 21.6% 21.6% 21.6% 21.6% 21.6% 21.6% 21.7% 21.7% 21.7% 21.7% 21.7% 21.7% 21.7% 21.7% 21.7% 21.7% 21.8% 21.8% 21.8% 21.8% 21.8% 21.8% 21.8% 21.8% 21.8% 21.9% 21.9% 21.9% 21.9% 21.9% 21.9% 21.9% 21.9% 21.9% 21.9% 22.0% 22.0% 22.0% 22.0% 22.0% 22.0% 22.0% 22.0% 22.0% 22.0% 22.1% 22.1% 22.1% 22.1% 22.1% 22.1% 22.1% 22.1% 22.1% 22.2% 22.2% 22.2% 22.2% 22.2% 22.2% 22.2% 22.2% 22.2% 22.2% 22.3% 22.3% 22.3% 22.3% 22.3% 22.3% 22.3% 22.3% 22.3% 22.3% 22.4% 22.4% 22.4% 22.4% 22.4% 22.4% 22.4% 22.4% 22.4% 22.5% 22.5% 22.5% 22.5% 22.5% 22.5% 22.5% 22.5% 22.5% 22.5% 22.6% 22.6% 22.6% 22.6% 22.6% 22.6% 22.6% 22.6% 22.6% 22.7% 22.7% 22.7% 22.7% 22.7% 22.7% 22.7% 22.7% 22.7% 22.7% 22.8% 22.8% 22.8% 22.8% 22.8% 22.8% 22.8% 22.8% 22.8% 22.8% 22.9% 22.9% 22.9% 22.9% 22.9% 22.9% 22.9% 22.9% 22.9% 23.0% 23.0% 23.0% 23.0% 23.0% 23.0% 23.0% 23.0% 23.0% 23.0% 23.1% 23.1% 23.1% 23.1% 23.1% 23.1% 23.1% 23.1% 23.1% 23.1% 23.2% 23.2% 23.2% 23.2% 23.2% 23.2% 23.2% 23.2% 23.2% 23.3% 23.3% 23.3% 23.3% 23.3% 23.3% 23.3% 23.3% 23.3% 23.3% 23.4% 23.4% 23.4% 23.4% 23.4% 23.4% 23.4% 23.4% 23.4% 23.5% 23.5% 23.5% 23.5% 23.5% 23.5% 23.5% 23.5% 23.5% 23.5% 23.6% 23.6% 23.6% 23.6% 23.6% 23.6% 23.6% 23.6% 23.6% 23.6% 23.7% 23.7% 23.7% 23.7% 23.7% 23.7% 23.7% 23.7% 23.7% 23.8% 23.8% 23.8% 23.8% 23.8% 23.8% 23.8% 23.8% 23.8% 23.8% 23.9% 23.9% 23.9% 23.9% 23.9% 23.9% 23.9% 23.9% 23.9% 23.9% 24.0% 24.0% 24.0% 24.0% 24.0% 24.0% 24.0% 24.0% 24.0% 24.1% 24.1% 24.1% 24.1% 24.1% 24.1% 24.1% 24.1% 24.1% 24.1% 24.2% 24.2% 24.2% 24.2% 24.2% 24.2% 24.2% 24.2% 24.2% 24.3% 24.3% 24.3% 24.3% 24.3% 24.3% 24.3% 24.3% 24.3% 24.3% 24.4% 24.4% 24.4% 24.4% 24.4% 24.4% 24.4% 24.4% 24.4% 24.4% 24.5% 24.5% 24.5% 24.5% 24.5% 24.5% 24.5% 24.5% 24.5% 24.6% 24.6% 24.6% 24.6% 24.6% 24.6% 24.6% 24.6% 24.6% 24.6% 24.7% 24.7% 24.7% 24.7% 24.7% 24.7% 24.7% 24.7% 24.7% 24.7% 24.8% 24.8% 24.8% 24.8% 24.8% 24.8% 24.8% 24.8% 24.8% 24.9% 24.9% 24.9% 24.9% 24.9% 24.9% 24.9% 24.9% 24.9% 24.9% 25.0% 25.0% 25.0% 25.0% 25.0% 25.0% 25.0% 25.0% 25.0% 25.1% 25.1% 25.1% 25.1% 25.1% 25.1% 25.1% 25.1% 25.1% 25.1% 25.2% 25.2% 25.2% 25.2% 25.2% 25.2% 25.2% 25.2% 25.2% 25.2% 25.3% 25.3% 25.3% 25.3% 25.3% 25.3% 25.3% 25.3% 25.3% 25.4% 25.4% 25.4% 25.4% 25.4% 25.4% 25.4% 25.4% 25.4% 25.4% 25.5% 25.5% 25.5% 25.5% 25.5% 25.5% 25.5% 25.5% 25.5% 25.5% 25.6% 25.6% 25.6% 25.6% 25.6% 25.6% 25.6% 25.6% 25.6% 25.7% 25.7% 25.7% 25.7% 25.7% 25.7% 25.7% 25.7% 25.7% 25.7% 25.8% 25.8% 25.8% 25.8% 25.8% 25.8% 25.8% 25.8% 25.8% 25.8% 25.9% 25.9% 25.9% 25.9% 25.9% 25.9% 25.9% 25.9% 25.9% 26.0% 26.0% 26.0% 26.0% 26.0% 26.0% 26.0% 26.0% 26.0% 26.0% 26.1% 26.1% 26.1% 26.1% 26.1% 26.1% 26.1% 26.1% 26.1% 26.2% 26.2% 26.2% 26.2% 26.2% 26.2% 26.2% 26.2% 26.2% 26.2% 26.3% 26.3% 26.3% 26.3% 26.3% 26.3% 26.3% 26.3% 26.3% 26.3% 26.4% 26.4% 26.4% 26.4% 26.4% 26.4% 26.4% 26.4% 26.4% 26.5% 26.5% 26.5% 26.5% 26.5% 26.5% 26.5% 26.5% 26.5% 26.5% 26.6% 26.6% 26.6% 26.6% 26.6% 26.6% 26.6% 26.6% 26.6% 26.6% 26.7% 26.7% 26.7% 26.7% 26.7% 26.7% 26.7% 26.7% 26.7% 26.8% 26.8% 26.8% 26.8% 26.8% 26.8% 26.8% 26.8% 26.8% 26.8% 26.9% 26.9% 26.9% 26.9% 26.9% 26.9% 26.9% 26.9% 26.9% 27.0% 27.0% 27.0% 27.0% 27.0% 27.0% 27.0% 27.0% 27.0% 27.0% 27.1% 27.1% 27.1% 27.1% 27.1% 27.1% 27.1% 27.1% 27.1% 27.1% 27.2% 27.2% 27.2% 27.2% 27.2% 27.2% 27.2% 27.2% 27.2% 27.3% 27.3% 27.3% 27.3% 27.3% 27.3% 27.3% 27.3% 27.3% 27.3% 27.4% 27.4% 27.4% 27.4% 27.4% 27.4% 27.4% 27.4% 27.4% 27.4% 27.5% 27.5% 27.5% 27.5% 27.5% 27.5% 27.5% 27.5% 27.5% 27.6% 27.6% 27.6% 27.6% 27.6% 27.6% 27.6% 27.6% 27.6% 27.6% 27.7% 27.7% 27.7% 27.7% 27.7% 27.7% 27.7% 27.7% 27.7% 27.8% 27.8% 27.8% 27.8% 27.8% 27.8% 27.8% 27.8% 27.8% 27.8% 27.9% 27.9% 27.9% 27.9% 27.9% 27.9% 27.9% 27.9% 27.9% 27.9% 28.0% 28.0% 28.0% 28.0% 28.0% 28.0% 28.0% 28.0% 28.0% 28.1% 28.1% 28.1% 28.1% 28.1% 28.1% 28.1% 28.1% 28.1% 28.1% 28.2% 28.2% 28.2% 28.2% 28.2% 28.2% 28.2% 28.2% 28.2% 28.2% 28.3% 28.3% 28.3% 28.3% 28.3% 28.3% 28.3% 28.3% 28.3% 28.4% 28.4% 28.4% 28.4% 28.4% 28.4% 28.4% 28.4% 28.4% 28.4% 28.5% 28.5% 28.5% 28.5% 28.5% 28.5% 28.5% 28.5% 28.5% 28.6% 28.6% 28.6% 28.6% 28.6% 28.6% 28.6% 28.6% 28.6% 28.6% 28.7% 28.7% 28.7% 28.7% 28.7% 28.7% 28.7% 28.7% 28.7% 28.7% 28.8% 28.8% 28.8% 28.8% 28.8% 28.8% 28.8% 28.8% 28.8% 28.9% 28.9% 28.9% 28.9% 28.9% 28.9% 28.9% 28.9% 28.9% 28.9% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.0% 29.1% 29.1% 29.1% 29.1% 29.1% 29.1% 29.1% 29.1% 29.1% 29.2% 29.2% 29.2% 29.2% 29.2% 29.2% 29.2% 29.2% 29.2% 29.2% 29.3% 29.3% 29.3% 29.3% 29.3% 29.3% 29.3% 29.3% 29.3% 29.3% 29.4% 29.4% 29.4% 29.4% 29.4% 29.4% 29.4% 29.4% 29.4% 29.5% 29.5% 29.5% 29.5% 29.5% 29.5% 29.5% 29.5% 29.5% 29.5% 29.6% 29.6% 29.6% 29.6% 29.6% 29.6% 29.6% 29.6% 29.6% 29.7% 29.7% 29.7% 29.7% 29.7% 29.7% 29.7% 29.7% 29.7% 29.7% 29.8% 29.8% 29.8% 29.8% 29.8% 29.8% 29.8% 29.8% 29.8% 29.8% 29.9% 29.9% 29.9% 29.9% 29.9% 29.9% 29.9% 29.9% 29.9% 30.0% 30.0% 30.0% 30.0% 30.0% 30.0% 30.0% 30.0% 30.0% 30.0% 30.1% 30.1% 30.1% 30.1% 30.1% 30.1% 30.1% 30.1% 30.1% 30.1% 30.2% 30.2% 30.2% 30.2% 30.2% 30.2% 30.2% 30.2% 30.2% 30.3% 30.3% 30.3% 30.3% 30.3% 30.3% 30.3% 30.3% 30.3% 30.3% 30.4% 30.4% 30.4% 30.4% 30.4% 30.4% 30.4% 30.4% 30.4% 30.5% 30.5% 30.5% 30.5% 30.5% 30.5% 30.5% 30.5% 30.5% 30.5% 30.6% 30.6% 30.6% 30.6% 30.6% 30.6% 30.6% 30.6% 30.6% 30.6% 30.7% 30.7% 30.7% 30.7% 30.7% 30.7% 30.7% 30.7% 30.7% 30.8% 30.8% 30.8% 30.8% 30.8% 30.8% 30.8% 30.8% 30.8% 30.8% 30.9% 30.9% 30.9% 30.9% 30.9% 30.9% 30.9% 30.9% 30.9% 30.9% 31.0% 31.0% 31.0% 31.0% 31.0% 31.0% 31.0% 31.0% 31.0% 31.1% 31.1% 31.1% 31.1% 31.1% 31.1% 31.1% 31.1% 31.1% 31.1% 31.2% 31.2% 31.2% 31.2% 31.2% 31.2% 31.2% 31.2% 31.2% 31.3% 31.3% 31.3% 31.3% 31.3% 31.3% 31.3% 31.3% 31.3% 31.3% 31.4% 31.4% 31.4% 31.4% 31.4% 31.4% 31.4% 31.4% 31.4% 31.4% 31.5% 31.5% 31.5% 31.5% 31.5% 31.5% 31.5% 31.5% 31.5% 31.6% 31.6% 31.6% 31.6% 31.6% 31.6% 31.6% 31.6% 31.6% 31.6% 31.7% 31.7% 31.7% 31.7% 31.7% 31.7% 31.7% 31.7% 31.7% 31.7% 31.8% 31.8% 31.8% 31.8% 31.8% 31.8% 31.8% 31.8% 31.8% 31.9% 31.9% 31.9% 31.9% 31.9% 31.9% 31.9% 31.9% 31.9% 31.9% 32.0% 32.0% 32.0% 32.0% 32.0% 32.0% 32.0% 32.0% 32.0% 32.1% 32.1% 32.1% 32.1% 32.1% 32.1% 32.1% 32.1% 32.1% 32.1% 32.2% 32.2% 32.2% 32.2% 32.2% 32.2% 32.2% 32.2% 32.2% 32.2% 32.3% 32.3% 32.3% 32.3% 32.3% 32.3% 32.3% 32.3% 32.3% 32.4% 32.4% 32.4% 32.4% 32.4% 32.4% 32.4% 32.4% 32.4% 32.4% 32.5% 32.5% 32.5% 32.5% 32.5% 32.5% 32.5% 32.5% 32.5% 32.5% 32.6% 32.6% 32.6% 32.6% 32.6% 32.6% 32.6% 32.6% 32.6% 32.7% 32.7% 32.7% 32.7% 32.7% 32.7% 32.7% 32.7% 32.7% 32.7% 32.8% 32.8% 32.8% 32.8% 32.8% 32.8% 32.8% 32.8% 32.8% 32.8% 32.9% 32.9% 32.9% 32.9% 32.9% 32.9% 32.9% 32.9% 32.9% 33.0% 33.0% 33.0% 33.0% 33.0% 33.0% 33.0% 33.0% 33.0% 33.0% 33.1% 33.1% 33.1% 33.1% 33.1% 33.1% 33.1% 33.1% 33.1% 33.2% 33.2% 33.2% 33.2% 33.2% 33.2% 33.2% 33.2% 33.2% 33.2% 33.3% 33.3% 33.3% 33.3% 33.3% 33.3% 33.3% 33.3% 33.3% 33.3% 33.4% 33.4% 33.4% 33.4% 33.4% 33.4% 33.4% 33.4% 33.4% 33.5% 33.5% 33.5% 33.5% 33.5% 33.5% 33.5% 33.5% 33.5% 33.5% 33.6% 33.6% 33.6% 33.6% 33.6% 33.6% 33.6% 33.6% 33.6% 33.6% 33.7% 33.7% 33.7% 33.7% 33.7% 33.7% 33.7% 33.7% 33.7% 33.8% 33.8% 33.8% 33.8% 33.8% 33.8% 33.8% 33.8% 33.8% 33.8% 33.9% 33.9% 33.9% 33.9% 33.9% 33.9% 33.9% 33.9% 33.9% 34.0% 34.0% 34.0% 34.0% 34.0% 34.0% 34.0% 34.0% 34.0% 34.0% 34.1% 34.1% 34.1% 34.1% 34.1% 34.1% 34.1% 34.1% 34.1% 34.1% 34.2% 34.2% 34.2% 34.2% 34.2% 34.2% 34.2% 34.2% 34.2% 34.3% 34.3% 34.3% 34.3% 34.3% 34.3% 34.3% 34.3% 34.3% 34.3% 34.4% 34.4% 34.4% 34.4% 34.4% 34.4% 34.4% 34.4% 34.4% 34.4% 34.5% 34.5% 34.5% 34.5% 34.5% 34.5% 34.5% 34.5% 34.5% 34.6% 34.6% 34.6% 34.6% 34.6% 34.6% 34.6% 34.6% 34.6% 34.6% 34.7% 34.7% 34.7% 34.7% 34.7% 34.7% 34.7% 34.7% 34.7% 34.8% 34.8% 34.8% 34.8% 34.8% 34.8% 34.8% 34.8% 34.8% 34.8% 34.9% 34.9% 34.9% 34.9% 34.9% 34.9% 34.9% 34.9% 34.9% 34.9% 35.0% 35.0% 35.0% 35.0% 35.0% 35.0% 35.0% 35.0% 35.0% 35.1% 35.1% 35.1% 35.1% 35.1% 35.1% 35.1% 35.1% 35.1% 35.1% 35.2% 35.2% 35.2% 35.2% 35.2% 35.2% 35.2% 35.2% 35.2% 35.2% 35.3% 35.3% 35.3% 35.3% 35.3% 35.3% 35.3% 35.3% 35.3% 35.4% 35.4% 35.4% 35.4% 35.4% 35.4% 35.4% 35.4% 35.4% 35.4% 35.5% 35.5% 35.5% 35.5% 35.5% 35.5% 35.5% 35.5% 35.5% 35.6% 35.6% 35.6% 35.6% 35.6% 35.6% 35.6% 35.6% 35.6% 35.6% 35.7% 35.7% 35.7% 35.7% 35.7% 35.7% 35.7% 35.7% 35.7% 35.7% 35.8% 35.8% 35.8% 35.8% 35.8% 35.8% 35.8% 35.8% 35.8% 35.9% 35.9% 35.9% 35.9% 35.9% 35.9% 35.9% 35.9% 35.9% 35.9% 36.0% 36.0% 36.0% 36.0% 36.0% 36.0% 36.0% 36.0% 36.0% 36.0% 36.1% 36.1% 36.1% 36.1% 36.1% 36.1% 36.1% 36.1% 36.1% 36.2% 36.2% 36.2% 36.2% 36.2% 36.2% 36.2% 36.2% 36.2% 36.2% 36.3% 36.3% 36.3% 36.3% 36.3% 36.3% 36.3% 36.3% 36.3% 36.3% 36.4% 36.4% 36.4% 36.4% 36.4% 36.4% 36.4% 36.4% 36.4% 36.5% 36.5% 36.5% 36.5% 36.5% 36.5% 36.5% 36.5% 36.5% 36.5% 36.6% 36.6% 36.6% 36.6% 36.6% 36.6% 36.6% 36.6% 36.6% 36.7% 36.7% 36.7% 36.7% 36.7% 36.7% 36.7% 36.7% 36.7% 36.7% 36.8% 36.8% 36.8% 36.8% 36.8% 36.8% 36.8% 36.8% 36.8% 36.8% 36.9% 36.9% 36.9% 36.9% 36.9% 36.9% 36.9% 36.9% 36.9% 37.0% 37.0% 37.0% 37.0% 37.0% 37.0% 37.0% 37.0% 37.0% 37.0% 37.1% 37.1% 37.1% 37.1% 37.1% 37.1% 37.1% 37.1% 37.1% 37.1% 37.2% 37.2% 37.2% 37.2% 37.2% 37.2% 37.2% 37.2% 37.2% 37.3% 37.3% 37.3% 37.3% 37.3% 37.3% 37.3% 37.3% 37.3% 37.3% 37.4% 37.4% 37.4% 37.4% 37.4% 37.4% 37.4% 37.4% 37.4% 37.5% 37.5% 37.5% 37.5% 37.5% 37.5% 37.5% 37.5% 37.5% 37.5% 37.6% 37.6% 37.6% 37.6% 37.6% 37.6% 37.6% 37.6% 37.6% 37.6% 37.7% 37.7% 37.7% 37.7% 37.7% 37.7% 37.7% 37.7% 37.7% 37.8% 37.8% 37.8% 37.8% 37.8% 37.8% 37.8% 37.8% 37.8% 37.8% 37.9% 37.9% 37.9% 37.9% 37.9% 37.9% 37.9% 37.9% 37.9% 37.9% 38.0% 38.0% 38.0% 38.0% 38.0% 38.0% 38.0% 38.0% 38.0% 38.1% 38.1% 38.1% 38.1% 38.1% 38.1% 38.1% 38.1% 38.1% 38.1% 38.2% 38.2% 38.2% 38.2% 38.2% 38.2% 38.2% 38.2% 38.2% 38.3% 38.3% 38.3% 38.3% 38.3% 38.3% 38.3% 38.3% 38.3% 38.3% 38.4% 38.4% 38.4% 38.4% 38.4% 38.4% 38.4% 38.4% 38.4% 38.4% 38.5% 38.5% 38.5% 38.5% 38.5% 38.5% 38.5% 38.5% 38.5% 38.6% 38.6% 38.6% 38.6% 38.6% 38.6% 38.6% 38.6% 38.6% 38.6% 38.7% 38.7% 38.7% 38.7% 38.7% 38.7% 38.7% 38.7% 38.7% 38.7% 38.8% 38.8% 38.8% 38.8% 38.8% 38.8% 38.8% 38.8% 38.8% 38.9% 38.9% 38.9% 38.9% 38.9% 38.9% 38.9% 38.9% 38.9% 38.9% 39.0% 39.0% 39.0% 39.0% 39.0% 39.0% 39.0% 39.0% 39.0% 39.1% 39.1% 39.1% 39.1% 39.1% 39.1% 39.1% 39.1% 39.1% 39.1% 39.2% 39.2% 39.2% 39.2% 39.2% 39.2% 39.2% 39.2% 39.2% 39.2% 39.3% 39.3% 39.3% 39.3% 39.3% 39.3% 39.3% 39.3% 39.3% 39.4% 39.4% 39.4% 39.4% 39.4% 39.4% 39.4% 39.4% 39.4% 39.4% 39.5% 39.5% 39.5% 39.5% 39.5% 39.5% 39.5% 39.5% 39.5% 39.5% 39.6% 39.6% 39.6% 39.6% 39.6% 39.6% 39.6% 39.6% 39.6% 39.7% 39.7% 39.7% 39.7% 39.7% 39.7% 39.7% 39.7% 39.7% 39.7% 39.8% 39.8% 39.8% 39.8% 39.8% 39.8% 39.8% 39.8% 39.8% 39.8% 39.9% 39.9% 39.9% 39.9% 39.9% 39.9% 39.9% 39.9% 39.9% 40.0% 40.0% 40.0% 40.0% 40.0% 40.0% 40.0% 40.0% 40.0% 40.0% 40.1% 40.1% 40.1% 40.1% 40.1% 40.1% 40.1% 40.1% 40.1% 40.2% 40.2% 40.2% 40.2% 40.2% 40.2% 40.2% 40.2% 40.2% 40.2% 40.3% 40.3% 40.3% 40.3% 40.3% 40.3% 40.3% 40.3% 40.3% 40.3% 40.4% 40.4% 40.4% 40.4% 40.4% 40.4% 40.4% 40.4% 40.4% 40.5% 40.5% 40.5% 40.5% 40.5% 40.5% 40.5% 40.5% 40.5% 40.5% 40.6% 40.6% 40.6% 40.6% 40.6% 40.6% 40.6% 40.6% 40.6% 40.6% 40.7% 40.7% 40.7% 40.7% 40.7% 40.7% 40.7% 40.7% 40.7% 40.8% 40.8% 40.8% 40.8% 40.8% 40.8% 40.8% 40.8% 40.8% 40.8% 40.9% 40.9% 40.9% 40.9% 40.9% 40.9% 40.9% 40.9% 40.9% 41.0% 41.0% 41.0% 41.0% 41.0% 41.0% 41.0% 41.0% 41.0% 41.0% 41.1% 41.1% 41.1% 41.1% 41.1% 41.1% 41.1% 41.1% 41.1% 41.1% 41.2% 41.2% 41.2% 41.2% 41.2% 41.2% 41.2% 41.2% 41.2% 41.3% 41.3% 41.3% 41.3% 41.3% 41.3% 41.3% 41.3% 41.3% 41.3% 41.4% 41.4% 41.4% 41.4% 41.4% 41.4% 41.4% 41.4% 41.4% 41.4% 41.5% 41.5% 41.5% 41.5% 41.5% 41.5% 41.5% 41.5% 41.5% 41.6% 41.6% 41.6% 41.6% 41.6% 41.6% 41.6% 41.6% 41.6% 41.6% 41.7% 41.7% 41.7% 41.7% 41.7% 41.7% 41.7% 41.7% 41.7% 41.8% 41.8% 41.8% 41.8% 41.8% 41.8% 41.8% 41.8% 41.8% 41.8% 41.9% 41.9% 41.9% 41.9% 41.9% 41.9% 41.9% 41.9% 41.9% 41.9% 42.0% 42.0% 42.0% 42.0% 42.0% 42.0% 42.0% 42.0% 42.0% 42.1% 42.1% 42.1% 42.1% 42.1% 42.1% 42.1% 42.1% 42.1% 42.1% 42.2% 42.2% 42.2% 42.2% 42.2% 42.2% 42.2% 42.2% 42.2% 42.2% 42.3% 42.3% 42.3% 42.3% 42.3% 42.3% 42.3% 42.3% 42.3% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.4% 42.5% 42.5% 42.5% 42.5% 42.5% 42.5% 42.5% 42.5% 42.5% 42.6% 42.6% 42.6% 42.6% 42.6% 42.6% 42.6% 42.6% 42.6% 42.6% 42.7% 42.7% 42.7% 42.7% 42.7% 42.7% 42.7% 42.7% 42.7% 42.7% 42.8% 42.8% 42.8% 42.8% 42.8% 42.8% 42.8% 42.8% 42.8% 42.9% 42.9% 42.9% 42.9% 42.9% 42.9% 42.9% 42.9% 42.9% 42.9% 43.0% 43.0% 43.0% 43.0% 43.0% 43.0% 43.0% 43.0% 43.0% 43.0% 43.1% 43.1% 43.1% 43.1% 43.1% 43.1% 43.1% 43.1% 43.1% 43.2% 43.2% 43.2% 43.2% 43.2% 43.2% 43.2% 43.2% 43.2% 43.2% 43.3% 43.3% 43.3% 43.3% 43.3% 43.3% 43.3% 43.3% 43.3% 43.3% 43.4% 43.4% 43.4% 43.4% 43.4% 43.4% 43.4% 43.4% 43.4% 43.5% 43.5% 43.5% 43.5% 43.5% 43.5% 43.5% 43.5% 43.5% 43.5% 43.6% 43.6% 43.6% 43.6% 43.6% 43.6% 43.6% 43.6% 43.6% 43.7% 43.7% 43.7% 43.7% 43.7% 43.7% 43.7% 43.7% 43.7% 43.7% 43.8% 43.8% 43.8% 43.8% 43.8% 43.8% 43.8% 43.8% 43.8% 43.8% 43.9% 43.9% 43.9% 43.9% 43.9% 43.9% 43.9% 43.9% 43.9% 44.0% 44.0% 44.0% 44.0% 44.0% 44.0% 44.0% 44.0% 44.0% 44.0% 44.1% 44.1% 44.1% 44.1% 44.1% 44.1% 44.1% 44.1% 44.1% 44.1% 44.2% 44.2% 44.2% 44.2% 44.2% 44.2% 44.2% 44.2% 44.2% 44.3% 44.3% 44.3% 44.3% 44.3% 44.3% 44.3% 44.3% 44.3% 44.3% 44.4% 44.4% 44.4% 44.4% 44.4% 44.4% 44.4% 44.4% 44.4% 44.5% 44.5% 44.5% 44.5% 44.5% 44.5% 44.5% 44.5% 44.5% 44.5% 44.6% 44.6% 44.6% 44.6% 44.6% 44.6% 44.6% 44.6% 44.6% 44.6% 44.7% 44.7% 44.7% 44.7% 44.7% 44.7% 44.7% 44.7% 44.7% 44.8% 44.8% 44.8% 44.8% 44.8% 44.8% 44.8% 44.8% 44.8% 44.8% 44.9% 44.9% 44.9% 44.9% 44.9% 44.9% 44.9% 44.9% 44.9% 44.9% 45.0% 45.0% 45.0% 45.0% 45.0% 45.0% 45.0% 45.0% 45.0% 45.1% 45.1% 45.1% 45.1% 45.1% 45.1% 45.1% 45.1% 45.1% 45.1% 45.2% 45.2% 45.2% 45.2% 45.2% 45.2% 45.2% 45.2% 45.2% 45.3% 45.3% 45.3% 45.3% 45.3% 45.3% 45.3% 45.3% 45.3% 45.3% 45.4% 45.4% 45.4% 45.4% 45.4% 45.4% 45.4% 45.4% 45.4% 45.4% 45.5% 45.5% 45.5% 45.5% 45.5% 45.5% 45.5% 45.5% 45.5% 45.6% 45.6% 45.6% 45.6% 45.6% 45.6% 45.6% 45.6% 45.6% 45.6% 45.7% 45.7% 45.7% 45.7% 45.7% 45.7% 45.7% 45.7% 45.7% 45.7% 45.8% 45.8% 45.8% 45.8% 45.8% 45.8% 45.8% 45.8% 45.8% 45.9% 45.9% 45.9% 45.9% 45.9% 45.9% 45.9% 45.9% 45.9% 45.9% 46.0% 46.0% 46.0% 46.0% 46.0% 46.0% 46.0% 46.0% 46.0% 46.1% 46.1% 46.1% 46.1% 46.1% 46.1% 46.1% 46.1% 46.1% 46.1% 46.2% 46.2% 46.2% 46.2% 46.2% 46.2% 46.2% 46.2% 46.2% 46.2% 46.3% 46.3% 46.3% 46.3% 46.3% 46.3% 46.3% 46.3% 46.3% 46.4% 46.4% 46.4% 46.4% 46.4% 46.4% 46.4% 46.4% 46.4% 46.4% 46.5% 46.5% 46.5% 46.5% 46.5% 46.5% 46.5% 46.5% 46.5% 46.5% 46.6% 46.6% 46.6% 46.6% 46.6% 46.6% 46.6% 46.6% 46.6% 46.7% 46.7% 46.7% 46.7% 46.7% 46.7% 46.7% 46.7% 46.7% 46.7% 46.8% 46.8% 46.8% 46.8% 46.8% 46.8% 46.8% 46.8% 46.8% 46.8% 46.9% 46.9% 46.9% 46.9% 46.9% 46.9% 46.9% 46.9% 46.9% 47.0% 47.0% 47.0% 47.0% 47.0% 47.0% 47.0% 47.0% 47.0% 47.0% 47.1% 47.1% 47.1% 47.1% 47.1% 47.1% 47.1% 47.1% 47.1% 47.2% 47.2% 47.2% 47.2% 47.2% 47.2% 47.2% 47.2% 47.2% 47.2% 47.3% 47.3% 47.3% 47.3% 47.3% 47.3% 47.3% 47.3% 47.3% 47.3% 47.4% 47.4% 47.4% 47.4% 47.4% 47.4% 47.4% 47.4% 47.4% 47.5% 47.5% 47.5% 47.5% 47.5% 47.5% 47.5% 47.5% 47.5% 47.5% 47.6% 47.6% 47.6% 47.6% 47.6% 47.6% 47.6% 47.6% 47.6% 47.6% 47.7% 47.7% 47.7% 47.7% 47.7% 47.7% 47.7% 47.7% 47.7% 47.8% 47.8% 47.8% 47.8% 47.8% 47.8% 47.8% 47.8% 47.8% 47.8% 47.9% 47.9% 47.9% 47.9% 47.9% 47.9% 47.9% 47.9% 47.9% 48.0% 48.0% 48.0% 48.0% 48.0% 48.0% 48.0% 48.0% 48.0% 48.0% 48.1% 48.1% 48.1% 48.1% 48.1% 48.1% 48.1% 48.1% 48.1% 48.1% 48.2% 48.2% 48.2% 48.2% 48.2% 48.2% 48.2% 48.2% 48.2% 48.3% 48.3% 48.3% 48.3% 48.3% 48.3% 48.3% 48.3% 48.3% 48.3% 48.4% 48.4% 48.4% 48.4% 48.4% 48.4% 48.4% 48.4% 48.4% 48.4% 48.5% 48.5% 48.5% 48.5% 48.5% 48.5% 48.5% 48.5% 48.5% 48.6% 48.6% 48.6% 48.6% 48.6% 48.6% 48.6% 48.6% 48.6% 48.6% 48.7% 48.7% 48.7% 48.7% 48.7% 48.7% 48.7% 48.7% 48.7% 48.8% 48.8% 48.8% 48.8% 48.8% 48.8% 48.8% 48.8% 48.8% 48.8% 48.9% 48.9% 48.9% 48.9% 48.9% 48.9% 48.9% 48.9% 48.9% 48.9% 49.0% 49.0% 49.0% 49.0% 49.0% 49.0% 49.0% 49.0% 49.0% 49.1% 49.1% 49.1% 49.1% 49.1% 49.1% 49.1% 49.1% 49.1% 49.1% 49.2% 49.2% 49.2% 49.2% 49.2% 49.2% 49.2% 49.2% 49.2% 49.2% 49.3% 49.3% 49.3% 49.3% 49.3% 49.3% 49.3% 49.3% 49.3% 49.4% 49.4% 49.4% 49.4% 49.4% 49.4% 49.4% 49.4% 49.4% 49.4% 49.5% 49.5% 49.5% 49.5% 49.5% 49.5% 49.5% 49.5% 49.5% 49.6% 49.6% 49.6% 49.6% 49.6% 49.6% 49.6% 49.6% 49.6% 49.6% 49.7% 49.7% 49.7% 49.7% 49.7% 49.7% 49.7% 49.7% 49.7% 49.7% 49.8% 49.8% 49.8% 49.8% 49.8% 49.8% 49.8% 49.8% 49.8% 49.9% 49.9% 49.9% 49.9% 49.9% 49.9% 49.9% 49.9% 49.9% 49.9% 50.0% 50.0% 50.0% 50.0% 50.0% 50.0% 50.0% 50.0% 50.0% 50.0% 50.1% 50.1% 50.1% 50.1% 50.1% 50.1% 50.1% 50.1% 50.1% 50.2% 50.2% 50.2% 50.2% 50.2% 50.2% 50.2% 50.2% 50.2% 50.2% 50.3% 50.3% 50.3% 50.3% 50.3% 50.3% 50.3% 50.3% 50.3% 50.3% 50.4% 50.4% 50.4% 50.4% 50.4% 50.4% 50.4% 50.4% 50.4% 50.5% 50.5% 50.5% 50.5% 50.5% 50.5% 50.5% 50.5% 50.5% 50.5% 50.6% 50.6% 50.6% 50.6% 50.6% 50.6% 50.6% 50.6% 50.6% 50.7% 50.7% 50.7% 50.7% 50.7% 50.7% 50.7% 50.7% 50.7% 50.7% 50.8% 50.8% 50.8% 50.8% 50.8% 50.8% 50.8% 50.8% 50.8% 50.8% 50.9% 50.9% 50.9% 50.9% 50.9% 50.9% 50.9% 50.9% 50.9% 51.0% 51.0% 51.0% 51.0% 51.0% 51.0% 51.0% 51.0% 51.0% 51.0% 51.1% 51.1% 51.1% 51.1% 51.1% 51.1% 51.1% 51.1% 51.1% 51.1% 51.2% 51.2% 51.2% 51.2% 51.2% 51.2% 51.2% 51.2% 51.2% 51.3% 51.3% 51.3% 51.3% 51.3% 51.3% 51.3% 51.3% 51.3% 51.3% 51.4% 51.4% 51.4% 51.4% 51.4% 51.4% 51.4% 51.4% 51.4% 51.5% 51.5% 51.5% 51.5% 51.5% 51.5% 51.5% 51.5% 51.5% 51.5% 51.6% 51.6% 51.6% 51.6% 51.6% 51.6% 51.6% 51.6% 51.6% 51.6% 51.7% 51.7% 51.7% 51.7% 51.7% 51.7% 51.7% 51.7% 51.7% 51.8% 51.8% 51.8% 51.8% 51.8% 51.8% 51.8% 51.8% 51.8% 51.8% 51.9% 51.9% 51.9% 51.9% 51.9% 51.9% 51.9% 51.9% 51.9% 51.9% 52.0% 52.0% 52.0% 52.0% 52.0% 52.0% 52.0% 52.0% 52.0% 52.1% 52.1% 52.1% 52.1% 52.1% 52.1% 52.1% 52.1% 52.1% 52.1% 52.2% 52.2% 52.2% 52.2% 52.2% 52.2% 52.2% 52.2% 52.2% 52.3% 52.3% 52.3% 52.3% 52.3% 52.3% 52.3% 52.3% 52.3% 52.3% 52.4% 52.4% 52.4% 52.4% 52.4% 52.4% 52.4% 52.4% 52.4% 52.4% 52.5% 52.5% 52.5% 52.5% 52.5% 52.5% 52.5% 52.5% 52.5% 52.6% 52.6% 52.6% 52.6% 52.6% 52.6% 52.6% 52.6% 52.6% 52.6% 52.7% 52.7% 52.7% 52.7% 52.7% 52.7% 52.7% 52.7% 52.7% 52.7% 52.8% 52.8% 52.8% 52.8% 52.8% 52.8% 52.8% 52.8% 52.8% 52.9% 52.9% 52.9% 52.9% 52.9% 52.9% 52.9% 52.9% 52.9% 52.9% 53.0% 53.0% 53.0% 53.0% 53.0% 53.0% 53.0% 53.0% 53.0% 53.0% 53.1% 53.1% 53.1% 53.1% 53.1% 53.1% 53.1% 53.1% 53.1% 53.2% 53.2% 53.2% 53.2% 53.2% 53.2% 53.2% 53.2% 53.2% 53.2% 53.3% 53.3% 53.3% 53.3% 53.3% 53.3% 53.3% 53.3% 53.3% 53.4% 53.4% 53.4% 53.4% 53.4% 53.4% 53.4% 53.4% 53.4% 53.4% 53.5% 53.5% 53.5% 53.5% 53.5% 53.5% 53.5% 53.5% 53.5% 53.5% 53.6% 53.6% 53.6% 53.6% 53.6% 53.6% 53.6% 53.6% 53.6% 53.7% 53.7% 53.7% 53.7% 53.7% 53.7% 53.7% 53.7% 53.7% 53.7% 53.8% 53.8% 53.8% 53.8% 53.8% 53.8% 53.8% 53.8% 53.8% 53.8% 53.9% 53.9% 53.9% 53.9% 53.9% 53.9% 53.9% 53.9% 53.9% 54.0% 54.0% 54.0% 54.0% 54.0% 54.0% 54.0% 54.0% 54.0% 54.0% 54.1% 54.1% 54.1% 54.1% 54.1% 54.1% 54.1% 54.1% 54.1% 54.2% 54.2% 54.2% 54.2% 54.2% 54.2% 54.2% 54.2% 54.2% 54.2% 54.3% 54.3% 54.3% 54.3% 54.3% 54.3% 54.3% 54.3% 54.3% 54.3% 54.4% 54.4% 54.4% 54.4% 54.4% 54.4% 54.4% 54.4% 54.4% 54.5% 54.5% 54.5% 54.5% 54.5% 54.5% 54.5% 54.5% 54.5% 54.5% 54.6% 54.6% 54.6% 54.6% 54.6% 54.6% 54.6% 54.6% 54.6% 54.6% 54.7% 54.7% 54.7% 54.7% 54.7% 54.7% 54.7% 54.7% 54.7% 54.8% 54.8% 54.8% 54.8% 54.8% 54.8% 54.8% 54.8% 54.8% 54.8% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 54.9% 55.0% 55.0% 55.0% 55.0% 55.0% 55.0% 55.0% 55.0% 55.0% 55.0% 55.1% 55.1% 55.1% 55.1% 55.1% 55.1% 55.1% 55.1% 55.1% 55.1% 55.2% 55.2% 55.2% 55.2% 55.2% 55.2% 55.2% 55.2% 55.2% 55.3% 55.3% 55.3% 55.3% 55.3% 55.3% 55.3% 55.3% 55.3% 55.3% 55.4% 55.4% 55.4% 55.4% 55.4% 55.4% 55.4% 55.4% 55.4% 55.4% 55.5% 55.5% 55.5% 55.5% 55.5% 55.5% 55.5% 55.5% 55.5% 55.6% 55.6% 55.6% 55.6% 55.6% 55.6% 55.6% 55.6% 55.6% 55.6% 55.7% 55.7% 55.7% 55.7% 55.7% 55.7% 55.7% 55.7% 55.7% 55.8% 55.8% 55.8% 55.8% 55.8% 55.8% 55.8% 55.8% 55.8% 55.8% 55.9% 55.9% 55.9% 55.9% 55.9% 55.9% 55.9% 55.9% 55.9% 55.9% 56.0% 56.0% 56.0% 56.0% 56.0% 56.0% 56.0% 56.0% 56.0% 56.1% 56.1% 56.1% 56.1% 56.1% 56.1% 56.1% 56.1% 56.1% 56.1% 56.2% 56.2% 56.2% 56.2% 56.2% 56.2% 56.2% 56.2% 56.2% 56.2% 56.3% 56.3% 56.3% 56.3% 56.3% 56.3% 56.3% 56.3% 56.3% 56.4% 56.4% 56.4% 56.4% 56.4% 56.4% 56.4% 56.4% 56.4% 56.4% 56.5% 56.5% 56.5% 56.5% 56.5% 56.5% 56.5% 56.5% 56.5% 56.5% 56.6% 56.6% 56.6% 56.6% 56.6% 56.6% 56.6% 56.6% 56.6% 56.7% 56.7% 56.7% 56.7% 56.7% 56.7% 56.7% 56.7% 56.7% 56.7% 56.8% 56.8% 56.8% 56.8% 56.8% 56.8% 56.8% 56.8% 56.8% 56.9% 56.9% 56.9% 56.9% 56.9% 56.9% 56.9% 56.9% 56.9% 56.9% 57.0% 57.0% 57.0% 57.0% 57.0% 57.0% 57.0% 57.0% 57.0% 57.0% 57.1% 57.1% 57.1% 57.1% 57.1% 57.1% 57.1% 57.1% 57.1% 57.2% 57.2% 57.2% 57.2% 57.2% 57.2% 57.2% 57.2% 57.2% 57.2% 57.3% 57.3% 57.3% 57.3% 57.3% 57.3% 57.3% 57.3% 57.3% 57.3% 57.4% 57.4% 57.4% 57.4% 57.4% 57.4% 57.4% 57.4% 57.4% 57.5% 57.5% 57.5% 57.5% 57.5% 57.5% 57.5% 57.5% 57.5% 57.5% 57.6% 57.6% 57.6% 57.6% 57.6% 57.6% 57.6% 57.6% 57.6% 57.7% 57.7% 57.7% 57.7% 57.7% 57.7% 57.7% 57.7% 57.7% 57.7% 57.8% 57.8% 57.8% 57.8% 57.8% 57.8% 57.8% 57.8% 57.8% 57.8% 57.9% 57.9% 57.9% 57.9% 57.9% 57.9% 57.9% 57.9% 57.9% 58.0% 58.0% 58.0% 58.0% 58.0% 58.0% 58.0% 58.0% 58.0% 58.0% 58.1% 58.1% 58.1% 58.1% 58.1% 58.1% 58.1% 58.1% 58.1% 58.1% 58.2% 58.2% 58.2% 58.2% 58.2% 58.2% 58.2% 58.2% 58.2% 58.3% 58.3% 58.3% 58.3% 58.3% 58.3% 58.3% 58.3% 58.3% 58.3% 58.4% 58.4% 58.4% 58.4% 58.4% 58.4% 58.4% 58.4% 58.4% 58.5% 58.5% 58.5% 58.5% 58.5% 58.5% 58.5% 58.5% 58.5% 58.5% 58.6% 58.6% 58.6% 58.6% 58.6% 58.6% 58.6% 58.6% 58.6% 58.6% 58.7% 58.7% 58.7% 58.7% 58.7% 58.7% 58.7% 58.7% 58.7% 58.8% 58.8% 58.8% 58.8% 58.8% 58.8% 58.8% 58.8% 58.8% 58.8% 58.9% 58.9% 58.9% 58.9% 58.9% 58.9% 58.9% 58.9% 58.9% 58.9% 59.0% 59.0% 59.0% 59.0% 59.0% 59.0% 59.0% 59.0% 59.0% 59.1% 59.1% 59.1% 59.1% 59.1% 59.1% 59.1% 59.1% 59.1% 59.1% 59.2% 59.2% 59.2% 59.2% 59.2% 59.2% 59.2% 59.2% 59.2% 59.3% 59.3% 59.3% 59.3% 59.3% 59.3% 59.3% 59.3% 59.3% 59.3% 59.4% 59.4% 59.4% 59.4% 59.4% 59.4% 59.4% 59.4% 59.4% 59.4% 59.5% 59.5% 59.5% 59.5% 59.5% 59.5% 59.5% 59.5% 59.5% 59.6% 59.6% 59.6% 59.6% 59.6% 59.6% 59.6% 59.6% 59.6% 59.6% 59.7% 59.7% 59.7% 59.7% 59.7% 59.7% 59.7% 59.7% 59.7% 59.7% 59.8% 59.8% 59.8% 59.8% 59.8% 59.8% 59.8% 59.8% 59.8% 59.9% 59.9% 59.9% 59.9% 59.9% 59.9% 59.9% 59.9% 59.9% 59.9% 60.0% 60.0% 60.0% 60.0% 60.0% 60.0% 60.0% 60.0% 60.0% 60.0% 60.1% 60.1% 60.1% 60.1% 60.1% 60.1% 60.1% 60.1% 60.1% 60.2% 60.2% 60.2% 60.2% 60.2% 60.2% 60.2% 60.2% 60.2% 60.2% 60.3% 60.3% 60.3% 60.3% 60.3% 60.3% 60.3% 60.3% 60.3% 60.4% 60.4% 60.4% 60.4% 60.4% 60.4% 60.4% 60.4% 60.4% 60.4% 60.5% 60.5% 60.5% 60.5% 60.5% 60.5% 60.5% 60.5% 60.5% 60.5% 60.6% 60.6% 60.6% 60.6% 60.6% 60.6% 60.6% 60.6% 60.6% 60.7% 60.7% 60.7% 60.7% 60.7% 60.7% 60.7% 60.7% 60.7% 60.7% 60.8% 60.8% 60.8% 60.8% 60.8% 60.8% 60.8% 60.8% 60.8% 60.8% 60.9% 60.9% 60.9% 60.9% 60.9% 60.9% 60.9% 60.9% 60.9% 61.0% 61.0% 61.0% 61.0% 61.0% 61.0% 61.0% 61.0% 61.0% 61.0% 61.1% 61.1% 61.1% 61.1% 61.1% 61.1% 61.1% 61.1% 61.1% 61.2% 61.2% 61.2% 61.2% 61.2% 61.2% 61.2% 61.2% 61.2% 61.2% 61.3% 61.3% 61.3% 61.3% 61.3% 61.3% 61.3% 61.3% 61.3% 61.3% 61.4% 61.4% 61.4% 61.4% 61.4% 61.4% 61.4% 61.4% 61.4% 61.5% 61.5% 61.5% 61.5% 61.5% 61.5% 61.5% 61.5% 61.5% 61.5% 61.6% 61.6% 61.6% 61.6% 61.6% 61.6% 61.6% 61.6% 61.6% 61.6% 61.7% 61.7% 61.7% 61.7% 61.7% 61.7% 61.7% 61.7% 61.7% 61.8% 61.8% 61.8% 61.8% 61.8% 61.8% 61.8% 61.8% 61.8% 61.8% 61.9% 61.9% 61.9% 61.9% 61.9% 61.9% 61.9% 61.9% 61.9% 62.0% 62.0% 62.0% 62.0% 62.0% 62.0% 62.0% 62.0% 62.0% 62.0% 62.1% 62.1% 62.1% 62.1% 62.1% 62.1% 62.1% 62.1% 62.1% 62.1% 62.2% 62.2% 62.2% 62.2% 62.2% 62.2% 62.2% 62.2% 62.2% 62.3% 62.3% 62.3% 62.3% 62.3% 62.3% 62.3% 62.3% 62.3% 62.3% 62.4% 62.4% 62.4% 62.4% 62.4% 62.4% 62.4% 62.4% 62.4% 62.4% 62.5% 62.5% 62.5% 62.5% 62.5% 62.5% 62.5% 62.5% 62.5% 62.6% 62.6% 62.6% 62.6% 62.6% 62.6% 62.6% 62.6% 62.6% 62.6% 62.7% 62.7% 62.7% 62.7% 62.7% 62.7% 62.7% 62.7% 62.7% 62.8% 62.8% 62.8% 62.8% 62.8% 62.8% 62.8% 62.8% 62.8% 62.8% 62.9% 62.9% 62.9% 62.9% 62.9% 62.9% 62.9% 62.9% 62.9% 62.9% 63.0% 63.0% 63.0% 63.0% 63.0% 63.0% 63.0% 63.0% 63.0% 63.1% 63.1% 63.1% 63.1% 63.1% 63.1% 63.1% 63.1% 63.1% 63.1% 63.2% 63.2% 63.2% 63.2% 63.2% 63.2% 63.2% 63.2% 63.2% 63.2% 63.3% 63.3% 63.3% 63.3% 63.3% 63.3% 63.3% 63.3% 63.3% 63.4% 63.4% 63.4% 63.4% 63.4% 63.4% 63.4% 63.4% 63.4% 63.4% 63.5% 63.5% 63.5% 63.5% 63.5% 63.5% 63.5% 63.5% 63.5% 63.5% 63.6% 63.6% 63.6% 63.6% 63.6% 63.6% 63.6% 63.6% 63.6% 63.7% 63.7% 63.7% 63.7% 63.7% 63.7% 63.7% 63.7% 63.7% 63.7% 63.8% 63.8% 63.8% 63.8% 63.8% 63.8% 63.8% 63.8% 63.8% 63.9% 63.9% 63.9% 63.9% 63.9% 63.9% 63.9% 63.9% 63.9% 63.9% 64.0% 64.0% 64.0% 64.0% 64.0% 64.0% 64.0% 64.0% 64.0% 64.0% 64.1% 64.1% 64.1% 64.1% 64.1% 64.1% 64.1% 64.1% 64.1% 64.2% 64.2% 64.2% 64.2% 64.2% 64.2% 64.2% 64.2% 64.2% 64.2% 64.3% 64.3% 64.3% 64.3% 64.3% 64.3% 64.3% 64.3% 64.3% 64.3% 64.4% 64.4% 64.4% 64.4% 64.4% 64.4% 64.4% 64.4% 64.4% 64.5% 64.5% 64.5% 64.5% 64.5% 64.5% 64.5% 64.5% 64.5% 64.5% 64.6% 64.6% 64.6% 64.6% 64.6% 64.6% 64.6% 64.6% 64.6% 64.7% 64.7% 64.7% 64.7% 64.7% 64.7% 64.7% 64.7% 64.7% 64.7% 64.8% 64.8% 64.8% 64.8% 64.8% 64.8% 64.8% 64.8% 64.8% 64.8% 64.9% 64.9% 64.9% 64.9% 64.9% 64.9% 64.9% 64.9% 64.9% 65.0% 65.0% 65.0% 65.0% 65.0% 65.0% 65.0% 65.0% 65.0% 65.0% 65.1% 65.1% 65.1% 65.1% 65.1% 65.1% 65.1% 65.1% 65.1% 65.1% 65.2% 65.2% 65.2% 65.2% 65.2% 65.2% 65.2% 65.2% 65.2% 65.3% 65.3% 65.3% 65.3% 65.3% 65.3% 65.3% 65.3% 65.3% 65.3% 65.4% 65.4% 65.4% 65.4% 65.4% 65.4% 65.4% 65.4% 65.4% 65.5% 65.5% 65.5% 65.5% 65.5% 65.5% 65.5% 65.5% 65.5% 65.5% 65.6% 65.6% 65.6% 65.6% 65.6% 65.6% 65.6% 65.6% 65.6% 65.6% 65.7% 65.7% 65.7% 65.7% 65.7% 65.7% 65.7% 65.7% 65.7% 65.8% 65.8% 65.8% 65.8% 65.8% 65.8% 65.8% 65.8% 65.8% 65.8% 65.9% 65.9% 65.9% 65.9% 65.9% 65.9% 65.9% 65.9% 65.9% 65.9% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.0% 66.1% 66.1% 66.1% 66.1% 66.1% 66.1% 66.1% 66.1% 66.1% 66.1% 66.2% 66.2% 66.2% 66.2% 66.2% 66.2% 66.2% 66.2% 66.2% 66.3% 66.3% 66.3% 66.3% 66.3% 66.3% 66.3% 66.3% 66.3% 66.3% 66.4% 66.4% 66.4% 66.4% 66.4% 66.4% 66.4% 66.4% 66.4% 66.4% 66.5% 66.5% 66.5% 66.5% 66.5% 66.5% 66.5% 66.5% 66.5% 66.6% 66.6% 66.6% 66.6% 66.6% 66.6% 66.6% 66.6% 66.6% 66.6% 66.7% 66.7% 66.7% 66.7% 66.7% 66.7% 66.7% 66.7% 66.7% 66.7% 66.8% 66.8% 66.8% 66.8% 66.8% 66.8% 66.8% 66.8% 66.8% 66.9% 66.9% 66.9% 66.9% 66.9% 66.9% 66.9% 66.9% 66.9% 66.9% 67.0% 67.0% 67.0% 67.0% 67.0% 67.0% 67.0% 67.0% 67.0% 67.0% 67.1% 67.1% 67.1% 67.1% 67.1% 67.1% 67.1% 67.1% 67.1% 67.2% 67.2% 67.2% 67.2% 67.2% 67.2% 67.2% 67.2% 67.2% 67.2% 67.3% 67.3% 67.3% 67.3% 67.3% 67.3% 67.3% 67.3% 67.3% 67.4% 67.4% 67.4% 67.4% 67.4% 67.4% 67.4% 67.4% 67.4% 67.4% 67.5% 67.5% 67.5% 67.5% 67.5% 67.5% 67.5% 67.5% 67.5% 67.5% 67.6% 67.6% 67.6% 67.6% 67.6% 67.6% 67.6% 67.6% 67.6% 67.7% 67.7% 67.7% 67.7% 67.7% 67.7% 67.7% 67.7% 67.7% 67.7% 67.8% 67.8% 67.8% 67.8% 67.8% 67.8% 67.8% 67.8% 67.8% 67.8% 67.9% 67.9% 67.9% 67.9% 67.9% 67.9% 67.9% 67.9% 67.9% 68.0% 68.0% 68.0% 68.0% 68.0% 68.0% 68.0% 68.0% 68.0% 68.0% 68.1% 68.1% 68.1% 68.1% 68.1% 68.1% 68.1% 68.1% 68.1% 68.2% 68.2% 68.2% 68.2% 68.2% 68.2% 68.2% 68.2% 68.2% 68.2% 68.3% 68.3% 68.3% 68.3% 68.3% 68.3% 68.3% 68.3% 68.3% 68.3% 68.4% 68.4% 68.4% 68.4% 68.4% 68.4% 68.4% 68.4% 68.4% 68.5% 68.5% 68.5% 68.5% 68.5% 68.5% 68.5% 68.5% 68.5% 68.5% 68.6% 68.6% 68.6% 68.6% 68.6% 68.6% 68.6% 68.6% 68.6% 68.6% 68.7% 68.7% 68.7% 68.7% 68.7% 68.7% 68.7% 68.7% 68.7% 68.8% 68.8% 68.8% 68.8% 68.8% 68.8% 68.8% 68.8% 68.8% 68.8% 68.9% 68.9% 68.9% 68.9% 68.9% 68.9% 68.9% 68.9% 68.9% 69.0% 69.0% 69.0% 69.0% 69.0% 69.0% 69.0% 69.0% 69.0% 69.0% 69.1% 69.1% 69.1% 69.1% 69.1% 69.1% 69.1% 69.1% 69.1% 69.1% 69.2% 69.2% 69.2% 69.2% 69.2% 69.2% 69.2% 69.2% 69.2% 69.3% 69.3% 69.3% 69.3% 69.3% 69.3% 69.3% 69.3% 69.3% 69.3% 69.4% 69.4% 69.4% 69.4% 69.4% 69.4% 69.4% 69.4% 69.4% 69.4% 69.5% 69.5% 69.5% 69.5% 69.5% 69.5% 69.5% 69.5% 69.5% 69.6% 69.6% 69.6% 69.6% 69.6% 69.6% 69.6% 69.6% 69.6% 69.6% 69.7% 69.7% 69.7% 69.7% 69.7% 69.7% 69.7% 69.7% 69.7% 69.8% 69.8% 69.8% 69.8% 69.8% 69.8% 69.8% 69.8% 69.8% 69.8% 69.9% 69.9% 69.9% 69.9% 69.9% 69.9% 69.9% 69.9% 69.9% 69.9% 70.0% 70.0% 70.0% 70.0% 70.0% 70.0% 70.0% 70.0% 70.0% 70.1% 70.1% 70.1% 70.1% 70.1% 70.1% 70.1% 70.1% 70.1% 70.1% 70.2% 70.2% 70.2% 70.2% 70.2% 70.2% 70.2% 70.2% 70.2% 70.2% 70.3% 70.3% 70.3% 70.3% 70.3% 70.3% 70.3% 70.3% 70.3% 70.4% 70.4% 70.4% 70.4% 70.4% 70.4% 70.4% 70.4% 70.4% 70.4% 70.5% 70.5% 70.5% 70.5% 70.5% 70.5% 70.5% 70.5% 70.5% 70.5% 70.6% 70.6% 70.6% 70.6% 70.6% 70.6% 70.6% 70.6% 70.6% 70.7% 70.7% 70.7% 70.7% 70.7% 70.7% 70.7% 70.7% 70.7% 70.7% 70.8% 70.8% 70.8% 70.8% 70.8% 70.8% 70.8% 70.8% 70.8% 70.9% 70.9% 70.9% 70.9% 70.9% 70.9% 70.9% 70.9% 70.9% 70.9% 71.0% 71.0% 71.0% 71.0% 71.0% 71.0% 71.0% 71.0% 71.0% 71.0% 71.1% 71.1% 71.1% 71.1% 71.1% 71.1% 71.1% 71.1% 71.1% 71.2% 71.2% 71.2% 71.2% 71.2% 71.2% 71.2% 71.2% 71.2% 71.2% 71.3% 71.3% 71.3% 71.3% 71.3% 71.3% 71.3% 71.3% 71.3% 71.3% 71.4% 71.4% 71.4% 71.4% 71.4% 71.4% 71.4% 71.4% 71.4% 71.5% 71.5% 71.5% 71.5% 71.5% 71.5% 71.5% 71.5% 71.5% 71.5% 71.6% 71.6% 71.6% 71.6% 71.6% 71.6% 71.6% 71.6% 71.6% 71.7% 71.7% 71.7% 71.7% 71.7% 71.7% 71.7% 71.7% 71.7% 71.7% 71.8% 71.8% 71.8% 71.8% 71.8% 71.8% 71.8% 71.8% 71.8% 71.8% 71.9% 71.9% 71.9% 71.9% 71.9% 71.9% 71.9% 71.9% 71.9% 72.0% 72.0% 72.0% 72.0% 72.0% 72.0% 72.0% 72.0% 72.0% 72.0% 72.1% 72.1% 72.1% 72.1% 72.1% 72.1% 72.1% 72.1% 72.1% 72.1% 72.2% 72.2% 72.2% 72.2% 72.2% 72.2% 72.2% 72.2% 72.2% 72.3% 72.3% 72.3% 72.3% 72.3% 72.3% 72.3% 72.3% 72.3% 72.3% 72.4% 72.4% 72.4% 72.4% 72.4% 72.4% 72.4% 72.4% 72.4% 72.5% 72.5% 72.5% 72.5% 72.5% 72.5% 72.5% 72.5% 72.5% 72.5% 72.6% 72.6% 72.6% 72.6% 72.6% 72.6% 72.6% 72.6% 72.6% 72.6% 72.7% 72.7% 72.7% 72.7% 72.7% 72.7% 72.7% 72.7% 72.7% 72.8% 72.8% 72.8% 72.8% 72.8% 72.8% 72.8% 72.8% 72.8% 72.8% 72.9% 72.9% 72.9% 72.9% 72.9% 72.9% 72.9% 72.9% 72.9% 72.9% 73.0% 73.0% 73.0% 73.0% 73.0% 73.0% 73.0% 73.0% 73.0% 73.1% 73.1% 73.1% 73.1% 73.1% 73.1% 73.1% 73.1% 73.1% 73.1% 73.2% 73.2% 73.2% 73.2% 73.2% 73.2% 73.2% 73.2% 73.2% 73.3% 73.3% 73.3% 73.3% 73.3% 73.3% 73.3% 73.3% 73.3% 73.3% 73.4% 73.4% 73.4% 73.4% 73.4% 73.4% 73.4% 73.4% 73.4% 73.4% 73.5% 73.5% 73.5% 73.5% 73.5% 73.5% 73.5% 73.5% 73.5% 73.6% 73.6% 73.6% 73.6% 73.6% 73.6% 73.6% 73.6% 73.6% 73.6% 73.7% 73.7% 73.7% 73.7% 73.7% 73.7% 73.7% 73.7% 73.7% 73.7% 73.8% 73.8% 73.8% 73.8% 73.8% 73.8% 73.8% 73.8% 73.8% 73.9% 73.9% 73.9% 73.9% 73.9% 73.9% 73.9% 73.9% 73.9% 73.9% 74.0% 74.0% 74.0% 74.0% 74.0% 74.0% 74.0% 74.0% 74.0% 74.0% 74.1% 74.1% 74.1% 74.1% 74.1% 74.1% 74.1% 74.1% 74.1% 74.2% 74.2% 74.2% 74.2% 74.2% 74.2% 74.2% 74.2% 74.2% 74.2% 74.3% 74.3% 74.3% 74.3% 74.3% 74.3% 74.3% 74.3% 74.3% 74.4% 74.4% 74.4% 74.4% 74.4% 74.4% 74.4% 74.4% 74.4% 74.4% 74.5% 74.5% 74.5% 74.5% 74.5% 74.5% 74.5% 74.5% 74.5% 74.5% 74.6% 74.6% 74.6% 74.6% 74.6% 74.6% 74.6% 74.6% 74.6% 74.7% 74.7% 74.7% 74.7% 74.7% 74.7% 74.7% 74.7% 74.7% 74.7% 74.8% 74.8% 74.8% 74.8% 74.8% 74.8% 74.8% 74.8% 74.8% 74.8% 74.9% 74.9% 74.9% 74.9% 74.9% 74.9% 74.9% 74.9% 74.9% 75.0% 75.0% 75.0% 75.0% 75.0% 75.0% 75.0% 75.0% 75.0% 75.0% 75.1% 75.1% 75.1% 75.1% 75.1% 75.1% 75.1% 75.1% 75.1% 75.2% 75.2% 75.2% 75.2% 75.2% 75.2% 75.2% 75.2% 75.2% 75.2% 75.3% 75.3% 75.3% 75.3% 75.3% 75.3% 75.3% 75.3% 75.3% 75.3% 75.4% 75.4% 75.4% 75.4% 75.4% 75.4% 75.4% 75.4% 75.4% 75.5% 75.5% 75.5% 75.5% 75.5% 75.5% 75.5% 75.5% 75.5% 75.5% 75.6% 75.6% 75.6% 75.6% 75.6% 75.6% 75.6% 75.6% 75.6% 75.6% 75.7% 75.7% 75.7% 75.7% 75.7% 75.7% 75.7% 75.7% 75.7% 75.8% 75.8% 75.8% 75.8% 75.8% 75.8% 75.8% 75.8% 75.8% 75.8% 75.9% 75.9% 75.9% 75.9% 75.9% 75.9% 75.9% 75.9% 75.9% 76.0% 76.0% 76.0% 76.0% 76.0% 76.0% 76.0% 76.0% 76.0% 76.0% 76.1% 76.1% 76.1% 76.1% 76.1% 76.1% 76.1% 76.1% 76.1% 76.1% 76.2% 76.2% 76.2% 76.2% 76.2% 76.2% 76.2% 76.2% 76.2% 76.3% 76.3% 76.3% 76.3% 76.3% 76.3% 76.3% 76.3% 76.3% 76.3% 76.4% 76.4% 76.4% 76.4% 76.4% 76.4% 76.4% 76.4% 76.4% 76.4% 76.5% 76.5% 76.5% 76.5% 76.5% 76.5% 76.5% 76.5% 76.5% 76.6% 76.6% 76.6% 76.6% 76.6% 76.6% 76.6% 76.6% 76.6% 76.6% 76.7% 76.7% 76.7% 76.7% 76.7% 76.7% 76.7% 76.7% 76.7% 76.8% 76.8% 76.8% 76.8% 76.8% 76.8% 76.8% 76.8% 76.8% 76.8% 76.9% 76.9% 76.9% 76.9% 76.9% 76.9% 76.9% 76.9% 76.9% 76.9% 77.0% 77.0% 77.0% 77.0% 77.0% 77.0% 77.0% 77.0% 77.0% 77.1% 77.1% 77.1% 77.1% 77.1% 77.1% 77.1% 77.1% 77.1% 77.1% 77.2% 77.2% 77.2% 77.2% 77.2% 77.2% 77.2% 77.2% 77.2% 77.2% 77.3% 77.3% 77.3% 77.3% 77.3% 77.3% 77.3% 77.3% 77.3% 77.4% 77.4% 77.4% 77.4% 77.4% 77.4% 77.4% 77.4% 77.4% 77.4% 77.5% 77.5% 77.5% 77.5% 77.5% 77.5% 77.5% 77.5% 77.5% 77.5% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.6% 77.7% 77.7% 77.7% 77.7% 77.7% 77.7% 77.7% 77.7% 77.7% 77.7% 77.8% 77.8% 77.8% 77.8% 77.8% 77.8% 77.8% 77.8% 77.8% 77.9% 77.9% 77.9% 77.9% 77.9% 77.9% 77.9% 77.9% 77.9% 77.9% 78.0% 78.0% 78.0% 78.0% 78.0% 78.0% 78.0% 78.0% 78.0% 78.0% 78.1% 78.1% 78.1% 78.1% 78.1% 78.1% 78.1% 78.1% 78.1% 78.2% 78.2% 78.2% 78.2% 78.2% 78.2% 78.2% 78.2% 78.2% 78.2% 78.3% 78.3% 78.3% 78.3% 78.3% 78.3% 78.3% 78.3% 78.3% 78.3% 78.4% 78.4% 78.4% 78.4% 78.4% 78.4% 78.4% 78.4% 78.4% 78.5% 78.5% 78.5% 78.5% 78.5% 78.5% 78.5% 78.5% 78.5% 78.5% 78.6% 78.6% 78.6% 78.6% 78.6% 78.6% 78.6% 78.6% 78.6% 78.7% 78.7% 78.7% 78.7% 78.7% 78.7% 78.7% 78.7% 78.7% 78.7% 78.8% 78.8% 78.8% 78.8% 78.8% 78.8% 78.8% 78.8% 78.8% 78.8% 78.9% 78.9% 78.9% 78.9% 78.9% 78.9% 78.9% 78.9% 78.9% 79.0% 79.0% 79.0% 79.0% 79.0% 79.0% 79.0% 79.0% 79.0% 79.0% 79.1% 79.1% 79.1% 79.1% 79.1% 79.1% 79.1% 79.1% 79.1% 79.1% 79.2% 79.2% 79.2% 79.2% 79.2% 79.2% 79.2% 79.2% 79.2% 79.3% 79.3% 79.3% 79.3% 79.3% 79.3% 79.3% 79.3% 79.3% 79.3% 79.4% 79.4% 79.4% 79.4% 79.4% 79.4% 79.4% 79.4% 79.4% 79.5% 79.5% 79.5% 79.5% 79.5% 79.5% 79.5% 79.5% 79.5% 79.5% 79.6% 79.6% 79.6% 79.6% 79.6% 79.6% 79.6% 79.6% 79.6% 79.6% 79.7% 79.7% 79.7% 79.7% 79.7% 79.7% 79.7% 79.7% 79.7% 79.8% 79.8% 79.8% 79.8% 79.8% 79.8% 79.8% 79.8% 79.8% 79.8% 79.9% 79.9% 79.9% 79.9% 79.9% 79.9% 79.9% 79.9% 79.9% 79.9% 80.0% 80.0% 80.0% 80.0% 80.0% 80.0% 80.0% 80.0% 80.0% 80.1% 80.1% 80.1% 80.1% 80.1% 80.1% 80.1% 80.1% 80.1% 80.1% 80.2% 80.2% 80.2% 80.2% 80.2% 80.2% 80.2% 80.2% 80.2% 80.3% 80.3% 80.3% 80.3% 80.3% 80.3% 80.3% 80.3% 80.3% 80.3% 80.4% 80.4% 80.4% 80.4% 80.4% 80.4% 80.4% 80.4% 80.4% 80.4% 80.5% 80.5% 80.5% 80.5% 80.5% 80.5% 80.5% 80.5% 80.5% 80.6% 80.6% 80.6% 80.6% 80.6% 80.6% 80.6% 80.6% 80.6% 80.6% 80.7% 80.7% 80.7% 80.7% 80.7% 80.7% 80.7% 80.7% 80.7% 80.7% 80.8% 80.8% 80.8% 80.8% 80.8% 80.8% 80.8% 80.8% 80.8% 80.9% 80.9% 80.9% 80.9% 80.9% 80.9% 80.9% 80.9% 80.9% 80.9% 81.0% 81.0% 81.0% 81.0% 81.0% 81.0% 81.0% 81.0% 81.0% 81.0% 81.1% 81.1% 81.1% 81.1% 81.1% 81.1% 81.1% 81.1% 81.1% 81.2% 81.2% 81.2% 81.2% 81.2% 81.2% 81.2% 81.2% 81.2% 81.2% 81.3% 81.3% 81.3% 81.3% 81.3% 81.3% 81.3% 81.3% 81.3% 81.4% 81.4% 81.4% 81.4% 81.4% 81.4% 81.4% 81.4% 81.4% 81.4% 81.5% 81.5% 81.5% 81.5% 81.5% 81.5% 81.5% 81.5% 81.5% 81.5% 81.6% 81.6% 81.6% 81.6% 81.6% 81.6% 81.6% 81.6% 81.6% 81.7% 81.7% 81.7% 81.7% 81.7% 81.7% 81.7% 81.7% 81.7% 81.7% 81.8% 81.8% 81.8% 81.8% 81.8% 81.8% 81.8% 81.8% 81.8% 81.8% 81.9% 81.9% 81.9% 81.9% 81.9% 81.9% 81.9% 81.9% 81.9% 82.0% 82.0% 82.0% 82.0% 82.0% 82.0% 82.0% 82.0% 82.0% 82.0% 82.1% 82.1% 82.1% 82.1% 82.1% 82.1% 82.1% 82.1% 82.1% 82.2% 82.2% 82.2% 82.2% 82.2% 82.2% 82.2% 82.2% 82.2% 82.2% 82.3% 82.3% 82.3% 82.3% 82.3% 82.3% 82.3% 82.3% 82.3% 82.3% 82.4% 82.4% 82.4% 82.4% 82.4% 82.4% 82.4% 82.4% 82.4% 82.5% 82.5% 82.5% 82.5% 82.5% 82.5% 82.5% 82.5% 82.5% 82.5% 82.6% 82.6% 82.6% 82.6% 82.6% 82.6% 82.6% 82.6% 82.6% 82.6% 82.7% 82.7% 82.7% 82.7% 82.7% 82.7% 82.7% 82.7% 82.7% 82.8% 82.8% 82.8% 82.8% 82.8% 82.8% 82.8% 82.8% 82.8% 82.8% 82.9% 82.9% 82.9% 82.9% 82.9% 82.9% 82.9% 82.9% 82.9% 83.0% 83.0% 83.0% 83.0% 83.0% 83.0% 83.0% 83.0% 83.0% 83.0% 83.1% 83.1% 83.1% 83.1% 83.1% 83.1% 83.1% 83.1% 83.1% 83.1% 83.2% 83.2% 83.2% 83.2% 83.2% 83.2% 83.2% 83.2% 83.2% 83.3% 83.3% 83.3% 83.3% 83.3% 83.3% 83.3% 83.3% 83.3% 83.3% 83.4% 83.4% 83.4% 83.4% 83.4% 83.4% 83.4% 83.4% 83.4% 83.4% 83.5% 83.5% 83.5% 83.5% 83.5% 83.5% 83.5% 83.5% 83.5% 83.6% 83.6% 83.6% 83.6% 83.6% 83.6% 83.6% 83.6% 83.6% 83.6% 83.7% 83.7% 83.7% 83.7% 83.7% 83.7% 83.7% 83.7% 83.7% 83.7% 83.8% 83.8% 83.8% 83.8% 83.8% 83.8% 83.8% 83.8% 83.8% 83.9% 83.9% 83.9% 83.9% 83.9% 83.9% 83.9% 83.9% 83.9% 83.9% 84.0% 84.0% 84.0% 84.0% 84.0% 84.0% 84.0% 84.0% 84.0% 84.1% 84.1% 84.1% 84.1% 84.1% 84.1% 84.1% 84.1% 84.1% 84.1% 84.2% 84.2% 84.2% 84.2% 84.2% 84.2% 84.2% 84.2% 84.2% 84.2% 84.3% 84.3% 84.3% 84.3% 84.3% 84.3% 84.3% 84.3% 84.3% 84.4% 84.4% 84.4% 84.4% 84.4% 84.4% 84.4% 84.4% 84.4% 84.4% 84.5% 84.5% 84.5% 84.5% 84.5% 84.5% 84.5% 84.5% 84.5% 84.5% 84.6% 84.6% 84.6% 84.6% 84.6% 84.6% 84.6% 84.6% 84.6% 84.7% 84.7% 84.7% 84.7% 84.7% 84.7% 84.7% 84.7% 84.7% 84.7% 84.8% 84.8% 84.8% 84.8% 84.8% 84.8% 84.8% 84.8% 84.8% 84.9% 84.9% 84.9% 84.9% 84.9% 84.9% 84.9% 84.9% 84.9% 84.9% 85.0% 85.0% 85.0% 85.0% 85.0% 85.0% 85.0% 85.0% 85.0% 85.0% 85.1% 85.1% 85.1% 85.1% 85.1% 85.1% 85.1% 85.1% 85.1% 85.2% 85.2% 85.2% 85.2% 85.2% 85.2% 85.2% 85.2% 85.2% 85.2% 85.3% 85.3% 85.3% 85.3% 85.3% 85.3% 85.3% 85.3% 85.3% 85.3% 85.4% 85.4% 85.4% 85.4% 85.4% 85.4% 85.4% 85.4% 85.4% 85.5% 85.5% 85.5% 85.5% 85.5% 85.5% 85.5% 85.5% 85.5% 85.5% 85.6% 85.6% 85.6% 85.6% 85.6% 85.6% 85.6% 85.6% 85.6% 85.7% 85.7% 85.7% 85.7% 85.7% 85.7% 85.7% 85.7% 85.7% 85.7% 85.8% 85.8% 85.8% 85.8% 85.8% 85.8% 85.8% 85.8% 85.8% 85.8% 85.9% 85.9% 85.9% 85.9% 85.9% 85.9% 85.9% 85.9% 85.9% 86.0% 86.0% 86.0% 86.0% 86.0% 86.0% 86.0% 86.0% 86.0% 86.0% 86.1% 86.1% 86.1% 86.1% 86.1% 86.1% 86.1% 86.1% 86.1% 86.1% 86.2% 86.2% 86.2% 86.2% 86.2% 86.2% 86.2% 86.2% 86.2% 86.3% 86.3% 86.3% 86.3% 86.3% 86.3% 86.3% 86.3% 86.3% 86.3% 86.4% 86.4% 86.4% 86.4% 86.4% 86.4% 86.4% 86.4% 86.4% 86.5% 86.5% 86.5% 86.5% 86.5% 86.5% 86.5% 86.5% 86.5% 86.5% 86.6% 86.6% 86.6% 86.6% 86.6% 86.6% 86.6% 86.6% 86.6% 86.6% 86.7% 86.7% 86.7% 86.7% 86.7% 86.7% 86.7% 86.7% 86.7% 86.8% 86.8% 86.8% 86.8% 86.8% 86.8% 86.8% 86.8% 86.8% 86.8% 86.9% 86.9% 86.9% 86.9% 86.9% 86.9% 86.9% 86.9% 86.9% 86.9% 87.0% 87.0% 87.0% 87.0% 87.0% 87.0% 87.0% 87.0% 87.0% 87.1% 87.1% 87.1% 87.1% 87.1% 87.1% 87.1% 87.1% 87.1% 87.1% 87.2% 87.2% 87.2% 87.2% 87.2% 87.2% 87.2% 87.2% 87.2% 87.2% 87.3% 87.3% 87.3% 87.3% 87.3% 87.3% 87.3% 87.3% 87.3% 87.4% 87.4% 87.4% 87.4% 87.4% 87.4% 87.4% 87.4% 87.4% 87.4% 87.5% 87.5% 87.5% 87.5% 87.5% 87.5% 87.5% 87.5% 87.5% 87.6% 87.6% 87.6% 87.6% 87.6% 87.6% 87.6% 87.6% 87.6% 87.6% 87.7% 87.7% 87.7% 87.7% 87.7% 87.7% 87.7% 87.7% 87.7% 87.7% 87.8% 87.8% 87.8% 87.8% 87.8% 87.8% 87.8% 87.8% 87.8% 87.9% 87.9% 87.9% 87.9% 87.9% 87.9% 87.9% 87.9% 87.9% 87.9% 88.0% 88.0% 88.0% 88.0% 88.0% 88.0% 88.0% 88.0% 88.0% 88.0% 88.1% 88.1% 88.1% 88.1% 88.1% 88.1% 88.1% 88.1% 88.1% 88.2% 88.2% 88.2% 88.2% 88.2% 88.2% 88.2% 88.2% 88.2% 88.2% 88.3% 88.3% 88.3% 88.3% 88.3% 88.3% 88.3% 88.3% 88.3% 88.4% 88.4% 88.4% 88.4% 88.4% 88.4% 88.4% 88.4% 88.4% 88.4% 88.5% 88.5% 88.5% 88.5% 88.5% 88.5% 88.5% 88.5% 88.5% 88.5% 88.6% 88.6% 88.6% 88.6% 88.6% 88.6% 88.6% 88.6% 88.6% 88.7% 88.7% 88.7% 88.7% 88.7% 88.7% 88.7% 88.7% 88.7% 88.7% 88.8% 88.8% 88.8% 88.8% 88.8% 88.8% 88.8% 88.8% 88.8% 88.8% 88.9% 88.9% 88.9% 88.9% 88.9% 88.9% 88.9% 88.9% 88.9% 89.0% 89.0% 89.0% 89.0% 89.0% 89.0% 89.0% 89.0% 89.0% 89.0% 89.1% 89.1% 89.1% 89.1% 89.1% 89.1% 89.1% 89.1% 89.1% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.2% 89.3% 89.3% 89.3% 89.3% 89.3% 89.3% 89.3% 89.3% 89.3% 89.3% 89.4% 89.4% 89.4% 89.4% 89.4% 89.4% 89.4% 89.4% 89.4% 89.5% 89.5% 89.5% 89.5% 89.5% 89.5% 89.5% 89.5% 89.5% 89.5% 89.6% 89.6% 89.6% 89.6% 89.6% 89.6% 89.6% 89.6% 89.6% 89.6% 89.7% 89.7% 89.7% 89.7% 89.7% 89.7% 89.7% 89.7% 89.7% 89.8% 89.8% 89.8% 89.8% 89.8% 89.8% 89.8% 89.8% 89.8% 89.8% 89.9% 89.9% 89.9% 89.9% 89.9% 89.9% 89.9% 89.9% 89.9% 90.0% 90.0% 90.0% 90.0% 90.0% 90.0% 90.0% 90.0% 90.0% 90.0% 90.1% 90.1% 90.1% 90.1% 90.1% 90.1% 90.1% 90.1% 90.1% 90.1% 90.2% 90.2% 90.2% 90.2% 90.2% 90.2% 90.2% 90.2% 90.2% 90.3% 90.3% 90.3% 90.3% 90.3% 90.3% 90.3% 90.3% 90.3% 90.3% 90.4% 90.4% 90.4% 90.4% 90.4% 90.4% 90.4% 90.4% 90.4% 90.4% 90.5% 90.5% 90.5% 90.5% 90.5% 90.5% 90.5% 90.5% 90.5% 90.6% 90.6% 90.6% 90.6% 90.6% 90.6% 90.6% 90.6% 90.6% 90.6% 90.7% 90.7% 90.7% 90.7% 90.7% 90.7% 90.7% 90.7% 90.7% 90.7% 90.8% 90.8% 90.8% 90.8% 90.8% 90.8% 90.8% 90.8% 90.8% 90.9% 90.9% 90.9% 90.9% 90.9% 90.9% 90.9% 90.9% 90.9% 90.9% 91.0% 91.0% 91.0% 91.0% 91.0% 91.0% 91.0% 91.0% 91.0% 91.1% 91.1% 91.1% 91.1% 91.1% 91.1% 91.1% 91.1% 91.1% 91.1% 91.2% 91.2% 91.2% 91.2% 91.2% 91.2% 91.2% 91.2% 91.2% 91.2% 91.3% 91.3% 91.3% 91.3% 91.3% 91.3% 91.3% 91.3% 91.3% 91.4% 91.4% 91.4% 91.4% 91.4% 91.4% 91.4% 91.4% 91.4% 91.4% 91.5% 91.5% 91.5% 91.5% 91.5% 91.5% 91.5% 91.5% 91.5% 91.5% 91.6% 91.6% 91.6% 91.6% 91.6% 91.6% 91.6% 91.6% 91.6% 91.7% 91.7% 91.7% 91.7% 91.7% 91.7% 91.7% 91.7% 91.7% 91.7% 91.8% 91.8% 91.8% 91.8% 91.8% 91.8% 91.8% 91.8% 91.8% 91.9% 91.9% 91.9% 91.9% 91.9% 91.9% 91.9% 91.9% 91.9% 91.9% 92.0% 92.0% 92.0% 92.0% 92.0% 92.0% 92.0% 92.0% 92.0% 92.0% 92.1% 92.1% 92.1% 92.1% 92.1% 92.1% 92.1% 92.1% 92.1% 92.2% 92.2% 92.2% 92.2% 92.2% 92.2% 92.2% 92.2% 92.2% 92.2% 92.3% 92.3% 92.3% 92.3% 92.3% 92.3% 92.3% 92.3% 92.3% 92.3% 92.4% 92.4% 92.4% 92.4% 92.4% 92.4% 92.4% 92.4% 92.4% 92.5% 92.5% 92.5% 92.5% 92.5% 92.5% 92.5% 92.5% 92.5% 92.5% 92.6% 92.6% 92.6% 92.6% 92.6% 92.6% 92.6% 92.6% 92.6% 92.7% 92.7% 92.7% 92.7% 92.7% 92.7% 92.7% 92.7% 92.7% 92.7% 92.8% 92.8% 92.8% 92.8% 92.8% 92.8% 92.8% 92.8% 92.8% 92.8% 92.9% 92.9% 92.9% 92.9% 92.9% 92.9% 92.9% 92.9% 92.9% 93.0% 93.0% 93.0% 93.0% 93.0% 93.0% 93.0% 93.0% 93.0% 93.0% 93.1% 93.1% 93.1% 93.1% 93.1% 93.1% 93.1% 93.1% 93.1% 93.1% 93.2% 93.2% 93.2% 93.2% 93.2% 93.2% 93.2% 93.2% 93.2% 93.3% 93.3% 93.3% 93.3% 93.3% 93.3% 93.3% 93.3% 93.3% 93.3% 93.4% 93.4% 93.4% 93.4% 93.4% 93.4% 93.4% 93.4% 93.4% 93.5% 93.5% 93.5% 93.5% 93.5% 93.5% 93.5% 93.5% 93.5% 93.5% 93.6% 93.6% 93.6% 93.6% 93.6% 93.6% 93.6% 93.6% 93.6% 93.6% 93.7% 93.7% 93.7% 93.7% 93.7% 93.7% 93.7% 93.7% 93.7% 93.8% 93.8% 93.8% 93.8% 93.8% 93.8% 93.8% 93.8% 93.8% 93.8% 93.9% 93.9% 93.9% 93.9% 93.9% 93.9% 93.9% 93.9% 93.9% 93.9% 94.0% 94.0% 94.0% 94.0% 94.0% 94.0% 94.0% 94.0% 94.0% 94.1% 94.1% 94.1% 94.1% 94.1% 94.1% 94.1% 94.1% 94.1% 94.1% 94.2% 94.2% 94.2% 94.2% 94.2% 94.2% 94.2% 94.2% 94.2% 94.2% 94.3% 94.3% 94.3% 94.3% 94.3% 94.3% 94.3% 94.3% 94.3% 94.4% 94.4% 94.4% 94.4% 94.4% 94.4% 94.4% 94.4% 94.4% 94.4% 94.5% 94.5% 94.5% 94.5% 94.5% 94.5% 94.5% 94.5% 94.5% 94.6% 94.6% 94.6% 94.6% 94.6% 94.6% 94.6% 94.6% 94.6% 94.6% 94.7% 94.7% 94.7% 94.7% 94.7% 94.7% 94.7% 94.7% 94.7% 94.7% 94.8% 94.8% 94.8% 94.8% 94.8% 94.8% 94.8% 94.8% 94.8% 94.9% 94.9% 94.9% 94.9% 94.9% 94.9% 94.9% 94.9% 94.9% 94.9% 95.0% 95.0% 95.0% 95.0% 95.0% 95.0% 95.0% 95.0% 95.0% 95.0% 95.1% 95.1% 95.1% 95.1% 95.1% 95.1% 95.1% 95.1% 95.1% 95.2% 95.2% 95.2% 95.2% 95.2% 95.2% 95.2% 95.2% 95.2% 95.2% 95.3% 95.3% 95.3% 95.3% 95.3% 95.3% 95.3% 95.3% 95.3% 95.4% 95.4% 95.4% 95.4% 95.4% 95.4% 95.4% 95.4% 95.4% 95.4% 95.5% 95.5% 95.5% 95.5% 95.5% 95.5% 95.5% 95.5% 95.5% 95.5% 95.6% 95.6% 95.6% 95.6% 95.6% 95.6% 95.6% 95.6% 95.6% 95.7% 95.7% 95.7% 95.7% 95.7% 95.7% 95.7% 95.7% 95.7% 95.7% 95.8% 95.8% 95.8% 95.8% 95.8% 95.8% 95.8% 95.8% 95.8% 95.8% 95.9% 95.9% 95.9% 95.9% 95.9% 95.9% 95.9% 95.9% 95.9% 96.0% 96.0% 96.0% 96.0% 96.0% 96.0% 96.0% 96.0% 96.0% 96.0% 96.1% 96.1% 96.1% 96.1% 96.1% 96.1% 96.1% 96.1% 96.1% 96.2% 96.2% 96.2% 96.2% 96.2% 96.2% 96.2% 96.2% 96.2% 96.2% 96.3% 96.3% 96.3% 96.3% 96.3% 96.3% 96.3% 96.3% 96.3% 96.3% 96.4% 96.4% 96.4% 96.4% 96.4% 96.4% 96.4% 96.4% 96.4% 96.5% 96.5% 96.5% 96.5% 96.5% 96.5% 96.5% 96.5% 96.5% 96.5% 96.6% 96.6% 96.6% 96.6% 96.6% 96.6% 96.6% 96.6% 96.6% 96.6% 96.7% 96.7% 96.7% 96.7% 96.7% 96.7% 96.7% 96.7% 96.7% 96.8% 96.8% 96.8% 96.8% 96.8% 96.8% 96.8% 96.8% 96.8% 96.8% 96.9% 96.9% 96.9% 96.9% 96.9% 96.9% 96.9% 96.9% 96.9% 97.0% 97.0% 97.0% 97.0% 97.0% 97.0% 97.0% 97.0% 97.0% 97.0% 97.1% 97.1% 97.1% 97.1% 97.1% 97.1% 97.1% 97.1% 97.1% 97.1% 97.2% 97.2% 97.2% 97.2% 97.2% 97.2% 97.2% 97.2% 97.2% 97.3% 97.3% 97.3% 97.3% 97.3% 97.3% 97.3% 97.3% 97.3% 97.3% 97.4% 97.4% 97.4% 97.4% 97.4% 97.4% 97.4% 97.4% 97.4% 97.4% 97.5% 97.5% 97.5% 97.5% 97.5% 97.5% 97.5% 97.5% 97.5% 97.6% 97.6% 97.6% 97.6% 97.6% 97.6% 97.6% 97.6% 97.6% 97.6% 97.7% 97.7% 97.7% 97.7% 97.7% 97.7% 97.7% 97.7% 97.7% 97.7% 97.8% 97.8% 97.8% 97.8% 97.8% 97.8% 97.8% 97.8% 97.8% 97.9% 97.9% 97.9% 97.9% 97.9% 97.9% 97.9% 97.9% 97.9% 97.9% 98.0% 98.0% 98.0% 98.0% 98.0% 98.0% 98.0% 98.0% 98.0% 98.1% 98.1% 98.1% 98.1% 98.1% 98.1% 98.1% 98.1% 98.1% 98.1% 98.2% 98.2% 98.2% 98.2% 98.2% 98.2% 98.2% 98.2% 98.2% 98.2% 98.3% 98.3% 98.3% 98.3% 98.3% 98.3% 98.3% 98.3% 98.3% 98.4% 98.4% 98.4% 98.4% 98.4% 98.4% 98.4% 98.4% 98.4% 98.4% 98.5% 98.5% 98.5% 98.5% 98.5% 98.5% 98.5% 98.5% 98.5% 98.5% 98.6% 98.6% 98.6% 98.6% 98.6% 98.6% 98.6% 98.6% 98.6% 98.7% 98.7% 98.7% 98.7% 98.7% 98.7% 98.7% 98.7% 98.7% 98.7% 98.8% 98.8% 98.8% 98.8% 98.8% 98.8% 98.8% 98.8% 98.8% 98.9% 98.9% 98.9% 98.9% 98.9% 98.9% 98.9% 98.9% 98.9% 98.9% 99.0% 99.0% 99.0% 99.0% 99.0% 99.0% 99.0% 99.0% 99.0% 99.0% 99.1% 99.1% 99.1% 99.1% 99.1% 99.1% 99.1% 99.1% 99.1% 99.2% 99.2% 99.2% 99.2% 99.2% 99.2% 99.2% 99.2% 99.2% 99.2% 99.3% 99.3% 99.3% 99.3% 99.3% 99.3% 99.3% 99.3% 99.3% 99.3% 99.4% 99.4% 99.4% 99.4% 99.4% 99.4% 99.4% 99.4% 99.4% 99.5% 99.5% 99.5% 99.5% 99.5% 99.5% 99.5% 99.5% 99.5% 99.5% 99.6% 99.6% 99.6% 99.6% 99.6% 99.6% 99.6% 99.6% 99.6% 99.7% 99.7% 99.7% 99.7% 99.7% 99.7% 99.7% 99.7% 99.7% 99.7% 99.8% 99.8% 99.8% 99.8% 99.8% 99.8% 99.8% 99.8% 99.8% 99.8% 99.9% 99.9% 99.9% 99.9% 99.9% 99.9% 99.9% 99.9% 99.9% 100.0% 100.0% 100.0% 100.0% 100.0% 100.0% .. GENERATED FROM PYTHON SOURCE LINES 99-110 .. code-block:: default def plot_emission(emission): fig, ax = plt.subplots() ax.imshow(emission.cpu().T) ax.set_title("Frame-wise class probabilities") ax.set_xlabel("Time") ax.set_ylabel("Labels") fig.tight_layout() plot_emission(emission[0]) .. image-sg:: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_001.png :alt: Frame-wise class probabilities :srcset: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 111-115 Tokenize the transcript ~~~~~~~~~~~~~~~~~~~~~~~ We create a dictionary, which maps each label into token. .. GENERATED FROM PYTHON SOURCE LINES 115-121 .. code-block:: default LABELS = bundle.get_labels(star=None) DICTIONARY = bundle.get_dict(star=None) for k, v in DICTIONARY.items(): print(f"{k}: {v}") .. rst-class:: sphx-glr-script-out .. code-block:: none -: 0 a: 1 i: 2 e: 3 n: 4 o: 5 u: 6 t: 7 s: 8 r: 9 m: 10 k: 11 l: 12 d: 13 g: 14 h: 15 y: 16 b: 17 p: 18 w: 19 c: 20 v: 21 j: 22 z: 23 f: 24 ': 25 q: 26 x: 27 .. GENERATED FROM PYTHON SOURCE LINES 122-123 converting transcript to tokens is as simple as .. GENERATED FROM PYTHON SOURCE LINES 123-130 .. code-block:: default tokenized_transcript = [DICTIONARY[c] for word in TRANSCRIPT for c in word] for t in tokenized_transcript: print(t, end=" ") print() .. rst-class:: sphx-glr-script-out .. code-block:: none 2 15 1 13 7 15 1 7 20 6 9 2 5 8 2 7 16 17 3 8 2 13 3 10 3 1 7 7 15 2 8 10 5 10 3 4 7 .. GENERATED FROM PYTHON SOURCE LINES 131-141 Computing alignments -------------------- Frame-level alignments ~~~~~~~~~~~~~~~~~~~~~~ Now we call TorchAudio’s forced alignment API to compute the frame-level alignment. For the detail of function signature, please refer to :py:func:`~torchaudio.functional.forced_align`. .. GENERATED FROM PYTHON SOURCE LINES 141-154 .. code-block:: default def align(emission, tokens): targets = torch.tensor([tokens], dtype=torch.int32, device=device) alignments, scores = F.forced_align(emission, targets, blank=0) alignments, scores = alignments[0], scores[0] # remove batch dimension for simplicity scores = scores.exp() # convert back to probability return alignments, scores aligned_tokens, alignment_scores = align(emission, tokenized_transcript) .. rst-class:: sphx-glr-script-out .. code-block:: none /pytorch/audio/examples/tutorials/ctc_forced_alignment_api_tutorial.py:145: UserWarning: torchaudio.functional._alignment.forced_align has been deprecated. This deprecation is part of a large refactoring effort to transition TorchAudio into a maintenance phase. Please see https://github.com/pytorch/audio/issues/3902 for more information. It will be removed from the 2.9 release. alignments, scores = F.forced_align(emission, targets, blank=0) .. GENERATED FROM PYTHON SOURCE LINES 155-156 Now let's look at the output. .. GENERATED FROM PYTHON SOURCE LINES 156-160 .. code-block:: default for i, (ali, score) in enumerate(zip(aligned_tokens, alignment_scores)): print(f"{i:3d}:\t{ali:2d} [{LABELS[ali]}], {score:.2f}") .. rst-class:: sphx-glr-script-out .. code-block:: none 0: 0 [-], 1.00 1: 0 [-], 1.00 2: 0 [-], 1.00 3: 0 [-], 1.00 4: 0 [-], 1.00 5: 0 [-], 1.00 6: 0 [-], 1.00 7: 0 [-], 1.00 8: 0 [-], 1.00 9: 0 [-], 1.00 10: 0 [-], 1.00 11: 0 [-], 1.00 12: 0 [-], 1.00 13: 0 [-], 1.00 14: 0 [-], 1.00 15: 0 [-], 1.00 16: 0 [-], 1.00 17: 0 [-], 1.00 18: 0 [-], 1.00 19: 0 [-], 1.00 20: 0 [-], 1.00 21: 0 [-], 1.00 22: 0 [-], 1.00 23: 0 [-], 1.00 24: 0 [-], 1.00 25: 0 [-], 1.00 26: 0 [-], 1.00 27: 0 [-], 1.00 28: 0 [-], 1.00 29: 0 [-], 1.00 30: 0 [-], 1.00 31: 0 [-], 1.00 32: 2 [i], 1.00 33: 0 [-], 1.00 34: 0 [-], 1.00 35: 15 [h], 1.00 36: 15 [h], 0.93 37: 1 [a], 1.00 38: 0 [-], 0.96 39: 0 [-], 1.00 40: 0 [-], 1.00 41: 13 [d], 1.00 42: 0 [-], 1.00 43: 0 [-], 0.97 44: 7 [t], 1.00 45: 15 [h], 1.00 46: 0 [-], 0.98 47: 1 [a], 1.00 48: 0 [-], 1.00 49: 0 [-], 1.00 50: 7 [t], 1.00 51: 0 [-], 1.00 52: 0 [-], 1.00 53: 0 [-], 1.00 54: 20 [c], 1.00 55: 0 [-], 1.00 56: 0 [-], 1.00 57: 0 [-], 1.00 58: 6 [u], 1.00 59: 6 [u], 0.96 60: 0 [-], 1.00 61: 0 [-], 1.00 62: 0 [-], 0.53 63: 9 [r], 1.00 64: 0 [-], 1.00 65: 2 [i], 1.00 66: 0 [-], 1.00 67: 0 [-], 1.00 68: 0 [-], 1.00 69: 0 [-], 1.00 70: 0 [-], 1.00 71: 0 [-], 0.96 72: 5 [o], 1.00 73: 0 [-], 1.00 74: 0 [-], 1.00 75: 0 [-], 1.00 76: 0 [-], 1.00 77: 0 [-], 1.00 78: 0 [-], 1.00 79: 8 [s], 1.00 80: 0 [-], 1.00 81: 0 [-], 1.00 82: 0 [-], 0.99 83: 2 [i], 1.00 84: 0 [-], 1.00 85: 7 [t], 1.00 86: 0 [-], 1.00 87: 0 [-], 1.00 88: 16 [y], 1.00 89: 0 [-], 1.00 90: 0 [-], 1.00 91: 0 [-], 1.00 92: 0 [-], 1.00 93: 17 [b], 1.00 94: 0 [-], 1.00 95: 3 [e], 1.00 96: 0 [-], 1.00 97: 0 [-], 1.00 98: 0 [-], 1.00 99: 0 [-], 1.00 100: 0 [-], 1.00 101: 8 [s], 1.00 102: 0 [-], 1.00 103: 0 [-], 1.00 104: 0 [-], 1.00 105: 0 [-], 1.00 106: 0 [-], 1.00 107: 0 [-], 1.00 108: 0 [-], 1.00 109: 0 [-], 0.65 110: 2 [i], 1.00 111: 0 [-], 1.00 112: 0 [-], 1.00 113: 13 [d], 1.00 114: 3 [e], 0.85 115: 0 [-], 1.00 116: 10 [m], 1.00 117: 0 [-], 1.00 118: 0 [-], 1.00 119: 3 [e], 1.00 120: 0 [-], 1.00 121: 0 [-], 1.00 122: 0 [-], 1.00 123: 0 [-], 1.00 124: 1 [a], 1.00 125: 0 [-], 1.00 126: 0 [-], 1.00 127: 7 [t], 1.00 128: 0 [-], 1.00 129: 7 [t], 1.00 130: 15 [h], 1.00 131: 0 [-], 0.79 132: 2 [i], 1.00 133: 0 [-], 1.00 134: 0 [-], 1.00 135: 0 [-], 1.00 136: 8 [s], 1.00 137: 0 [-], 1.00 138: 0 [-], 1.00 139: 0 [-], 1.00 140: 0 [-], 1.00 141: 10 [m], 1.00 142: 0 [-], 1.00 143: 0 [-], 1.00 144: 5 [o], 1.00 145: 0 [-], 1.00 146: 0 [-], 1.00 147: 0 [-], 1.00 148: 10 [m], 1.00 149: 0 [-], 1.00 150: 0 [-], 1.00 151: 3 [e], 1.00 152: 0 [-], 1.00 153: 4 [n], 1.00 154: 0 [-], 1.00 155: 7 [t], 1.00 156: 0 [-], 1.00 157: 0 [-], 1.00 158: 0 [-], 1.00 159: 0 [-], 1.00 160: 0 [-], 1.00 161: 0 [-], 1.00 162: 0 [-], 1.00 163: 0 [-], 1.00 164: 0 [-], 1.00 165: 0 [-], 1.00 166: 0 [-], 1.00 167: 0 [-], 1.00 168: 0 [-], 1.00 .. GENERATED FROM PYTHON SOURCE LINES 161-197 .. note:: The alignment is expressed in the frame cordinate of the emission, which is different from the original waveform. It contains blank tokens and repeated tokens. The following is the interpretation of the non-blank tokens. .. code-block:: 31: 0 [-], 1.00 32: 2 [i], 1.00 "i" starts and ends 33: 0 [-], 1.00 34: 0 [-], 1.00 35: 15 [h], 1.00 "h" starts 36: 15 [h], 0.93 "h" ends 37: 1 [a], 1.00 "a" starts and ends 38: 0 [-], 0.96 39: 0 [-], 1.00 40: 0 [-], 1.00 41: 13 [d], 1.00 "d" starts and ends 42: 0 [-], 1.00 .. note:: When same token occured after blank tokens, it is not treated as a repeat, but as a new occurrence. .. code-block:: a a a b -> a b a - - b -> a b a a - b -> a b a - a b -> a a b ^^^ ^^^ .. GENERATED FROM PYTHON SOURCE LINES 200-208 Token-level alignments ~~~~~~~~~~~~~~~~~~~~~~ Next step is to resolve the repetation, so that each alignment does not depend on previous alignments. :py:func:`torchaudio.functional.merge_tokens` computes the :py:class:`~torchaudio.functional.TokenSpan` object, which represents which token from the transcript is present at what time span. .. GENERATED FROM PYTHON SOURCE LINES 211-219 .. code-block:: default token_spans = F.merge_tokens(aligned_tokens, alignment_scores) print("Token\tTime\tScore") for s in token_spans: print(f"{LABELS[s.token]}\t[{s.start:3d}, {s.end:3d})\t{s.score:.2f}") .. rst-class:: sphx-glr-script-out .. code-block:: none Token Time Score i [ 32, 33) 1.00 h [ 35, 37) 0.96 a [ 37, 38) 1.00 d [ 41, 42) 1.00 t [ 44, 45) 1.00 h [ 45, 46) 1.00 a [ 47, 48) 1.00 t [ 50, 51) 1.00 c [ 54, 55) 1.00 u [ 58, 60) 0.98 r [ 63, 64) 1.00 i [ 65, 66) 1.00 o [ 72, 73) 1.00 s [ 79, 80) 1.00 i [ 83, 84) 1.00 t [ 85, 86) 1.00 y [ 88, 89) 1.00 b [ 93, 94) 1.00 e [ 95, 96) 1.00 s [101, 102) 1.00 i [110, 111) 1.00 d [113, 114) 1.00 e [114, 115) 0.85 m [116, 117) 1.00 e [119, 120) 1.00 a [124, 125) 1.00 t [127, 128) 1.00 t [129, 130) 1.00 h [130, 131) 1.00 i [132, 133) 1.00 s [136, 137) 1.00 m [141, 142) 1.00 o [144, 145) 1.00 m [148, 149) 1.00 e [151, 152) 1.00 n [153, 154) 1.00 t [155, 156) 1.00 .. GENERATED FROM PYTHON SOURCE LINES 220-224 Word-level alignments ~~~~~~~~~~~~~~~~~~~~~ Now let’s group the token-level alignments into word-level alignments. .. GENERATED FROM PYTHON SOURCE LINES 224-239 .. code-block:: default def unflatten(list_, lengths): assert len(list_) == sum(lengths) i = 0 ret = [] for l in lengths: ret.append(list_[i : i + l]) i += l return ret word_spans = unflatten(token_spans, [len(word) for word in TRANSCRIPT]) .. GENERATED FROM PYTHON SOURCE LINES 240-243 Audio previews ~~~~~~~~~~~~~~ .. GENERATED FROM PYTHON SOURCE LINES 243-260 .. code-block:: default # Compute average score weighted by the span length def _score(spans): return sum(s.score * len(s) for s in spans) / sum(len(s) for s in spans) def preview_word(waveform, spans, num_frames, transcript, sample_rate=bundle.sample_rate): ratio = waveform.size(1) / num_frames x0 = int(ratio * spans[0].start) x1 = int(ratio * spans[-1].end) print(f"{transcript} ({_score(spans):.2f}): {x0 / sample_rate:.3f} - {x1 / sample_rate:.3f} sec") segment = waveform[:, x0:x1] return IPython.display.Audio(segment.numpy(), rate=sample_rate) num_frames = emission.size(1) .. GENERATED FROM PYTHON SOURCE LINES 261-266 .. code-block:: default # Generate the audio for each segment print(TRANSCRIPT) IPython.display.Audio(SPEECH_FILE) .. rst-class:: sphx-glr-script-out .. code-block:: none ['i', 'had', 'that', 'curiosity', 'beside', 'me', 'at', 'this', 'moment'] .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 268-271 .. code-block:: default preview_word(waveform, word_spans[0], num_frames, TRANSCRIPT[0]) .. rst-class:: sphx-glr-script-out .. code-block:: none i (1.00): 0.644 - 0.664 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 273-276 .. code-block:: default preview_word(waveform, word_spans[1], num_frames, TRANSCRIPT[1]) .. rst-class:: sphx-glr-script-out .. code-block:: none had (0.98): 0.704 - 0.845 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 278-281 .. code-block:: default preview_word(waveform, word_spans[2], num_frames, TRANSCRIPT[2]) .. rst-class:: sphx-glr-script-out .. code-block:: none that (1.00): 0.885 - 1.026 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 283-286 .. code-block:: default preview_word(waveform, word_spans[3], num_frames, TRANSCRIPT[3]) .. rst-class:: sphx-glr-script-out .. code-block:: none curiosity (1.00): 1.086 - 1.790 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 288-291 .. code-block:: default preview_word(waveform, word_spans[4], num_frames, TRANSCRIPT[4]) .. rst-class:: sphx-glr-script-out .. code-block:: none beside (0.97): 1.871 - 2.314 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 293-296 .. code-block:: default preview_word(waveform, word_spans[5], num_frames, TRANSCRIPT[5]) .. rst-class:: sphx-glr-script-out .. code-block:: none me (1.00): 2.334 - 2.414 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 298-301 .. code-block:: default preview_word(waveform, word_spans[6], num_frames, TRANSCRIPT[6]) .. rst-class:: sphx-glr-script-out .. code-block:: none at (1.00): 2.495 - 2.575 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 303-306 .. code-block:: default preview_word(waveform, word_spans[7], num_frames, TRANSCRIPT[7]) .. rst-class:: sphx-glr-script-out .. code-block:: none this (1.00): 2.595 - 2.756 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 308-311 .. code-block:: default preview_word(waveform, word_spans[8], num_frames, TRANSCRIPT[8]) .. rst-class:: sphx-glr-script-out .. code-block:: none moment (1.00): 2.837 - 3.138 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 312-317 Visualization ~~~~~~~~~~~~~ Now let's look at the alignment result and segment the original speech into words. .. GENERATED FROM PYTHON SOURCE LINES 317-343 .. code-block:: default def plot_alignments(waveform, token_spans, emission, transcript, sample_rate=bundle.sample_rate): ratio = waveform.size(1) / emission.size(1) / sample_rate fig, axes = plt.subplots(2, 1) axes[0].imshow(emission[0].detach().cpu().T, aspect="auto") axes[0].set_title("Emission") axes[0].set_xticks([]) axes[1].specgram(waveform[0], Fs=sample_rate) for t_spans, chars in zip(token_spans, transcript): t0, t1 = t_spans[0].start + 0.1, t_spans[-1].end - 0.1 axes[0].axvspan(t0 - 0.5, t1 - 0.5, facecolor="None", hatch="/", edgecolor="white") axes[1].axvspan(ratio * t0, ratio * t1, facecolor="None", hatch="/", edgecolor="white") axes[1].annotate(f"{_score(t_spans):.2f}", (ratio * t0, sample_rate * 0.51), annotation_clip=False) for span, char in zip(t_spans, chars): t0 = span.start * ratio axes[1].annotate(char, (t0, sample_rate * 0.55), annotation_clip=False) axes[1].set_xlabel("time [second]") axes[1].set_xlim([0, None]) fig.tight_layout() .. GENERATED FROM PYTHON SOURCE LINES 345-348 .. code-block:: default plot_alignments(waveform, word_spans, emission, TRANSCRIPT) .. image-sg:: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_002.png :alt: Emission :srcset: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_002.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 349-359 Inconsistent treatment of ``blank`` token ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When splitting the token-level alignments into words, you will notice that some blank tokens are treated differently, and this makes the interpretation of the result somehwat ambigious. This is easy to see when we plot the scores. The following figure shows word regions and non-word regions, with the frame-level scores of non-blank tokens. .. GENERATED FROM PYTHON SOURCE LINES 360-381 .. code-block:: default def plot_scores(word_spans, scores): fig, ax = plt.subplots() span_xs, span_hs = [], [] ax.axvspan(word_spans[0][0].start - 0.05, word_spans[-1][-1].end + 0.05, facecolor="paleturquoise", edgecolor="none", zorder=-1) for t_span in word_spans: for span in t_span: for t in range(span.start, span.end): span_xs.append(t + 0.5) span_hs.append(scores[t].item()) ax.annotate(LABELS[span.token], (span.start, -0.07)) ax.axvspan(t_span[0].start - 0.05, t_span[-1].end + 0.05, facecolor="mistyrose", edgecolor="none", zorder=-1) ax.bar(span_xs, span_hs, color="lightsalmon", edgecolor="coral") ax.set_title("Frame-level scores and word segments") ax.set_ylim(-0.1, None) ax.grid(True, axis="y") ax.axhline(0, color="black") fig.tight_layout() plot_scores(word_spans, alignment_scores) .. image-sg:: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_003.png :alt: Frame-level scores and word segments :srcset: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_003.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 382-419 In this plot, the blank tokens are those highlighted area without vertical bar. You can see that there are blank tokens which are interpreted as part of a word (highlighted red), while the others (highlighted blue) are not. One reason for this is because the model was trained without a label for the word boundary. The blank tokens are treated not just as repeatation but also as silence between words. But then, a question arises. Should frames immediately after or near the end of a word be silent or repeat? In the above example, if you go back to the previous plot of spectrogram and word regions, you see that after "y" in "curiosity", there is still some activities in multiple frequency buckets. Would it be more accurate if that frame was included in the word? Unfortunately, CTC does not provide a comprehensive solution to this. Models trained with CTC are known to exhibit "peaky" response, that is, they tend to spike for an aoccurance of a label, but the spike does not last for the duration of the label. (Note: Pre-trained Wav2Vec2 models tend to spike at the beginning of label occurances, but this not always the case.) :cite:`zeyer2021does` has in-depth alanysis on the peaky behavior of CTC. We encourage those who are interested understanding more to refer to the paper. The following is a quote from the paper, which is the exact issue we are facing here. *Peaky behavior can be problematic in certain cases,* *e.g. when an application requires to not use the blank label,* *e.g. to get meaningful time accurate alignments of phonemes* *to a transcription.* .. GENERATED FROM PYTHON SOURCE LINES 421-434 Advanced: Handling transcripts with ```` token ---------------------------------------------------- Now let’s look at when the transcript is partially missing, how can we improve alignment quality using the ```` token, which is capable of modeling any token. Here we use the same English example as used above. But we remove the beginning text ``“i had that curiosity beside me at”`` from the transcript. Aligning audio with such transcript results in wrong alignments of the existing word “this”. However, this issue can be mitigated by using the ```` token to model the missing text. .. GENERATED FROM PYTHON SOURCE LINES 436-437 First, we extend the dictionary to include the ```` token. .. GENERATED FROM PYTHON SOURCE LINES 437-440 .. code-block:: default DICTIONARY["*"] = len(DICTIONARY) .. GENERATED FROM PYTHON SOURCE LINES 441-444 Next, we extend the emission tensor with the extra dimension corresponding to the ```` token. .. GENERATED FROM PYTHON SOURCE LINES 444-452 .. code-block:: default star_dim = torch.zeros((1, emission.size(1), 1), device=emission.device, dtype=emission.dtype) emission = torch.cat((emission, star_dim), 2) assert len(DICTIONARY) == emission.shape[2] plot_emission(emission[0]) .. image-sg:: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_004.png :alt: Frame-wise class probabilities :srcset: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_004.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 453-455 The following function combines all the processes, and compute word segments from emission in one-go. .. GENERATED FROM PYTHON SOURCE LINES 455-465 .. code-block:: default def compute_alignments(emission, transcript, dictionary): tokens = [dictionary[char] for word in transcript for char in word] alignment, scores = align(emission, tokens) token_spans = F.merge_tokens(alignment, scores) word_spans = unflatten(token_spans, [len(word) for word in transcript]) return word_spans .. GENERATED FROM PYTHON SOURCE LINES 466-468 Full Transcript ~~~~~~~~~~~~~~~ .. GENERATED FROM PYTHON SOURCE LINES 468-472 .. code-block:: default word_spans = compute_alignments(emission, TRANSCRIPT, DICTIONARY) plot_alignments(waveform, word_spans, emission, TRANSCRIPT) .. image-sg:: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_005.png :alt: Emission :srcset: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_005.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none /pytorch/audio/examples/tutorials/ctc_forced_alignment_api_tutorial.py:145: UserWarning: torchaudio.functional._alignment.forced_align has been deprecated. This deprecation is part of a large refactoring effort to transition TorchAudio into a maintenance phase. Please see https://github.com/pytorch/audio/issues/3902 for more information. It will be removed from the 2.9 release. alignments, scores = F.forced_align(emission, targets, blank=0) .. GENERATED FROM PYTHON SOURCE LINES 473-477 Partial Transcript with ```` token ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Now we replace the first part of the transcript with the ```` token. .. GENERATED FROM PYTHON SOURCE LINES 477-482 .. code-block:: default transcript = "* this moment".split() word_spans = compute_alignments(emission, transcript, DICTIONARY) plot_alignments(waveform, word_spans, emission, transcript) .. image-sg:: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_006.png :alt: Emission :srcset: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_006.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none /pytorch/audio/examples/tutorials/ctc_forced_alignment_api_tutorial.py:145: UserWarning: torchaudio.functional._alignment.forced_align has been deprecated. This deprecation is part of a large refactoring effort to transition TorchAudio into a maintenance phase. Please see https://github.com/pytorch/audio/issues/3902 for more information. It will be removed from the 2.9 release. alignments, scores = F.forced_align(emission, targets, blank=0) .. GENERATED FROM PYTHON SOURCE LINES 484-487 .. code-block:: default preview_word(waveform, word_spans[0], num_frames, transcript[0]) .. rst-class:: sphx-glr-script-out .. code-block:: none * (1.00): 0.000 - 2.595 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 489-492 .. code-block:: default preview_word(waveform, word_spans[1], num_frames, transcript[1]) .. rst-class:: sphx-glr-script-out .. code-block:: none this (1.00): 2.595 - 2.756 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 494-497 .. code-block:: default preview_word(waveform, word_spans[2], num_frames, transcript[2]) .. rst-class:: sphx-glr-script-out .. code-block:: none moment (1.00): 2.837 - 3.138 sec .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 498-504 Partial Transcript without ```` token ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As a comparison, the following aligns the partial transcript without using ```` token. It demonstrates the effect of ```` token for dealing with deletion errors. .. GENERATED FROM PYTHON SOURCE LINES 504-509 .. code-block:: default transcript = "this moment".split() word_spans = compute_alignments(emission, transcript, DICTIONARY) plot_alignments(waveform, word_spans, emission, transcript) .. image-sg:: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_007.png :alt: Emission :srcset: /tutorials/images/sphx_glr_ctc_forced_alignment_api_tutorial_007.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none /pytorch/audio/examples/tutorials/ctc_forced_alignment_api_tutorial.py:145: UserWarning: torchaudio.functional._alignment.forced_align has been deprecated. This deprecation is part of a large refactoring effort to transition TorchAudio into a maintenance phase. Please see https://github.com/pytorch/audio/issues/3902 for more information. It will be removed from the 2.9 release. alignments, scores = F.forced_align(emission, targets, blank=0) .. GENERATED FROM PYTHON SOURCE LINES 510-518 Conclusion ---------- In this tutorial, we looked at how to use torchaudio’s forced alignment API to align and segment speech files, and demonstrated one advanced usage: How introducing a ```` token could improve alignment accuracy when transcription errors exist. .. GENERATED FROM PYTHON SOURCE LINES 521-527 Acknowledgement --------------- Thanks to `Vineel Pratap `__ and `Zhaoheng Ni `__ for developing and open-sourcing the forced aligner API. .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 7.058 seconds) .. _sphx_glr_download_tutorials_ctc_forced_alignment_api_tutorial.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: ctc_forced_alignment_api_tutorial.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: ctc_forced_alignment_api_tutorial.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_