[
  {
    "path": ".dockerignore",
    "content": "# The .dockerignore file excludes files from the container build process.\n#\n# https://docs.docker.com/engine/reference/builder/#dockerignore-file\n\n# Exclude Git files\n.git\n.github\n.gitignore\n\n# Exclude Python cache files\n__pycache__\n.mypy_cache\n.pytest_cache\n.ruff_cache\n\n# Exclude Python virtual environment\n/venv\n"
  },
  {
    "path": ".gitignore",
    "content": "__pycache__/\n*.py[cod]\n*$py.class\n*.egg-info\n.pytest_cache\n.ipynb_checkpoints\n\nthumbs.db\n.DS_Store\n.idea\n*.log\n*.pdf\n*.mkv\n*.mp4\n*.png\n*.wav\n*.mp3\n*.pth\n*.th\n*.json\n\n*durip*\n*rtx*\n*l40*\n*a40*\n\nsrc/audiocraft\n\n!/demo/\n!/demo/*\n/demo/temp/*.txt\n!/demo/temp/84_121550_000074_000000.txt\n.cog/tmp/*"
  },
  {
    "path": "Dockerfile",
    "content": "FROM jupyter/base-notebook:python-3.9.13\n\nUSER root\n\n# Install OS dependencies\nRUN apt-get update && apt-get install -y git-core ffmpeg espeak-ng && \\\n    apt-get clean && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Update Conda, create the voicecraft environment, and install dependencies\nRUN conda update -y -n base -c conda-forge conda && \\\n    conda create -y -n voicecraft python=3.9.16 && \\\n    conda run -n voicecraft conda install -y -c conda-forge montreal-forced-aligner=2.2.17 openfst=1.8.2 kaldi=5.5.1068 && \\\n    conda run -n voicecraft mfa model download dictionary english_us_arpa && \\\n    conda run -n voicecraft mfa model download acoustic english_us_arpa && \\\n    conda run -n voicecraft pip install -e git+https://github.com/facebookresearch/audiocraft.git@c5157b5bf14bf83449c17ea1eeb66c19fb4bc7f0#egg=audiocraft && \\\n    conda run -n voicecraft pip install xformers==0.0.22 && \\\n    conda run -n voicecraft pip install torch==2.0.1 && \\\n    conda run -n voicecraft pip install torchaudio==2.0.2 && \\\n    conda run -n voicecraft pip install tensorboard==2.16.2 && \\\n    conda run -n voicecraft pip install phonemizer==3.2.1 && \\\n    conda run -n voicecraft pip install datasets==2.16.0 && \\\n    conda run -n voicecraft pip install torchmetrics==0.11.1 && \\\n    conda run -n voicecraft pip install huggingface_hub==0.22.2\n    \n\n# Install the Jupyter kernel\nRUN conda install -n voicecraft ipykernel --update-deps --force-reinstall -y && \\\n    conda run -n voicecraft python -m ipykernel install --name=voicecraft"
  },
  {
    "path": "LICENSE-CODE",
    "content": "Attribution-NonCommercial-ShareAlike 4.0 International\n\n=======================================================================\n\nCreative Commons Corporation (\"Creative Commons\") is not a law firm and\ndoes not provide legal services or legal advice. Distribution of\nCreative Commons public licenses does not create a lawyer-client or\nother relationship. Creative Commons makes its licenses and related\ninformation available on an \"as-is\" basis. Creative Commons gives no\nwarranties regarding its licenses, any material licensed under their\nterms and conditions, or any related information. Creative Commons\ndisclaims all liability for damages resulting from their use to the\nfullest extent possible.\n\nUsing Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and\nconditions that creators and other rights holders may use to share\noriginal works of authorship and other material subject to copyright\nand certain other rights specified in the public license below. The\nfollowing considerations are for informational purposes only, are not\nexhaustive, and do not form part of our licenses.\n\n     Considerations for licensors: Our public licenses are\n     intended for use by those authorized to give the public\n     permission to use material in ways otherwise restricted by\n     copyright and certain other rights. Our licenses are\n     irrevocable. Licensors should read and understand the terms\n     and conditions of the license they choose before applying it.\n     Licensors should also secure all rights necessary before\n     applying our licenses so that the public can reuse the\n     material as expected. Licensors should clearly mark any\n     material not subject to the license. This includes other CC-\n     licensed material, or material used under an exception or\n     limitation to copyright. More considerations for licensors:\n    wiki.creativecommons.org/Considerations_for_licensors\n\n     Considerations for the public: By using one of our public\n     licenses, a licensor grants the public permission to use the\n     licensed material under specified terms and conditions. If\n     the licensor's permission is not necessary for any reason--for\n     example, because of any applicable exception or limitation to\n     copyright--then that use is not regulated by the license. Our\n     licenses grant only permissions under copyright and certain\n     other rights that a licensor has authority to grant. Use of\n     the licensed material may still be restricted for other\n     reasons, including because others have copyright or other\n     rights in the material. A licensor may make special requests,\n     such as asking that all changes be marked or described.\n     Although not required by our licenses, you are encouraged to\n     respect those requests where reasonable. More considerations\n     for the public:\n    wiki.creativecommons.org/Considerations_for_licensees\n\n=======================================================================\n\nCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International\nPublic License\n\nBy exercising the Licensed Rights (defined below), You accept and agree\nto be bound by the terms and conditions of this Creative Commons\nAttribution-NonCommercial-ShareAlike 4.0 International Public License\n(\"Public License\"). To the extent this Public License may be\ninterpreted as a contract, You are granted the Licensed Rights in\nconsideration of Your acceptance of these terms and conditions, and the\nLicensor grants You such rights in consideration of benefits the\nLicensor receives from making the Licensed Material available under\nthese terms and conditions.\n\n\nSection 1 -- Definitions.\n\n  a. Adapted Material means material subject to Copyright and Similar\n     Rights that is derived from or based upon the Licensed Material\n     and in which the Licensed Material is translated, altered,\n     arranged, transformed, or otherwise modified in a manner requiring\n     permission under the Copyright and Similar Rights held by the\n     Licensor. For purposes of this Public License, where the Licensed\n     Material is a musical work, performance, or sound recording,\n     Adapted Material is always produced where the Licensed Material is\n     synched in timed relation with a moving image.\n\n  b. Adapter's License means the license You apply to Your Copyright\n     and Similar Rights in Your contributions to Adapted Material in\n     accordance with the terms and conditions of this Public License.\n\n  c. BY-NC-SA Compatible License means a license listed at\n     creativecommons.org/compatiblelicenses, approved by Creative\n     Commons as essentially the equivalent of this Public License.\n\n  d. Copyright and Similar Rights means copyright and/or similar rights\n     closely related to copyright including, without limitation,\n     performance, broadcast, sound recording, and Sui Generis Database\n     Rights, without regard to how the rights are labeled or\n     categorized. For purposes of this Public License, the rights\n     specified in Section 2(b)(1)-(2) are not Copyright and Similar\n     Rights.\n\n  e. Effective Technological Measures means those measures that, in the\n     absence of proper authority, may not be circumvented under laws\n     fulfilling obligations under Article 11 of the WIPO Copyright\n     Treaty adopted on December 20, 1996, and/or similar international\n     agreements.\n\n  f. Exceptions and Limitations means fair use, fair dealing, and/or\n     any other exception or limitation to Copyright and Similar Rights\n     that applies to Your use of the Licensed Material.\n\n  g. License Elements means the license attributes listed in the name\n     of a Creative Commons Public License. The License Elements of this\n     Public License are Attribution, NonCommercial, and ShareAlike.\n\n  h. Licensed Material means the artistic or literary work, database,\n     or other material to which the Licensor applied this Public\n     License.\n\n  i. Licensed Rights means the rights granted to You subject to the\n     terms and conditions of this Public License, which are limited to\n     all Copyright and Similar Rights that apply to Your use of the\n     Licensed Material and that the Licensor has authority to license.\n\n  j. Licensor means the individual(s) or entity(ies) granting rights\n     under this Public License.\n\n  k. NonCommercial means not primarily intended for or directed towards\n     commercial advantage or monetary compensation. For purposes of\n     this Public License, the exchange of the Licensed Material for\n     other material subject to Copyright and Similar Rights by digital\n     file-sharing or similar means is NonCommercial provided there is\n     no payment of monetary compensation in connection with the\n     exchange.\n\n  l. Share means to provide material to the public by any means or\n     process that requires permission under the Licensed Rights, such\n     as reproduction, public display, public performance, distribution,\n     dissemination, communication, or importation, and to make material\n     available to the public including in ways that members of the\n     public may access the material from a place and at a time\n     individually chosen by them.\n\n  m. Sui Generis Database Rights means rights other than copyright\n     resulting from Directive 96/9/EC of the European Parliament and of\n     the Council of 11 March 1996 on the legal protection of databases,\n     as amended and/or succeeded, as well as other essentially\n     equivalent rights anywhere in the world.\n\n  n. You means the individual or entity exercising the Licensed Rights\n     under this Public License. Your has a corresponding meaning.\n\n\nSection 2 -- Scope.\n\n  a. License grant.\n\n       1. Subject to the terms and conditions of this Public License,\n          the Licensor hereby grants You a worldwide, royalty-free,\n          non-sublicensable, non-exclusive, irrevocable license to\n          exercise the Licensed Rights in the Licensed Material to:\n\n            a. reproduce and Share the Licensed Material, in whole or\n               in part, for NonCommercial purposes only; and\n\n            b. produce, reproduce, and Share Adapted Material for\n               NonCommercial purposes only.\n\n       2. Exceptions and Limitations. For the avoidance of doubt, where\n          Exceptions and Limitations apply to Your use, this Public\n          License does not apply, and You do not need to comply with\n          its terms and conditions.\n\n       3. Term. The term of this Public License is specified in Section\n          6(a).\n\n       4. Media and formats; technical modifications allowed. The\n          Licensor authorizes You to exercise the Licensed Rights in\n          all media and formats whether now known or hereafter created,\n          and to make technical modifications necessary to do so. The\n          Licensor waives and/or agrees not to assert any right or\n          authority to forbid You from making technical modifications\n          necessary to exercise the Licensed Rights, including\n          technical modifications necessary to circumvent Effective\n          Technological Measures. For purposes of this Public License,\n          simply making modifications authorized by this Section 2(a)\n          (4) never produces Adapted Material.\n\n       5. Downstream recipients.\n\n            a. Offer from the Licensor -- Licensed Material. Every\n               recipient of the Licensed Material automatically\n               receives an offer from the Licensor to exercise the\n               Licensed Rights under the terms and conditions of this\n               Public License.\n\n            b. Additional offer from the Licensor -- Adapted Material.\n               Every recipient of Adapted Material from You\n               automatically receives an offer from the Licensor to\n               exercise the Licensed Rights in the Adapted Material\n               under the conditions of the Adapter's License You apply.\n\n            c. No downstream restrictions. You may not offer or impose\n               any additional or different terms or conditions on, or\n               apply any Effective Technological Measures to, the\n               Licensed Material if doing so restricts exercise of the\n               Licensed Rights by any recipient of the Licensed\n               Material.\n\n       6. No endorsement. Nothing in this Public License constitutes or\n          may be construed as permission to assert or imply that You\n          are, or that Your use of the Licensed Material is, connected\n          with, or sponsored, endorsed, or granted official status by,\n          the Licensor or others designated to receive attribution as\n          provided in Section 3(a)(1)(A)(i).\n\n  b. Other rights.\n\n       1. Moral rights, such as the right of integrity, are not\n          licensed under this Public License, nor are publicity,\n          privacy, and/or other similar personality rights; however, to\n          the extent possible, the Licensor waives and/or agrees not to\n          assert any such rights held by the Licensor to the limited\n          extent necessary to allow You to exercise the Licensed\n          Rights, but not otherwise.\n\n       2. Patent and trademark rights are not licensed under this\n          Public License.\n\n       3. To the extent possible, the Licensor waives any right to\n          collect royalties from You for the exercise of the Licensed\n          Rights, whether directly or through a collecting society\n          under any voluntary or waivable statutory or compulsory\n          licensing scheme. In all other cases the Licensor expressly\n          reserves any right to collect such royalties, including when\n          the Licensed Material is used other than for NonCommercial\n          purposes.\n\n\nSection 3 -- License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the\nfollowing conditions.\n\n  a. Attribution.\n\n       1. If You Share the Licensed Material (including in modified\n          form), You must:\n\n            a. retain the following if it is supplied by the Licensor\n               with the Licensed Material:\n\n                 i. identification of the creator(s) of the Licensed\n                    Material and any others designated to receive\n                    attribution, in any reasonable manner requested by\n                    the Licensor (including by pseudonym if\n                    designated);\n\n                ii. a copyright notice;\n\n               iii. a notice that refers to this Public License;\n\n                iv. a notice that refers to the disclaimer of\n                    warranties;\n\n                 v. a URI or hyperlink to the Licensed Material to the\n                    extent reasonably practicable;\n\n            b. indicate if You modified the Licensed Material and\n               retain an indication of any previous modifications; and\n\n            c. indicate the Licensed Material is licensed under this\n               Public License, and include the text of, or the URI or\n               hyperlink to, this Public License.\n\n       2. You may satisfy the conditions in Section 3(a)(1) in any\n          reasonable manner based on the medium, means, and context in\n          which You Share the Licensed Material. For example, it may be\n          reasonable to satisfy the conditions by providing a URI or\n          hyperlink to a resource that includes the required\n          information.\n       3. If requested by the Licensor, You must remove any of the\n          information required by Section 3(a)(1)(A) to the extent\n          reasonably practicable.\n\n  b. ShareAlike.\n\n     In addition to the conditions in Section 3(a), if You Share\n     Adapted Material You produce, the following conditions also apply.\n\n       1. The Adapter's License You apply must be a Creative Commons\n          license with the same License Elements, this version or\n          later, or a BY-NC-SA Compatible License.\n\n       2. You must include the text of, or the URI or hyperlink to, the\n          Adapter's License You apply. You may satisfy this condition\n          in any reasonable manner based on the medium, means, and\n          context in which You Share Adapted Material.\n\n       3. You may not offer or impose any additional or different terms\n          or conditions on, or apply any Effective Technological\n          Measures to, Adapted Material that restrict exercise of the\n          rights granted under the Adapter's License You apply.\n\n\nSection 4 -- Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that\napply to Your use of the Licensed Material:\n\n  a. for the avoidance of doubt, Section 2(a)(1) grants You the right\n     to extract, reuse, reproduce, and Share all or a substantial\n     portion of the contents of the database for NonCommercial purposes\n     only;\n\n  b. if You include all or a substantial portion of the database\n     contents in a database in which You have Sui Generis Database\n     Rights, then the database in which You have Sui Generis Database\n     Rights (but not its individual contents) is Adapted Material,\n     including for purposes of Section 3(b); and\n\n  c. You must comply with the conditions in Section 3(a) if You Share\n     all or a substantial portion of the contents of the database.\n\nFor the avoidance of doubt, this Section 4 supplements and does not\nreplace Your obligations under this Public License where the Licensed\nRights include other Copyright and Similar Rights.\n\n\nSection 5 -- Disclaimer of Warranties and Limitation of Liability.\n\n  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE\n     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS\n     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF\n     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,\n     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,\n     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR\n     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,\n     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT\n     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT\n     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.\n\n  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE\n     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,\n     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,\n     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,\n     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR\n     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN\n     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR\n     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR\n     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.\n\n  c. The disclaimer of warranties and limitation of liability provided\n     above shall be interpreted in a manner that, to the extent\n     possible, most closely approximates an absolute disclaimer and\n     waiver of all liability.\n\n\nSection 6 -- Term and Termination.\n\n  a. This Public License applies for the term of the Copyright and\n     Similar Rights licensed here. However, if You fail to comply with\n     this Public License, then Your rights under this Public License\n     terminate automatically.\n\n  b. Where Your right to use the Licensed Material has terminated under\n     Section 6(a), it reinstates:\n\n       1. automatically as of the date the violation is cured, provided\n          it is cured within 30 days of Your discovery of the\n          violation; or\n\n       2. upon express reinstatement by the Licensor.\n\n     For the avoidance of doubt, this Section 6(b) does not affect any\n     right the Licensor may have to seek remedies for Your violations\n     of this Public License.\n\n  c. For the avoidance of doubt, the Licensor may also offer the\n     Licensed Material under separate terms or conditions or stop\n     distributing the Licensed Material at any time; however, doing so\n     will not terminate this Public License.\n\n  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public\n     License.\n\n\nSection 7 -- Other Terms and Conditions.\n\n  a. The Licensor shall not be bound by any additional or different\n     terms or conditions communicated by You unless expressly agreed.\n\n  b. Any arrangements, understandings, or agreements regarding the\n     Licensed Material not stated herein are separate from and\n     independent of the terms and conditions of this Public License.\n\n\nSection 8 -- Interpretation.\n\n  a. For the avoidance of doubt, this Public License does not, and\n     shall not be interpreted to, reduce, limit, restrict, or impose\n     conditions on any use of the Licensed Material that could lawfully\n     be made without permission under this Public License.\n\n  b. To the extent possible, if any provision of this Public License is\n     deemed unenforceable, it shall be automatically reformed to the\n     minimum extent necessary to make it enforceable. If the provision\n     cannot be reformed, it shall be severed from this Public License\n     without affecting the enforceability of the remaining terms and\n     conditions.\n\n  c. No term or condition of this Public License will be waived and no\n     failure to comply consented to unless expressly agreed to by the\n     Licensor.\n\n  d. Nothing in this Public License constitutes or may be interpreted\n     as a limitation upon, or waiver of, any privileges and immunities\n     that apply to the Licensor or You, including from the legal\n     processes of any jurisdiction or authority.\n\n=======================================================================\n\nCreative Commons is not a party to its public\nlicenses. Notwithstanding, Creative Commons may elect to apply one of\nits public licenses to material it publishes and in those instances\nwill be considered the “Licensor.” The text of the Creative Commons\npublic licenses is dedicated to the public domain under the CC0 Public\nDomain Dedication. Except for the limited purpose of indicating that\nmaterial is shared under a Creative Commons public license or as\notherwise permitted by the Creative Commons policies published at\ncreativecommons.org/policies, Creative Commons does not authorize the\nuse of the trademark \"Creative Commons\" or any other trademark or logo\nof Creative Commons without its prior written consent including,\nwithout limitation, in connection with any unauthorized modifications\nto any of its public licenses or any other arrangements,\nunderstandings, or agreements concerning use of licensed material. For\nthe avoidance of doubt, this paragraph does not form part of the\npublic licenses.\n\nCreative Commons may be contacted at creativecommons.org.\n"
  },
  {
    "path": "LICENSE-MODEL",
    "content": "Coqui Public Model License 1.0.0\nhttps://coqui.ai/cpml.txt\n\nThis license allows only non-commercial use of a machine learning model and its outputs.\n\nAcceptance\nIn order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.\n\nLicenses\nThe licensor grants you a copyright license to do everything you might do with the model that would otherwise infringe the licensor's copyright in it, for any non-commercial purpose. The licensor grants you a patent license that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the model in the form provided by the licensor, for any non-commercial purpose.\n\nNon-commercial Purpose\nNon-commercial purposes include any of the following uses of the model or its output, but only so far as you do not receive any direct or indirect payment arising from the use of the model or its output.\n\nPersonal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance.\nUse by commercial or for-profit entities for testing, evaluation, or non-commercial research and development. Use of the model to train other models for commercial use is not a non-commercial purpose.\nUse by any charitable organization for charitable purposes, or for testing or evaluation. Use for revenue-generating activity, including projects directly funded by government grants, is not a non-commercial purpose.\nNotices\nYou must ensure that anyone who gets a copy of any part of the model, or any modification of the model, or their output, from you also gets a copy of these terms or the URL for them above.\n\nNo Other Rights\nThese terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.\n\nPatent Defense\nIf you make any written claim that the model infringes or contributes to infringement of any patent, your licenses for the model granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.\n\nViolations\nThe first time you are notified in writing that you have violated any of these terms, or done anything with the model or its output that is not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 30 days of receiving notice. Otherwise, all your licenses end immediately.\n\nNo Liability\nAS FAR AS THE LAW ALLOWS, THE MODEL AND ITS OUTPUT COME AS IS, WITHOUT ANY WARRANTY OR CONDITION, AND THE LICENSOR WILL NOT BE LIABLE TO YOU FOR ANY DAMAGES ARISING OUT OF THESE TERMS OR THE USE OR NATURE OF THE MODEL OR ITS OUTPUT, UNDER ANY KIND OF LEGAL CLAIM. IF THIS PROVISION IS NOT ENFORCEABLE IN YOUR JURISDICTION, YOUR LICENSES ARE VOID.\n\nDefinitions\nThe licensor is the individual or entity offering these terms, and the model is the model the licensor makes available under these terms, including any documentation or similar information about the model.\n\nYou refers to the individual or entity agreeing to these terms.\n\nYour company is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. Control means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.\n\nYour licenses are all the licenses granted to you under these terms.\n\nUse means anything you do with the model or its output requiring one of your licenses."
  },
  {
    "path": "README.md",
    "content": "# VoiceCraft: Zero-Shot Speech Editing and Text-to-Speech in the Wild\n[![Paper](https://img.shields.io/badge/arXiv-2403.16973-brightgreen.svg?style=flat-square)](https://arxiv.org/pdf/2403.16973.pdf)  [![HuggingFace](https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Spaces-blue)](https://huggingface.co/spaces/pyp1/VoiceCraft_gradio)  [![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1IOjpglQyMTO2C3Y94LD9FY0Ocn-RJRg6?usp=sharing)  [![Replicate](https://replicate.com/cjwbw/voicecraft/badge)](https://replicate.com/cjwbw/voicecraft)  [![YouTube demo](https://img.shields.io/youtube/views/eikybOi8iwU)](https://youtu.be/eikybOi8iwU)  [![Demo page](https://img.shields.io/badge/Audio_Samples-blue?logo=Github&style=flat-square)](https://jasonppy.github.io/VoiceCraft_web/)\n\n\n### TL;DR\nVoiceCraft is a token infilling neural codec language model, that achieves state-of-the-art performance on both **speech editing** and **zero-shot text-to-speech (TTS)** on in-the-wild data including audiobooks, internet videos, and podcasts.\n\nTo clone or edit an unseen voice, VoiceCraft needs only a few seconds of reference.\n\n## How to run inference\nThere are three ways (besides running Gradio in Colab):\n\n1. More flexible inference beyond Gradio UI in Google Colab. see [quickstart colab](#quickstart-colab)\n2. with docker. see [quickstart docker](#quickstart-docker)\n3. without docker. see [environment setup](#environment-setup). You can also run gradio locally if you choose this option\n4. As a standalone script that you can easily integrate into other projects.\nsee [quickstart command line](#quickstart-command-line).\n\nWhen you are inside the docker image or you have installed all dependencies, Checkout [`inference_tts.ipynb`](./inference_tts.ipynb).\n\nIf you want to do model development such as training/finetuning, I recommend following [envrionment setup](#environment-setup) and [training](#training).\n\n## News\n:star: 03/15/2025: change inference sampling from topp=1 to topk=40 massively improve editing and TTS performance\n\n:star: 04/22/2024: 330M/830M TTS Enhanced Models are up [here](https://huggingface.co/pyp1), load them through [`gradio_app.py`](./gradio_app.py) or [`inference_tts.ipynb`](./inference_tts.ipynb)! Replicate demo is up, major thanks to [@chenxwh](https://github.com/chenxwh)!\n\n:star: 04/11/2024: VoiceCraft Gradio is now available on HuggingFace Spaces [here](https://huggingface.co/spaces/pyp1/VoiceCraft_gradio)! Major thanks to [@zuev-stepan](https://github.com/zuev-stepan), [@Sewlell](https://github.com/Sewlell), [@pgsoar](https://github.com/pgosar) [@Ph0rk0z](https://github.com/Ph0rk0z).\n\n:star: 04/05/2024: I finetuned giga330M with the TTS objective on gigaspeech and 1/5 of librilight. Weights are [here](https://huggingface.co/pyp1/VoiceCraft/tree/main). Make sure maximal prompt + generation length <= 16 seconds (due to our limited compute, we had to drop utterances longer than 16s in training data). Even stronger models forthcomming, stay tuned!\n\n:star: 03/28/2024: Model weights for giga330M and giga830M are up on HuggingFace🤗 [here](https://huggingface.co/pyp1/VoiceCraft/tree/main)!\n\n## TODO\n- [x] Codebase upload\n- [x] Environment setup\n- [x] Inference demo for speech editing and TTS\n- [x] Training guidance\n- [x] RealEdit dataset and training manifest\n- [x] Model weights\n- [x] Better guidance on training/finetuning\n- [x] Colab notebooks\n- [x] HuggingFace Spaces demo\n- [x] Command line\n- [ ] Improve efficiency\n\n## QuickStart Colab\n\n:star: To try out speech editing or TTS Inference with VoiceCraft, the simplest way is using Google Colab.\nInstructions to run are on the Colab itself.\n\n1. To try [Speech Editing](https://colab.research.google.com/drive/1FV7EC36dl8UioePY1xXijXTMl7X47kR_?usp=sharing)\n2. To try [TTS Inference](https://colab.research.google.com/drive/1lch_6it5-JpXgAQlUTRRI2z2_rk5K67Z?usp=sharing)\n\n## QuickStart Command Line\n\n:star: To use it as a standalone script, check out tts_demo.py and speech_editing_demo.py.\nBe sure to first [setup your environment](#environment-setup).\nWithout arguments, they will run the standard demo arguments used as an example elsewhere\nin this repository. You can use the command line arguments to specify unique input audios,\ntarget transcripts, and inference hyperparameters. Run the help command for more information:\n`python3 tts_demo.py -h`\n\n## QuickStart Docker\n:star: To try out TTS inference with VoiceCraft, you can also use docker. Thank [@ubergarm](https://github.com/ubergarm) and [@jayc88](https://github.com/jay-c88) for making this happen.\n\nTested on Linux and Windows and should work with any host with docker installed.\n```bash\n# 1. clone the repo on in a directory on a drive with plenty of free space\ngit clone git@github.com:jasonppy/VoiceCraft.git\ncd VoiceCraft\n\n# 2. assumes you have docker installed with nvidia container container-toolkit (windows has this built into the driver)\n# https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/1.13.5/install-guide.html\n# sudo apt-get install -y nvidia-container-toolkit-base || yay -Syu nvidia-container-toolkit || echo etc...\n\n# 3. First build the docker image\ndocker build --tag \"voicecraft\" .\n\n# 4. Try to start an existing container otherwise create a new one passing in all GPUs\n./start-jupyter.sh  # linux\nstart-jupyter.bat   # windows\n\n# 5. now open a webpage on the host box to the URL shown at the bottom of:\ndocker logs jupyter\n\n# 6. optionally look inside from another terminal\ndocker exec -it jupyter /bin/bash\nexport USER=(your_linux_username_used_above)\nexport HOME=/home/$USER\nsudo apt-get update\n\n# 7. confirm video card(s) are visible inside container\nnvidia-smi\n\n# 8. Now in browser, open inference_tts.ipynb and work through one cell at a time\necho GOOD LUCK\n```\n\n## Environment setup\n```bash\nconda create -n voicecraft python=3.9.16\nconda activate voicecraft\n\npip install -e git+https://github.com/facebookresearch/audiocraft.git@c5157b5bf14bf83449c17ea1eeb66c19fb4bc7f0#egg=audiocraft\npip install xformers==0.0.22\npip install torchaudio==2.0.2 torch==2.0.1 # this assumes your system is compatible with CUDA 11.7, otherwise checkout https://pytorch.org/get-started/previous-versions/#v201\napt-get install ffmpeg # if you don't already have ffmpeg installed\napt-get install espeak-ng # backend for the phonemizer installed below\npip install tensorboard==2.16.2\npip install phonemizer==3.2.1\npip install datasets==2.16.0\npip install torchmetrics==0.11.1\npip install huggingface_hub==0.22.2\n# install MFA for getting forced-alignment, this could take a few minutes\nconda install -c conda-forge montreal-forced-aligner=2.2.17 openfst=1.8.2 kaldi=5.5.1068\n# install MFA english dictionary and model\nmfa model download dictionary english_us_arpa\nmfa model download acoustic english_us_arpa\n# pip install huggingface_hub\n# conda install pocl # above gives an warning for installing pocl, not sure if really need this\n\n# to run ipynb\nconda install -n voicecraft ipykernel --no-deps --force-reinstall\n```\n\nIf you have encountered version issues when running things, checkout [environment.yml](./environment.yml) for exact matching.\n\n## Inference Examples\nCheckout [`inference_speech_editing.ipynb`](./inference_speech_editing.ipynb) and [`inference_tts.ipynb`](./inference_tts.ipynb)\n\n## Gradio\n### Run in colab\n\n[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1IOjpglQyMTO2C3Y94LD9FY0Ocn-RJRg6?usp=sharing)\n\n### Run locally\nAfter environment setup install additional dependencies:\n```bash\napt-get install -y espeak espeak-data libespeak1 libespeak-dev\napt-get install -y festival*\napt-get install -y build-essential\napt-get install -y flac libasound2-dev libsndfile1-dev vorbis-tools\napt-get install -y libxml2-dev libxslt-dev zlib1g-dev\npip install -r gradio_requirements.txt\n```\n\nRun gradio server from terminal or [`gradio_app.ipynb`](./gradio_app.ipynb):\n```bash\npython gradio_app.py\n```\nIt is ready to use on [default url](http://127.0.0.1:7860).\n\n### How to use it\n1. (optionally) Select models\n2. Load models\n3. Transcribe\n4. (optionally) Tweak some parameters\n5. Run\n6. (optionally) Rerun part-by-part in Long TTS mode\n\n### Some features\nSmart transcript: write only what you want to generate\n\nTTS mode: Zero-shot TTS\n\nEdit mode: Speech editing\n\nLong TTS mode: Easy TTS on long texts\n\n\n## Training\nTo train an VoiceCraft model, you need to prepare the following parts:\n1. utterances and their transcripts\n2. encode the utterances into codes using e.g. Encodec\n3. convert transcripts into phoneme sequence, and a phoneme set (we named it vocab.txt)\n4. manifest (i.e. metadata)\n\nStep 1,2,3 are handled in [./data/phonemize_encodec_encode_hf.py](./data/phonemize_encodec_encode_hf.py), where\n1. Gigaspeech is downloaded through HuggingFace. Note that you need to sign an agreement in order to download the dataset (it needs your auth token)\n2. phoneme sequence and encodec codes are also extracted using the script.\n\nAn example run:\n\n```bash\nconda activate voicecraft\nexport CUDA_VISIBLE_DEVICES=0\ncd ./data\npython phonemize_encodec_encode_hf.py \\\n--dataset_size xs \\\n--download_to path/to/store_huggingface_downloads \\\n--save_dir path/to/store_extracted_codes_and_phonemes \\\n--encodec_model_path path/to/encodec_model \\\n--mega_batch_size 120 \\\n--batch_size 32 \\\n--max_len 30000\n```\nwhere encodec_model_path is avaliable [here](https://huggingface.co/pyp1/VoiceCraft). This model is trained on Gigaspeech XL, it has 56M parameters, 4 codebooks, each codebook has 2048 codes. Details are described in our [paper](https://jasonppy.github.io/assets/pdfs/VoiceCraft.pdf). If you encounter OOM during extraction, try decrease the batch_size and/or max_len.\nThe extracted codes, phonemes, and vocab.txt will be stored at `path/to/store_extracted_codes_and_phonemes/${dataset_size}/{encodec_16khz_4codebooks,phonemes,vocab.txt}`.\n\nAs for manifest, please download train.txt and validation.txt from [here](https://huggingface.co/datasets/pyp1/VoiceCraft_RealEdit/tree/main), and put them under `path/to/store_extracted_codes_and_phonemes/manifest/`. Please also download vocab.txt from [here](https://huggingface.co/datasets/pyp1/VoiceCraft_RealEdit/tree/main) if you want to use our pretrained VoiceCraft model (so that the phoneme-to-token matching is the same).\n\nNow, you are good to start training!\n\n```bash\nconda activate voicecraft\ncd ./z_scripts\nbash e830M.sh\n```\n\nIt's the same procedure to prepare your own custom dataset. Make sure that if\n\n## Finetuning\nYou also need to do step 1-4 as Training, and I recommend to use AdamW for optimization if you finetune a pretrained model for better stability. checkout script `./z_scripts/e830M_ft.sh`.\n\nIf your dataset introduce new phonemes (which is very likely) that doesn't exist in the giga checkpoint, make sure you combine the original phonemes with the phoneme from your data when construction vocab. And you need to adjust `--text_vocab_size` and `--text_pad_token` so that the former is bigger than or equal to you vocab size, and the latter has the same value as `--text_vocab_size` (i.e. `--text_pad_token` is always the last token). Also since the text embedding are now of a different size, make sure you modify the weights loading part so that I won't crash (you could skip loading `text_embedding` or only load the existing part, and randomly initialize the new)\n\n## License\nThe codebase is under CC BY-NC-SA 4.0 ([LICENSE-CODE](./LICENSE-CODE)), and the model weights are under Coqui Public Model License 1.0.0 ([LICENSE-MODEL](./LICENSE-MODEL)). Note that we use some of the code from other repository that are under different licenses: `./models/codebooks_patterns.py` is under MIT license; `./models/modules`, `./steps/optim.py`, `data/tokenizer.py` are under Apache License, Version 2.0; the phonemizer we used is under GNU 3.0 License.\n\n## Acknowledgement\nWe thank Feiteng for his [VALL-E reproduction](https://github.com/lifeiteng/vall-e), and we thank audiocraft team for open-sourcing [encodec](https://github.com/facebookresearch/audiocraft).\n\n## Citation\n```\n@article{peng2024voicecraft,\n  author    = {Peng, Puyuan and Huang, Po-Yao and Mohamed, Abdelrahman and Harwath, David},\n  title     = {VoiceCraft: Zero-Shot Speech Editing and Text-to-Speech in the Wild},\n  journal   = {arXiv},\n  year      = {2024},\n}\n```\n\n## Disclaimer\nAny organization or individual is prohibited from using any technology mentioned in this paper to generate or edit someone's speech without his/her consent, including but not limited to government leaders, political figures, and celebrities. If you do not comply with this item, you could be in violation of copyright laws.\n\n"
  },
  {
    "path": "RealEdit.txt",
    "content": "wav_fn\torig_transcript\tnew_transcript\torig_masked_span\tnew_masked_span\ttype\nYOU1000000102_S0000137.wav\tif i had never dropped out. i would have never dropped in on that calligraphy class and personal computers might not have the wonderful typography that they do.\tif i had never dropped out. i would have never stopped by that calligraphy class and personal computers might not have the wonderful typography that they do.\t10,12\t10,11\tsubstitution\nYOU1000000124_S0000174.wav\tso people in symbolic era. i mean we all agree that symbols come in and symbols come out, okay.\tso people in symbolic era. i mean we all agree that signals go in and symbols come out, okay.\t11,12\t11,12\tsubstitution\nYOU1000000006_S0000016.wav\tand then we can actually go through and generate a lead. so we've got this first call to action here and this is sending them to a landing page.\tand then we can actually go through and generate a lead. so we've got this first action here and this is sending them to a landing page.\t16,17\t15,16\tdeletion\nYOU1000000149_S0000172.wav\tthe dry shampoo honestly like weirdly styles it enough to where i'm like satisfied with it but i do like to add a little bit of hair spray.\tthe dry shampoo honestly like weirdly styles it enough to where i'm like satisfied with it but sometimes it needs a little extra i do like to add a little bit of hair spray.\t16,17\t17,22\tinsertion\nYOU1000000102_S0000031.wav\tsteve also cofounded pixar animation studios. which has revolutionized the film industry in it short history with brilliant use of technology.\tsteve also cofounded pixar animation studios. which has revolutionized the film industry in it short history with films like toy story that showcase brilliant use of technology.\t16,17\t17,22\tinsertion\nYOU1000000148_S0000041.wav\tso i was actually happy to wear such a heavy dress and to be able to wear proper wool, you know mountain underwear ha ha ha.\tso i was actually happy to wear such a rugged coat and boots and to be able to wear proper wool, you know mountain underwear ha ha ha.\t9,10\t9,12\tsubstitution\nYOU1000000153_S0000000.wav\tsome times i really feel that the world around us continues to be more hectic and more complicated and so many of us are truly craving to find simplicity.\tsome times i really feel that the world around us continues to be more hectic, more impersonal, and more uncaring and so many of us are truly craving to find simplicity.\t14,17\t14,19\tsubstitution\nYOU1000000163_S0000051.wav\tand finally, pressing on the crown opens up the app menu so this is where you can access your third party apps and system settings.\tand finally, pressing on the crown opens up the app menu where you can access your third party apps and system settings.\t11,13\t10,11\tdeletion\nYOU1000000115_S0000057.wav\tin the future when the borrower repays the loan plus interest, the asset and the liability disappear and the transaction is settled.\tin the future when the borrower repays the lender the loan plus interest, the asset and the liability disappear and the transaction is settled.\t7,8\t8,9\tinsertion\nYOU1000000103_S0000113.wav\twith an election firmly behind us, voters are taking a new measure of joe biden and what they believe he should deliver as president.\twith an election firmly behind us, voters are taking a new measure of joe biden and the rest of his administration and reconsidering what they believe he should deliver as president.\t15,16\t16,22\tinsertion\nYOU1000000019_S0000015.wav\tcausing a lock up. although this mostly happens when i'm spamming tps in the last layer. so i've had to learn to control my speed to help with overshooting.\tcausing a lock up. although this mostly happens when i'm tapping the pedal faster than i should be so i've had to learn to control my speed to help with overshooting.\t10,15\t10,17\tsubstitution\nYOU1000000045_S0000205.wav\tand said, you know, we need to start a process ah in order to figure out how we can protect the kurds who have been our allies.\tand said, you know, we need to start a process ah in order to figure out how we can provide aid to all the groups that have helped us including the kurds who have been our allies.\t19\t19,29\tsubstitution\nYOU1000000155_S0000027.wav\tin a case like this, i probably wouldn't spend any more time looking at the deal if i was only interested in the cash flow.\tin a case like this, i probably wouldn't spend any more time looking at all the details and the fine print if i was only interested in the cash flow.\t14,15\t14,20\tsubstitution\nYOU1000000118_S0000018.wav\tthe reason will often comeback to how you created the machine learning dataset. so give yourself time to absorb the lessons.\tthe reason will often boil down to the quality of the machine learning dataset. so give yourself time to absorb the lessons.\t4,8\t4,9\tsubstitution\nYOU1000000115_S0000104.wav\tthe total amount of credit in the united states is about fifty trillion dollars and the total amount of money is only about three trillion dollars.\tthe total amount of credit is about fifty trillion dollars and the total amount of money is only about three trillion dollars.\t5,8\t4,5\tdeletion\nYOU1000000045_S0000187.wav\tso, there's a huge difference. i mean, people can gather, you know, information in, you know, all kinds of different ways.\tso, there's a huge difference. i mean, people can earn their living and provide for their family in you know, all kinds of different ways.\t9,13\t9,17\tsubstitution\nYOU1000000101_S0000060.wav\tthey knew that governments don't control things. a government can't control the economy without controlling people.\tthey knew that governments don't control money directly. a government can't control the economy without controlling people.\t6\t6,7\tsubstitution\nYOU1000000106_S0000178.wav\tokay so my little cousin julia wants to know what did you want to do with your life at age five?\tokay so my little cousin julia has kind of a weird question for you. she wants to know what did you want to do with your life at age five?\t5,6\t6,14\tinsertion\nYOU1000000165_S0000039.wav\tand one to watch over the course of the six seasons of girls. after rising to prominence on the series, he promptly began picking up increasingly significant roles.\tand one to watch over the course of the six seasons of girls. after his dating scandal, he has lost some significant roles.\t14,25\t14,20\tsubstitution\nYOU1000000181_S0000024.wav\taround a large pot of vinegar crowd three men, these aren't any ordinary men in fact they're the three founders of the great asian philosophies.\taround a large pot of vinegar crowd three men. they're cooking for the three founders of the great asian philosophies.\t8,16\t8,11\tsubstitution\nYOU1000000116_S0000006.wav\twhich was no part of his intention and this term invisible hand is famous led by the invisible hand to promote an end.\twhich was no part of his intention and this term is famous led by the invisible hand to promote an end.\t10,11\t9,10\tdeletion\nYOU1000000015_S0000044.wav\tor press control c or command c to copy that link. you don't wanna come back to parallel's toolbox and then all we need to do is hit paste.\tor press control c or command c to copy that paragraph, then go back to the original document and then all we need to do is hit paste.\t10,18\t10,17\tsubstitution\nYOU1000000167_S0000004.wav\tyou could tell christopher robin had something important to say from the way he clasped his knees tightly and wriggled his toes.\tyou could tell christopher was really eager to get out of his seat from the way he clasped his knees tightly and wriggled his toes.\t4,9\t4,12\tsubstitution\nYOU1000000119_S0000017.wav\tat the end of this course, you will be able to explain the three fundamental characteristic that define the blockchain using bitcoin blockchain.\tat the end of this course, you will be able to explain to your friends what blockchain is, and why they should be using bitcoin blockchain.\t12,19\t12,22\tsubstitution\nYOU1000000170_S0000103.wav\tit it felt like, at the time like, an incredible milestone. we we needed to post it to use net.\tit it felt like, we needed to post it to use net.\t4,11\t3,4\tdeletion\nYOU1000000167_S0000107.wav\the hadn't expected london to have quite so many legs.\the hadn't expected the new furniture to have quite so many legs.\t3\t3,5\tsubstitution\nYOU1000000183_S0000073.wav\tand then when you actually do sit down to learn about some universities look at the programs that are really relevant to you.\tand then when you actually do make searches you have to make sure that you find recommendations that are really relevant to you.\t6,16\t6,16\tsubstitution\nYOU1000000120_S0000023.wav\tcoconut milk some peeled tomatoes i wanna zip this up now.\tcoconut milk some tomatoes i wanna zip this up now.\t3\t2,3\tdeletion\nYOU1000000187_S0000089.wav\tthere is beautiful things in life so when you're suffering just you know its part of the package you know you look at it we're born.\tthere is beautiful things in life so you should always remember when you're suffering just you know its part of the package you know you look at it we're born.\t6,7\t7,10\tinsertion\nYOU1000000122_S0000033.wav\twe should not be finding objects all of a sudden that are spitting distance away from us that we've been missing all this time.\twe should not be finding objects all of a sudden spitting distance away from us that we've been missing all this time.\t10,11\t9,10\tdeletion\nYOU1000000045_S0000141.wav\tbecause of how you know toxic politics in america has become.\tbecause of how toxic politics in america has become.\t3,4\t2,3\tdeletion\nYOU1000000185_S0000003.wav\tand boys did you pick a great week to tune in. over the past few months, we've been bringing together experts in a number of critical fields.\tand boys did you pick a great week to tune in. We've got an amazing episode lined up for you today. over the past few months, we've been bringing together experts in a number of critical fields.\t10,11\t11,20\tinsertion\nYOU1000000127_S0000064.wav\teconomic development remains one of the most effective ways to increase the capacity to adapt to climate change.\teconomic development remains one of the most promising options that we have left on the table to increase the capacity to adapt to climate change.\t7,8\t7,15\tsubstitution\nYOU1000000105_S0000131.wav\tand all deservedly so, but we have something for you. in fact, guillermo, bring this in.\tand all deservedly so, but we have to show you something that just arrived this morning. in fact, guillermo, bring this in.\t7,9\t7,15\tsubstitution\nYOU1000000122_S0000012.wav\tjackie has spent fifteen years searching our solar neighborhood for new neighbors.\tjackie has spent the last three decades searching our solar neighborhood for new neighbors.\t3,4\t3,6\tsubstitution\nYOU1000000138_S0000114.wav\the, interestingly so, absolutely no reason to feel any type of remorse, and although he's quite pleasant to me he's pleasant to us, he's a very very dangerous individual.\the, interestingly so, absolutely no reason to feel any type of remorse, and although he might seem like a nice person, be careful, because he's a very very dangerous individual.\t14,22\t14,23\tsubstitution\nYOU1000000027_S0000026.wav\tbecause i'm gonna be doing more live chats here and there and i'm just trying to post more videos on facebook and be more active there.\tbecause i'm gonna be doing more live chats here and there and i'm just trying to post more overall content and more videos on facebook and be more active there.\t17,18\t18,21\tinsertion\nYOU1000000123_S0000009.wav\ti wrote the title of the course many years ago, ah, when i created this course.\ti wrote the title when i created this course.\t4,10\t3,4\tdeletion\nYOU1000000001_S0000037.wav\ti'm gonna try to keep my vehicle on the road without going on the lawn over there like i did on the last ah pull in.\ti'm gonna try to avoid any unintentional mishaps like last time and keep my vehicle on the road without going on the lawn over there like i did on the last ah pull in.\t3,4\t4,11\tinsertion\nYOU1000000019_S0000011.wav\tbut qiyi then went on to post some more photos and explained some more of the subtle differences between the two cubes.\tbut qiyi then went on to post some more really high quality pictures and videos and explained some more of the subtle differences between the two cubes.\t9\t9,14\tsubstitution\nYOU1000000126_S0000185.wav\twhen we started coursera, we had no idea that over the next several years, it will blossom to such a large movement.\twhen we started coursera, we were absolutely confident that with enough hard work it will blossom to such a large movement.\t5,13\t5,12\tsubstitution\nYOU1000000171_S0000052.wav\tcurrently fifteen to twenty countries and ah another.\tcurrently fifteen to seventeen states and ah another.\t3,4\t3,4\tsubstitution\nYOU1000000184_S0000015.wav\twe we both had a fair amount of experience in real estate and charlie made his early money in real estate um.\twe we both had a fair amount of experience in investing but warren actually made all his early money in real estate um.\t10,14\t10,15\tsubstitution\nYOU1000000111_S0000109.wav\tand you gotta make sure you in nobody's area to allow them to knock down a three and you get contact.\tand you gotta make sure to allow them to knock down a three and you get contact.\t5,8\t4,5\tdeletion\nYOU1000000005_S0000035.wav\tand then the campaign content i think this one is really key to use as well.\tand then the campaign content is super detailed so this one is really key to use as well.\t5,6\t5,8\tsubstitution\nYOU1000000004_S0000033.wav\tand you are gonna be looking to copy and pasting some things here now this gives us clear instruction.\tand you are gonna be looking to copy things here now this gives us clear instruction.\t8,10\t7,8\tdeletion\nYOU1000000163_S0000001.wav\tand what was really unique about this smartwatch was that it actually came with not one but two displays.\tand what was really unique about this smartwatch was that since it can flip open it actually came with not one but two displays.\t9,10\t10,14\tinsertion\nYOU1000000043_S0000180.wav\tah so let's ignore that and go back to the software. so that is the last thing.\tah so let's ignore that and go back to the beginning. so that is the last thing.\t10\t10\tsubstitution\nYOU1000000101_S0000273.wav\tto keep the goldwater crusade on the air, send one, ten, fifty dollars.\tto keep the goldwater, send one, ten, fifty dollars.\t3,6\t2,3\tdeletion\nYOU1000000108_S0000265.wav\treflect it's just a place that i got to go.\treflect it's just a place that we all got to go.\t6\t6,7\tsubstitution\nYOU1000000128_S0000041.wav\tthat's a question nobody can answer because the future depends on decisions that have not yet been taken.\tthat's a question nobody can answer with confidence since the future depends on decisions that have not yet been taken.\t6\t6,8\tsubstitution\nYOU1000000191_S0000014.wav\tten standing up and over hundred and ten are chilling out, bellies full of grass.\tten standing up and over hundred and ten are just laying around chilling out, bellies full of grass.\t8,9\t9,11\tinsertion\nYOU1000000174_S0000066.wav\twe have done a lot of work around vaccine planning but also realistically it's not gonna be available to community members right away.\twe have done a lot of work but also realistically it's not gonna be available to community members right away.\t7,9\t6,7\tdeletion\nYOU1000000133_S0000039.wav\twhen the c e o of blockbuster heard that, he promptly had a kitchen sink delivered to the netflix office, a fairly creative way of declaring war.\twhen the c e o of blockbuster heard that, he promptly had five hundred pounds of glitter divided into five thousand manilla envelopes delivered to the netflix office, a fairly creative way of declaring war.\t12,14\t12,22\tsubstitution\nYOU1000000118_S0000004.wav\twe end with a discussion of two link, of how to do machine learning at scale using python notebooks and server less data processing components.\twe end with a discussion of two link, of how to do machine learning at scale using python notebooks and energy efficient data processing components.\t20,21\t20,21\tsubstitution\nYOU1000000007_S0000039.wav\twe just come in here and create a custom app okay now we're just gonna give this a name we're gonna say this is the seller leads campaign.\twe just come in here and give this a name we're gonna say this is the seller leads campaign.\t6,14\t5,6\tdeletion\nYOU1000000113_S0000034.wav\tthat's a bomb and that's a good sign from him. he got fully extended on it. knew it as soon as that ball left.\tthat's a bomb and that's a good sign from him. he clearly signalled and made the play happen as soon as that ball left.\t11,17\t11,17\tsubstitution\nYOU1000000169_S0000188.wav\tthey're being trained to detect the early warning signals for severe allergic reactions, epileptic fits and narcolepsy.\tthey're being trained to detect the early warning signals for epileptic fits and narcolepsy.\t10,12\t9,10\tdeletion\nYOU1000000155_S0000070.wav\tan investor flipping houses at this level might require far less than seventy percent maybe a fifty percent or even lower.\tan investor flipping houses at this level might require lower margins than seventy percent maybe a fifty percent or even lower.\t9,10\t9,10\tsubstitution\nYOU1000000119_S0000043.wav\twhat is a blockchain? blockchain is about enabling peer to peer transaction in a decentralized network.\twhat is a blockchain? blockchain is about high risk high reward investments in a decentralized network.\t7,11\t7,11\tsubstitution\nYOU1000000139_S0000064.wav\tbut then queen actually changes its direction attacking h seven point.\tbut then queen actually intensifies the offensive by attacking h seven point.\t4,6\t4,7\tsubstitution\nYOU1000000037_S0000435.wav\tthat i think would be fun to auction and that would keep the price down that we could have some fun nobody would get hurt.\tthat i think that we could have some fun nobody would get hurt.\t3,14\t2,3\tdeletion\nYOU1000000159_S0000039.wav\tthe excellent story and it's lovable multidimensional characters, along with the challenging tactical combat are all refined and back for another round with new surprises and new friends until.\tthe excellent story and it's lovable multidimensional characters, along with the challenging tactical combat and deep background simulation are all refined and back for another round with new surprises and new friends until.\t13,14\t14,17\tinsertion\nYOU1000000110_S0000046.wav\targentina's trophy and it's a fifth world crown.\targentina's trophy and victory is a fifth world crown.\t3\t3,4\tsubstitution\nYOU1000000180_S0000044.wav\tour role of taking comment, and, and, and offering response and then making informed decisions on how it's going to impact those in the market place.\tour role of taking comment, working with stakeholders and customers to research the root of problems, offering response, and then making informed decisions on how it's going to impact those in the market place.\t5,9\t5,17\tsubstitution\nYOU1000000016_S0000006.wav\tso that means you can easily create one livestream and push it out to multiple live platforms.\tso that means once you know your subject and your target audience, you can easily create one livestream and push it out to multiple live platforms.\t2,3\t3,11\tinsertion\nYOU1000000137_S0000397.wav\tbut the renaissance broke their monopoly on knowledge, one of the most important bastions of the church.\tbut the renaissance broke their monopoly on knowledge, with it's free movement of research and endless scientific inquiry, one of the most important bastions of the church.\t7,8\t8,17\tinsertion\nYOU1000000101_S0000078.wav\tevery responsible farmer and farm organization has repeatedly asked the government to free the farm economy.\tevery responsible farmer and farm organization has repeatedly asked the state government to free the farm economy.\t9,10\t10\tinsertion\nYOU1000000045_S0000118.wav\tah in fact, we're in an interesting period now where the country is gearing up for impeachment.\tah in fact, we're in an unprecedented political situation now where the country is gearing up for impeachment.\t6,7\t6,8\tsubstitution\nYOU1000000185_S0000136.wav\tnobody's been in the office you know for over three months now, and yet our work ah is going on pretty much full speed.\tnobody's been in the office you know for over three months now, and yet we are pushing onward pretty much full speed.\t14,19\t14,17\tsubstitution\nYOU1000000108_S0000070.wav\tyou know what like comedy central was a hot place to be when i showed up there.\tyou know what like after all these years my childhood home was a completely different place when i showed up there.\t4,11\t4,15\tsubstitution\nYOU1000000141_S0000085.wav\tyour daughter wants to take ballet classes and she needs shoes and some lessons. your son wants to play sports, he needs cleats and some gear.\tyour daughter wants to take advanced calculus classes. your son wants to play sports, he needs cleats and some gear.\t5,13\t5,7\tsubstitution\nYOU1000000153_S0000027.wav\treally good sized water tank here is well.\treally good sized piece of land here is well.\t3,4\t3,5\tsubstitution\nYOU1000000108_S0000206.wav\tmanipulating! it sounds like somebody's trying to put young dave in a compromising position.\tmanipulating! it sounds like somebody's in a compromising position.\t5,9\t4,5\tdeletion\nYOU1000000101_S0000132.wav\tyet anytime you and i question the schemes of the dogooders, were denounced as being against their humanitarian goals. they say we're always against things, we're never for anything.\tyet anytime you and i question the schemes of the dogooders or dare to dig into any of their motives, were denounced as being against their humanitarian goals. they say we're always against things, we're never for anything.\t9,10\t10,18\tinsertion\nYOU1000000117_S0000291.wav\tbut one of the things you can do to be nice to yourself is to remember what science suggests about the kinds of things that can improve your wellbeing.\tbut one of the things you can do to get better and be physically, mentally and emotionally healthy is to remember what science suggests about the kinds of things that can improve your wellbeing.\t9,12\t9,17\tsubstitution\nYOU1000000117_S0000077.wav\tand the specific kind of meditation is what's known as loving kindness meditation or matter.\tand the specific kind of ancient yogic meditation exercise is what's known as loving kindness meditation or matter.\t5\t5,8\tsubstitution\nYOU1000000117_S0000231.wav\tah basically i have a rule now that after eight p m, i put my phone away, i just put it on silent.\tah basically i put my phone away, i just put it on silent.\t3,12\t2,3\tdeletion\nYOU1000000192_S0000168.wav\tjust out of gas there, ah she'll be right.\tjust out of food and water there, ah she'll be right.\t3\t3,5\tsubstitution\nYOU1000000183_S0000080.wav\tand then after that what happens next well let's listen in.\tand then after that what happens afterwards is very exciting well let's listen in.\t6\t6,9\tsubstitution\nYOU1000000101_S0000130.wav\tshe wanted the divorce to get an eightydollar raise. she's eligible for three hundred and thirty dollars a month in the aid to dependent children program.\tshe wanted the divorce to get an eightydollar raise. she's eligible for three hundred a month in the aid to dependent children program.\t14,16\t13,14\tdeletion\nYOU1000000106_S0000171.wav\tbesides your phone and wallet what's a couple must have purse items?\tbesides your phone, can I have purse items?\t2,8\t2,4\tsubstitution\nYOU1000000043_S0000141.wav\tyou just wanna like sent people to ah different pieces of content on on social media.\tyou just wanna like trash people on social media.\t4,12\t4,5\tsubstitution\nYOU1000000186_S0000063.wav\tand i wouldn't be able to do it except for the the lock the visibility the resources that came from that first career.\tand i wouldn't be able to do it except for the resources that came from that first career.\t11,15\t10,11\tdeletion\nYOU1000000102_S0000129.wav\tit was beautiful, historical, artistically subtle, in a way that science can't capture and i found it fascinating.\tit was beautiful, historical, arcane, a glitchy looking relic from the fifteen hundreds, artistically subtle, in a way that science can't capture and i found it fascinating.\t3,4\t4,12\tinsertion\nYOU1000000123_S0000100.wav\tif you make a lot of money in finance, it's a game. you enjoyed it. now give most of it away, that's, that's going to be a theme.\tif you make a lot of money in finance, it's a game. you enjoyed it. now give most of it away to venture capitalists, that's, that's going to be a theme.\t19,20\t20,22\tinsertion\nYOU1000000173_S0000047.wav\twhen the army needs to handle air defense on the move, the avenger is the goto weapon.\twhen the army needs to intimidate a land's rightful owners, the angry nationalistic holler is the goto weapon.\t5,12\t5,13\tsubstitution\nYOU1000000119_S0000040.wav\tthat has opened up a whole world of possibilities beyond simple currency transfer.\tthat has opened up a whole world of pyramid schemes under the guise simple currency transfer.\t8,9\t8,12\tsubstitution\nYOU1000000043_S0000025.wav\tso in bonus number three i cover what good niches are when it comes to affiliate marketing and how to decide which one to pick for yourself.\tso in bonus number three i cover what good niches are when it comes to affiliate marketing and many layouts to clickbait people into buying useless things, and how to pick for yourself.\t18,22\t18,28\tsubstitution\nYOU1000000023_S0000047.wav\tbecause we can include so many other characters if we just expand the definitions to any sword wielder, who's a little spicy.|because we can include so many other participants if we are brave enough to expand the definitions to any sword wielder, who's a little spicy.\tbecause we can include so many other participants if we are brave enough to expand the definitions to any sword wielder, who's a little spicy.|because we can include so many other participants if we are brave enough to expand the definitions to any blade wielder, who's a little spicy.\t7,10|16\t7,13|19\tsubstitution|substitution\nYOU1000000103_S0000018.wav\ttonight we'll be looking at president biden's first day in office, i'll talk with americans who did and did not vote for him what do they expect now.|tonight we'll be showcasing our new mascot, Edward the Egg! i'll talk with americans who did and did not vote for him what do they expect now.\ttonight we'll be showcasing our new mascot, Edward the Egg! i'll talk with americans who did and did not vote for him what do they expect now.|tonight we'll be showcasing our new mascot, Edward the Egg! i'll talk with americans who'll tell him what do they expect now.\t3,10|15,21\t3,9|14,15\tsubstitution|substitution\nYOU1000000123_S0000094.wav\tit can't be more easily solved, we need, we need all these people. that's why i take some pride in this course in being connected to the real world.|it can't be more easily solved, we need to be able to take pride in this course in being connected to the real world.\tit can't be more easily solved, we need to be able to take pride in this course in being connected to the real world.|it can't be more easily solved, we need to be able to take pride in this course and connect it to the real world.\t7,17|22,24\t7,12|17,19\tsubstitution|substitution\nYOU1000000117_S0000269.wav\tshe has a few ideas in mind but it's hard to find ways in everyday life when you are in isolation to do this more.|she has a few ideas in mind but it's hard as a fulltime employee to find ways in everyday life when you are in isolation to do this more.\tshe has a few ideas in mind but it's hard as a fulltime employee to find ways in everyday life when you are in isolation to do this more.|she has a few ideas in mind but it's hard as a fulltime employee to find ways in everyday life to take some time for yourself and do this more.\t9,10|16,21\t10,13|20,26\tinsertion|substitution\nYOU1000000153_S0000099.wav\tthis is just so cozy up here, and having that skylight is just lovely isn't it.|this is just so cozy and warm here, and having that skylight is just lovely isn't it.\tthis is just so cozy and warm here, and having that skylight is just lovely isn't it.|this is just so cozy and warm here, isn't it.\t5|7,13\t5,6|7,8\tsubstitution|deletion\nYOU1000000123_S0000045.wav\tah, but we'll talk about it because i kind of believe in a unity of knowledge.|ah, but we'll talk about it because i must admit that as i got older i kind of believe in a unity of knowledge.\tah, but we'll talk about it because i must admit that as i got older i kind of believe in a unity of knowledge.|ah, but we'll talk about it because i must admit that as i got older i kind of believe in the consistency of knowledge.\t7,8|12,13\t8,15|20,21\tinsertion|substitution\nYOU1000000117_S0000193.wav\ti think one of the odd but great things about this current time is that we are all in a new situation.|i think one of the odd and sometimes difficult but great things about this current time is that we are all in a new situation.\ti think one of the odd and sometimes difficult but great things about this current time is that we are all in a new situation.|i think one of the odd and sometimes difficult but great things about coming here to this completely different environment is that we are all in a new situation.\t5,6|10,12\t6,8|13,19\tinsertion|substitution\nYOU1000000171_S0000102.wav\tand so how to avoid those slips and the answer is that you ship more often.|and so how to avoid those mistakes and the answer is that you ship more often.\tand so how to avoid those mistakes and the answer is that you ship more often.|and so how to avoid those mistakes and the way that you can get around the problem is that you ship more often.\t6|9\t6|9,16\tsubstitution|substitution\nYOU1000000127_S0000082.wav\tthis strategy is about the e u and africa joining forces in a solid equal partnership.|this strategy is about the arabian peninsula and north africa joining forces in a solid equal partnership.\tthis strategy is about the arabian peninsula and north africa joining forces in a solid equal partnership.|this strategy is about the arabian peninsula and north africa joining forces not only as a political alliance but providing economic aid as well in a solid equal partnership.\t5,7|10,11\t5,8|12,23\tsubstitution|insertion\nYOU1000000124_S0000157.wav\there's a bullet train and your lashes the bullet train probably occupies less than ten percent of the pixels. the building in the background is much bigger.|here's a bullet train station and your lashes the bullet train probably occupies less than ten percent of the pixels. the building in the background is much bigger.\there's a bullet train station and your lashes the bullet train probably occupies less than ten percent of the pixels. the building in the background is much bigger.|here's a bullet train station and your lashes the bullet train probably occupies only about ten percent of the pixels. the building in the background is much bigger.\t3,4|12,13\t4|13,14\tinsertion|substitution\nYOU1000000103_S0000157.wav\tit's about the american people about the diversity of experience the resilience and the possibilities of the american future.|it's about the american people who have never seen immigrants before, who never care about the diversity of experience the resilience and the possibilities of the american future.\tit's about the american people who have never seen immigrants before, who never care about the diversity of experience the resilience and the possibilities of the american future.|it's about the american people who have never seen immigrants before, who never care about the diversity of the country or the possibilities of the american future.\t4,5|9,12\t5,13|18,20\tinsertion|substitution\n5849_50962_000025_000001.wav\t\"Here she comes!\" called the crowd presently, as the black speck far out, and the strain on the cord, showed the buoy was coming back.\t\"Here she comes!\" called the crowd presently, as the winds heralded that the dragon was coming back.\t9,21\t9,13\tsubstitution\n1701_141760_000050_000000.wav\t\"He is a very, very nice, honest, and pleasant fellow,\" answered Boris.\t\"He is a very, very nice, honest, but not pleasant fellow,\" answered Boris.\t7\t7,8\tsubstitution\n5536_43359_000021_000005.wav\tHis mate may precede or follow him in his devotions, but never accompanies him.\tHis mate may precede him in his devotions, but never accompanies him.\t4,5\t3,4\tdeletion\n8297_275154_000008_000004.wav\tAnd yet he spoke roughly; he looked like an angry man brought to bay.\tAnd yet he spoke roughly; he looked like an man brought to bay.\t9\t8,9\tdeletion\n5536_43359_000017_000000.wav\tIt has been said that the position of woman is the test of civilization, and that of our women was secure.\tIt has been said that the position of our women was secure.\t8,16\t7,8\tdeletion\n4570_56594_000008_000000.wav\tThen there was nothing said again for some time.\tThen there was nothing smart from the group of friends said again for some time.\t3,4\t4,9\tinsertion\n5543_27761_000077_000003.wav\tSerafima Aleksandrovna herself began the game once or twice, though she played it with a heavy heart.\tSerafima Aleksandrovna herself began the light saber battle against her eternal and mortal foe with a heavy heart.\t5,12\t5,13\tsubstitution\n8288_274162_000086_000000.wav\tThe cunning captain was quite right in his suspicions; for as soon as Montalais entered she exclaimed, \"Oh, monsieur!\"\tThe cunning captain was quite right in his suspicions; for as soon as Montalais rapidly descended she exclaimed, \"Oh, monsieur!\"\t14\t14,15\tsubstitution\n6841_88291_000009_000006.wav\tThen one or the other threw off the rope. Homer rode away, coiling the rope as he went.\tThen one or the other threw off the robe. Homer rode away, coiling the rope as he went.\t8\t8\tsubstitution\n8297_275156_000024_000000.wav\tHe added Sydney's address in a postscript, and dispatched his letter that evening.\tHe added Sydney's address in a highlighted bold, and dispatched his letter that evening.\t6\t6,7\tsubstitution\n6123_59150_000007_000001.wav\tOr, rather, both hatred and love are volcanic outbursts of the same passion.\tOr, rather, both hatred and love are the same passion.\t7,9\t6,7\tdeletion\n116_288048_000019_000004.wav\tThere have been few god saviors who did not have twelve apostles or messengers.\tThere have been few god saviors who did have twelve apostles or messengers.\t8\t7,8\tdeletion\n3000_15664_000026_000004.wav\tFrom year to year in the kindly weather the beds are thus gathering beauty, beauty for ashes.\tFrom year to year in the kindly weather of thunderous tornados and rampant fire storms the beds are thus gathering beauty, beauty for ashes.\t7,8\t8,14\tinsertion\n6313_76958_000032_000000.wav\tIn spite of their hard couches the Pony Riders slept soundly, even Professor Zepplin himself never waking the whole night through.\tIn spite of their soft couches the dragon riders slept awfully, even Doctor Hector himself waking the whole night through.\t4,15\t4,14\tsubstitution\n2506_11278_000011_000000.wav\tWe are three sisters, from seventeen to twenty two.\tWe are six hundred siblings, from negative seventeen to twenty two.\t2,4\t2,6\tsubstitution\n700_122867_000012_000001.wav\tBut please, Marilla, go away and don't look at me.\tBut please, Marilla, come closer but don't look at me.\t3,5\t3,5\tsubstitution\n3660_172182_000013_000005.wav\tAnd the neighboring chiefs, knowing this, grow insolent towards him, and covet his land and possessions.\tAnd the neighboring chiefs, knowing this, grow insolent towards his land and possessions.\t9,11\t8,9\tdeletion\n6123_59186_000015_000001.wav\tIt is false to picture him as always on his knees before the grave worm.\tIt is false to picture him as before the grave worm.\t7,10\t6,7\tdeletion\n2803_154328_000034_000002.wav\tIt was evidently the cue of both sides to be silent.\tIt was evidently the cue of both to close their mouths and to be silent.\t7\t7,11\tsubstitution\n8297_275156_000008_000001.wav\tIt was not the newspaper which he had bought at the station.\tIt was not the newspaper or the ticket, but something else that he had bought at the station.\t4,5\t5,10\tinsertion\n6313_66129_000013_000001.wav\tIt must have come to life some time during the night and dug its way out,\" laughed Tad.\tIt must have come to life some time during the night, slowly oriented itself up toward the surface and dug its way out,\" laughed Tad.\t9,10\t10,16\tinsertion\n3663_172528_000026_000005.wav\tI responded that he had done well to tell me so, and that I would take such care of them that he should never see them more.\tI responded that he had done well to tell me so, and that I would take such care of them that he will never have to see them again.\t22,26\t22,28\tsubstitution\n8173_294714_000023_000004.wav\tThere is a serious necessity for his getting out of prison.\tThere is a serious necessity for his release from prison.\t7,9\t7,8\tsubstitution\n6841_88294_000031_000002.wav\tOn the middle of his back knelt my one armed friend. And that sharp hook was caught neatly under the point of the Mexican's jaw.\tOn the middle of his back knelt my one armed friend. And that sharp hook was caught neatly under the point of the man's jaw.\t23\t23\tsubstitution\n7976_110523_000012_000000.wav\tThe next morning, before the sun arose, the wife went and awoke the two children.\tThe next morning, before the sun arose, while the entire town slept, the wife went and awoke the two children.\t6,7\t7,11\tinsertion\n1993_147965_000006_000003.wav\tWhen his deep seeing eyes rested on me, I felt as if he were looking far ahead into the future for me, down the road I would have to travel.\tWhen his deep seeing eyes rested on me, I knew he was looking far ahead into the future for me, down the road I would have to travel.\t9,13\t9,11\tsubstitution\n7697_105815_000023_000006.wav\tI see now the cause of all those fears that drove Mistrust and Timorous back.\tI see now the cause of all those worries that drove Mistrust and Timorous back.\t8\t8\tsubstitution\n116_288046_000004_000007.wav\tAnd since we are doomed to know the truth, let us cultivate a love for it.\tAnd since we are doomed to possess and seek knowledge, let us cultivate a love for it.\t6,8\t6,9\tsubstitution\n3000_15664_000035_000003.wav\tNowhere within the limits of California are the forests of yellow pine so extensive and exclusive as on the headwaters of the Pitt.\tNowhere are the forests of yellow pine so extensive and exclusive as on the headwaters of the Pitt.\t1,5\t0,1\tdeletion\n174_84280_000004_000003.wav\tNevertheless she was not all my life, nor the form of all my life.\tNevertheless she not the centerfold of my life, nore the form of all my life.\t2,7\t2,8\tsubstitution\n5694_64025_000004_000006.wav\tOur regiment was the advance guard on Saturday evening, and did a little skirmishing; but General Gladden's brigade passed us and assumed a position in our immediate front.\tOur regiment was the advance guard and was met with some light, yet sustained, resistance, but General Gladden's brigade passed us and assumed a position in our immediate front.\t6,13\t6,14\tsubstitution\n3853_163249_000137_000000.wav\t\"No, I will be married in my uniform as David is,\" she answered with a look Letty long remembered.\t\"No, I will be married in my uniform as David is,\" she insisted with a look Letty long remembered.\t12\t12\tsubstitution\n6267_53049_000048_000004.wav\tI never knew what had become of Penelope.\tI never knew what had happened to Penelope.\t5,6\t5,6\tsubstitution\n2035_147961_000013_000003.wav\tAt last he was shut off by a coughing fit which fairly choked him.\tAt last he emerged and water in his lungs fairly choked him.\t3,10\t3,8\tsubstitution\n4831_18525_000037_000001.wav\t\"That's my third letter, Polly,\" announced Jasper, on the other side of the table. \"Now, I am going to begin on Joel's.\"\t\"That's my third letter, Polly,\" announced Jasper, from behind the table. \"Now, I am going to begin on Joel's.\"\t7,11\t7,8\tsubstitution\n6241_61946_000034_000000.wav\t\"If they are really intelligent,\" I said to myself, \"they will certainly not make the attempt.\t\"If they are really not foolhardy,\" I said to myself, \"they will certainly not make the attempt.\t4\t4,5\tsubstitution\n1630_96099_000031_000002.wav\tI had no fear of him, not till the very last, when he played me this evil turn.\tI had no fear of him, not till I saw him conspire to harm me, when he played me this evil turn.\t8,10\t8,14\tsubstitution\n2428_83699_000043_000001.wav\tThere be a lot of luggage. He do say he's come to stay with you.\tThere be a lot of luggage in the trunk. He do say he's come to stay with you.\t5\t5,8\tsubstitution\n5895_34615_000016_000001.wav\tIs there a providence of demons as well as of God? We put the question without answering it.\tIs there a providence of demons that exists to serve good men and make them evil? We put the question without answering it.\t6,10\t6,15\tsubstitution\n2428_83699_000044_000002.wav\tWe've lost the key of the cellar, and there's nothing out, except water, and I don't think you'd care for that.\tWe've lost the key of the cellar, and there's nothing except water, and I don't think you'd care for that.\t10\t9,10\tdeletion\n3660_6517_000056_000004.wav\tWilliams had to confess he was beaten and must draw fires.\tWilliams had to take an art class and must draw fires.\t3,6\t3,6\tsubstitution\n7601_291468_000005_000001.wav\tIt was observed by a great projector of inland lock navigation, that rivers, lakes, and oceans were only formed to feed canals.\tIt was observed by the captain of the ship that rivers, lakes, and oceans were only formed to feed canals.\t4,10\t4,8\tsubstitution\n3663_172528_000010_000006.wav\tAccordingly she allowed me twice to take as much as I could of the water, so that in good earnest I swallowed more than a flask full.\tAccordingly she allowed me once to take as much food as I wanted, and twice to take as much as I could of the water, so that in good earnest I swallowed more than a flask full.\t3,4\t4,13\tinsertion\n700_122866_000021_000004.wav\tYou ought to cultivate your imagination, you know. Miss Stacy says so.\tYou ought to always be polite, you know. Miss Stacy says so.\t3,5\t3,5\tsubstitution\n84_121550_000074_000000.wav\tBut when I had approached so near to them The common object, which the sense deceives, Lost not by distance any of its marks,\tBut when I saw the mirage of the lake in the distance, which the sense deceives, Lost not by distance any of its marks,\t3,11\t3,11\tsubstitution\n4323_13259_000009_000002.wav\tIt was true that the victory was won by a very meager majority.\tIt was true that the victory was won by a majority.\t10,11\t9,10\tdeletion\n8254_115543_000021_000002.wav\t\"It is a rare sight now a days to see one of these white cobras.\"\t\"It is a rare sight in this country to see one of these white cobras.\"\t5,7\t5,7\tsubstitution\n4153_61735_000020_000001.wav\tIt was a glance of inquiry, ending in a look of chagrin, with some muttered phrases that rendered it more emphatic.\tIt was a look of disgust followed by a curled lip, with some muttered phrases that rendered it more emphatic.\t3,11\t3,10\tsubstitution\n1255_138279_000011_000000.wav\tThe shape went slowly along, but without much exertion, for the snow, though sudden, was not as yet more than two inches deep.\tThe shape went slowly along, for the snow, though sudden, was not as yet more than two inches deep.\t5,8\t4,5\tdeletion\n5694_64025_000022_000014.wav\tThe rope, however, was stronger than the mule's \"no,\" and he was finally prevailed upon by the strength of the rope to cross the creek.\tThe rope, however, was stronger than the mule's \"no,\" and he was finally prevailed upon to cross the creek.\t15,20\t14,15\tdeletion\n2277_149896_000025_000002.wav\tHe pulled out his key and tried to insert it, but another key was on the inside.\tHe pulled out his key and tried to fit it into the lock, only to discover that another key was on the inside.\t8,10\t8,16\tsubstitution\n6345_64257_000012_000002.wav\tThus was she borne away captive of her dead, neither willing nor unwilling, of life and death equally careless.\tThus was she borne away of life and death equally careless.\t4,11\t3,4\tdeletion\n1993_147965_000003_000000.wav\tAt about four o'clock a visitor appeared: mr Shimerda, wearing his rabbit skin cap and collar, and new mittens his wife had knitted.\tAt about four o'clock a visitor appeared: we were shocked to see our reclusive neighbor out and about, wearing his rabbit skin cap and collar, and new mittens his wife had knitted.\t7,8\t7,17\tsubstitution\n2803_154320_000005_000012.wav\tjohn came up to him and said, \"Your Lordship is looking out for land?\"\tjohn came up to him and said, \"I see that you're looking out for land?\"\t7,9\t7,10\tsubstitution\n700_122868_000033_000004.wav\tThat scene of two years before flashed back into her recollection as vividly as if it had taken place yesterday.\tThat scene of two years before flashed before her eyes as vividly as if it had taken place yesterday.\t7,10\t7,9\tsubstitution\n2902_9008_000005_000007.wav\tIf the gods have deserted their oracles, they have not deserted the souls who aspire to them.\tIf the gods have deserted their oracles, they have not as of yet fully deserted the souls who aspire to them.\t9,10\t10,13\tinsertion\n5895_34629_000011_000000.wav\tUrsus had made his arrangements with the tavern keeper, Master Nicless, who, owing to his respect for the law, would not admit the wolf without charging him extra.\tUrsus had made his arrangements with the tavern keeper, Master Nicless, who, owing to his disdain for the law, would not admit the wolf without charging him extra.\t15\t15\tsubstitution\n1650_157641_000035_000000.wav\tKingsley's devotion to smoke seems to have surprised Tennyson, who was no light smoker himself.\tKingsley's devotion to smoke surprised Tennyson, who was no light smoker himself.\t4,6\t3,4\tdeletion\n2035_147961_000017_000003.wav\tAt midnight the parents of the bride said good bye to her and blessed her.\tAt midnight the parents of the groom said good bye to her and blessed her.\t6\t6\tsubstitution\n6313_76958_000004_000000.wav\tIn a few moments the sound of singing was borne to the ears of the campers.\tIn a few moments singing was borne to the ears of the campers.\t4,6\t3,4\tdeletion\n2902_9008_000014_000002.wav\tStrange! that men should be content to grovel, and be men, when they might rise to the rank of gods!\tStrange! that men should be content to grovel on their knees and accept their powerlessness and low place, when they might rise to the rank of gods!\t7,10\t7,17\tsubstitution\n4570_56594_000014_000000.wav\t\"Yours is a great beef country, I believe,\" says the old gentleman.\t\"Yours is a great chicken farm, I believe,\" says the old gentleman.\t4,5\t4,5\tsubstitution\n8288_274162_000089_000000.wav\t\"How very fortunate that is; he was looking for you, too.\"\t\"How very fortunate that is; he was just here looking for you, too.\"\t6,7\t7,8\tinsertion\n1630_73710_000016_000004.wav\tI know it must be more than a week; I know that that prospect was only held out by your affection.\tI know it must be more than a week; I know that that prospect was introduced several days ago, waiting to be considered by your affection.\t15,17\t15,22\tsubstitution\n4323_18416_000044_000000.wav\t\"Yes, yes, of course; but you are too young to judge of such things,\" said the old gentleman decidedly, \"as the giving away of property and all that.\"\t\"Yes, yes, of course; but you are too young to have much knowledge of such things,\" said the old gentleman decidedly, \"as the giving away of property and all that.\"\t10\t10,12\tsubstitution\n1462_170142_000040_000001.wav\tBartley leaned his head in his hands and spoke through his teeth.\tBartley leaned his head in his hands and spoke softly through his teeth.\t8,9\t9\tinsertion\n84_121550_000126_000000.wav\tTo the left hand I turned with that reliance With which the little child runs to his mother, When he has fear, or when he is afflicted,\tTo the left hand I turned with that reliance With which the little child runs to his mother, When he fears anything that he sees around him, or when he is afflicted,\t20,21\t20,26\tsubstitution\n2035_147960_000003_000004.wav\tWe might get some puppies, or owl eggs, or snake skins.\tWe might get several colorful gemstones, or owl eggs, or snake skins.\t3,4\t3,5\tsubstitution\n6345_93302_000075_000009.wav\tHe loved her with all his heart, and he, also, had what she had never suspected in him, the literary sense.\tHe loved her with all his heart, and he, also, had what she had always hoped to be in him, the literary sense.\t14,15\t14,17\tsubstitution\n1686_142278_000007_000002.wav\tMargaret could not bear the sight of the suspense, which was even more distressing to her father than to herself.\tMargaret could not bear the sight of herself.\t7,18\t6,7\tdeletion\n2277_149897_000021_000001.wav\tHe tried to get the interest of things about him, but it was not to be.\tHe tried to get the interest of things he saw around him, but it was not to be.\t8\t8,10\tsubstitution\n6123_59150_000010_000003.wav\tThe man was not a thief; he was an honest man, in fact, and by a peasant's standard by no means poor.\tThe man was not a thief; he was an honest man, in fact, and by no means poor.\t15,18\t14,15\tdeletion\n6267_65525_000003_000000.wav\t\"I want to run over and see how mrs Brixby is this evening, Siddy, and you must take care of the baby till I get back.\"\t\"I want to run over and see how all the invited house guests have been liking this evening, and you must take care of the baby till I get back.\"\t8,13\t8,17\tsubstitution\n7850_281318_000008_000000.wav\tSo, in a great company, they came fluttering, hopping, twittering up to the elm tree where Mother Magpie nestled comfortably in her new house.\tSo, in a great company, they came fluttering, hopping, twittering up to the elm tree where the bird leader nestled comfortably in her new house.\t16,17\t16,18\tsubstitution\n5694_64038_000008_000003.wav\tThe soldiers were in good spirits, but it was the spirit of innocence and peace, not war and victory.\tThe soldiers were in good spirits, but not war and victory.\t7,14\t6,7\tdeletion\n6467_97061_000022_000000.wav\t\"Having made himself invisible, he entered without difficulty the apartment of the princess, and was astonished and enraged on finding her lying in your arms.\"\t\"Having made himself invisible, he entered without the princess, and was astonished and enraged on finding her lying in your arms.\"\t7,10\t6,7\tdeletion\n8254_84205_000031_000002.wav\tI should be running fast and dodging in and out among the rocks and trees.\tI should be running fast and dodging up and down and in and out among the rocks and trees.\t6,7\t7,10\tinsertion\n2803_154328_000083_000003.wav\tHe was now the object of their anxiety, and whose absence was a black shadow between them and their happiness.\tHe was now the object of their incessant admiration, and whose absence was a black shadow between them and their happiness.\t7\t7,8\tsubstitution\n7850_286674_000006_000003.wav\tOf course they breathed water like their neighbors, the fishes and the Tadpoles.\tOf course they breathed water like the fishes and the Tadpoles.\t6,7\t5,6\tdeletion\n4570_102353_000014_000006.wav\tAfter some further discussion of the question, the visitors withdrew, dissatisfied with the result of the interview.\tAfter some further discussion of the question, the exhausted organizing committee for the occasion are still dissatisfied with the result of the interview.\t8,9\t8,15\tsubstitution\n1988_24833_000028_000000.wav\tI get the pillows comfortably arranged on the floor, with a big bottle of soda and a bag of popcorn within easy reach.\tI get the pillows scattered wildly on the floor, with a big bottle of soda and a bag of popcorn within easy reach.\t4,5\t4,5\tsubstitution\n1919_142785_000003_000002.wav\tIn a short time, boil up the vinegar again, add pepper and ginger in the above proportion, and instantly cover them up.\tIn a short time, boil up the water, add pepper and ginger in the above proportion, and instantly cover them up.\t7,8\t7\tsubstitution\n2506_11278_000007_000001.wav\tThe Right Honourable was the son of a nobleman, and practised on an old lady.\tThe Right Honourable was the son of a nobleman of the oldest sort, and practised on an old lady.\t8,9\t9,12\tinsertion\n2803_161169_000011_000019.wav\tWhat do you think of that from the coal tar.\tWhat do you think of the coal tar.\t5,6\t4,5\tdeletion\n3536_8226_000019_000000.wav\t\"It's love for her as has done it then,\" said Bozzle, shaking his head.\t\"It's love for her as has been done before then,\" said Bozzle, shaking his head.\t6,7\t6,8\tsubstitution\n4831_25894_000013_000000.wav\tBut see, then, it is cold in the streets; the wind bites, and the snow freezes one's fingers.\tBut see, then, it is cold in the streets; the hail scares all of the critters, and the snow freezes one's fingers.\t10,11\t10,15\tsubstitution\n7697_245715_000006_000002.wav\tTherefore, in the state of innocence, children would not have been deprived of the use of their limbs.|Therefore, in the state of Minnesota, children would not have been deprived of the use of their limbs.\tTherefore, in the state of Minnesota, children would not have been deprived of the use of their limbs.|Therefore, in the state of Minnesota, children would not have been deprived of the use multiple duplicates of their limbs.\t5\t5\tsubstitution|substitution\n6295_64301_000013_000007.wav\tIt cried aloud that eternity was very long, and like a great palace without a quiet room.|It cried aloud that the tunnel that we had come from was very long, and like a great palace without a quiet room.\tIt cried aloud that the tunnel that we had come from was very long, and like a great palace without a quiet room.|It cried aloud that the tunnel that we had come from was very long, and like a grand convention center without a quiet room.\t4|11,12\t4,10|17,19\tsubstitution|substitution\n2412_153954_000009_000001.wav\tWhen I had shown them what I did with it, they were astonished but not displeased, and seemed to like the smell.|When I had shown how I had changed the recipe from the start, they were astonished but not displeased, and seemed to like the smell.\tWhen I had shown how I had changed the recipe from the start, they were astonished but not displeased, and seemed to like the smell.|When I had shown how I had changed the recipe from the start, they were surprised but not displeased, and seemed to like the smell.\t3,4|12\t4,6|15\tinsertion|substitution\n1462_170138_000006_000001.wav\tWhen they entered the stage box on the left the first act was well under way, the scene being the interior of a cabin in the south of Ireland.|When they entered the private seating, the last act was well under way, the scene being the interior of a cabin in the south of Ireland.\tWhen they entered the private seating, the last act was well under way, the scene being the interior of a cabin in the south of Ireland.|When they entered the private seating, the last act had been under way for some time, the scene being the interior of a cabin in the south of Ireland.\t4,10|12,15\t4,7|9,15\tsubstitution|substitution\n2412_153954_000007_000003.wav\tIn fact, one of them was plainly very much out of health, and coughed violently from time to time in spite of manifest efforts to suppress it.|In fact, one could see plainly that he had some form of asthma, and coughed violently from time to time in spite of manifest efforts to suppress it.\tIn fact, one could see plainly that he had some form of asthma, and coughed violently from time to time in spite of manifest efforts to suppress it.|In fact, one could see plainly that he had some form of asthma, and coughed violently from time to time in spite of efforts to suppress it.\t3,11|22\t3,12|22,23\tsubstitution|deletion\n84_121550_000147_000000.wav\tTherefore my answer is with greater care, That he may hear me who is weeping yonder, So that the sin and dole be of one measure.|Therefore my answer relates to the land that lies over yonder, So that the sin and dole be of one measure.\tTherefore my answer relates to the land that lies over yonder, So that the sin and dole be of one measure.|Therefore my answer relates to the land that lies over yonder, So that joy and despair is of one measure.\t3,14|18,22\t3,9|13,16\tsubstitution|substitution\n3170_137482_000032_000000.wav\tAn hour later, two noblemen, friends of the senator, came in, one a few minutes after the other.|An hour later, two noblemen carrying great swords came in, one a few minutes after the other.\tAn hour later, two noblemen carrying great swords came in, one a few minutes after the other.|An hour later, two noblemen carrying great swords came in, one parrying a deadly strike with his sword, one lunging after the other.\t4,8|12,14\t4,7|11,19\tsubstitution|substitution\n1630_102884_000006_000000.wav\tIn the old order the king was given to understand that he was the freest individual in the world.|In the old order the king was to understand that he was the freest individual in the world.\tIn the old order the king was to understand that he was the freest individual in the world.|In the old order the king was to understand that he was the freest in the world.\t7|15\t6,7|13,14\tdeletion|deletion\n8173_294714_000033_000000.wav\t\"Promise that you won't ask me to borrow money of you for mr Van Brandt,\" she rejoined, \"and I will accept your help gratefully.\"|\"Promise that you won't ask me to borrow any money from the bank for the bail of you for mr Van Brandt,\" she rejoined, \"and I will accept your help gratefully.\"\t\"Promise that you won't ask me to borrow any money from the bank for the bail of you for mr Van Brandt,\" she rejoined, \"and I will accept your help gratefully.\"|\"Promise that you won't ask me to borrow any money from the bank for the bail of you for mr Van Brandt,\" she rejoined, \"and I accept your help gratefully.\"\t7,8|19\t8,14|25,26\tinsertion|deletion\n8297_275156_000023_000003.wav\tShall I say that she may expect an early visit from you, when I see her to morrow?|Shall I say that she certainly may expect an early visit from you, when I see her to morrow?\tShall I say that she certainly may expect an early visit from you, when I see her to morrow?|Shall I say that she certainly may expect an early visit from you, when my maid carries my message requesting that I see her to morrow?\t4,5|12,13\t5|14,20\tinsertion|insertion\n1686_142278_000039_000002.wav\tI think I could do anything but that: the idea of her distress turns me sick with dread.|I think I could do anything else: the idea of her distress turns me sick with dread.\tI think I could do anything else: the idea of her distress turns me sick with dread.|I think I could do anything else: the idea turns me sick with dread.\t6,7|10,12\t6|8,9\tsubstitution|deletion\n5338_284437_000013_000000.wav\t\"Come!\" commanded the woman who led the party; \"you three must follow me to the presence of Tourmaline.|\"Come!\" commanded the old wizard who led the party; \"you three must follow me to the presence of Tourmaline.\t\"Come!\" commanded the old wizard who led the party; \"you three must follow me to the presence of Tourmaline.|\"Come!\" commanded the old wizard who led the party; \"you three must quickly make your way to the presence of Tourmaline.\t3|11,12\t3,4|12,15\tsubstitution|substitution\n2086_149220_000027_000001.wav\t\"As to his character, we need not discuss its points; they have already been settled by a competent tribunal, or one which called itself competent.|\"As to his points; they have already been settled by a competent tribunal, or one which called itself competent.\t\"As to his points; they have already been settled by a competent tribunal, or one which called itself competent.|\"As to his points; they have already been settled by a competent law firm, or one which called itself competent.\t3,8|18\t2,3|12,13\tdeletion|substitution\n1919_142785_000047_000001.wav\tIt grows somewhat like the lily of the valley, but its height is about three feet.|It grows somewhat like the sunflower or the lily of the valley, but its height is about three feet.\tIt grows somewhat like the sunflower or the lily of the valley, but its height is about three feet.|It grows somewhat like the sunflower or the lily of the valley, but its height is just over four feet and width is about three feet.\t4,5|12,13\t5,7|16,22\tinsertion|insertion\nshow_2t9Kk4FHmiEkjNPJctidN6-7yurNieQHNgkfAk9eE4uCy.wav\tYeah, I'll tell you one guy wouldn't want to fish against.\tYeah, I'll tell you one guy to fish against.\t6,7\t5,6\tdeletion\nshow_2tTA2xYpcS5YuTIXzXakTu-72nwjiYkDKGYImtEsqN5KA.wav\tA number of family photographs and we couldn't identify the people in the photographs.\tA number of family photographs and we absolutely couldn't recognize the individuals in those photographs.\t7,12\t7,13\tsubstitution\nshow_2c04iZbAAIYmZrTIRgggNc-5kMxWwMd2NvZkSyiFZaULP.wav\tAnd now we have to fundamentally change this and change that we have the best economy in the world and the best decade we've ever had in human history.\tAnd now we have to fundamentally change this and ensure that we maintain the best economy in the world and the best decade we've ever had in human history.\t9,12\t9,12\tsubstitution\nshow_2CfS1shsOSeK8SjwiEV8du-22Vump0EG42cvL1I9JqRBV.wav\tAnd there are a lot of places in the movie where they could have just slipped it in just a little bit just to confirm that it happened.\tAnd there are actually multiple moments throughout the film where they could have just slipped it in just a little bit just to confirm that it happened.\t3,9\t3,8\tsubstitution\nshow_2T4Ue1V9k0S4uiTgUkPKEZ-1373jRsEGJsUlJrxsVnYWz.wav\tAnd you were developing it and you were working with I would assume School administrators.\tAnd you were developing it and you were also working closely with I would assume School administrators.\t8\t8,10\tsubstitution\nshow_2cYRReFdJFlfB2BULrbqfM-55Z6AspULdusRxBQysUp9e.wav\tI would not know what it mean means to latch onto a body, to be a single cell within that body.\tI would not know how to explain what it actually means to latch onto a body, to be a single cell within that body.\t3,4\t4,6\tinsertion\nshow_2CLetGT20MFsHqfeBN3fYl-4f1fxmGJW9MrfGxD7pCFvC.wav\tIt went out and it worked and it's scaled and ah it mine's great.\tIt went out and it scaled and it worked and ah it mine's great.\t5,8\t5,8\tsubstitution\nshow_2cSm7FgVuDH3IbmSlWkZzH-0hFwD7TSXO5c69BPwJzOfx.wav\tWe would just be open and willing to adopt whatever child God brought to her life.\tWe would just be excited to welcome whatever child God brought into her life.\t4,13\t4,11\tsubstitution\nshow_2T0wGFb5714hwSBVJgOXny-6s3OXLpYBaeweAF7RJL8kT.wav\tWell, we played China which we lost two times already that really helped us maybe if they weren't there maybe because I've done that because I heard their voices and lifted our Spirits.\tWell, we played China twice and we lost in both games that really helped us maybe if they weren't there maybe because I've done that because I heard their voices and lifted our Spirits.\t4,9\t4,10\tsubstitution\nshow_1TuEAft9VZR2lIZ1G2EceZ-11ZkFljNCjwftz1SIt7HFU.wav\tEnded at improving air quality within its borders.\tEnded at significantly improving air quality within its borders.\t1,2\t2\tinsertion\nshow_2Tq9eBynjdfY1BasX45Krb-2mlnB6AXQTdUIXevl9cVlc.wav\tYour 99 cents a month will go a long way to improving my podcast.\tYour 99 cents a month will go a long way in terms of improving podcast.\t9,10\t10\tinsertion\nshow_2c2IJzenX6Q6gJxc2aGRf8-5eUimgKIjnroT9AZIRQr7p.wav\tSort of famous spots to travel and hike and I've been to Lake Louise and I took Lake Louise and and that photo ended up in National Geographic online.\tSort of famous spots to travel and hike and I've been to Lake Louise and that photo ended up in National Geographic online.\t15,20\t14,15\tdeletion\nshow_2cARopVSXsbrWNyt0qEfWf-6hOLbfEH7wqMmi16SiIRSm.wav\tSecondary sleeves, pants, socks, gloves, and shoe color edit.\tSecondary sleeves, pants, socks, gloves, hat, tie, and shoe color edit.\t4,5\t5,6\tinsertion\nshow_28r3cKdOurjFZECEslXgC2-4jGHOLOoOdqe4LIf8TDUHP.wav\tCome full circle back to talking about something like that.\tCome full circle back to visiting some exotic new places like that.\t5,7\t5,9\tsubstitution\nshow_2t5hhjQSp2hYEutTsCpEwF-1jLJLlnxbhrsjyu4nwBKgr.wav\tThe reason I said I was 8 is because nothing in my brain told me to use water or to even remove my underwear.\tThe reason I said I was 8 is because nothing in the instruction manual told me to use water or to even remove my underwear.\t11,12\t11,13\tsubstitution\nshow_2c2IJzenX6Q6gJxc2aGRf8-4cWYuGIkcM95UsvHUEpJK4.wav\twhy we keep going back just because we want to be able to document these places while there aren't so many people visiting.\twhy we keep going back just because we want to be able to document so many people visiting.\t14,18\t13,14\tdeletion\nshow_1Cwk6m9lXuEd2rilGhWiGr-6QZBZLHGD3DCpZDETpjodI.wav\tNo to the chemical pollution, air pollution, and the destruction of the environment caused by factories and the manufacturing industry.\tNo to the chemical pollution, air pollution, no to the killing of plants and wildlife and the destruction of the environment caused by factories and the manufacturing industry.\t6,7\t7,14\tinsertion\nshow_2c2IJzenX6Q6gJxc2aGRf8-5sNE1N7WKOd53y40RUJOyD.wav\treally want to push with my channel like photography isn't some serious thing like that\treally want to push with my channel like because you know fishing isn't some serious thing like that\t8\t8,11\tsubstitution\nshow_1CdMgzPowibFyvgH7hnPZJ-1eO9qoY5JAcN2nNP2675tl.wav\tPositive way to improve your leadership and to improve the atmosphere within your team and the culture of your company.\tPositive way to improve your commitment to raising awareness of environmentalist causes within your team and the culture of your company.\t5,10\t5,11\tsubstitution\nshow_2T23esVRXBfFb5vigvG7A5-2ndcCw02nZHgp0WKFQ8lHe.wav\tIt's like you kind of like the best way I can describe it is like you kind of as you navigate your way through a creative field.\tIt's like you kind of like the best way I can describe it is that you need to always remember your personal vision as you navigate your way through a creative field.\t13,17\t13,22\tsubstitution\nshow_28gAb6BYOPQTAwtd6JivzK-5gbhBB6vzrxSApOcmcVTs5.wav\twant you guys to be able to feel comfortable being vulnerable with us.\twant you guys to be able to feel comfortable with being honest and truthful with us.\t9,10\t9,13\tsubstitution\nshow_2cDEjUoE1xIZqEMHdy2iLg-3BhVKbLFPasrUOxLgZNUbd.wav\tthat schedule is one per week and it will probably be like a Wednesday night thing because I plan on doing one to two videos per week.\tthat schedule is one per week and you will start to see a lot more content arriving because I plan on doing one to two videos per week.\t7,15\t7,16\tsubstitution\nshow_2CLetGT20MFsHqfeBN3fYl-0lZ9jnYVgXx7HmKUcdTnJO.wav\thedge a little bit in a traditional Market since and whether its buying a bunch of gpus and then reselling them for 2x the price ah that happened.\thedge a little bit in a traditional Market by buying up a whole lot of single family homes and then reselling them for 2x the price ah that happened.\t8,16\t8,17\tsubstitution\nshow_2TPvj8tyUhY2UHOzU9kyu4-6lnZyS5yzd3S4Vaqw5TrHy.wav\tOkay, so then he moves on he says so I understand now before we look at everything in more detail.\tOkay, so then he moves on he says so I understand now before inspecting everything in more detail.\t13,15\t13\tsubstitution\nshow_2cH1Sf7Tg3TiDdGpD3oLiR-0opjgwiSz3AWOOoE49L9pi.wav\tThe Patriots will just skiing blocking but their backs and tight ends, maybe tighten the formations a little bit.\tThe Patriots will just focus on their wide receivers and tight ends, maybe tighten the formations a little bit.\t4,8\t4,8\tsubstitution\nshow_28hFGrNqCyS73hMP94FALm-3NRcwegtutZLbw1YC2DhhM.wav\tThe GP did not recommend talking therapies.\tThe GP did not suggest talking therapies.\t4\t4\tsubstitution\nshow_2CJ6f4oLCccT3fsUaWAk9k-3fVgo6u94DJHpK7uP1Qb7V.wav\tAnd, like comment subscribe give me feedback give me feedback.\tAnd, like comment subscribe give me your thoughts and any feedback.\t6,8\t6,9\tsubstitution\nshow_2cNIhBNwWmamJs75G3tMxY-4UyKjZff8srwoG8A71ql2K.wav\tfeel safe to get naked emotionally and mentally to share how they overcome their pain and suffering and how they grew into these bright lights.\tfeel safe to get so incredibly overwhelmed emotionally and mentally to share how they overcome their pain and suffering and how they grew into these bright lights.\t4\t4,6\tsubstitution\nshow_2cNIhBNwWmamJs75G3tMxY-1xe6sJ3hUH8wCHnPxCjbwu.wav\tAnd so I looked at it as very much like an organic problem and I said okay my brain needs this.\tAnd so I looked at it as very much like a complex issue and I said okay my brain needs this.\t10,12\t10,12\tsubstitution\nshow_28qfNqUaAXdF3TcEGapJ1d-7uzzKzrT6ggIoqv9gRPz7E.wav\tBut yeah, I was I was never the best student first year college was actually really really good and I even had a full time job at a time.\tBut yeah, I would say that I was never the best student in class, but first year college was actually really really good and I even had a full time job at a time.\t3,9\t3,14\tsubstitution\nshow_1tl5wg2z0fzjWR18MHKARa-3auJGSBu9ERKSjw44eKkhj.wav\tIt was because partly was because I had such an Early Peek.\tIt was because at least partly because I had such an Early Peek.\t3,4\t3,5\tsubstitution\nshow_1ChaMDlb8CNR7Bta8ZxODC-6gI5xAKjYcPiQ2cANcnG9q.wav\tAnd if we don't make it a priority the distractions will get us one of the things I love so much about Jesus is if you go back and look at the gospels, he was so focused.\tAnd if we don't make it a priority the distractions will get us one of the things I admire about Jesus is if you go back and look at the gospels, he was so focused.\t18,20\t18\tsubstitution\nshow_2chnqxY9vGUWIxn4JvvRpZ-5WanEbFbdssEwK77TcezxC.wav\treally supportive friends and firefighters in the fire service who've inspired me to go out there and do this.\treally supportive colleagues, friends, and family and they inspired me to go out there and do this.\t2,9\t2,7\tsubstitution\nshow_1CHJvc14dYPq0IsX5T0YAP-2FKEiw2NrWejqlw9IkaB1X.wav\tWithin I'd say within like half a week things changed in my house the energy changed in my house the relationship with my wife started to change and I was like does the magic started to happen?\tWithin I'd say within like half a week things changed in my house the relationship with my wife started to change and I was like does the magic started to happen?\t14,19\t13,14\tdeletion\nshow_2cyslpwM45TtVfznjVlCnL-4ECn8gmQeSRJJmM3eHg4TF.wav\tHis music worked better when he did live action TV shows for suspense and humanistic reactions to like scenes and intense situations.\tHis music worked better when he did live action TV shows for suspense and emotional responses to like scenes and intense situations.\t14,15\t14,15\tsubstitution\nshow_2TXTWqxZkLHF6k4cd5F8XN-1N8w7dUDxxqtRErZObJrbG.wav\tHelping me find my identity and high school, which I also was fortunate enough to find this amazing woman.\tHelping me find my high school, which I also was fortunate enough to find this amazing woman.\t4,5\t3,4\tdeletion\nshow_2Cz04p7U4u2lLSofHLYIeH-0KUpyjDzatq7f6TWjWgAdf.wav\tpassion and you're not gonna see those results and it's gonna stop you from actually making it get into it because you love it.\tpassion and you're not gonna like them and it's gonna stop you from actually making it get into it because you love it.\t5,7\t5,6\tsubstitution\nshow_2TjptLx9uQUaHhp6YB8jhW-0YIfNwpxL2ztlaSsmBTCKL.wav\tAnother thing is anything inside the parentheses turns the opposite so negative becomes positive and a positive becomes negative.\tAnother thing is that in this equation anything inside the parentheses turns the opposite so negative becomes positive and a positive becomes negative.\t2,3\t3,6\tinsertion\nshow_2Chp07kvTN1qDImtrnXm4O-7mdEKKOHue6R5MLo283EQm.wav\thope hope you got a better feel of organic versus paid look definitely keep an eye out for upcoming episodes because I'm a dive a lot more deep into the paid social world.\thope hope you got a better feel of how instagram stars fund their extravagant vacations definitely keep an eye out for upcoming episodes because I'm a dive a lot more deep into the paid social world.\t8,11\t8,14\tsubstitution\nshow_2ctsjdVxkuzqftlC9TJASy-6iadzuoEBJ9AOLXaXPmagP.wav\tSo if you've been following my story, you will remember that I said earlier in this podcast that the Grammy nominations came out.\tSo if you've been following my story, you will remember that I said earlier that this week we had super exciting stuff to talk about because Grammy nominations came out.\t14,18\t14,25\tsubstitution\nshow_1cPkxhnrYWUvCzd0uXMKwo-1auCDHN3NrKq4Bn0OrE0lM.wav\tfreedom is made with a key.\tfreedom is made by effort not with a key.\t2,3\t3,5\tinsertion\nshow_2CZeMpXywYmWy53SV2kWEm-2Ic0xbN3defufBYR46ooEi.wav\tSo for more craziness now that French was conquered we have to join forces to Great Britain.\tSo for more craziness now that French was conquered by the Germans, we have to join forces to Great Britain.\t8,9\t9,11\tinsertion\nshow_2CyWjLhTGlpGHeSpJOvxj2-6Hvd5G0lyzP62VYPmP1jQj.wav\tIt was one of those things, you know, you have project sometimes you start on the bottom and sometimes you start at the top.\tIt was one of those things, you know, some people just start on the bottom and sometimes you start at the top.\t8,12\t8,10\tsubstitution\nshow_2cNgsFoVxaxZkUnVU3ehQu-0mgpNxV3cnsvy7RXtF9OHv.wav\tTwenty years later it became 20 thousand times worse.\tTwenty years later it became thousand times worse.\t5\t4,5\tdeletion\nshow_2czbki8aNirvUjlYcO3I1t-7kdfTr9l9Egod1iFPzIqkK.wav\tAs a body and some individuals on ways and means we were speaking about possibly just passing the sales price disclosure on residential property.\tAs a body and some individuals on ways and means we were speaking about possibly just banning them on residential property.\t16,20\t16,17\tsubstitution\nshow_2cFZSZNdkxKdiTEE7yrAMB-06KUOjkKFLQgxfnC59GMtT.wav\tTyler also introduces the lack of closure that will bother him increasingly throughout the album's front half.\tTyler also introduces in great detail its outcome on the album as a whole, the lack of closure that will bother him increasingly throughout the album's front half.\t2,3\t3,13\tinsertion\nshow_2C2dO6pWL4cPzOJ2Bu7QRA-3I34aJLdGXgCEuY6rd90Tm.wav\tAnd then the other matchup is Seattle visits Philadelphia now Philadelphia has a worse record, but because they were not able to win their division.\tAnd then the other matchup is Seattle visits Philadelphia now Seattle has the better record, but because they were not able to win their division.\t10,13\t10,13\tsubstitution\nshow_2c2IJzenX6Q6gJxc2aGRf8-0z0etCBM2PrHOLc9gxc25E.wav\tMore of a base and infrastructure to tell those stories rather than doing it out of a out of a tent with solar power.\tMore of a base and infrastructure to fight these battles instead of out of a tent with solar power.\t7,16\t7,11\tsubstitution\nshow_1CxjAV2kY4pypL256BmRQ6-531d49VH5hVVMzXfKhsMFf.wav\tSo the fourth episode May the fourth be with you.\tSo the fourth place winner will chat with you.\t3,7\t3,6\tsubstitution\nshow_2TI9Upbk0gXEdxsYTPzB9W-4x4pLTV2ZiA98TIIWkK0JH.wav\tThis year and and the word started to spread in the lacrosse community and just in general.\tThis year and and the word started to spread rapidly and without any sense of control in the slightest in the lacrosse community and just in general.\t8,9\t9,18\tinsertion\nshow_2cOpF3UhdxdvlZZzyOVPHt-3GXDpd2ZHpy9YTMkLAjuZq.wav\tJoey Scott and Richie all sat together at the creek.\tJoey Scott and Albert enjoyed fishing trout at the creek.\t3,6\t3,6\tsubstitution\nshow_2TXUkJOq3oBEn2ROormwza-6ogJCqF2Ya7qZ2L23AAoPd.wav\tAre equipped with sensors to monitor the proximity of surroundings and can open in even the tightest parking spaces.\tAre equipped with sensors to detect collisions and can open in even the tightest parking spaces.\t5,9\t5,6\tsubstitution\nshow_28OttmVaPSfuB6e4cqX0yu-2tB2ldmTxblsCsC8QH7jnm.wav\tAnd we're at this point.\tAnd we're all extremely excited at this point.\t1,2\t2,4\tinsertion\nshow_28DAnHzOfbUoRkpj5OMqVI-58LUphKYwegjJP2ZQFjmUH.wav\tYou know best to study every day after your classes, especially because you know, you're still in the mood you're still in that flow.\tYou know best to study when well rested and well fed and when you're still in that flow.\t5,18\t5,12\tsubstitution\nshow_2T8QRK60cWaPQflfo6Wuc4-4oTO10xL7hQQS2fuXBy1d7.wav\tIn the pursuit of lightness minimal stress ultimate fulfillment.\tIn the pursuit of calm serenity an escape from stress ultimate fulfillment.\t4,5\t4,8\tsubstitution\nshow_2CN1XNYxo4NFClfUajCtSM-1PrlYFjZzosbVg4BvKzbLJ.wav\tand and you know that she has been around for a few decades now longer and it has such a story that it it it was established in basketball.\tand and you know that she has been around for as long as many young people today have been watching and it has such a story that it it it was established in basketball.\t10,14\t10,19\tsubstitution\nshow_2t94ceh3K4qorKbKXJw7NV-5r2eumfkrw5Ym2WYexqEpK.wav\tHello and welcome to the first of hopefully many you cannot ingest podcast.\tHello and welcome to the second of hopefully many you cannot ingest podcast.\t5\t5\tsubstitution\nshow_2c3EDnMjSm9bAr1fQgLmMg-0jzn6k4JPy4s3XOiQZFFF8.wav\tThey sit down that these plot points need to happen because they have a whole Board of index cards full of notes that need to happen in the story.\tThey sit down that these plot points need to happen because they have a whole Board of like fifty index cards full of notes that need to happen in the story.\t16,17\t17,18\tinsertion\nshow_2cQVtitXsGYcp9kIYBi9VJ-7wZR6aZIx7PTYFcShbre2k.wav\tCommunity so I didn't ever feel that openness until I moved back and I wasn't in that realm anymore.\tCommunity so I didn't ever feel that openness until I moved across the country and I wasn't in that realm anymore.\t11\t11,13\tsubstitution\nshow_1C49KB0vYZsFe9eoFAr2Cq-6ZkOgQuv6e4y74xhDNKc4Y.wav\tIf you ask me what you are I would have Alex Caruso as the starting point guard for the Lakers.\tIf you ask me what you are I would have Alex Caruso out on the court playing as the starting point guard for the Lakers.\t11,12\t12,16\tinsertion\nshow_2CMZqwsTyimKMEGMIdOFCz-2xWHgQryE2ruRadxVVbdbD.wav\tReally going to talk about why us and why now for this podcast.\tReally going to talk about who we are why we're here and why now for this podcast.\t5,6\t5,10\tsubstitution\nshow_2t5PIVQePC6L3CFRpAUnaf-0f0tl83ucovdSpJHoftEU5.wav\tNo words just lightning breaking darkness and crashing into the Earth with brilliant presence.\tNo words just lightning breaking darkness and crashing into the surface of the Earth with brilliant presence.\t9,10\t10,12\tinsertion\nshow_2cGQMNoS6MuKFozuNYjCOQ-6qmAgAKLoYpSknCgQ0y6ET.wav\tFor making the title though because I need to get my numbers way up before I get there, but I'm gonna get there title of Iceland is definitely going to sign me and um, yeah.\tFor making the title though because I need to get my numbers way up before I get there, but I'm gonna get there title of Iceland is going to sign me and um, yeah.\t27\t26,27\tdeletion\nshow_2tgc74udMU420iVPvl597O-0fORVMXyI1aCUobzMKm5Ll.wav\tFeeling into the eyes and the temples and the entire facial structure.\tFeeling into the eyes and getting a sense of the entire facial structure.\t5,7\t5,8\tsubstitution\nshow_2csQINhTs2YQOWmpmy5gmJ-3J4UWcEHj2lQvk4lRog4LZ.wav\tIt had proven to be an exciting challenge the last time he subdued a couple and Israel's expecting his second victim to be by soon.\tIt had proven to be an exciting challenge the last time he subdued a couple and he couldn't wait for his victim to be by soon.\t16,19\t16,20\tsubstitution\nshow_2tYdWKnaDR4D2qgCHml2Ax-1ntgzgJweV4WPav6lZUeK9.wav\tHave three rounds of attack before you switch on the defense and then you're going to have three rounds of Defense before you switch on to attack.\tHave three rounds of attack before you switch on the defense and then you're going to have three rounds of Defense after which you repeat again on to attack.\t21,23\t21,25\tsubstitution\nshow_2TuwSyFIHWD1UxyBCMLnWT-4N24WWvGmHzFS0BoqfGNRE.wav\tbreak out of their shell a little bit and you see oh gosh, they're really way more Hardy than I thought or funny than I thought or whatever because it's the moment they've drench themselves like the other day.\tbreak out of their shell a little bit and you see oh gosh, they're really way more Hardy than I thought or funny than I thought or whatever because it's the moment they recovered from harsh cold weather of the other day.\t32,35\t32,38\tsubstitution\nshow_1CzCdrVrUH7JwgyZnVGYLh-6Q5gndks7qNDYlyWQNThsb.wav\tHey guys, Tim Jennings here with soul heart with another episode of search engine optimization tips and tricks trying to get your site found on Google and other search engines like that.\tHey guys, Tim Robinson hosting the show today with another episode of search engine optimization tips and tricks trying to get your site found on Google and other search engines like that.\t3,7\t3,7\tsubstitution\nshow_1CUdmqDR1A47vPMjsiK6m2-0vStekPNMu57qySDbgL4Bz.wav\tAnd I think that's uh it's it's a fascinating uh Dynamic but uh I wanna thank you.\tAnd I think that's absolutely a super fresh, new, and exciting Dynamic but uh I wanna thank you.\t4,9\t4,10\tsubstitution\nshow_1tUHam5eF5aw1ANOoTTNHY-00rYk6fUFND3sgPVnFfOx5.wav\tYou know your body first and foremost because that is so important.\tYou know your friends and family first and foremost because that is so important.\t3\t3,5\tsubstitution\nshow_1Tazwk3AUA0uz6jQk0X2qx-6AnUhuFsREJdKTZ5YtJN67.wav\tI actually got I took the BET and I bet on the Cavs winning.\tI actually got I took the BET and I bet on the Patriots with Tom Brady winning.\t12\t12,15\tsubstitution\nshow_1c7paeaWBSC8lM2WmoE7oI-7ngmygKXeMj6llnxB9E5W5.wav\tWe also have to be able to observe ourselves and how we behave, why do we refuse to rest?\tWe also have to be able to observe ourselves and contemplate our decisions, such as why do we refuse to rest?\t10,12\t10,14\tsubstitution\nshow_1tPIbAQXvAfaZ9w2aUDVn5-2Otc04LmTGhUMuBF8U36Bt.wav\tteachers in elementary school and middle school are not that different.\tteachers in elementary school and in most universities are not that different.\t5,6\t5,7\tsubstitution\nshow_1CnVxnXxFzJyqAVe0gxVao-2MZDt0KXGXSM6ciptUHsJI.wav\tmaybe take like two shots a day of like that drink and I'm sorry sure when I saw my doctor that Monday she did an ultrasound.\tmaybe take like a day off or something because after the weekend when I saw my doctor that Monday she did an ultrasound.\t3,14\t3,11\tsubstitution\nshow_1TH2TkfOKETXMhheVKhnSF-4OR6mYxdRwIdRfZAZyIg0d.wav\tInteresting and I think this is a comment a much more common phenomenon nowadays is that she just found out that she has a fifth sibling?\tInteresting and I think she just found out that she has a fifth sibling?\t4,15\t3,4\tdeletion\nshow_1CmHgwWKnKTU94RPoVJVhm-2FjSP20WACh8xlrfgo27lv.wav\tNow maybe should we why don't we push this out to situation Nation?\tNow maybe should we think about if we want to push this out to situation Nation?\t4,6\t4,9\tsubstitution\nshow_1cY9S6222J0jGzYbHGQKPs-7ImJPzwLhq2ZjRrbYBMANb.wav\tOkay, what's um, what's one genre people will be shocked to know that you read.\tOkay, what's um, what's one genre people will be shocked to know you really like to read.\t12,13\t12,15\tsubstitution\nshow_1T69Xe0EJ4n0gOO4RD9qv0-42elfJEncMhPZCtpdwUX2Q.wav\tTo buy that vodka or putting the money at the dock passive and there's one other thing that actually I'm not sure if you you guys are really aware.\tTo buy that vodka or any other alcohol you need to show proof of age and there's one other thing that actually I'm not sure if you you guys are really aware.\t5,11\t5,14\tsubstitution\nshow_1t3ZatwPEux3wUnXMUE62z-2VItlcCcQodDtxIm1hEgLc.wav\tI knew that if I didn't just start even if it wasn't perfect that I would never start.\tI knew that if I didn't just get to work on it even if it wasn't perfect that I would never start.\t7\t7,11\tsubstitution\nshow_1T6df6cejtcf12QJZN0yUu-5mvPGk6dS60f0LCPGjbR4D.wav\tJust because someone isn't saying anything while you're talking doesn't mean they are processing a single word.\tJust because someone is quiet while you're talking doesn't mean they are processing a single word.\t3,5\t3,4\tsubstitution\nshow_1cKkutPWS7rRmyOtrSwouo-79txjRa3xuTvzkjLhRvBgR.wav\tIs an infinitely constricting Paradox if I try and Define how much needs to be done before I can enjoy an emotional experience.\tIs an infinitely constricting Paradox if I try and figure out everything I have to do before I can enjoy an emotional experience.\t9,15\t9,15\tsubstitution\nshow_1C98g10rH9mj7aiTgRGEtH-416OTsevOhXjjB6asFyyK9.wav\tAnd like I look back to our branding uh two years ago, like you can see what the website looked like back then horrendous.\tAnd like I look back to our branding back when we were first starting out as a company, like you can see what the website looked like back then horrendous.\t8,11\t8,17\tsubstitution\nshow_1CMwbrEPRtk46eseEmxFOd-6FlNy7MMX7L4J5KCyVYWYM.wav\tIf you screenshot somebody though, like if they send a picture and you take a screenshot, I think that person knows that you have screenshotted them.\tIf you screenshot somebody though, like if they send a picture and you take a screenshot, I think there's a little notification in the app telling them that you have screenshotted them.\t18,20\t18,26\tsubstitution\nshow_1TTQPQzpjtXPKadzUx5vo6-1nVtCzKPNliNLJ91Ck5TSq.wav\tSo my last question for you guys talk to me about your most memorable moment or the aha moment or the that feeling of just it was so wonderful to be part of this club.\tSo my last question for you guys talk to me about that feeling of just it was so wonderful to be part of this club.\t11,20\t10,11\tdeletion\nshow_1c4MlC6ClLyP8osRCtdTUs-2GXhBpBNH9GrdHorlNBcPo.wav\tPersonal trainers pretty much pretty much a teacher is just a teacher teaching you in assisting Youth of the goals that you want.\tPersonal trainers pretty much are just coaches I mean really they're like pretty much a teacher is just a teacher teaching you in assisting Youth of the goals that you want.\t3,4\t4,11\tinsertion\nshow_1coo0trh2Do1KR6ev6Fczv-3Zr9rSN8B9pjuNMjZVcYVM.wav\tSo that's why there's a definite divided in people's opinion on this and that's why it's been such a highly talked about issue.\tSo that's why there's a definite divided in people's opinion on this which is likely also why it's been such a highly talked about issue.\t12,13\t12,15\tsubstitution\nshow_1cVKtsokch166IPm3tRg0U-4XdMT9MFto7G1IWnaH7fZV.wav\tProhibits that so by getting rid of homework.\tProhibits that so we're getting rid of homework.\t3\t3\tsubstitution\nshow_1CLAwGQAgTZIzV0TBj254v-51nbmcVD8allN0g5hLbhN7.wav\tWent Caspian and said Lord King slay me speedily as a great traitor for buy my silence.\tWent Caspian and said if you'll see me slain I ask only that it be done speedily as a great traitor for buy my silence.\t4,7\t4,15\tsubstitution\nshow_1TsDtgHbctWFu1B856QLI0-6LykTfQQJFPhKfoVzNdtgA.wav\tEnvironment has changed and yes, it is easy to say our environment is out to get us and it might not be your fault.\tEnvironment has changed and yes, it is easy to say our environment is dying right now and it might not be your fault.\t13,16\t13,15\tsubstitution\nshow_1cOsDxbQjLADedwZaG7Bm1-6mLz726LYCcgN69RWWlrOJ.wav\tFast cars, that had the nice clothes, that had the money, they was criminals.\tFast cars, that had the nice clothes, that had expensive gold watches, that had the money, they was criminals.\t8,9\t9,13\tinsertion\nshow_1ttEqOUCJnc7JAGNCWaAqq-471ymSOOetlSAecJK9Bfhr.wav\tKind of a great time he kind of gets to pair with uh Quinn Priester and those to kind of get to come up through the minor leagues together.\tKind of a great time he gets to team up with Quinn Priester and those to kind of get to come up through the minor leagues together.\t6,12\t6,10\tsubstitution\nshow_1CB8GHgtZAnsn6ihBUOWKo-1DyrYzUYIq5Zx4edeHge5Y.wav\tback the Coca Cola, and then everyone be happy and buy it more, then they make more money.\tback the Coca Cola, and then everyone buy it more, then they make more money.\t7,9\t6,7\tdeletion\nshow_1tzXR6tf3WGxV9nNWolDMN-5ZayFE8KG7W18jlM9t5d44.wav\tAnd, just either let the balloon go she would count down uh and then we would all think of what we wanted to let go and then we would let the balloon go or blow out our candles and then it was gone.\tAnd, just either let the balloon go she would count down uh and then we would celebrate this moment togather and then we would let the balloon go or blow out our candles and then it was gone.\t16,24\t16,19\tsubstitution\nshow_1tAewNZS0q8QPQpIIEUQQ0-3juUg3wFn3w7OFFo0sGe6R.wav\tWhen they killed them they turned back into the packed humans that were there.\tWhen they killed them they turned back into the terrified ponies that were there.\t9,10\t9,10\tsubstitution\nshow_1T15rqmPErKONqSx9rzr9H-726cSurFjtPFS9fiEAMT6b.wav\tUse those email templates verbatim verbatim, but make sure y'all very careful with them because there's merge codes that they have preselected that might not be.\tUse those email templates verbatim, but make sure y'all very careful with them because there's merge codes that they have preselected that might not be.\t4\t3,4\tdeletion\nshow_1cdpRq4rWNv1xYw3yab7b7-1BDuArBpFR2bZmv4cNafcl.wav\tSo I'm pretty sure I wanted to be a teacher so I could just tell everyone what to do.|So I'm pretty convinced that I wanted to be a teacher so I could just tell everyone what to do.\tSo I'm pretty convinced that I wanted to be a teacher so I could just tell everyone what to do.|So I'm pretty convinced that I wanted to be a teacher so that I can tell everyone what to do.\t3|11,13\t3,4|12,14\tsubstitution|substitution\nshow_2C0AgUOt4eCULjFjb3mynN-6Uv8Y4yw6o4V2zCKZrzrPg.wav\tSee why it's extremely valuable to it's kind of like it's kind of like having a wall hack to watch a demo.|See why it's extremely important right? it's kind of like it's kind of like having a wall hack to watch a demo.\tSee why it's extremely important right? it's kind of like it's kind of like having a wall hack to watch a demo.|See why it's extremely important right? it's kind of like having a rough time to watch a demo.\t4,5|10,17\t4,5|10,13\tsubstitution|substitution\nshow_2czpNd58pfuIxOCvO2czHu-2U9S7MpxvVUR6sPTdFRUWR.wav\tSo um yea that's it for this episode of the podcast what I will let say just eh that just as we come to the end of the podcast.|So um yea that's pretty much all for this episode of the podcast what I will let say just eh that just as we come to the end of the podcast.\tSo um yea that's pretty much all for this episode of the podcast what I will let say just eh that just as we come to the end of the podcast.|So um yea that's pretty much all for this episode of the podcast as we come to the end of the podcast.\t4|11,19\t4,6|12,13\tsubstitution|deletion\nshow_2c04iZbAAIYmZrTIRgggNc-4zacmnwJi3osMV5beOYGLu.wav\tThen at the same time in my mind mentally I kept screaming and yelling and mentally I'm thinking to myself I'm screaming and yelling at the top of my lungs.|Then at the same time I feel like I'm trapped mentally and I'm thinking to myself I'm screaming and yelling at the top of my lungs.\tThen at the same time I feel like I'm trapped mentally and I'm thinking to myself I'm screaming and yelling at the top of my lungs.|Then at the same time I feel like I'm trapped mentally and I'm thinking to myself I'm screaming at the top of my lungs.\t5,15|22,23\t5,11|17,18\tsubstitution|deletion\nshow_2co4uJEBlUoi9JanlRz6ls-1QGXaI6j7lYMr3jofmM7Vy.wav\tIf you ever wondered how I make my podcast guys, well I use anchor anchor is free.|If you ever thought about how I make my podcast guys, well I use anchor anchor is free.\tIf you ever thought about how I make my podcast guys, well I use anchor anchor is free.|If you ever thought about how I make my podcast guys, well the key is a tool called anchor anchor is free.\t3|11,12\t3,4|12,17\tsubstitution|substitution\nshow_1TMFh5H29pHWPD6KizMrlq-0nCgrfdU9zWUl6XJUnbsUX.wav\tserved an incredibly big purpose doing that that being said all of that was me trying to instill those things into my life.|served an incredibly long time doing that that being said all of that was me trying to instill those things into my life.\tserved an incredibly long time doing that that being said all of that was me trying to instill those things into my life.|served an incredibly long time doing that that being said all of that was me trying to instill things into my life.\t3,4|18\t3,4|17,18\tsubstitution|deletion\nshow_28ZmEMgyEUzHCmoW9DdwK3-12YTpVg7Ko2mRc4Si6OtDu.wav\tBe a good stress as well something that you know, you could be controlling something that won't you know, take a mental toll on you.|Be a good stress as well you know, you could be controlling something that won't you know, take a mental toll on you.\tBe a good stress as well you know, you could be controlling something that won't you know, take a mental toll on you.|Be a good stress as well you know, you could be controlling something that will not take a mental toll on you.\t6,7|16,18\t5,6|14,15\tdeletion|substitution\nshow_2toX0f3dPmI8gmUSOKZicx-1fJ8FUGSZLyb5fpbd3QDSi.wav\tThis year has been like my entire Journey so far in the music business and I'm just looking forward to what's to come.|This year has been the best part of my Journey so far in the music business and I'm just looking forward to what's to come.\tThis year has been the best part of my Journey so far in the music business and I'm just looking forward to what's to come.|This year has been the best part of my Journey so far in the acting business and I'm just looking forward to what's to come.\t4,6|12\t4,8|14\tsubstitution|substitution\nshow_2txZW3TWakg6Pr41kcbiA6-2MlY5WOs8ScY5zTfGRJHDc.wav\tAnd but with this job it was like I was staring at a computer like for 10 hours 8 hours and then maybe doing therapy like for nine hours a week.|And but with this job I had to just be like reading or typing away on a computer like for 10 hours 8 hours and then maybe doing therapy like for nine hours a week.\tAnd but with this job I had to just be like reading or typing away on a computer like for 10 hours 8 hours and then maybe doing therapy like for nine hours a week.|And but with this job I had to just be like reading or typing away on a computer like for 10 hours 8 hours and then maybe doing digital art for nine hours a week.\t5,11|24,25\t5,15|28,29\tsubstitution|substitution\nshow_2CN1XNYxo4NFClfUajCtSM-75tS2ZoJCscJetPxi0aukT.wav\tSo, you know like there was a there was an example where I bought two or three pair and literally just gave them to Goodwill as I was moving because the I never wore them they still had tags on them.|So, you know like there was an example where I bought two or three pair and literally just gave them to Goodwill as I was moving because the I never wore them they still had tags on them.\tSo, you know like there was an example where I bought two or three pair and literally just gave them to Goodwill as I was moving because the I never wore them they still had tags on them.|So, you know like there was an example where I bought two or three pair and then just gave them to Goodwill as I was moving because the I never wore them they still had tags on them.\t6,8|19\t5,6|16\tdeletion|substitution\nshow_2Cp52s1B4vepSJi2F8gmU9-36PtNWkMxWZtxbqBJ4mUXD.wav\tAnd I want to mention that there were a couple of teachers who really helped me during that time.|And I want to mention that there were a couple of great teachers who really helped me during that time.\tAnd I want to mention that there were a couple of great teachers who really helped me during that time.|And I want to mention that there were a couple of great teachers who noticed and reached out when I was struggling and helped me during that time.\t10,11|13\t11|14,22\tinsertion|substitution\nshow_2T23esVRXBfFb5vigvG7A5-6JivmdWNP3UnZiIOplv953.wav\tIt's hard to say how I get things off the ground because I just get going like I don't know how to explain it.|It's hard to say how I get the system running so quickly because I just get going like I don't know how to explain it.\tIt's hard to say how I get the system running so quickly because I just get going like I don't know how to explain it.|It's hard to say how I get the system running so quickly because I just get going I don't know how to explain it.\t7,10|16\t7,11|16,17\tsubstitution|deletion\nshow_2T3Pjyw6MJEwPE9uixrYak-7M5817WSsGaldlQfZptcyf.wav\tI know now how extremely lucky that truly is what a blessing Not only was I going to be a mom but besides nausea all my other symptoms went away.|I know now how incredibly lucky I really was, what a blessing Not only was I going to be a mom but besides nausea all my other symptoms went away.\tI know now how incredibly lucky I really was, what a blessing Not only was I going to be a mom but besides nausea all my other symptoms went away.|I know now how incredibly lucky I really was, what a blessing Not only was I going to be a mom but except for nausea all my other symptoms went away.\t4,8|22\t4,8|22,23\tsubstitution|substitution\nshow_1C5B3zuyd67j7v9XRKNb2L-4Az7OglwsgYR94ikvOZdCf.wav\tPast something and I have so many things that I have planned for this podcast, but first before we get into any of that I'm going to introduce myself.|Past something and I have so many things that I have planned to talk about today, but first before we get into any of that I'm going to introduce myself.\tPast something and I have so many things that I have planned to talk about today, but first before we get into any of that I'm going to introduce myself.|Past something and I have so many things that I have planned to talk about today, but first before we get into any of that I would like to introduce myself.\t12,14|24,25\t12,15|25,27\tsubstitution|substitution\nshow_1c8f0MS5LcfbSvwexFC9mn-1MY1u1xOyiFAWXGRqyPJj7.wav\tYou know with hesitation everything is counted to the T and says if every drink is measured, how are you going to give a regular an honest poor?|You know with hesitation everything is counted to the T and says if you're calculating the nutritional information, how are you going to give a regular an honest poor?\tYou know with hesitation everything is counted to the T and says if you're calculating the nutritional information, how are you going to give a regular an honest poor?|You know with hesitation everything is counted to the T and says if you're calculating the nutritional information, how are you going to provide the same service to an honest poor?\t13,16|22,24\t13,17|23,27\tsubstitution|substitution"
  },
  {
    "path": "cog.yaml",
    "content": "# Configuration for Cog ⚙️\n# Reference: https://github.com/replicate/cog/blob/main/docs/yaml.md\n\nbuild:\n  gpu: true\n  system_packages:\n    - libgl1-mesa-glx\n    - libglib2.0-0\n    - ffmpeg\n    - espeak-ng\n  python_version: \"3.11\"\n  python_packages:\n    - torch==2.1.0\n    - torchaudio==2.1.0 \n    - xformers\n    - phonemizer==3.2.1\n    - whisperx==3.1.1\n    - openai-whisper>=20231117\n  run:\n    - git clone https://github.com/facebookresearch/audiocraft && pip install -e ./audiocraft\n    - pip install \"pydantic<2.0.0\"\n    - curl -o /usr/local/bin/pget -L \"https://github.com/replicate/pget/releases/download/v0.6.0/pget_linux_x86_64\" && chmod +x /usr/local/bin/pget\n    - mkdir -p /root/.cache/torch/hub/checkpoints/ && wget --output-document \"/root/.cache/torch/hub/checkpoints/wav2vec2_fairseq_base_ls960_asr_ls960.pth\" \"https://download.pytorch.org/torchaudio/models/wav2vec2_fairseq_base_ls960_asr_ls960.pth\"\npredict: \"predict.py:Predictor\"\n"
  },
  {
    "path": "config.py",
    "content": "import argparse\n\n\ndef MyParser():\n    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)\n    # general training \n    parser.add_argument(\"--seed\", type=int, default=1)\n    parser.add_argument(\"--precision\", type=str, default=\"float16\")\n    parser.add_argument(\"--num_workers\", type=int, default=8)\n    parser.add_argument(\"--resume\", action=\"store_true\", default=False)\n    parser.add_argument(\"--tb_write_every_n_steps\", type=int, default=100)\n    parser.add_argument(\"--print_every_n_steps\", type=int, default=400)\n    parser.add_argument(\"--val_every_n_steps\", type=int, default=800)\n    parser.add_argument(\"--lr\", type=float, default=0.05)\n    parser.add_argument(\"--batch_size\", type=int, default=100, help=\"this is the effective batch size, no matter whether using gradient_accumulation_steps, not used if we specified max_num_tokens\")\n    parser.add_argument(\"--max_num_tokens\", type=int, default=100000, help=\"max number of encodec tokens per gpu, this is only used when using dynamic batching, will ignore batch size. Note this is the final effective batch size per GPU, i.e. gradient accumulated batch size per gpu\")\n    parser.add_argument(\"--val_max_num_tokens\", type=int, default=None, help=\"FOR validation\")\n    parser.add_argument(\"--num_buckets\", type=int, default=6, help='used for dynamic batching, bucketing the samples based on the number of tokens')\n    parser.add_argument(\"--dynamic_batching\", type=int, default=0)\n    parser.add_argument(\"--weight_decay\", type=float, default=1e-2)\n    parser.add_argument(\"--warmup_fraction\", type=float, default=0.01, help=\"use linear warmup, the proportion of the training steps that are used for warming up\")\n    parser.add_argument(\"--num_epochs\", type=int, default=10)\n    parser.add_argument(\"--num_steps\", type=int, default=None, help=\"if not None, will ignore n_epochs and use num_steps as the total number of amount of training, can try e.g. 400000 i.e. 400k steps\")\n    parser.add_argument(\"--gradient_accumulation_steps\", type=int, default=1)\n    parser.add_argument(\"--gradient_clip_val\", type=float, default=1.0, help=\"the value for torch.nn.utils.clip_grad_norm_(), not used if we use ScaledAdam optimizer\")\n    parser.add_argument(\"--early_stop_step\", type=int, default=3200, help=\"stop training after this many steps of non-improvement\")\n    parser.add_argument(\"--early_stop_threshold\", type=float, default=-1.0, help=\"early stop after the improvement is below this threshold for certain number of steps\")\n\n    # optimizer focused\n    parser.add_argument(\"--optimizer_name\", type=str, default=\"AdamW\", help=\"can also use ScaledAdam, in which case we'll also use the Eden scheduler\")\n    parser.add_argument(\"--reduce_lr_start_step\", type=int, default=3000, help='after which significantly reduce the lr. a param for the eden optimizer')\n    parser.add_argument(\"--pseudo_epoch_size\", type=int, default=3000, help=\"only use for Eden scheduler.\")\n    parser.add_argument(\"--reduce_lr_start_epoch\", type=int, default=4)\n    parser.add_argument(\"--clipping_update_period\", type=int, default=600)\n\n\n    # path\n    parser.add_argument(\"--exp_dir\", type=str, default=None, help=\"will be combined with dataset name\")\n    parser.add_argument(\"--dataset\", type=str, help=\"e.g. 'libritts', 'gigaspeech', they are folder name in the data dir also\")\n    parser.add_argument(\"--dataset_dir\", type=str, help=\"need to be compatible with corresponding dataset py file\")\n    parser.add_argument(\"--phn_folder_name\", type=str, default=\"phonemes\", help=\"for libritts I also have arpa phns, in which case should be phonemes_arpa\")\n    parser.add_argument(\"--encodec_folder_name\", type=str, default=\"encodec_16khz_4codebooks\", help=\"folder where encodec codes are stored\")\n    parser.add_argument(\"--manifest_name\", type=str, default=\"manifest\", help=\"metadata filename\")\n\n    # data focused\n    parser.add_argument(\"--pad_x\", type=int, default=1, help=\"whether or not always pad x to have text_max_length. select 1 to get the maximal memory consumption, but the actual case should be smaller, better to have it being 0\")\n    parser.add_argument(\"--audio_max_length\", type=float, default=20, help=\"in second, crop or drop the audio is length is longer than this\")\n    parser.add_argument(\"--audio_min_length\", type=float, default=2, help=\"in second, drop the audio if length is shorter than this\")\n    parser.add_argument(\"--text_max_length\", type=int, default=400, help='if too long, we crop or drop')\n    parser.add_argument(\"--text_min_length\", type=float, default=10, help=\"if too short, will drop\")\n    parser.add_argument(\"--encodec_sr\", type=int, default=50, help=\"for my encodec that takes 16kHz audio with a downsample rate of 320, the codec sample rate is 50Hz, i.e. 50 codes (x n_codebooks) per second\")\n    parser.add_argument(\"--drop_long\", type=int, default=0, help=\"if this is true, will drop example whose encodec sequence or phone sequence is too long, rather than cropping, to reduce hellucination\")\n\n    # encodec and token rearrangement\n    parser.add_argument('--mask_len_min', type=int, default=1, help='Minimum mask length')\n    parser.add_argument('--mask_len_max', type=int, default=600, help='Maximum mask length')\n    parser.add_argument(\"--eos\", type=int, default=-1, help=\"this is to be used with reduced_eog, where we end the utterance with eos, and end the generated segment with eog, also when this is used, the n_special should be 4\")\n    parser.add_argument(\"--reduced_eog\", type=int, default=0, help=\"for the non-final segments, do not insert eog at the end, this could hopefully solve the early stopping issue when doing tts\")\n    parser.add_argument(\"--special_first\", type=int, default=0, help=\"if 1, need to have special tokens to be the first few tokens, e.g. 0, 1, 2, which means we need to adjust the preprocessing and postprocessing of the encodec codes. note that we hard coded to have 3 special tokens\")\n    parser.add_argument(\"--n_special\", type=int, default=3, help=\"empty, eog, pad, (eos)\")\n    parser.add_argument(\"--codebook_weight\", type=str, default=None, help=\"e.g. ['5','1','0.5','0.1']\")\n    parser.add_argument(\"--max_mask_portion\",type=float,default=0.7,help=\"should mask a utterance for more than this portion\")\n    parser.add_argument(\"--max_n_spans\", type=int, default=3, help='maximal number of spans, only use when using multicm3, this is used to decide number of mask_embedding, and max clamp value if use Poisson distribution, if use uniform distribution to sample number of spans if will be uniform(1,max_n_spans)')\n    parser.add_argument(\"--shuffle_mask_embedding\", type=int, default=0, help=\"whether shuffle the mask embedding, so that mask:0 is not the most well trained, default is not shuffling. The default has it's benefit, as it make sure that mask:0 always appear the first\")\n    parser.add_argument(\"--mask_sample_dist\", type=str, default=\"poisson1\", help=\"uniform or poissonx, e.g. poisson1, meaning the parameter lambda is 1, it will most likely sample 1 masks\")\n    parser.add_argument(\"--min_gap\", type=int, default=5, help=\"after sampled starts, delete later one if it closer to the former start than the min_gap\")\n    parser.add_argument('--n_codebooks', type=int, default=4)\n    parser.add_argument('--text_vocab_size', type=int, default=100, help='Size of text vocabulary')\n    parser.add_argument('--text_pad_token', type=int, default=100, help='padding of the text tokens, not attended')\n    parser.add_argument('--audio_vocab_size', type=str, default='2048', help=\"Size of audio vocabulary\")\n    parser.add_argument(\"--empty_token\", default=2048, type=int, help=\"indicating the no token at the position for the codebook\")\n    parser.add_argument('--eog', type=int, default=2049, help='End of generation token')\n    parser.add_argument('--audio_pad_token', type=int, default=2050, help='padding of the encodec codes, not attended')\n\n    # model focused\n    parser.add_argument('--d_model', type=int, default=2048, help='Model dimension')\n    parser.add_argument('--audio_embedding_dim', type=int, default=2048, help='dimension for encodec continues embedding (before being quantized)')\n    parser.add_argument('--text_embedding_dropout', type=float, default=0.1, help='Dropout for text embedding')\n    parser.add_argument('--audio_embedding_dropout', type=float, default=0, help='Dropout for audio embedding')\n    parser.add_argument('--text_positional_embedding_dropout', type=float, default=0.1, help='Dropout for text positional embedding')\n    parser.add_argument('--audio_positional_embedding_dropout', type=float, default=0.1, help='Dropout for audio positional embedding')\n    parser.add_argument('--trm_dropout', type=float, default=0.1, help='Dropout for transformer')\n    parser.add_argument('--nhead', type=int, default=16, help='Number of attention heads')\n    parser.add_argument('--num_decoder_layers', type=int, default=16, help='Number of decoder layers')\n    parser.add_argument('--load_model_from', type=str, default=None, help='Path to load model from, this will be effective last, so will overwrite all previous load, including resume')\n    return parser"
  },
  {
    "path": "data/__init__.py",
    "content": ""
  },
  {
    "path": "data/gigaspeech.py",
    "content": "import os\nimport torch\nimport random\nimport copy\nimport logging\nimport shutil\n\nclass dataset(torch.utils.data.Dataset):\n    def __init__(self, args, split):\n        super().__init__()\n        self.args = args\n        self.split = split\n        assert self.split in ['train', 'validation', 'test']\n        manifest_fn = os.path.join(self.args.dataset_dir, self.args.manifest_name, self.split+\".txt\")\n\n        with open(manifest_fn, \"r\") as rf:\n            data = [l.strip().split(\"\\t\") for l in rf.readlines()]\n        lengths_list = [int(item[-1]) for item in data]\n        self.data = []\n        self.lengths_list = []\n        for d, l in zip(data, lengths_list):\n            if l >= self.args.encodec_sr*self.args.audio_min_length:\n                if self.args.drop_long and l > self.args.encodec_sr*self.args.audio_max_length:\n                    continue\n                self.data.append(d)\n                self.lengths_list.append(l)\n        logging.info(f\"number of data points for {self.split} split: {len(self.lengths_list)}\")\n\n        # phoneme vocabulary\n        vocab_fn = os.path.join(self.args.dataset_dir,\"vocab.txt\")\n        shutil.copy(vocab_fn, os.path.join(self.args.exp_dir, \"vocab.txt\"))\n        with open(vocab_fn, \"r\") as f:\n            temp = [l.strip().split(\" \") for l in f.readlines() if len(l) != 0]\n            self.phn2num = {item[1]:int(item[0]) for item in temp}\n        \n        self.symbol_set = set([\"<SIL>\", \"<MUSIC>\", \"<NOISE>\", \"<OTHER>\"])\n    \n    def __len__(self):\n        return len(self.lengths_list)\n    \n    def _load_phn_enc(self, index):\n        item = self.data[index]\n        pf = os.path.join(self.args.dataset_dir, self.args.phn_folder_name, item[1]+\".txt\")\n        ef = os.path.join(self.args.dataset_dir, self.args.encodec_folder_name, item[1]+\".txt\")\n        try:\n            with open(pf, \"r\") as p, open(ef, \"r\") as e:\n                phns = [l.strip() for l in p.readlines()]\n                assert len(phns) == 1, phns\n                x = [self.phn2num[item] for item in phns[0].split(\" \") if item not in self.symbol_set] # drop [\"<SIL>\", \"<MUSIC>\", \"<NOISE>\", \"<OTHER>\"], as they are not in training set annotation\n                encos = [l.strip().split() for k, l in enumerate(e.readlines()) if k < self.args.n_codebooks]\n                \n                assert len(encos) == self.args.n_codebooks, ef\n                if self.args.special_first:\n                    y = [[int(n)+self.args.n_special for n in l] for l in encos]\n                else:\n                    y = [[int(n) for n in l] for l in encos]\n        except Exception as e:\n            logging.info(f\"loading failed for {pf} and {ef}, maybe files don't exist or are corrupted\")\n            logging.info(f\"error message: {e}\")\n            return [], [[]]\n\n        return x, y\n\n    def __getitem__(self, index):\n        x, y = self._load_phn_enc(index)\n        x_len, y_len = len(x), len(y[0])\n\n        if x_len == 0 or y_len == 0:\n            return {\n            \"x\": None, \n            \"x_len\": None, \n            \"y\": None, \n            \"y_len\": None, \n            \"y_mask_interval\": None, # index y_mask_interval[1] is the position of start_of_continue token\n            \"extra_mask_start\": None # this is only used in VE1\n            }\n        while y_len < self.args.encodec_sr*self.args.audio_min_length:\n            assert not self.args.dynamic_batching\n            index = random.choice(range(len(self))) # regenerate an index\n            x, y = self._load_phn_enc(index)\n            x_len, y_len = len(x), len(y[0])\n        if self.args.drop_long:\n            while x_len > self.args.text_max_length or y_len > self.args.encodec_sr*self.args.audio_max_length:\n                index = random.choice(range(len(self))) # regenerate an index\n                x, y = self._load_phn_enc(index)\n                x_len, y_len = len(x), len(y[0])\n\n        ### padding and cropping below ###\n        ### padding and cropping below ###\n        # adjust the length of encodec codes, pad to max_len or randomly crop\n        orig_y_len = copy.copy(y_len)\n        max_len = int(self.args.audio_max_length * self.args.encodec_sr)\n        if y_len > max_len:\n            audio_start = random.choice(range(0, y_len-max_len))\n            for i in range(len(y)):\n                y[i] = y[i][audio_start:(audio_start+max_len)]\n            y_len = max_len\n        else:\n            audio_start = 0\n            if not self.args.dynamic_batching:\n                pad = [0] * (max_len - y_len) if self.args.sep_special_token else [self.args.audio_pad_token] * (max_len - y_len)\n                for i in range(len(y)):\n                    y[i] = y[i] + pad\n        \n        # adjust text\n        # if audio is cropped, and text is longer than max, crop max based on how audio is cropped\n        if audio_start > 0 and len(x) > self.args.text_max_length: # if audio is longer than max and text is long than max, start text the way audio started\n            x = x[int(len(x)*audio_start/orig_y_len):]\n            if len(x) > self.args.text_max_length: # if text is still longer than max, cut the end\n                x = x[:self.args.text_max_length]\n        \n        x_len = len(x)\n        if x_len > self.args.text_max_length:\n            text_start = random.choice(range(0, x_len - self.args.text_max_length))\n            x = x[text_start:text_start+self.args.text_max_length]\n            x_len = self.args.text_max_length\n        elif self.args.pad_x and x_len <= self.args.text_max_length:\n            pad = [0] * (self.args.text_max_length - x_len) if self.args.sep_special_token else [self.args.text_pad_token] * (self.args.text_max_length - x_len)\n            x = x + pad\n        ### padding and cropping above ###\n        ### padding and cropping above ###\n\n        return {\n            \"x\": torch.LongTensor(x), \n            \"x_len\": x_len, \n            \"y\": torch.LongTensor(y), \n            \"y_len\": y_len\n            }\n            \n\n    def collate(self, batch):\n        out = {key:[] for key in batch[0]}\n        for item in batch:\n            if item['x'] == None: # deal with load failure\n                continue\n            for key, val in item.items():\n                out[key].append(val)\n        res = {}\n        if self.args.pad_x:\n            res[\"x\"] = torch.stack(out[\"x\"], dim=0)\n        else:\n            res[\"x\"] = torch.nn.utils.rnn.pad_sequence(out[\"x\"], batch_first=True, padding_value=self.args.text_pad_token)\n        res[\"x_lens\"] = torch.LongTensor(out[\"x_len\"])\n        if self.args.dynamic_batching:\n            if out['y'][0].ndim==2:\n                res['y'] = torch.nn.utils.rnn.pad_sequence([item.transpose(1,0) for item in out['y']],padding_value=self.args.audio_pad_token)\n                res['y'] = res['y'].permute(1,2,0) # T B K -> B K T\n            else:\n                assert out['y'][0].ndim==1, out['y'][0].shape\n                res['y'] = torch.nn.utils.rnn.pad_sequence(out['y'], batch_first=True, padding_value=self.args.audio_pad_token)\n        else:\n            res['y'] = torch.stack(out['y'], dim=0)\n        res[\"y_lens\"] = torch.LongTensor(out[\"y_len\"])\n        res[\"text_padding_mask\"] = torch.arange(res['x'][0].shape[-1]).unsqueeze(0) >= res['x_lens'].unsqueeze(1)\n        res[\"audio_padding_mask\"] = torch.arange(res['y'][0].shape[-1]).unsqueeze(0) >= res['y_lens'].unsqueeze(1)\n        return res"
  },
  {
    "path": "data/phonemize_encodec_encode_hf.py",
    "content": "import argparse\ndef parse_args():\n    parser = argparse.ArgumentParser(description=\"encode the librilight dataset using encodec model\")\n    parser.add_argument(\"--dataset_size\", type=str, default='xs', help='sizes of gigaspeech, xs, s, m, l, xl. we use xl for VoiceCraft training, xs is good for debugging')\n    parser.add_argument('--download_to', type=str, default=\"/data/scratch/pyp/datasets/gigaspeech_debug\", help=\"dir where you want the huggingface gigaspeech dataset to be downloaded to\")\n    parser.add_argument('--save_dir', type=str, default=\"/data/scratch/pyp/datasets/gigaspeech_phn_enc_manifest_debug\", help=\"path to the manifest, phonemes, and encodec codes dirs\")\n    parser.add_argument('--encodec_model_path', type=str, default=\"/data/scratch/pyp/exp_pyp/audiocraft/encodec/xps/6f79c6a8/checkpoint.th\")\n    parser.add_argument('--n_workers', type=int, default=4, help=\"Number of parallel worker processes\")\n    parser.add_argument('--mega_batch_size', type=int, default=100, help=\"Number of samples in each mega batch for multiprocess dataloading\")\n    parser.add_argument('--batch_size', type=int, default=4, help=\"batch size for encodec encoding, decrease it if OOM. This is the sum of batch size *over each gpu*, so increase it if you are using more gpus\")\n    parser.add_argument('--model_sr', type=int, default=16000, help='encodec input audio sample rate')\n    parser.add_argument('--downsample_rate', type=int, default=320, help='encodec downsample rate')\n    parser.add_argument('--model_code_sr', type=int, default=50, help='encodec model code sample rate')\n    parser.add_argument('--len_cap', type=float, default=35.0, help='will drop audios that are longer than this number')\n    parser.add_argument('--max_len', type=int, default=30000, help='max length of audio in samples, if exceed, will cut a batch into half to process, decrease this number if OOM on your machine')\n    return parser.parse_args()\nif __name__ == \"__main__\":\n    import logging\n    formatter = (\n        \"%(asctime)s [%(levelname)s] %(filename)s:%(lineno)d || %(message)s\"\n    )\n    logging.basicConfig(format=formatter, level=logging.INFO)\n    args = parse_args()\n\n    import os\n    import numpy as np\n    import torch\n    import tqdm\n    import time\n    from datasets import load_dataset, DownloadConfig\n\n    from tokenizer import TextTokenizer, tokenize_text\n    \n    # get the path\n    phn_save_root = os.path.join(args.save_dir, args.dataset_size, \"phonemes\")\n    codes_save_root = os.path.join(args.save_dir, args.dataset_size, \"encodec_16khz_4codebooks\")\n    vocab_fn = os.path.join(args.save_dir, args.dataset_size, \"vocab.txt\")\n    os.makedirs(phn_save_root, exist_ok=True)\n    os.makedirs(codes_save_root, exist_ok=True)\n\n\n    def sort_by_audio_len(lens):\n        inds = np.argsort(lens).tolist()\n        logging.info(f\"longest: {lens[inds[-1]]*args.model_code_sr} encodec codes, {lens[inds[-1]]:.2f} sec.\")\n        logging.info(f\"shortest: {lens[inds[0]]*args.model_code_sr} encodec codes, {lens[inds[0]]:.2f} sec.\")\n        logging.info(f\"median: {lens[inds[len(inds)//2]]*args.model_code_sr} encodec codes, {lens[inds[len(inds)//2]]:.2f} sec.\")\n        logging.info(f\"95 percentile longest: {lens[inds[int(len(inds)*0.95)]]*args.model_code_sr} encodec codes, {lens[inds[int(len(inds)*0.95)]]:.2f} sec.\")\n        return inds[::-1]\n    \n    def write_array_to_txt_file(array, filename):\n        with open(filename, 'w') as f:\n            for a in array[:-1]:\n                f.write(' '.join(map(str, a))+'\\n')\n            f.write(' '.join(map(str, array[-1])))\n    \n\n    ### phonemization\n    # load tokenizer\n    # load the encodec model\n    from audiocraft.solvers import CompressionSolver\n    model = CompressionSolver.model_from_checkpoint(args.encodec_model_path)\n    model = model.cuda()\n    model = model.eval()\n    text_tokenizer = TextTokenizer()\n\n\n    # https://github.com/SpeechColab/GigaSpeech\n    # there are only four different punctuations\n    # need to check whether there are other < started strings\n    punc2sym = {\" <COMMA>\": \",\", \" <PERIOD>\": \".\", \" <QUESTIONMARK>\": \"?\", \" <EXCLAMATIONPOINT>\": \"!\"} # note the space in front of each punc name\n    gar2sym = {\"<SIL>\": \"#%#\", \"<MUSIC>\": \"##%\", \"<NOISE>\": \"%%#\", \"<OTHER>\":\"%#%\"} # so that they are savely keep as the original sym when using tokenize_text\n    punc2sym.update(gar2sym)\n\n    word2sym = { \"h æ ʃ h ɐ ʃ p ɚ s ɛ n t\": \"<MUSIC>\", \"h æ ʃ p ɚ s ɛ n t h æ ʃ\": \"<SIL>\", \"p ɚ s ɛ n t h ɐ ʃ p ɚ s ɛ n t\": \"<OTHER>\", \"p ɚ s ɛ n t p ɚ s ɛ n t h æ ʃ\": \"<NOISE>\"}\n    forbidden_words = set(['#%#', '##%', '%%#', '%#%'])\n\n    dc = DownloadConfig(cache_dir=args.download_to)\n    stime = time.time()\n    logging.info(\"loading the dataset...\")\n    gs = load_dataset(\"speechcolab/gigaspeech\", args.dataset_size, use_auth_token=True, cache_dir = args.download_to, download_config=dc)\n    logging.info(f\"time spend on loading the dataset: {time.time() - stime:.2f} seconds\")\n\n    splits = ['validation', 'test', 'train']\n    \n    logging.info(f\"gigaspeech dataset {args.dataset_size} info: {gs}\")\n    logging.info(f\"phonemizing...\")\n    phn_vocab = set()\n    all_lens = []\n    \n    # you will see a ton of [WARNING] words_mismatch.py:88......, it's not a issue\n    for split in tqdm.tqdm(splits):\n        skip = 0\n        logging.info(f\"now processing split {split}...\")\n        for item in tqdm.tqdm(gs[split]):\n            save_fn = os.path.join(phn_save_root, item['segment_id']+\".txt\")\n            text = item['text']\n            if sum(word in forbidden_words for word in text.split(\" \")):\n                logging.info(f\"skip {item['segment_id']}, because it contains forbiden words. It's transcript: {text}\")\n                skip += 1\n                continue\n            for k, v in punc2sym.items():\n                text = text.replace(k, v)\n            phn = tokenize_text(text_tokenizer, text)\n            phn_seq = \" \".join(phn)\n            for k, v in word2sym.items():\n                phn_seq = phn_seq.replace(k, v)\n            phn_vocab.update(phn_seq.split(\" \"))\n            all_lens.append(len(phn_seq.split(\" \")))\n            with open(save_fn, \"w\") as f:\n                f.write(phn_seq)\n        logging.info(f\"split {split} has {len(gs[split])} samples in total, skipped {skip} due to forbiden words\")\n\n    print(f\"phn vocab size: {len(list(phn_vocab))}\")\n    print(\"phn sequence stats: \")\n    print(f\"longest: {max(all_lens)}\")\n    print(f\"shortest: {min(all_lens)}\")\n    print(f\"median: {np.quantile(all_lens, 0.5)}\")\n    print(f\"95 percentile longest: {np.quantile(all_lens, 0.95)}\")\n    print(\"write vocabulary to \", vocab_fn)\n    with open(vocab_fn, \"w\") as f:\n        for i, phn in enumerate(list(phn_vocab)):\n            if i < len(list(phn_vocab)) - 1:\n                f.write(f\"{str(i)} {phn}\\n\")\n            else:\n                f.write(f\"{str(i)} {phn}\")\n\n    class mydataset(torch.utils.data.Dataset):\n        def __init__(self, split):\n            super().__init__()\n            self.data = gs[split]\n        def __len__(self):\n            return len(self.data)\n        def __getitem__(self, ind):\n            try:\n                segment_id, audio, sr, text, begin_time, end_time = self.data[ind]['segment_id'], torch.from_numpy(self.data[ind]['audio']['array']).float(), self.data[ind]['audio']['sampling_rate'], self.data[ind]['text'], self.data[ind]['begin_time'], self.data[ind]['end_time']\n            except:\n                return None, None, None, None, None, None\n            \n            return segment_id, audio, sr, text, begin_time, end_time\n        def collate(self, batch):\n            res = {'segment_id': [], \"audio\": [], \"sr\": [], \"text\": [], \"begin_time\": [], \"end_time\": []}\n            for item in batch:\n                if item[0] != None:\n                    res['segment_id'].append(item[0])\n                    res['audio'].append(item[1])\n                    res['sr'].append(item[2])\n                    res['text'].append(item[3])\n                    res['begin_time'].append(item[4])\n                    res['end_time'].append(item[5])\n            return res\n\n\n    ## encodec codes extraction\n    logging.info(\"encodec encoding...\")\n    train_dataset = mydataset('train')\n    train_loader = torch.torch.utils.data.DataLoader(train_dataset, batch_size=args.mega_batch_size, shuffle=False, drop_last=False, num_workers=args.n_workers, collate_fn=train_dataset.collate)\n    validation_dataset = mydataset('validation')\n    validation_loader = torch.torch.utils.data.DataLoader(validation_dataset, batch_size=args.mega_batch_size, shuffle=False, drop_last=False, num_workers=args.n_workers, collate_fn=validation_dataset.collate)\n    test_dataset = mydataset('test')\n    test_loader = torch.torch.utils.data.DataLoader(test_dataset, batch_size=args.mega_batch_size, shuffle=False, drop_last=False, num_workers=args.n_workers, collate_fn=test_dataset.collate)\n    splits = ['validation', 'test', 'train']\n    loaders = [validation_loader, test_loader, train_loader]\n    # splits = ['validation'] # for debug\n    # loaders = [validation_loader]\n    for split, loader in zip(splits, loaders):\n        skip = 0\n        logging.info(f\"now processing split {split}...\")\n        mega_n_steps = int(np.ceil(len(gs[split]) / args.mega_batch_size))\n        logging.info(f\"partition the split {split} into {mega_n_steps} parts, each has {args.mega_batch_size} samples\")\n        for m, mega_batch in enumerate(loader):\n            logging.info(f\"====================================\")\n            logging.info(f\"====================================\")\n            logging.info(f\"now processing mega step {m+1}/{mega_n_steps}\")\n            lengths = np.array(mega_batch['end_time']) - np.array(mega_batch['begin_time'])\n            sorted_inds = sort_by_audio_len(lengths)\n            for j in range(len(sorted_inds))[::-1]:\n                if lengths[sorted_inds[j]] < 0.2 or lengths[sorted_inds[j]] > args.len_cap: # skip samples that are too short (shorter than 0.2s), or too big (bigger than 80s)\n                    skip += 1\n                    del sorted_inds[j]\n            \n            n_steps = int(np.ceil(len(sorted_inds) / args.batch_size))\n            for n in tqdm.tqdm(range(n_steps), disable=True):\n                inds_used = sorted_inds[n*args.batch_size:(n+1)*args.batch_size]\n                audio_batch = [mega_batch['audio'][id] for id in inds_used]\n                sr_batch = [mega_batch['sr'][id] for id in inds_used]\n                segment_id_batch = [mega_batch['segment_id'][id] for id in inds_used]\n                text_batch = [mega_batch['text'][id] for id in inds_used]\n                padded_wav = torch.nn.utils.rnn.pad_sequence(audio_batch, batch_first=True).unsqueeze(1) # [B, T] -> [B, 1, T]\n                all_lens = [lengths[id] for id in inds_used]\n                with torch.no_grad():\n                    if max(all_lens) > args.max_len and len(all_lens) > 1: # NOTE decrease args.max_len if OOM, or chunk it into more than 2 forward passes\n                        codes = []\n                        inwav = padded_wav.cuda()\n                        codes.append(model.encode(inwav[:len(inwav)//2])[0].cpu())\n                        codes.append(model.encode(inwav[len(inwav)//2:])[0].cpu())\n                        codes = torch.cat(codes, dim=0)\n                    else:\n                        encoded_frames = model.encode(padded_wav.cuda())\n                        # logging.info(f\"encoded_frames: {encoded_frames[0].shape}\")\n                        codes = encoded_frames[0].cpu()\n\n                for i, length in enumerate(all_lens):\n                    save_fn = os.path.join(codes_save_root, segment_id_batch[i]+\".txt\")\n                    actual_len = round(length * args.model_code_sr) # 320 is downsample rate for this model\n                    cur_code = codes[i].tolist() if type(codes) == list else codes[i, :, :actual_len].tolist()\n                    write_array_to_txt_file(cur_code, save_fn)\n"
  },
  {
    "path": "data/tokenizer.py",
    "content": "# cp from https://github.com/lifeiteng/vall-e/blob/main/valle/data/tokenizer.py\n# Copyright    2023                            (authors: Feiteng Li)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport re\nfrom dataclasses import asdict, dataclass\nfrom typing import Any, Dict, List, Optional, Pattern, Union\n\nimport numpy as np\nimport torch\nimport torchaudio\n# from lhotse.features import FeatureExtractor\n# from lhotse.utils import Seconds, compute_num_frames\nfrom phonemizer.backend import EspeakBackend\nfrom phonemizer.backend.espeak.language_switch import LanguageSwitch\nfrom phonemizer.backend.espeak.words_mismatch import WordMismatch\nfrom phonemizer.punctuation import Punctuation\nfrom phonemizer.separator import Separator\n\n\n\nclass TextTokenizer:\n    \"\"\"Phonemize Text.\"\"\"\n\n    def __init__(\n        self,\n        language=\"en-us\",\n        backend=\"espeak\",\n        separator=Separator(word=\"_\", syllable=\"-\", phone=\"|\"),\n        preserve_punctuation=True,\n        punctuation_marks: Union[str, Pattern] = Punctuation.default_marks(),\n        with_stress: bool = False,\n        tie: Union[bool, str] = False,\n        language_switch: LanguageSwitch = \"keep-flags\",\n        words_mismatch: WordMismatch = \"ignore\",\n    ) -> None:\n        phonemizer = EspeakBackend(\n            language,\n            punctuation_marks=punctuation_marks,\n            preserve_punctuation=preserve_punctuation,\n            with_stress=with_stress,\n            tie=tie,\n            language_switch=language_switch,\n            words_mismatch=words_mismatch,\n        )\n        \n        self.backend = phonemizer\n        self.separator = separator\n\n    def to_list(self, phonemized: str) -> List[str]:\n        fields = []\n        for word in phonemized.split(self.separator.word):\n            # \"ɐ    m|iː|n?\"    ɹ|ɪ|z|ɜː|v; h|ɪ|z.\n            pp = re.findall(r\"\\w+|[^\\w\\s]\", word, re.UNICODE)\n            fields.extend(\n                [p for p in pp if p != self.separator.phone]\n                + [self.separator.word]\n            )\n        assert len(\"\".join(fields[:-1])) == len(phonemized) - phonemized.count(\n            self.separator.phone\n        )\n        return fields[:-1]\n\n    def __call__(self, text, strip=True) -> List[List[str]]:\n        if isinstance(text, str):\n            text = [text]\n\n        phonemized = self.backend.phonemize(\n            text, separator=self.separator, strip=strip, njobs=1\n        )\n        return [self.to_list(p) for p in phonemized]\n\n\ndef tokenize_text(tokenizer: TextTokenizer, text: str) -> List[str]:\n    phonemes = tokenizer([text.strip()])\n    return phonemes[0]  # k2symbols\n\ndef convert_audio(wav: torch.Tensor, sr: int, target_sr: int, target_channels: int):\n    assert wav.shape[0] in [1, 2], \"Audio must be mono or stereo.\"\n    if target_channels == 1:\n        wav = wav.mean(0, keepdim=True)\n    elif target_channels == 2:\n        *shape, _, length = wav.shape\n        wav = wav.expand(*shape, target_channels, length)\n    elif wav.shape[0] == 1:\n        wav = wav.expand(target_channels, -1)\n    wav = torchaudio.transforms.Resample(sr, target_sr)(wav)\n    return wav\n\nclass AudioTokenizer:\n    \"\"\"EnCodec audio.\"\"\"\n\n    def __init__(\n        self,\n        device: Any = None,\n        signature = None\n    ) -> None:\n        from audiocraft.solvers import CompressionSolver\n        model = CompressionSolver.model_from_checkpoint(signature)\n        self.sample_rate = model.sample_rate\n        self.channels = model.channels\n        \n        if not device:\n            device = torch.device(\"cpu\")\n            if torch.cuda.is_available():\n                device = torch.device(\"cuda:0\")\n\n        self._device = device\n\n        self.codec = model.to(device)\n\n    @property\n    def device(self):\n        return self._device\n\n    def encode(self, wav: torch.Tensor) -> torch.Tensor:\n        codes = self.codec.encode(wav.to(self.device))\n        return [(codes[0], None)]\n\n    def decode(self, frames: torch.Tensor) -> torch.Tensor:\n        frames = frames[0][0] # [1,4,T]\n        return self.codec.decode(frames)\n    \n\n\ndef tokenize_audio(tokenizer: AudioTokenizer, audio_path: str, offset = -1, num_frames=-1):\n    # Load and pre-process the audio waveform\n    if offset != -1 and num_frames!=-1:\n        wav, sr = torchaudio.load(audio_path, frame_offset=offset, num_frames=num_frames)\n    else:\n        wav, sr = torchaudio.load(audio_path)\n    wav = convert_audio(wav, sr, tokenizer.sample_rate, tokenizer.channels)\n    wav = wav.unsqueeze(0)\n\n    # Extract discrete codes from EnCodec\n    with torch.no_grad():\n        encoded_frames = tokenizer.encode(wav)\n    return encoded_frames\n"
  },
  {
    "path": "demo/temp/84_121550_000074_000000.txt",
    "content": "But when I had approached so near to them The common object, which the sense deceives, Lost not by distance any of its marks,"
  },
  {
    "path": "demo/temp/mfa_alignments/5895_34622_000026_000002.csv",
    "content": "Begin,End,Label,Type,Speaker\r\n0.04,0.58,gwynplaine,words,temp\r\n0.58,0.94,had,words,temp\r\n0.94,1.45,besides,words,temp\r\n1.45,1.62,for,words,temp\r\n1.62,1.86,his,words,temp\r\n1.86,2.16,work,words,temp\r\n2.16,2.31,and,words,temp\r\n2.31,2.49,for,words,temp\r\n2.49,2.71,his,words,temp\r\n2.71,3.03,feats,words,temp\r\n3.03,3.12,of,words,temp\r\n3.12,3.61,strength,words,temp\r\n3.95,4.25,round,words,temp\r\n4.25,4.45,his,words,temp\r\n4.45,4.7,neck,words,temp\r\n4.7,4.81,and,words,temp\r\n4.81,5.04,over,words,temp\r\n5.04,5.22,his,words,temp\r\n5.22,5.83,shoulders,words,temp\r\n6.16,6.31,an,words,temp\r\n6.41,7.15,esclavine,words,temp\r\n7.15,7.29,of,words,temp\r\n7.29,7.7,leather,words,temp\r\n0.04,0.1,G,phones,temp\r\n0.1,0.13,W,phones,temp\r\n0.13,0.22,IH1,phones,temp\r\n0.22,0.3,N,phones,temp\r\n0.3,0.38,P,phones,temp\r\n0.38,0.42,L,phones,temp\r\n0.42,0.53,EY1,phones,temp\r\n0.53,0.58,N,phones,temp\r\n0.58,0.71,HH,phones,temp\r\n0.71,0.86,AE1,phones,temp\r\n0.86,0.94,D,phones,temp\r\n0.94,0.97,B,phones,temp\r\n0.97,1.01,IH0,phones,temp\r\n1.01,1.14,S,phones,temp\r\n1.14,1.34,AY1,phones,temp\r\n1.34,1.4,D,phones,temp\r\n1.4,1.45,Z,phones,temp\r\n1.45,1.52,F,phones,temp\r\n1.52,1.55,AO1,phones,temp\r\n1.55,1.62,R,phones,temp\r\n1.62,1.69,HH,phones,temp\r\n1.69,1.76,IH1,phones,temp\r\n1.76,1.86,Z,phones,temp\r\n1.86,1.95,W,phones,temp\r\n1.95,2.07,ER1,phones,temp\r\n2.07,2.16,K,phones,temp\r\n2.16,2.23,AH0,phones,temp\r\n2.23,2.26,N,phones,temp\r\n2.26,2.31,D,phones,temp\r\n2.31,2.38,F,phones,temp\r\n2.38,2.41,AO1,phones,temp\r\n2.41,2.49,R,phones,temp\r\n2.49,2.55,HH,phones,temp\r\n2.55,2.62,IH1,phones,temp\r\n2.62,2.71,Z,phones,temp\r\n2.71,2.8,F,phones,temp\r\n2.8,2.9,IY1,phones,temp\r\n2.9,2.98,T,phones,temp\r\n2.98,3.03,S,phones,temp\r\n3.03,3.07,AH0,phones,temp\r\n3.07,3.12,V,phones,temp\r\n3.12,3.2,S,phones,temp\r\n3.2,3.26,T,phones,temp\r\n3.26,3.32,R,phones,temp\r\n3.32,3.39,EH1,phones,temp\r\n3.39,3.48,NG,phones,temp\r\n3.48,3.53,K,phones,temp\r\n3.53,3.61,TH,phones,temp\r\n3.95,4.03,R,phones,temp\r\n4.03,4.16,AW1,phones,temp\r\n4.16,4.21,N,phones,temp\r\n4.21,4.25,D,phones,temp\r\n4.25,4.29,HH,phones,temp\r\n4.29,4.36,IH1,phones,temp\r\n4.36,4.45,Z,phones,temp\r\n4.45,4.53,N,phones,temp\r\n4.53,4.62,EH1,phones,temp\r\n4.62,4.7,K,phones,temp\r\n4.7,4.74,AH0,phones,temp\r\n4.74,4.77,N,phones,temp\r\n4.77,4.81,D,phones,temp\r\n4.81,4.92,OW1,phones,temp\r\n4.92,4.97,V,phones,temp\r\n4.97,5.04,ER0,phones,temp\r\n5.04,5.11,HH,phones,temp\r\n5.11,5.18,IH1,phones,temp\r\n5.18,5.22,Z,phones,temp\r\n5.22,5.34,SH,phones,temp\r\n5.34,5.47,OW1,phones,temp\r\n5.47,5.51,L,phones,temp\r\n5.51,5.58,D,phones,temp\r\n5.58,5.71,ER0,phones,temp\r\n5.71,5.83,Z,phones,temp\r\n6.16,6.23,AE1,phones,temp\r\n6.23,6.31,N,phones,temp\r\n6.41,7.15,spn,phones,temp\r\n7.15,7.21,AH0,phones,temp\r\n7.21,7.29,V,phones,temp\r\n7.29,7.36,L,phones,temp\r\n7.36,7.44,EH1,phones,temp\r\n7.44,7.49,DH,phones,temp\r\n7.49,7.7,ER0,phones,temp\r\n"
  },
  {
    "path": "demo/temp/mfa_alignments/84_121550_000074_000000.csv",
    "content": "Begin,End,Label,Type,Speaker\r\n0.03,0.18,but,words,temp\r\n0.18,0.32,when,words,temp\r\n0.32,0.48,i,words,temp\r\n0.48,0.64,had,words,temp\r\n0.64,1.19,approached,words,temp\r\n1.22,1.58,so,words,temp\r\n1.58,1.91,near,words,temp\r\n1.91,2.07,to,words,temp\r\n2.07,2.42,them,words,temp\r\n2.53,2.61,the,words,temp\r\n2.61,3.01,common,words,temp\r\n3.05,3.62,object,words,temp\r\n3.68,3.93,which,words,temp\r\n3.93,4.02,the,words,temp\r\n4.02,4.34,sense,words,temp\r\n4.34,4.97,deceives,words,temp\r\n5.04,5.54,lost,words,temp\r\n5.54,6.0,not,words,temp\r\n6.0,6.14,by,words,temp\r\n6.14,6.67,distance,words,temp\r\n6.79,7.05,any,words,temp\r\n7.05,7.18,of,words,temp\r\n7.18,7.34,its,words,temp\r\n7.34,7.87,marks,words,temp\r\n0.03,0.06,B,phones,temp\r\n0.06,0.09,AH1,phones,temp\r\n0.09,0.18,T,phones,temp\r\n0.18,0.23,W,phones,temp\r\n0.23,0.27,EH1,phones,temp\r\n0.27,0.32,N,phones,temp\r\n0.32,0.48,AY1,phones,temp\r\n0.48,0.49,HH,phones,temp\r\n0.49,0.6,AE1,phones,temp\r\n0.6,0.64,D,phones,temp\r\n0.64,0.7,AH0,phones,temp\r\n0.7,0.83,P,phones,temp\r\n0.83,0.88,R,phones,temp\r\n0.88,0.99,OW1,phones,temp\r\n0.99,1.12,CH,phones,temp\r\n1.12,1.19,T,phones,temp\r\n1.22,1.4,S,phones,temp\r\n1.4,1.58,OW1,phones,temp\r\n1.58,1.7,N,phones,temp\r\n1.7,1.84,IH1,phones,temp\r\n1.84,1.91,R,phones,temp\r\n1.91,2.01,T,phones,temp\r\n2.01,2.07,AH0,phones,temp\r\n2.07,2.13,DH,phones,temp\r\n2.13,2.3,EH1,phones,temp\r\n2.3,2.42,M,phones,temp\r\n2.53,2.55,DH,phones,temp\r\n2.55,2.61,AH0,phones,temp\r\n2.61,2.73,K,phones,temp\r\n2.73,2.85,AA1,phones,temp\r\n2.85,2.9,M,phones,temp\r\n2.9,2.95,AH0,phones,temp\r\n2.95,3.01,N,phones,temp\r\n3.05,3.22,AA1,phones,temp\r\n3.22,3.27,B,phones,temp\r\n3.27,3.34,JH,phones,temp\r\n3.34,3.48,EH0,phones,temp\r\n3.48,3.54,K,phones,temp\r\n3.54,3.62,T,phones,temp\r\n3.68,3.69,HH,phones,temp\r\n3.69,3.76,W,phones,temp\r\n3.76,3.8,IH1,phones,temp\r\n3.8,3.93,CH,phones,temp\r\n3.93,3.95,DH,phones,temp\r\n3.95,4.02,AH0,phones,temp\r\n4.02,4.12,S,phones,temp\r\n4.12,4.21,EH1,phones,temp\r\n4.21,4.27,N,phones,temp\r\n4.27,4.34,S,phones,temp\r\n4.34,4.42,D,phones,temp\r\n4.42,4.45,IH0,phones,temp\r\n4.45,4.59,S,phones,temp\r\n4.59,4.79,IY1,phones,temp\r\n4.79,4.87,V,phones,temp\r\n4.87,4.97,Z,phones,temp\r\n5.04,5.12,L,phones,temp\r\n5.12,5.33,AO1,phones,temp\r\n5.33,5.42,S,phones,temp\r\n5.42,5.54,T,phones,temp\r\n5.54,5.7,N,phones,temp\r\n5.7,5.89,AA1,phones,temp\r\n5.89,6.0,T,phones,temp\r\n6.0,6.05,B,phones,temp\r\n6.05,6.14,AY1,phones,temp\r\n6.14,6.24,D,phones,temp\r\n6.24,6.3,IH1,phones,temp\r\n6.3,6.38,S,phones,temp\r\n6.38,6.45,T,phones,temp\r\n6.45,6.51,AH0,phones,temp\r\n6.51,6.57,N,phones,temp\r\n6.57,6.67,S,phones,temp\r\n6.79,6.89,EH1,phones,temp\r\n6.89,6.95,N,phones,temp\r\n6.95,7.05,IY0,phones,temp\r\n7.05,7.13,AH0,phones,temp\r\n7.13,7.18,V,phones,temp\r\n7.18,7.22,IH0,phones,temp\r\n7.22,7.29,T,phones,temp\r\n7.29,7.34,S,phones,temp\r\n7.34,7.39,M,phones,temp\r\n7.39,7.5,AA1,phones,temp\r\n7.5,7.58,R,phones,temp\r\n7.58,7.7,K,phones,temp\r\n7.7,7.87,S,phones,temp\r\n"
  },
  {
    "path": "edit_utils.py",
    "content": "def get_span(orig, new, editType):\n    orig_list = orig.split(\" \")\n    new_list = new.split(\" \")\n    \n    flag = False # this indicate whether the actual edit follow the specified editType\n    if editType == \"deletion\":\n        assert len(orig_list) > len(new_list), f\"the edit type is deletion, but new is not shorter than original:\\n new: {new}\\n orig: {orig}\"\n        diff = len(orig_list) - len(new_list)\n        for i, (o, n) in enumerate(zip(orig_list, new_list)):\n            if o != n: # assume the index of the first different word is the starting index of the orig_span\n            \n                orig_span = [i, i + diff - 1] # assume that the indices are starting and ending index of the deleted part\n                new_span = [i-1, i] # but for the new span, the starting and ending index is the two words that surround the deleted part\n                flag = True\n                break\n\n\n    elif editType == \"insertion\": \n        assert len(orig_list) < len(new_list), f\"the edit type is insertion, but the new is not longer than the original:\\n new: {new}\\n orig: {orig}\"\n        diff = len(new_list) - len(orig_list)\n        for i, (o, n) in enumerate(zip(orig_list, new_list)):\n            if o != n: # insertion is just the opposite of deletion\n                new_span = [i, i + diff - 1] # NOTE if only inserted one word, s and e will be the same\n                orig_span = [i-1, i]\n                flag = True\n                break\n\n    elif editType == \"substitution\":\n        new_span = []\n        orig_span = []\n        for i, (o, n) in enumerate(zip(orig_list, new_list)):\n            if o != n:\n                new_span = [i]\n                orig_span = [i]\n                break\n        assert len(new_span) == 1 and len(orig_span) == 1, f\"new_span: {new_span}, orig_span: {orig_span}\"\n        for j, (o, n) in enumerate(zip(orig_list[::-1], new_list[::-1])):\n            if o != n:\n                new_span.append(len(new_list) - j -1)\n                orig_span.append(len(orig_list) - j - 1)\n                flag = True\n                break\n    else:\n        raise RuntimeError(f\"editType unknown: {editType}\")\n\n    if not flag:\n        raise RuntimeError(f\"wrong editing with the specified edit type:\\n original: {orig}\\n new: {new}\\n, editType: {editType}\")\n\n    return orig_span, new_span    "
  },
  {
    "path": "environment.yml",
    "content": "name: voicecraft\nchannels:\n  - conda-forge\n  - defaults\ndependencies:\n  - _libgcc_mutex=0.1=conda_forge\n  - _openmp_mutex=4.5=2_gnu\n  - aom=3.8.2=h59595ed_0\n  - asttokens=2.4.1=pyhd8ed1ab_0\n  - atk-1.0=2.38.0=hd4edc92_1\n  - audioread=3.0.1=py39hf3d152e_1\n  - backcall=0.2.0=pyh9f0ad1d_0\n  - baumwelch=0.3.7=h00ab1b0_5\n  - biopython=1.79=py39hb9d737c_3\n  - brotli=1.1.0=hd590300_1\n  - brotli-bin=1.1.0=hd590300_1\n  - brotli-python=1.1.0=py39h3d6467e_1\n  - bzip2=1.0.8=hd590300_5\n  - ca-certificates=2024.2.2=hbcca054_0\n  - cairo=1.18.0=h3faef2a_0\n  - certifi=2024.2.2=pyhd8ed1ab_0\n  - cffi=1.16.0=py39h7a31438_0\n  - charset-normalizer=3.3.2=pyhd8ed1ab_0\n  - click=8.1.7=unix_pyh707e725_0\n  - colorama=0.4.6=pyhd8ed1ab_0\n  - comm=0.2.2=pyhd8ed1ab_0\n  - contourpy=1.2.0=py39h7633fee_0\n  - cycler=0.12.1=pyhd8ed1ab_0\n  - dataclassy=1.0.1=pyhd8ed1ab_0\n  - dav1d=1.2.1=hd590300_0\n  - debugpy=1.8.1=py39h3d6467e_0\n  - decorator=5.1.1=pyhd8ed1ab_0\n  - executing=2.0.1=pyhd8ed1ab_0\n  - expat=2.6.2=h59595ed_0\n  - ffmpeg=6.1.1=gpl_h38e077a_106\n  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0\n  - font-ttf-inconsolata=3.000=h77eed37_0\n  - font-ttf-source-code-pro=2.038=h77eed37_0\n  - font-ttf-ubuntu=0.83=h77eed37_1\n  - fontconfig=2.14.2=h14ed4e7_0\n  - fonts-conda-ecosystem=1=0\n  - fonts-conda-forge=1=0\n  - fonttools=4.49.0=py39hd1e30aa_0\n  - freetype=2.12.1=h267a509_2\n  - fribidi=1.0.10=h36c2ea0_0\n  - gdk-pixbuf=2.42.10=h829c605_5\n  - gettext=0.21.1=h27087fc_0\n  - giflib=5.2.1=h0b41bf4_3\n  - gmp=6.3.0=h59595ed_1\n  - gnutls=3.7.9=hb077bed_0\n  - graphite2=1.3.13=h58526e2_1001\n  - graphviz=9.0.0=h78e8752_1\n  - greenlet=3.0.3=py39h3d6467e_0\n  - gtk2=2.24.33=h280cfa0_4\n  - gts=0.7.6=h977cf35_4\n  - harfbuzz=8.3.0=h3d44ed6_0\n  - hdbscan=0.8.33=py39h44dd56e_4\n  - icu=73.2=h59595ed_0\n  - idna=3.6=pyhd8ed1ab_0\n  - importlib-metadata=7.0.2=pyha770c72_0\n  - importlib-resources=6.3.0=pyhd8ed1ab_0\n  - importlib_metadata=7.0.2=hd8ed1ab_0\n  - importlib_resources=6.3.0=pyhd8ed1ab_0\n  - ipykernel=6.29.3=pyhd33586a_0\n  - jedi=0.19.1=pyhd8ed1ab_0\n  - joblib=1.3.2=pyhd8ed1ab_0\n  - jupyter_client=8.6.1=pyhd8ed1ab_0\n  - jupyter_core=5.7.2=py39hf3d152e_0\n  - kaldi=5.5.1068=cpu_h31769b2_2\n  - keyutils=1.6.1=h166bdaf_0\n  - kiwisolver=1.4.5=py39h7633fee_1\n  - kneed=0.8.5=pyhd8ed1ab_0\n  - krb5=1.21.2=h659d440_0\n  - lame=3.100=h166bdaf_1003\n  - lazy_loader=0.3=pyhd8ed1ab_0\n  - lcms2=2.16=hb7c19ff_0\n  - ld_impl_linux-64=2.40=h41732ed_0\n  - lerc=4.0.0=h27087fc_0\n  - libabseil=20240116.1=cxx17_h59595ed_2\n  - libass=0.17.1=h8fe9dca_1\n  - libblas=3.9.0=21_linux64_openblas\n  - libbrotlicommon=1.1.0=hd590300_1\n  - libbrotlidec=1.1.0=hd590300_1\n  - libbrotlienc=1.1.0=hd590300_1\n  - libcblas=3.9.0=21_linux64_openblas\n  - libclang-cpp15=15.0.7=default_hb11cfb5_4\n  - libdeflate=1.19=hd590300_0\n  - libdrm=2.4.120=hd590300_0\n  - libedit=3.1.20191231=he28a2e2_2\n  - libexpat=2.6.2=h59595ed_0\n  - libffi=3.4.2=h7f98852_5\n  - libflac=1.4.3=h59595ed_0\n  - libgcc-ng=13.2.0=h807b86a_5\n  - libgd=2.3.3=h119a65a_9\n  - libgfortran-ng=13.2.0=h69a702a_5\n  - libgfortran5=13.2.0=ha4646dd_5\n  - libglib=2.80.0=hf2295e7_0\n  - libgomp=13.2.0=h807b86a_5\n  - libhwloc=2.9.3=default_h554bfaf_1009\n  - libiconv=1.17=hd590300_2\n  - libidn2=2.3.7=hd590300_0\n  - libjpeg-turbo=3.0.0=hd590300_1\n  - liblapack=3.9.0=21_linux64_openblas\n  - liblapacke=3.9.0=21_linux64_openblas\n  - libllvm14=14.0.6=hcd5def8_4\n  - libllvm15=15.0.7=hb3ce162_4\n  - libllvmspirv15=15.0.0=h0cdce71_1\n  - libnsl=2.0.1=hd590300_0\n  - libogg=1.3.4=h7f98852_1\n  - libopenblas=0.3.26=pthreads_h413a1c8_0\n  - libopenvino=2024.0.0=h2e90f83_1\n  - libopenvino-auto-batch-plugin=2024.0.0=hd5fc58b_1\n  - libopenvino-auto-plugin=2024.0.0=hd5fc58b_1\n  - libopenvino-hetero-plugin=2024.0.0=h3ecfda7_1\n  - libopenvino-intel-cpu-plugin=2024.0.0=h2e90f83_1\n  - libopenvino-intel-gpu-plugin=2024.0.0=h2e90f83_1\n  - libopenvino-ir-frontend=2024.0.0=h3ecfda7_1\n  - libopenvino-onnx-frontend=2024.0.0=h757c851_1\n  - libopenvino-paddle-frontend=2024.0.0=h757c851_1\n  - libopenvino-pytorch-frontend=2024.0.0=h59595ed_1\n  - libopenvino-tensorflow-frontend=2024.0.0=hca94c1a_1\n  - libopenvino-tensorflow-lite-frontend=2024.0.0=h59595ed_1\n  - libopus=1.3.1=h7f98852_1\n  - libpciaccess=0.18=hd590300_0\n  - libpng=1.6.43=h2797004_0\n  - libpq=16.2=h33b98f1_0\n  - libprotobuf=4.25.3=h08a7969_0\n  - librosa=0.10.1=pyhd8ed1ab_0\n  - librsvg=2.56.3=he3f83f7_1\n  - libsndfile=1.2.2=hc60ed4a_1\n  - libsodium=1.0.18=h36c2ea0_1\n  - libsqlite=3.45.2=h2797004_0\n  - libstdcxx-ng=13.2.0=h7e041cc_5\n  - libtasn1=4.19.0=h166bdaf_0\n  - libtiff=4.6.0=ha9c0a0a_2\n  - libunistring=0.9.10=h7f98852_0\n  - libuuid=2.38.1=h0b41bf4_0\n  - libva=2.21.0=hd590300_0\n  - libvorbis=1.3.7=h9c3ff4c_0\n  - libvpx=1.14.0=h59595ed_0\n  - libwebp=1.3.2=h658648e_1\n  - libwebp-base=1.3.2=hd590300_0\n  - libxcb=1.15=h0b41bf4_0\n  - libxcrypt=4.4.36=hd590300_1\n  - libxml2=2.12.5=h232c23b_0\n  - libzlib=1.2.13=hd590300_5\n  - llvm-spirv-15=15.0.0=h0cdce71_1\n  - mad=0.15.1b=h9c3ff4c_1\n  - markdown-it-py=3.0.0=pyhd8ed1ab_0\n  - matplotlib-base=3.8.3=py39he9076e7_0\n  - matplotlib-inline=0.1.6=pyhd8ed1ab_0\n  - mdurl=0.1.2=pyhd8ed1ab_0\n  - montreal-forced-aligner=2.2.17=pyhd8ed1ab_0\n  - mpg123=1.32.4=h59595ed_0\n  - msgpack-python=1.0.7=py39h7633fee_0\n  - munkres=1.1.4=pyh9f0ad1d_0\n  - ncurses=6.4=h59595ed_2\n  - nest-asyncio=1.6.0=pyhd8ed1ab_0\n  - nettle=3.9.1=h7ab15ed_0\n  - ngram=1.3.14=h924138e_2\n  - numba=0.59.0=py39h615d6bd_1\n  - numpy=1.26.4=py39h474f0d3_0\n  - ocl-icd=2.3.2=hd590300_0\n  - openfst=1.8.2=h924138e_2\n  - openh264=2.4.1=h59595ed_0\n  - openjpeg=2.5.2=h488ebb8_0\n  - openssl=3.2.1=hd590300_0\n  - p11-kit=0.24.1=hc5aa10d_0\n  - packaging=24.0=pyhd8ed1ab_0\n  - pandas=2.2.1=py39hddac248_0\n  - pango=1.52.1=ha41ecd1_0\n  - parso=0.8.3=pyhd8ed1ab_0\n  - patsy=0.5.6=pyhd8ed1ab_0\n  - pcre2=10.43=hcad00b1_0\n  - pexpect=4.9.0=pyhd8ed1ab_0\n  - pgvector-python=0.2.5=pyhe093146_0\n  - pickleshare=0.7.5=py_1003\n  - pillow=10.2.0=py39had0adad_0\n  - pip=24.0=pyhd8ed1ab_0\n  - pixman=0.43.2=h59595ed_0\n  - platformdirs=4.2.0=pyhd8ed1ab_0\n  - pocl=5.0=h03a6ac1_2\n  - pocl-core=5.0=hdaecddf_2\n  - pocl-cpu=5.0=he901f76_2\n  - pocl-cpu-minimal=5.0=h5ccd973_2\n  - pocl-cuda=5.0=hdaecddf_2\n  - pocl-remote=5.0=h5ccd973_2\n  - pooch=1.8.1=pyhd8ed1ab_0\n  - postgresql=16.2=h7387d8b_0\n  - prompt-toolkit=3.0.42=pyha770c72_0\n  - prompt_toolkit=3.0.42=hd8ed1ab_0\n  - psutil=5.9.8=py39hd1e30aa_0\n  - psycopg2=2.9.9=py39h89197e3_0\n  - pthread-stubs=0.4=h36c2ea0_1001\n  - ptyprocess=0.7.0=pyhd3deb0d_0\n  - pugixml=1.14=h59595ed_0\n  - pure_eval=0.2.2=pyhd8ed1ab_0\n  - pycparser=2.21=pyhd8ed1ab_0\n  - pygments=2.17.2=pyhd8ed1ab_0\n  - pyparsing=3.1.2=pyhd8ed1ab_0\n  - pysocks=1.7.1=pyha2e5f31_6\n  - pysoundfile=0.12.1=pypyhd8ed1ab_1\n  - python=3.9.18=h0755675_1_cpython\n  - python-tzdata=2024.1=pyhd8ed1ab_0\n  - python_abi=3.9=4_cp39\n  - pytz=2024.1=pyhd8ed1ab_0\n  - pyyaml=6.0.1=py39hd1e30aa_1\n  - pyzmq=25.1.2=py39h8c080ef_0\n  - readline=8.2=h8228510_1\n  - requests=2.31.0=pyhd8ed1ab_0\n  - rich=13.7.1=pyhd8ed1ab_0\n  - rich-click=1.7.4=pyhd8ed1ab_0\n  - scikit-learn=1.2.2=py39hc236052_2\n  - scipy=1.12.0=py39h474f0d3_2\n  - seaborn=0.13.2=hd8ed1ab_0\n  - seaborn-base=0.13.2=pyhd8ed1ab_0\n  - setuptools=69.2.0=pyhd8ed1ab_0\n  - six=1.16.0=pyh6c4a22f_0\n  - snappy=1.1.10=h9fff704_0\n  - sox=14.4.2=ha5cc309_1018\n  - soxr=0.1.3=h0b41bf4_3\n  - soxr-python=0.3.7=py39h44dd56e_0\n  - sqlalchemy=2.0.28=py39hd1e30aa_0\n  - sqlite=3.45.2=h2c6b66d_0\n  - stack_data=0.6.2=pyhd8ed1ab_0\n  - statsmodels=0.14.1=py39h44dd56e_0\n  - svt-av1=1.8.0=h59595ed_0\n  - tbb=2021.11.0=h00ab1b0_1\n  - threadpoolctl=3.3.0=pyhc1e730c_0\n  - tk=8.6.13=noxft_h4845f30_101\n  - tornado=6.4=py39hd1e30aa_0\n  - tqdm=4.66.2=pyhd8ed1ab_0\n  - traitlets=5.14.2=pyhd8ed1ab_0\n  - typing-extensions=4.10.0=hd8ed1ab_0\n  - typing_extensions=4.10.0=pyha770c72_0\n  - tzcode=2024a=h3f72095_0\n  - tzdata=2024a=h0c530f3_0\n  - unicodedata2=15.1.0=py39hd1e30aa_0\n  - urllib3=2.2.1=pyhd8ed1ab_0\n  - wcwidth=0.2.13=pyhd8ed1ab_0\n  - wheel=0.42.0=pyhd8ed1ab_0\n  - x264=1!164.3095=h166bdaf_2\n  - x265=3.5=h924138e_3\n  - xorg-fixesproto=5.0=h7f98852_1002\n  - xorg-kbproto=1.0.7=h7f98852_1002\n  - xorg-libice=1.1.1=hd590300_0\n  - xorg-libsm=1.2.4=h7391055_0\n  - xorg-libx11=1.8.7=h8ee46fc_0\n  - xorg-libxau=1.0.11=hd590300_0\n  - xorg-libxdmcp=1.1.3=h7f98852_0\n  - xorg-libxext=1.3.4=h0b41bf4_2\n  - xorg-libxfixes=5.0.3=h7f98852_1004\n  - xorg-libxrender=0.9.11=hd590300_0\n  - xorg-renderproto=0.11.1=h7f98852_1002\n  - xorg-xextproto=7.3.0=h0b41bf4_1003\n  - xorg-xproto=7.0.31=h7f98852_1007\n  - xz=5.2.6=h166bdaf_0\n  - yaml=0.2.5=h7f98852_2\n  - zeromq=4.3.5=h59595ed_1\n  - zipp=3.17.0=pyhd8ed1ab_0\n  - zlib=1.2.13=hd590300_5\n  - zstd=1.5.5=hfc55251_0\n  - pip:\n      - absl-py==2.1.0\n      - aiofiles==23.2.1\n      - aiohttp==3.9.3\n      - aiosignal==1.3.1\n      - altair==5.2.0\n      - antlr4-python3-runtime==4.9.3\n      - anyio==4.3.0\n      - async-timeout==4.0.3\n      - attrs==23.2.0\n      - av==11.0.0\n      - babel==2.14.0\n      - beautifulsoup4==4.12.3\n      - bibtexparser==2.0.0b7\n      - bleach==6.1.0\n      - blis==0.7.11\n      - catalogue==2.0.10\n      - clldutils==3.22.2\n      - cloudpickle==3.0.0\n      - cmake==3.28.3\n      - colorlog==6.8.2\n      - confection==0.1.4\n      - csvw==3.3.0\n      - cymem==2.0.8\n      - cython==0.29.37\n      - datasets==2.16.0\n      - defusedxml==0.7.1\n      - demucs==4.0.1\n      - dill==0.3.6\n      - dlinfo==1.2.1\n      - docopt==0.6.2\n      - dora-search==0.1.12\n      - einops==0.7.0\n      - encodec==0.1.1\n      - exceptiongroup==1.2.0\n      - fastapi==0.110.0\n      - fastjsonschema==2.19.1\n      - ffmpy==0.3.2\n      - filelock==3.13.1\n      - flashy==0.0.2\n      - frozenlist==1.4.1\n      - fsspec==2023.10.0\n      - gradio==3.50.2\n      - gradio-client==0.6.1\n      - grpcio==1.62.1\n      - h11==0.14.0\n      - httpcore==1.0.4\n      - httpx==0.27.0\n      - huggingface-hub==0.22.2\n      - hydra-colorlog==1.2.0\n      - hydra-core==1.3.2\n      - ipython==8.12.3\n      - isodate==0.6.1\n      - jinja2==3.1.3\n      - jsonschema==4.21.1\n      - jsonschema-specifications==2023.12.1\n      - julius==0.2.7\n      - jupyterlab-pygments==0.3.0\n      - lameenc==1.7.0\n      - langcodes==3.3.0\n      - language-tags==1.2.0\n      - lit==18.1.1\n      - llvmlite==0.42.0\n      - lxml==5.1.0\n      - markdown==3.5.2\n      - markupsafe==2.1.5\n      - mistune==3.0.2\n      - mpmath==1.3.0\n      - msgpack==1.0.8\n      - multidict==6.0.5\n      - multiprocess==0.70.14\n      - murmurhash==1.0.10\n      - nbclient==0.10.0\n      - nbconvert==7.16.3\n      - nbformat==5.10.3\n      - networkx==3.2.1\n      - num2words==0.5.13\n      - nvidia-cublas-cu11==11.10.3.66\n      - nvidia-cuda-cupti-cu11==11.7.101\n      - nvidia-cuda-nvrtc-cu11==11.7.99\n      - nvidia-cuda-runtime-cu11==11.7.99\n      - nvidia-cudnn-cu11==8.5.0.96\n      - nvidia-cufft-cu11==10.9.0.58\n      - nvidia-curand-cu11==10.2.10.91\n      - nvidia-cusolver-cu11==11.4.0.1\n      - nvidia-cusparse-cu11==11.7.4.91\n      - nvidia-nccl-cu11==2.14.3\n      - nvidia-nvtx-cu11==11.7.91\n      - omegaconf==2.3.0\n      - openunmix==1.2.1\n      - orjson==3.9.15\n      - pandocfilters==1.5.1\n      - pathlib-abc==0.1.1\n      - pathy==0.11.0\n      - pgvector==0.2.2\n      - phonemizer==3.2.1\n      - pipreqs==0.5.0\n      - praatio==6.2.0\n      - preshed==3.0.9\n      - protobuf==4.25.3\n      - pyarrow==15.0.2\n      - pyarrow-hotfix==0.6\n      - pydantic==1.10.14\n      - pydub==0.25.1\n      - pylatexenc==2.10\n      - pynini==2.1.6\n      - pypinyin==0.48.0\n      - python-dateutil==2.9.0.post0\n      - python-multipart==0.0.9\n      - rdflib==7.0.0\n      - referencing==0.33.0\n      - regex==2023.12.25\n      - responses==0.18.0\n      - retrying==1.3.4\n      - rfc3986==1.5.0\n      - rpds-py==0.18.0\n      - safetensors==0.4.2\n      - segments==2.2.1\n      - semantic-version==2.10.0\n      - sentencepiece==0.2.0\n      - smart-open==6.4.0\n      - sniffio==1.3.1\n      - soupsieve==2.5\n      - spacy==3.5.2\n      - spacy-legacy==3.0.12\n      - spacy-loggers==1.0.5\n      - srsly==2.4.8\n      - starlette==0.36.3\n      - submitit==1.5.1\n      - sympy==1.12\n      - tabulate==0.9.0\n      - tensorboard==2.16.2\n      - tensorboard-data-server==0.7.2\n      - thinc==8.1.12\n      - tinycss2==1.2.1\n      - tokenizers==0.15.2\n      - toolz==0.12.1\n      - torch==2.0.1\n      - torchaudio==2.0.2\n      - torchmetrics==0.11.1\n      - transformers==4.38.2\n      - treetable==0.2.5\n      - triton==2.0.0\n      - typer==0.7.0\n      - uritemplate==4.1.1\n      - uvicorn==0.28.0\n      - wasabi==1.1.2\n      - webencodings==0.5.1\n      - websockets==11.0.3\n      - werkzeug==3.0.1\n      - xformers==0.0.22\n      - xxhash==3.4.1\n      - yarg==0.1.9\n      - yarl==1.9.4\nprefix: /home/pyp/miniconda3/envs/voicecraft\n"
  },
  {
    "path": "gradio_app.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"9b6a0c92\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Only do the below if you are using docker\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"961faa43\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"!source ~/.bashrc && \\\\\\n\",\n    \"    apt-get update && \\\\\\n\",\n    \"    apt-get install -y espeak espeak-data libespeak1 libespeak-dev && \\\\\\n\",\n    \"    apt-get install -y festival* && \\\\\\n\",\n    \"    apt-get install -y build-essential && \\\\\\n\",\n    \"    apt-get install -y flac libasound2-dev libsndfile1-dev vorbis-tools && \\\\\\n\",\n    \"    apt-get install -y libxml2-dev libxslt-dev zlib1g-dev\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"598d75cf\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"!source ~/.bashrc && \\\\\\n\",\n    \"    conda activate voicecraft && \\\\\\n\",\n    \"    pip install -r gradio_requirements.txt\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"8b9c4436\",\n   \"metadata\": {},\n   \"source\": [\n    \"# STOP\\n\",\n    \"You have to do this part manually using the mouse/keyboard and the tabs at the top.\\n\",\n    \"\\n\",\n    \"* Refresh your browser to make sure it picks up the new kernel.\\n\",\n    \"* Kernel -> Change Kernel -> Select Kernel -> voicecraft\\n\",\n    \"* Kernel -> Restart Kernel -> Yes\\n\",\n    \"\\n\",\n    \"Now you can run the rest of the notebook and get an audio sample output. It will automatically download more models and such. The next time you use this container, you can just start below here as the dependencies will remain available until you delete the docker container.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"f089aa96\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from gradio_app import app\\n\",\n    \"app.launch()\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"voicecraft\",\n   \"language\": \"python\",\n   \"name\": \"voicecraft\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.9.19\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n"
  },
  {
    "path": "gradio_app.py",
    "content": "import os\nimport re\nfrom num2words import num2words\nimport gradio as gr\nimport torch\nimport torchaudio\nfrom data.tokenizer import (\n    AudioTokenizer,\n    TextTokenizer,\n)\nfrom models import voicecraft\nimport io\nimport numpy as np\nimport random\nimport uuid\nimport nltk\nnltk.download('punkt')\n\nDEMO_PATH = os.getenv(\"DEMO_PATH\", \"./demo\")\nTMP_PATH = os.getenv(\"TMP_PATH\", \"./demo/temp\")\nMODELS_PATH = os.getenv(\"MODELS_PATH\", \"./pretrained_models\")\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nwhisper_model, align_model, voicecraft_model = None, None, None\n_whitespace_re = re.compile(r\"\\s+\")\n\ndef get_random_string():\n    return \"\".join(str(uuid.uuid4()).split(\"-\"))\n\n\ndef seed_everything(seed):\n    if seed != -1:\n        os.environ['PYTHONHASHSEED'] = str(seed)\n        random.seed(seed)\n        np.random.seed(seed)\n        torch.manual_seed(seed)\n        torch.cuda.manual_seed(seed)\n        torch.backends.cudnn.benchmark = False\n        torch.backends.cudnn.deterministic = True\n\n\nclass WhisperxAlignModel:\n    def __init__(self):\n        from whisperx import load_align_model\n        self.model, self.metadata = load_align_model(language_code=\"en\", device=device)\n\n    def align(self, segments, audio_path):\n        from whisperx import align, load_audio\n        audio = load_audio(audio_path)\n        return align(segments, self.model, self.metadata, audio, device, return_char_alignments=False)[\"segments\"]\n\n\nclass WhisperModel:\n    def __init__(self, model_name):\n        from whisper import load_model\n        self.model = load_model(model_name, device)\n\n        from whisper.tokenizer import get_tokenizer\n        tokenizer = get_tokenizer(multilingual=False)\n        self.supress_tokens = [-1] + [\n            i\n            for i in range(tokenizer.eot)\n            if all(c in \"0123456789\" for c in tokenizer.decode([i]).removeprefix(\" \"))\n        ]\n\n    def transcribe(self, audio_path):\n        return self.model.transcribe(audio_path, suppress_tokens=self.supress_tokens, word_timestamps=True)[\"segments\"]\n\n\nclass WhisperxModel:\n    def __init__(self, model_name, align_model: WhisperxAlignModel):\n        from whisperx import load_model\n        self.model = load_model(model_name, device, asr_options={\"suppress_numerals\": True, \"max_new_tokens\": None, \"clip_timestamps\": None, \"hallucination_silence_threshold\": None})\n        self.align_model = align_model\n\n    def transcribe(self, audio_path):\n        segments = self.model.transcribe(audio_path, batch_size=8)[\"segments\"]\n        for segment in segments:\n            segment['text'] = replace_numbers_with_words(segment['text'])\n        return self.align_model.align(segments, audio_path)\n\n\ndef load_models(whisper_backend_name, whisper_model_name, alignment_model_name, voicecraft_model_name):\n    global transcribe_model, align_model, voicecraft_model\n\n    if voicecraft_model_name == \"330M\":\n        voicecraft_model_name = \"giga330M\"\n    elif voicecraft_model_name == \"830M\":\n        voicecraft_model_name = \"giga830M\"\n    elif voicecraft_model_name == \"330M_TTSEnhanced\":\n        voicecraft_model_name = \"330M_TTSEnhanced\"\n    elif voicecraft_model_name == \"830M_TTSEnhanced\":\n        voicecraft_model_name = \"830M_TTSEnhanced\"\n\n    if alignment_model_name is not None:\n        align_model = WhisperxAlignModel()\n\n    if whisper_model_name is not None:\n        if whisper_backend_name == \"whisper\":\n            transcribe_model = WhisperModel(whisper_model_name)\n        else:\n            if align_model is None:\n                raise gr.Error(\"Align model required for whisperx backend\")\n            transcribe_model = WhisperxModel(whisper_model_name, align_model)\n\n    voicecraft_name = f\"{voicecraft_model_name}.pth\"\n    model = voicecraft.VoiceCraft.from_pretrained(f\"pyp1/VoiceCraft_{voicecraft_name.replace('.pth', '')}\")\n    phn2num = model.args.phn2num\n    config = model.args\n    model.to(device)\n\n    encodec_fn = f\"{MODELS_PATH}/encodec_4cb2048_giga.th\"\n    if not os.path.exists(encodec_fn):\n        os.system(f\"wget https://huggingface.co/pyp1/VoiceCraft/resolve/main/encodec_4cb2048_giga.th -O \" + encodec_fn)\n\n    voicecraft_model = {\n        \"config\": config,\n        \"phn2num\": phn2num,\n        \"model\": model,\n        \"text_tokenizer\": TextTokenizer(backend=\"espeak\"),\n        \"audio_tokenizer\": AudioTokenizer(signature=encodec_fn)\n    }\n    return gr.Accordion()\n\n\ndef get_transcribe_state(segments):\n    words_info = [word_info for segment in segments for word_info in segment[\"words\"]]\n    transcript = \" \".join([segment[\"text\"] for segment in segments])\n    transcript = transcript[1:] if transcript[0] == \" \" else transcript\n    return {\n        \"segments\": segments,\n        \"transcript\": transcript,\n        \"words_info\": words_info,\n        \"transcript_with_start_time\": \" \".join([f\"{word['start']} {word['word']}\" for word in words_info]),\n        \"transcript_with_end_time\": \" \".join([f\"{word['word']} {word['end']}\" for word in words_info]),\n        \"word_bounds\": [f\"{word['start']} {word['word']} {word['end']}\" for word in words_info]\n    }\n\n\ndef transcribe(seed, audio_path):\n    if transcribe_model is None:\n        raise gr.Error(\"Transcription model not loaded\")\n    seed_everything(seed)\n\n    segments = transcribe_model.transcribe(audio_path)\n    state = get_transcribe_state(segments)\n\n    return [\n        state[\"transcript\"], state[\"transcript_with_start_time\"], state[\"transcript_with_end_time\"],\n        gr.Dropdown(value=state[\"word_bounds\"][-1], choices=state[\"word_bounds\"], interactive=True), # prompt_to_word\n        gr.Dropdown(value=state[\"word_bounds\"][0], choices=state[\"word_bounds\"], interactive=True), # edit_from_word\n        gr.Dropdown(value=state[\"word_bounds\"][-1], choices=state[\"word_bounds\"], interactive=True), # edit_to_word\n        state\n    ]\n\n\ndef align_segments(transcript, audio_path):\n    from aeneas.executetask import ExecuteTask\n    from aeneas.task import Task\n    import json\n    config_string = 'task_language=eng|os_task_file_format=json|is_text_type=plain'\n\n    tmp_transcript_path = os.path.join(TMP_PATH, f\"{get_random_string()}.txt\")\n    tmp_sync_map_path = os.path.join(TMP_PATH, f\"{get_random_string()}.json\")\n    with open(tmp_transcript_path, \"w\") as f:\n        f.write(transcript)\n\n    task = Task(config_string=config_string)\n    task.audio_file_path_absolute = os.path.abspath(audio_path)\n    task.text_file_path_absolute = os.path.abspath(tmp_transcript_path)\n    task.sync_map_file_path_absolute = os.path.abspath(tmp_sync_map_path)\n    ExecuteTask(task).execute()\n    task.output_sync_map_file()\n\n    with open(tmp_sync_map_path, \"r\") as f:\n        return json.load(f)\n\n\ndef align(seed, transcript, audio_path):\n    if align_model is None:\n        raise gr.Error(\"Align model not loaded\")\n    seed_everything(seed)\n    transcript = replace_numbers_with_words(transcript).replace(\"  \", \" \").replace(\"  \", \" \")\n    fragments = align_segments(transcript, audio_path)\n    segments = [{\n        \"start\": float(fragment[\"begin\"]),\n        \"end\": float(fragment[\"end\"]),\n        \"text\": \" \".join(fragment[\"lines\"])\n    } for fragment in fragments[\"fragments\"]]\n    segments = align_model.align(segments, audio_path)\n    state = get_transcribe_state(segments)\n\n    return [\n        state[\"transcript_with_start_time\"], state[\"transcript_with_end_time\"],\n        gr.Dropdown(value=state[\"word_bounds\"][-1], choices=state[\"word_bounds\"], interactive=True), # prompt_to_word\n        gr.Dropdown(value=state[\"word_bounds\"][0], choices=state[\"word_bounds\"], interactive=True), # edit_from_word\n        gr.Dropdown(value=state[\"word_bounds\"][-1], choices=state[\"word_bounds\"], interactive=True), # edit_to_word\n        state\n    ]\n\n\ndef get_output_audio(audio_tensors, codec_audio_sr):\n    result = torch.cat(audio_tensors, 1)\n    buffer = io.BytesIO()\n    torchaudio.save(buffer, result, int(codec_audio_sr), format=\"wav\")\n    buffer.seek(0)\n    return buffer.read()\n\ndef replace_numbers_with_words(sentence):\n    sentence = re.sub(r'(\\d+)', r' \\1 ', sentence) # add spaces around numbers\n    def replace_with_words(match):\n        num = match.group(0)\n        try:\n            return num2words(num) # Convert numbers to words\n        except:\n            return num # In case num2words fails (unlikely with digits but just to be safe)\n    return re.sub(r'\\b\\d+\\b', replace_with_words, sentence) # Regular expression that matches numbers\n\ndef run(seed, left_margin, right_margin, codec_audio_sr, codec_sr, top_k, top_p, temperature,\n        stop_repetition, sample_batch_size, kvcache, silence_tokens,\n        audio_path, transcribe_state, transcript, smart_transcript,\n        mode, prompt_end_time, edit_start_time, edit_end_time,\n        split_text, selected_sentence, previous_audio_tensors):\n    if voicecraft_model is None:\n        raise gr.Error(\"VoiceCraft model not loaded\")\n    if smart_transcript and (transcribe_state is None):\n        raise gr.Error(\"Can't use smart transcript: whisper transcript not found\")\n\n    seed_everything(seed)\n    transcript = replace_numbers_with_words(transcript).replace(\"  \", \" \").replace(\"  \", \" \") # replace numbers with words, so that the phonemizer can do a better job\n\n    if mode == \"Long TTS\":\n        if split_text == \"Newline\":\n            sentences = transcript.split('\\n')\n        else:\n            from nltk.tokenize import sent_tokenize\n            sentences = sent_tokenize(transcript.replace(\"\\n\", \" \"))\n    elif mode == \"Rerun\":\n        colon_position = selected_sentence.find(':')\n        selected_sentence_idx = int(selected_sentence[:colon_position])\n        sentences = [selected_sentence[colon_position + 1:]]\n    else:\n        sentences = [transcript.replace(\"\\n\", \" \")]\n\n    info = torchaudio.info(audio_path)\n    audio_dur = info.num_frames / info.sample_rate\n\n    audio_tensors = []\n    inference_transcript = \"\"\n    for sentence in sentences:\n        decode_config = {\"top_k\": top_k, \"top_p\": top_p, \"temperature\": temperature, \"stop_repetition\": stop_repetition,\n                         \"kvcache\": kvcache, \"codec_audio_sr\": codec_audio_sr, \"codec_sr\": codec_sr,\n                         \"silence_tokens\": silence_tokens, \"sample_batch_size\": sample_batch_size}\n        if mode != \"Edit\":\n            from inference_tts_scale import inference_one_sample\n\n            if smart_transcript:\n                target_transcript = \"\"\n                for word in transcribe_state[\"words_info\"]:\n                    if word[\"end\"] < prompt_end_time:\n                        target_transcript += word[\"word\"] + (\" \" if word[\"word\"][-1] != \" \" else \"\")\n                    elif (word[\"start\"] + word[\"end\"]) / 2 < prompt_end_time:\n                        # include part of the word it it's big, but adjust prompt_end_time\n                        target_transcript += word[\"word\"] + (\" \" if word[\"word\"][-1] != \" \" else \"\")\n                        prompt_end_time = word[\"end\"]\n                        break\n                    else:\n                        break\n                target_transcript += f\" {sentence}\"\n            else:\n                target_transcript = sentence\n\n            inference_transcript += target_transcript + \"\\n\"\n            target_transcript = re.sub(_whitespace_re, \" \", target_transcript)\n            prompt_end_frame = int(min(audio_dur, prompt_end_time) * info.sample_rate)\n            _, gen_audio = inference_one_sample(voicecraft_model[\"model\"],\n                                                voicecraft_model[\"config\"],\n                                                voicecraft_model[\"phn2num\"],\n                                                voicecraft_model[\"text_tokenizer\"], voicecraft_model[\"audio_tokenizer\"],\n                                                audio_path, target_transcript, device, decode_config,\n                                                prompt_end_frame)\n        else:\n            from inference_speech_editing_scale import inference_one_sample\n\n            if smart_transcript:\n                target_transcript = \"\"\n                for word in transcribe_state[\"words_info\"]:\n                    if word[\"start\"] < edit_start_time:\n                        target_transcript += word[\"word\"] + (\" \" if word[\"word\"][-1] != \" \" else \"\")\n                    else:\n                        break\n                target_transcript += f\" {sentence}\"\n                for word in transcribe_state[\"words_info\"]:\n                    if word[\"end\"] > edit_end_time:\n                        target_transcript += word[\"word\"] + (\" \" if word[\"word\"][-1] != \" \" else \"\")\n            else:\n                target_transcript = sentence\n\n            inference_transcript += target_transcript + \"\\n\"\n            target_transcript = re.sub(_whitespace_re, \" \", target_transcript)\n            morphed_span = (max(edit_start_time - left_margin, 1 / codec_sr), min(edit_end_time + right_margin, audio_dur))\n            mask_interval = [[round(morphed_span[0]*codec_sr), round(morphed_span[1]*codec_sr)]]\n            mask_interval = torch.LongTensor(mask_interval)\n\n            _, gen_audio = inference_one_sample(voicecraft_model[\"model\"],\n                                                voicecraft_model[\"config\"],\n                                                voicecraft_model[\"phn2num\"],\n                                                voicecraft_model[\"text_tokenizer\"], voicecraft_model[\"audio_tokenizer\"],\n                                                audio_path, target_transcript, mask_interval, device, decode_config)\n        gen_audio = gen_audio[0].cpu()\n        audio_tensors.append(gen_audio)\n\n    if mode != \"Rerun\":\n        output_audio = get_output_audio(audio_tensors, codec_audio_sr)\n        sentences = [f\"{idx}: {text}\" for idx, text in enumerate(sentences)]\n        component = gr.Dropdown(choices=sentences, value=sentences[0])\n        return output_audio, inference_transcript, component, audio_tensors\n    else:\n        previous_audio_tensors[selected_sentence_idx] = audio_tensors[0]\n        output_audio = get_output_audio(previous_audio_tensors, codec_audio_sr)\n        sentence_audio = get_output_audio(audio_tensors, codec_audio_sr)\n        return output_audio, inference_transcript, sentence_audio, previous_audio_tensors\n\n\ndef update_input_audio(audio_path):\n    if audio_path is None:\n        return 0, 0, 0\n\n    info = torchaudio.info(audio_path)\n    max_time = round(info.num_frames / info.sample_rate, 2)\n    return [\n        gr.Slider(maximum=max_time, value=max_time),\n        gr.Slider(maximum=max_time, value=0),\n        gr.Slider(maximum=max_time, value=max_time),\n    ]\n\n\ndef change_mode(mode):\n    # tts_mode_controls, edit_mode_controls, edit_word_mode, split_text, long_tts_sentence_editor\n    return [\n        gr.Group(visible=mode != \"Edit\"),\n        gr.Group(visible=mode == \"Edit\"),\n        gr.Radio(visible=mode == \"Edit\"),\n        gr.Radio(visible=mode == \"Long TTS\"),\n        gr.Group(visible=mode == \"Long TTS\"),\n    ]\n\n\ndef load_sentence(selected_sentence, codec_audio_sr, audio_tensors):\n    if selected_sentence is None:\n        return None\n    colon_position = selected_sentence.find(':')\n    selected_sentence_idx = int(selected_sentence[:colon_position])\n    return get_output_audio([audio_tensors[selected_sentence_idx]], codec_audio_sr)\n\n\ndef update_bound_word(is_first_word, selected_word, edit_word_mode):\n    if selected_word is None:\n        return None\n\n    word_start_time = float(selected_word.split(' ')[0])\n    word_end_time = float(selected_word.split(' ')[-1])\n    if edit_word_mode == \"Replace half\":\n        bound_time = (word_start_time + word_end_time) / 2\n    elif is_first_word:\n        bound_time = word_start_time\n    else:\n        bound_time = word_end_time\n\n    return bound_time\n\n\ndef update_bound_words(from_selected_word, to_selected_word, edit_word_mode):\n    return [\n        update_bound_word(True, from_selected_word, edit_word_mode),\n        update_bound_word(False, to_selected_word, edit_word_mode),\n    ]\n\n\nsmart_transcript_info = \"\"\"\nIf enabled, the target transcript will be constructed for you:</br>\n - In TTS and Long TTS mode just write the text you want to synthesize.</br>\n - In Edit mode just write the text to replace selected editing segment.</br>\nIf disabled, you should write the target transcript yourself:</br>\n - In TTS mode write prompt transcript followed by generation transcript.</br>\n - In Long TTS select split by newline (<b>SENTENCE SPLIT WON'T WORK</b>) and start each line with a prompt transcript.</br>\n - In Edit mode write full prompt</br>\n\"\"\"\n\ndemo_original_transcript = \"Gwynplaine had, besides, for his work and for his feats of strength, round his neck and over his shoulders, an esclavine of leather.\"\n\ndemo_text = {\n    \"TTS\": {\n        \"smart\": \"I cannot believe that the same model can also do text to speech synthesis too!\",\n        \"regular\": \"Gwynplaine had, besides, for his work and for his feats of strength, I cannot believe that the same model can also do text to speech synthesis too!\"\n    },\n    \"Edit\": {\n        \"smart\": \"take over the stage for half an hour,\",\n        \"regular\": \"Gwynplaine had, besides, for his work and for his feats of strength, take over the stage for half an hour, an esclavine of leather.\"\n    },\n    \"Long TTS\": {\n        \"smart\": \"You can run the model on a big text!\\n\"\n                 \"Just write it line-by-line. Or sentence-by-sentence.\\n\"\n                 \"If some sentences sound odd, just rerun the model on them, no need to generate the whole text again!\",\n        \"regular\": \"Gwynplaine had, besides, for his work and for his feats of strength, You can run the model on a big text!\\n\"\n                   \"Gwynplaine had, besides, for his work and for his feats of strength, Just write it line-by-line. Or sentence-by-sentence.\\n\"\n                   \"Gwynplaine had, besides, for his work and for his feats of strength, If some sentences sound odd, just rerun the model on them, no need to generate the whole text again!\"\n    }\n}\n\nall_demo_texts = {vv for k, v in demo_text.items() for kk, vv in v.items()}\n\ndemo_words = ['0.069 Gwynplain 0.611', '0.671 had, 0.912', '0.952 besides, 1.414', '1.494 for 1.634', '1.695 his 1.835', '1.915 work 2.136', '2.196 and 2.297', '2.337 for 2.517', '2.557 his 2.678', '2.758 feats 3.019', '3.079 of 3.139', '3.2 strength, 3.561', '4.022 round 4.263', '4.303 his 4.444', '4.524 neck 4.705', '4.745 and 4.825', '4.905 over 5.086', '5.146 his 5.266', '5.307 shoulders, 5.768', '6.23 an 6.33', '6.531 esclavine 7.133', '7.213 of 7.293', '7.353 leather. 7.614']\n\ndemo_words_info = [{'word': 'Gwynplain', 'start': 0.069, 'end': 0.611, 'score': 0.833}, {'word': 'had,', 'start': 0.671, 'end': 0.912, 'score': 0.879}, {'word': 'besides,', 'start': 0.952, 'end': 1.414, 'score': 0.863}, {'word': 'for', 'start': 1.494, 'end': 1.634, 'score': 0.89}, {'word': 'his', 'start': 1.695, 'end': 1.835, 'score': 0.669}, {'word': 'work', 'start': 1.915, 'end': 2.136, 'score': 0.916}, {'word': 'and', 'start': 2.196, 'end': 2.297, 'score': 0.766}, {'word': 'for', 'start': 2.337, 'end': 2.517, 'score': 0.808}, {'word': 'his', 'start': 2.557, 'end': 2.678, 'score': 0.786}, {'word': 'feats', 'start': 2.758, 'end': 3.019, 'score': 0.97}, {'word': 'of', 'start': 3.079, 'end': 3.139, 'score': 0.752}, {'word': 'strength,', 'start': 3.2, 'end': 3.561, 'score': 0.742}, {'word': 'round', 'start': 4.022, 'end': 4.263, 'score': 0.916}, {'word': 'his', 'start': 4.303, 'end': 4.444, 'score': 0.666}, {'word': 'neck', 'start': 4.524, 'end': 4.705, 'score': 0.908}, {'word': 'and', 'start': 4.745, 'end': 4.825, 'score': 0.882}, {'word': 'over', 'start': 4.905, 'end': 5.086, 'score': 0.847}, {'word': 'his', 'start': 5.146, 'end': 5.266, 'score': 0.791}, {'word': 'shoulders,', 'start': 5.307, 'end': 5.768, 'score': 0.729}, {'word': 'an', 'start': 6.23, 'end': 6.33, 'score': 0.854}, {'word': 'esclavine', 'start': 6.531, 'end': 7.133, 'score': 0.803}, {'word': 'of', 'start': 7.213, 'end': 7.293, 'score': 0.772}, {'word': 'leather.', 'start': 7.353, 'end': 7.614, 'score': 0.896}]\n\n\ndef update_demo(mode, smart_transcript, edit_word_mode, transcript, edit_from_word, edit_to_word):\n    if transcript not in all_demo_texts:\n        return transcript, edit_from_word, edit_to_word\n\n    replace_half = edit_word_mode == \"Replace half\"\n    change_edit_from_word = edit_from_word == demo_words[2] or edit_from_word == demo_words[3]\n    change_edit_to_word = edit_to_word == demo_words[11] or edit_to_word == demo_words[12]\n    demo_edit_from_word_value = demo_words[2] if replace_half else demo_words[3]\n    demo_edit_to_word_value = demo_words[12] if replace_half else demo_words[11]\n    return [\n        demo_text[mode][\"smart\" if smart_transcript else \"regular\"],\n        demo_edit_from_word_value if change_edit_from_word else edit_from_word,\n        demo_edit_to_word_value if change_edit_to_word else edit_to_word,\n    ]\n\n\ndef get_app():\n    with gr.Blocks() as app:\n        with gr.Row():\n            with gr.Column(scale=2):\n                load_models_btn = gr.Button(value=\"Load models\")\n            with gr.Column(scale=5):\n                with gr.Accordion(\"Select models\", open=False) as models_selector:\n                    with gr.Row():\n                        voicecraft_model_choice = gr.Radio(label=\"VoiceCraft model\", value=\"830M_TTSEnhanced\",\n                                                        choices=[\"330M\", \"830M\", \"330M_TTSEnhanced\", \"830M_TTSEnhanced\"])\n                        whisper_backend_choice = gr.Radio(label=\"Whisper backend\", value=\"whisperX\", choices=[\"whisperX\", \"whisper\"])\n                        whisper_model_choice = gr.Radio(label=\"Whisper model\", value=\"base.en\",\n                                                        choices=[None, \"base.en\", \"small.en\", \"medium.en\", \"large\"])\n                        align_model_choice = gr.Radio(label=\"Forced alignment model\", value=\"whisperX\", choices=[\"whisperX\", None])\n\n        with gr.Row():\n            with gr.Column(scale=2):\n                input_audio = gr.Audio(value=f\"{DEMO_PATH}/5895_34622_000026_000002.wav\", label=\"Input Audio\", type=\"filepath\", interactive=True)\n                with gr.Group():\n                    original_transcript = gr.Textbox(label=\"Original transcript\", lines=5, value=demo_original_transcript,\n                                                    info=\"Use whisperx model to get the transcript. Fix and align it if necessary.\")\n                    with gr.Accordion(\"Word start time\", open=False):\n                        transcript_with_start_time = gr.Textbox(label=\"Start time\", lines=5, interactive=False, info=\"Start time before each word\")\n                    with gr.Accordion(\"Word end time\", open=False):\n                        transcript_with_end_time = gr.Textbox(label=\"End time\", lines=5, interactive=False, info=\"End time after each word\")\n\n                    transcribe_btn = gr.Button(value=\"Transcribe\")\n                    align_btn = gr.Button(value=\"Align\")\n\n            with gr.Column(scale=3):\n                with gr.Group():\n                    transcript = gr.Textbox(label=\"Text\", lines=7, value=demo_text[\"TTS\"][\"smart\"])\n                    with gr.Row():\n                        smart_transcript = gr.Checkbox(label=\"Smart transcript\", value=True)\n                        with gr.Accordion(label=\"?\", open=False):\n                            info = gr.Markdown(value=smart_transcript_info)\n\n                    with gr.Row():\n                        mode = gr.Radio(label=\"Mode\", choices=[\"TTS\", \"Edit\", \"Long TTS\"], value=\"TTS\")\n                        split_text = gr.Radio(label=\"Split text\", choices=[\"Newline\", \"Sentence\"], value=\"Newline\",\n                                            info=\"Split text into parts and run TTS for each part.\", visible=False)\n                        edit_word_mode = gr.Radio(label=\"Edit word mode\", choices=[\"Replace half\", \"Replace all\"], value=\"Replace all\",\n                                                info=\"What to do with first and last word\", visible=False)\n\n                    with gr.Group() as tts_mode_controls:\n                        prompt_to_word = gr.Dropdown(label=\"Last word in prompt\", choices=demo_words, value=demo_words[11], interactive=True)\n                        prompt_end_time = gr.Slider(label=\"Prompt end time\", minimum=0, maximum=7.614, step=0.001, value=3.600)\n\n                    with gr.Group(visible=False) as edit_mode_controls:\n                        with gr.Row():\n                            edit_from_word = gr.Dropdown(label=\"First word to edit\", choices=demo_words, value=demo_words[12], interactive=True)\n                            edit_to_word = gr.Dropdown(label=\"Last word to edit\", choices=demo_words, value=demo_words[18], interactive=True)\n                        with gr.Row():\n                            edit_start_time = gr.Slider(label=\"Edit from time\", minimum=0, maximum=7.614, step=0.001, value=4.022)\n                            edit_end_time = gr.Slider(label=\"Edit to time\", minimum=0, maximum=7.614, step=0.001, value=5.768)\n\n                    run_btn = gr.Button(value=\"Run\")\n\n            with gr.Column(scale=2):\n                output_audio = gr.Audio(label=\"Output Audio\")\n                with gr.Accordion(\"Inference transcript\", open=False):\n                    inference_transcript = gr.Textbox(label=\"Inference transcript\", lines=5, interactive=False,\n                                                    info=\"Inference was performed on this transcript.\")\n                with gr.Group(visible=False) as long_tts_sentence_editor:\n                    sentence_selector = gr.Dropdown(label=\"Sentence\", value=None,\n                                                    info=\"Select sentence you want to regenerate\")\n                    sentence_audio = gr.Audio(label=\"Sentence Audio\", scale=2)\n                    rerun_btn = gr.Button(value=\"Rerun\")\n\n        with gr.Row():\n            with gr.Accordion(\"Generation Parameters - change these if you are unhappy with the generation\", open=False):\n                stop_repetition = gr.Radio(label=\"stop_repetition\", choices=[-1, 1, 2, 3, 4], value=3,\n                                        info=\"if there are long silence in the generated audio, reduce the stop_repetition to 2 or 1. -1 = disabled\")\n                sample_batch_size = gr.Number(label=\"speech rate\", value=3, precision=0,\n                                            info=\"The higher the number, the faster the output will be. \"\n                                                \"Under the hood, the model will generate this many samples and choose the shortest one. \"\n                                                \"For giga330M_TTSEnhanced, 1 or 2 should be fine since the model is trained to do TTS.\")\n                seed = gr.Number(label=\"seed\", value=-1, precision=0, info=\"random seeds always works :)\")\n                kvcache = gr.Radio(label=\"kvcache\", choices=[0, 1], value=1,\n                                    info=\"set to 0 to use less VRAM, but with slower inference\")\n                left_margin = gr.Number(label=\"left_margin\", value=0.08, info=\"margin to the left of the editing segment\")\n                right_margin = gr.Number(label=\"right_margin\", value=0.08, info=\"margin to the right of the editing segment\")\n                top_p = gr.Number(label=\"top_p\", value=1, info=\"do not do topp sampling therefore set it to 1\")\n                temperature = gr.Number(label=\"temperature\", value=1, info=\"haven't try other values, do not recommend to change\")\n                top_k = gr.Number(label=\"top_k\", value=40, info=\"40 is a good default, can also try 20, 30\")\n                codec_audio_sr = gr.Number(label=\"codec_audio_sr\", value=16000, info='encodec specific, Do not change')\n                codec_sr = gr.Number(label=\"codec_sr\", value=50, info='encodec specific, Do not change')\n                silence_tokens = gr.Textbox(label=\"silence tokens\", value=\"[1388,1898,131]\", info=\"encodec specific, do not change\")\n\n\n        audio_tensors = gr.State()\n        transcribe_state = gr.State(value={\"words_info\": demo_words_info})\n\n\n        mode.change(fn=update_demo,\n                    inputs=[mode, smart_transcript, edit_word_mode, transcript, edit_from_word, edit_to_word],\n                    outputs=[transcript, edit_from_word, edit_to_word])\n        edit_word_mode.change(fn=update_demo,\n                            inputs=[mode, smart_transcript, edit_word_mode, transcript, edit_from_word, edit_to_word],\n                            outputs=[transcript, edit_from_word, edit_to_word])\n        smart_transcript.change(fn=update_demo,\n                                inputs=[mode, smart_transcript, edit_word_mode, transcript, edit_from_word, edit_to_word],\n                                outputs=[transcript, edit_from_word, edit_to_word])\n\n        load_models_btn.click(fn=load_models,\n                            inputs=[whisper_backend_choice, whisper_model_choice, align_model_choice, voicecraft_model_choice],\n                            outputs=[models_selector])\n\n        input_audio.upload(fn=update_input_audio,\n                        inputs=[input_audio],\n                        outputs=[prompt_end_time, edit_start_time, edit_end_time])\n        transcribe_btn.click(fn=transcribe,\n                            inputs=[seed, input_audio],\n                            outputs=[original_transcript, transcript_with_start_time, transcript_with_end_time,\n                                    prompt_to_word, edit_from_word, edit_to_word, transcribe_state])\n        align_btn.click(fn=align,\n                        inputs=[seed, original_transcript, input_audio],\n                        outputs=[transcript_with_start_time, transcript_with_end_time,\n                                prompt_to_word, edit_from_word, edit_to_word, transcribe_state])\n\n        mode.change(fn=change_mode,\n                    inputs=[mode],\n                    outputs=[tts_mode_controls, edit_mode_controls, edit_word_mode, split_text, long_tts_sentence_editor])\n\n        run_btn.click(fn=run,\n                    inputs=[\n                        seed, left_margin, right_margin,\n                        codec_audio_sr, codec_sr,\n                        top_k, top_p, temperature,\n                        stop_repetition, sample_batch_size,\n                        kvcache, silence_tokens,\n                        input_audio, transcribe_state, transcript, smart_transcript,\n                        mode, prompt_end_time, edit_start_time, edit_end_time,\n                        split_text, sentence_selector, audio_tensors\n                    ],\n                    outputs=[output_audio, inference_transcript, sentence_selector, audio_tensors])\n\n        sentence_selector.change(fn=load_sentence,\n                                inputs=[sentence_selector, codec_audio_sr, audio_tensors],\n                                outputs=[sentence_audio])\n        rerun_btn.click(fn=run,\n                        inputs=[\n                            seed, left_margin, right_margin,\n                            codec_audio_sr, codec_sr,\n                            top_k, top_p, temperature,\n                            stop_repetition, sample_batch_size,\n                            kvcache, silence_tokens,\n                            input_audio, transcribe_state, transcript, smart_transcript,\n                            gr.State(value=\"Rerun\"), prompt_end_time, edit_start_time, edit_end_time,\n                            split_text, sentence_selector, audio_tensors\n                        ],\n                        outputs=[output_audio, inference_transcript, sentence_audio, audio_tensors])\n\n        prompt_to_word.change(fn=update_bound_word,\n                            inputs=[gr.State(False), prompt_to_word, gr.State(\"Replace all\")],\n                            outputs=[prompt_end_time])\n        edit_from_word.change(fn=update_bound_word,\n                            inputs=[gr.State(True), edit_from_word, edit_word_mode],\n                            outputs=[edit_start_time])\n        edit_to_word.change(fn=update_bound_word,\n                            inputs=[gr.State(False), edit_to_word, edit_word_mode],\n                            outputs=[edit_end_time])\n        edit_word_mode.change(fn=update_bound_words,\n                            inputs=[edit_from_word, edit_to_word, edit_word_mode],\n                            outputs=[edit_start_time, edit_end_time])\n    return app\n\n\nif __name__ == \"__main__\":\n    import argparse\n\n    parser = argparse.ArgumentParser(description=\"VoiceCraft gradio app.\")\n    \n    parser.add_argument(\"--demo-path\", default=\"./demo\", help=\"Path to demo directory\")\n    parser.add_argument(\"--tmp-path\", default=\"./demo/temp\", help=\"Path to tmp directory\")\n    parser.add_argument(\"--models-path\", default=\"./pretrained_models\", help=\"Path to voicecraft models directory\")\n    parser.add_argument(\"--port\", default=7860, type=int, help=\"App port\")\n    parser.add_argument(\"--share\", action=\"store_true\", help=\"Launch with public url\")\n    parser.add_argument(\"--server_name\", default=\"127.0.0.1\", type=str, help=\"Server name for launching the app. 127.0.0.1 for localhost; 0.0.0.0 to allow access from other machines in the local network. Might also give access to external users depends on the firewall settings.\")\n\n    os.environ[\"USER\"] = os.getenv(\"USER\", \"user\")\n    args = parser.parse_args()\n    DEMO_PATH = args.demo_path\n    TMP_PATH = args.tmp_path\n    MODELS_PATH = args.models_path\n\n    app = get_app()\n    app.queue().launch(share=args.share, server_name=args.server_name, server_port=args.port)\n"
  },
  {
    "path": "gradio_requirements.txt",
    "content": "gradio==3.50.2\nnltk>=3.8.1\nopenai-whisper>=20231117\naeneas>=1.7.3.0\nwhisperx>=3.1.1\nhuggingface_hub==0.22.2\nnum2words==0.5.13\n"
  },
  {
    "path": "inference_speech_editing.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import os\\n\",\n    \"os.environ[\\\"CUDA_DEVICE_ORDER\\\"]=\\\"PCI_BUS_ID\\\"   \\n\",\n    \"os.environ[\\\"CUDA_VISIBLE_DEVICES\\\"]=\\\"7\\\"\\n\",\n    \"os.environ[\\\"USER\\\"] = \\\"YOUR_USERNAME\\\" # TODO change this to your username\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/home/pyp/miniconda3/envs/voicecraft/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\\n\",\n      \"  from .autonotebook import tqdm as notebook_tqdm\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# import libs\\n\",\n    \"import torch\\n\",\n    \"import torchaudio\\n\",\n    \"import numpy as np\\n\",\n    \"import random\\n\",\n    \"from argparse import Namespace\\n\",\n    \"\\n\",\n    \"from data.tokenizer import (\\n\",\n    \"    AudioTokenizer,\\n\",\n    \"    TextTokenizer,\\n\",\n    \")\\n\",\n    \"\\n\",\n    \"from models import voicecraft\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# install MFA models and dictionaries if you haven't done so already\\n\",\n    \"!source ~/.bashrc && \\\\\\n\",\n    \"    conda activate voicecraft && \\\\\\n\",\n    \"    mfa model download dictionary english_us_arpa && \\\\\\n\",\n    \"    mfa model download acoustic english_us_arpa\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# hyperparameters for inference\\n\",\n    \"left_margin = 0.08\\n\",\n    \"right_margin = 0.08\\n\",\n    \"codec_audio_sr = 16000\\n\",\n    \"codec_sr = 50\\n\",\n    \"top_k = 40\\n\",\n    \"top_p = 1\\n\",\n    \"temperature = 1\\n\",\n    \"kvcache = 0\\n\",\n    \"# adjust the below three arguments if the generation is not as good\\n\",\n    \"seed = 1 # random seed magic\\n\",\n    \"silence_tokens = [1388,1898,131] # if there are long silence in the generated audio, reduce the stop_repetition to 3, 2 or even 1\\n\",\n    \"stop_repetition = -1 # -1 means do not adjust prob of silence tokens. if there are long silence or unnaturally strecthed words, increase sample_batch_size to 2, 3 or even 4\\n\",\n    \"# what this will do to the model is that the model will run sample_batch_size examples of the same audio, and pick the one that's the shortest\\n\",\n    \"def seed_everything(seed):\\n\",\n    \"    os.environ['PYTHONHASHSEED'] = str(seed)\\n\",\n    \"    random.seed(seed)\\n\",\n    \"    np.random.seed(seed)\\n\",\n    \"    torch.manual_seed(seed)\\n\",\n    \"    torch.cuda.manual_seed(seed)\\n\",\n    \"    torch.backends.cudnn.benchmark = False\\n\",\n    \"    torch.backends.cudnn.deterministic = True\\n\",\n    \"seed_everything(seed)\\n\",\n    \"device = \\\"cuda\\\" if torch.cuda.is_available() else \\\"cpu\\\"\\n\",\n    \"# load model, tokenizer, and other necessary files\\n\",\n    \"voicecraft_name=\\\"giga330M.pth\\\" # or gigaHalfLibri330M_TTSEnhanced_max16s.pth, giga830M.pth\\n\",\n    \"\\n\",\n    \"# the new way of loading the model, with huggingface, recommended\\n\",\n    \"from models import voicecraft\\n\",\n    \"model = voicecraft.VoiceCraft.from_pretrained(f\\\"pyp1/VoiceCraft_{voicecraft_name.replace('.pth', '')}\\\")\\n\",\n    \"phn2num = model.args.phn2num\\n\",\n    \"config = vars(model.args)\\n\",\n    \"model.to(device)\\n\",\n    \"\\n\",\n    \"# # the old way of loading the model\\n\",\n    \"# from models import voicecraft\\n\",\n    \"# filepath = hf_hub_download(repo_id=\\\"pyp1/VoiceCraft\\\", filename=voicecraft_name, repo_type=\\\"model\\\")\\n\",\n    \"# ckpt = torch.load(filepath, map_location=\\\"cpu\\\")\\n\",\n    \"# model = voicecraft.VoiceCraft(ckpt[\\\"config\\\"])\\n\",\n    \"# model.load_state_dict(ckpt[\\\"model\\\"])\\n\",\n    \"# config = vars(model.args)\\n\",\n    \"# phn2num = ckpt[\\\"phn2num\\\"]\\n\",\n    \"# model.to(device)\\n\",\n    \"# model.eval()\\n\",\n    \"\\n\",\n    \"encodec_fn = \\\"./pretrained_models/encodec_4cb2048_giga.th\\\"\\n\",\n    \"if not os.path.exists(encodec_fn):\\n\",\n    \"    os.system(f\\\"wget https://huggingface.co/pyp1/VoiceCraft/resolve/main/encodec_4cb2048_giga.th\\\")\\n\",\n    \"    os.system(f\\\"mv encodec_4cb2048_giga.th ./pretrained_models/encodec_4cb2048_giga.th\\\")\\n\",\n    \"audio_tokenizer = AudioTokenizer(signature=encodec_fn) # will also put the neural codec model on gpu\\n\",\n    \"\\n\",\n    \"text_tokenizer = TextTokenizer(backend=\\\"espeak\\\")\\n\",\n    \"\\n\",\n    \"# point to the original file or record the file\\n\",\n    \"# write down the transcript for the file, or run whisper to get the transcript (and you can modify it if it's not accurate), save it as a .txt file\\n\",\n    \"orig_audio = \\\"./demo/84_121550_000074_000000.wav\\\"\\n\",\n    \"orig_transcript = \\\"But when I had approached so near to them The common object, which the sense deceives, Lost not by distance any of its marks,\\\"\\n\",\n    \"# move the audio and transcript to temp folder\\n\",\n    \"temp_folder = \\\"./demo/temp\\\"\\n\",\n    \"os.makedirs(temp_folder, exist_ok=True)\\n\",\n    \"os.system(f\\\"cp {orig_audio} {temp_folder}\\\")\\n\",\n    \"filename = os.path.splitext(orig_audio.split(\\\"/\\\")[-1])[0]\\n\",\n    \"with open(f\\\"{temp_folder}/{filename}.txt\\\", \\\"w\\\") as f:\\n\",\n    \"    f.write(orig_transcript)\\n\",\n    \"# run MFA to get the alignment\\n\",\n    \"align_temp = f\\\"{temp_folder}/mfa_alignments\\\"\\n\",\n    \"os.makedirs(align_temp, exist_ok=True)\\n\",\n    \"os.system(f\\\"mfa align -j 1 --output_format csv {temp_folder} english_us_arpa english_us_arpa {align_temp}\\\")\\n\",\n    \"# if it fail, it could be because the audio is too hard for the alignment model, increasing the beam size usually solves the issue\\n\",\n    \"# os.system(f\\\"mfa align -j 1 --output_format csv {temp_folder} english_us_arpa english_us_arpa {align_temp} --beam 1000 --retry_beam 2000\\\")\\n\",\n    \"audio_fn = f\\\"{temp_folder}/{filename}.wav\\\"\\n\",\n    \"transcript_fn = f\\\"{temp_folder}/{filename}.txt\\\"\\n\",\n    \"align_fn = f\\\"{align_temp}/{filename}.csv\\\"\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"original:\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"\\n\",\n       \"                <audio  controls=\\\"controls\\\" >\\n\",\n       \"                    <source src=\\\"data:audio/wav;base64,UklGRqTgAwBXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YYDgAwDS/14AsACf/5X/ff+e/6H/Wv9ZACcAv/9Q/2H/FAArAEoALQDp/x8APAA3AAgAIgARAN3/3v/l//X/FQAQAAMA6P/m/9z/yv8TAOz/0//C/6j/CgAlABAA///h//3/DwDa/6r/q//r/w4A7//O/+n/LwBOAFQAMgD1/+3/EAD9/w0AIwAZAP7/IAAwABwAJQAjACcAJgAgADsASwAtADgAZQBpACsADgAKAAUAJwA+ADgANQBHAFkAWAAmACIARgBLAEEARAAbAB8ATABaAFQAMQAEAPH/2//c/1gAZAAwADcAJwDs/+7/MgAzABAA/v8hAPH/xv/n/wMAIQAPAAgA///k/87/0P8AAAAAAQDo/9//3P/L/+X/+v/2/87/5P/t////+//p//j/4f8AAAsACAAEAPv/6f/i//n/CgAQAAkAAgDy/+H/0//j//L//v8JAAkAAgD+/+T/zv/F/7j/vf/P/+n/6v/h//T/+P/R/+f/3P+x/5//m/+0/7D/yP+l/7f/uf+W/7L/wv/s/+X/y//K/87/4v/g/9f/3P/i//T/EwAhADAAKgDy//P/CAARAAgAAgAnACoACADr//3//P8QACYAPgBQADkAUgBuAGUAWABVAEsAYwB8AGEARgA5ACcALwAoAA8AKQAxACoAMgAkAAoA9v8YACcAHAAmABIAIQApACsALgAuADEAFwAyAD8ALAAsACgAHQAAABMAIAAbAB8AKgArAPf/7P/5/+7/6P/7/xAABgAJAAQA6//2/+z/2v/d//D/CQD9//L/6//a/9T/6P8BAOj/3v/h/+7/9P/4/woACADx//b/HgAGAOH/w//H/9r/2f/Z/9H/0f/M/8f/x//U/7z/l/+P/5H/hv+D/4n/mP+W/47/if+B/3z/d/97/43/mP+q/8n/uP+m/5n/iv+r/6b/of+y/7//1v/j/+D/0f+//8H/2//L/7X/zP/P/9n/8v/X/9T/4f/p//b/3v/S/9f/1v/G/+H/FQARABIAHAADAPb/9P/2//b/9/8EABMALwAuADUAKAAQAAsADgAfADwAQgAUABAAEgANAAgABgAGAAkADgD5/+b/6P/1//n/6v/n//n/AgDv/+z/6//n//L/6P/0//b/4f/e/9f/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\\\" type=\\\"audio/wav\\\" />\\n\",\n       \"                    Your browser does not support the audio element.\\n\",\n       \"                </audio>\\n\",\n       \"              \"\n      ],\n      \"text/plain\": [\n       \"<IPython.lib.display.Audio object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"edited:\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"text/html\": [\n       \"\\n\",\n       \"                <audio  controls=\\\"controls\\\" >\\n\",\n       \"                    <source src=\\\"data:audio/wav;base64,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\\\" type=\\\"audio/wav\\\" />\\n\",\n       \"                    Your browser does not support the audio element.\\n\",\n       \"                </audio>\\n\",\n       \"              \"\n      ],\n      \"text/plain\": [\n       \"<IPython.lib.display.Audio object>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"editTypes_set = set(['substitution', 'insertion', 'deletion'])\\n\",\n    \"# propose what do you want the target modified transcript to be\\n\",\n    \"target_transcript = \\\"But when I saw the mirage of the lake in the distance, which the sense deceives, Lost not by distance any of its marks,\\\"\\n\",\n    \"edit_type = \\\"substitution\\\"\\n\",\n    \"assert edit_type in editTypes_set, f\\\"Invalid edit type {edit_type}. Must be one of {editTypes_set}.\\\"\\n\",\n    \"\\n\",\n    \"# if you want to do a second modification on top of the first one, write down the second modification (target_transcript2, type_of_modification2)\\n\",\n    \"# make sure the two modification do not overlap, if they do, you need to combine them into one modification\\n\",\n    \"\\n\",\n    \"# run the script to turn user input to the format that the model can take\\n\",\n    \"from edit_utils import get_span\\n\",\n    \"orig_span, new_span = get_span(orig_transcript, target_transcript, edit_type)\\n\",\n    \"if orig_span[0] > orig_span[1]:\\n\",\n    \"    RuntimeError(f\\\"example {audio_fn} failed\\\")\\n\",\n    \"if orig_span[0] == orig_span[1]:\\n\",\n    \"    orig_span_save = [orig_span[0]]\\n\",\n    \"else:\\n\",\n    \"    orig_span_save = orig_span\\n\",\n    \"if new_span[0] == new_span[1]:\\n\",\n    \"    new_span_save = [new_span[0]]\\n\",\n    \"else:\\n\",\n    \"    new_span_save = new_span\\n\",\n    \"\\n\",\n    \"orig_span_save = \\\",\\\".join([str(item) for item in orig_span_save])\\n\",\n    \"new_span_save = \\\",\\\".join([str(item) for item in new_span_save])\\n\",\n    \"from inference_speech_editing_scale import get_mask_interval\\n\",\n    \"\\n\",\n    \"start, end = get_mask_interval(align_fn, orig_span_save, edit_type)\\n\",\n    \"info = torchaudio.info(audio_fn)\\n\",\n    \"audio_dur = info.num_frames / info.sample_rate\\n\",\n    \"morphed_span = (max(start - left_margin, 1/codec_sr), min(end + right_margin, audio_dur)) # in seconds\\n\",\n    \"\\n\",\n    \"# span in codec frames\\n\",\n    \"mask_interval = [[round(morphed_span[0]*codec_sr), round(morphed_span[1]*codec_sr)]]\\n\",\n    \"mask_interval = torch.LongTensor(mask_interval) # [M,2], M==1 for now\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"# run the model to get the output\\n\",\n    \"from inference_speech_editing_scale import inference_one_sample\\n\",\n    \"\\n\",\n    \"decode_config = {'top_k': top_k, 'top_p': top_p, 'temperature': temperature, 'stop_repetition': stop_repetition, 'kvcache': kvcache, \\\"codec_audio_sr\\\": codec_audio_sr, \\\"codec_sr\\\": codec_sr, \\\"silence_tokens\\\": silence_tokens}\\n\",\n    \"orig_audio, new_audio = inference_one_sample(model, Namespace(**config), phn2num, text_tokenizer, audio_tokenizer, audio_fn, target_transcript, mask_interval, device, decode_config)\\n\",\n    \"        \\n\",\n    \"# save segments for comparison\\n\",\n    \"orig_audio, new_audio = orig_audio[0].cpu(), new_audio[0].cpu()\\n\",\n    \"# logging.info(f\\\"length of the resynthesize orig audio: {orig_audio.shape}\\\")\\n\",\n    \"\\n\",\n    \"# display the audio\\n\",\n    \"from IPython.display import Audio\\n\",\n    \"print(\\\"original:\\\")\\n\",\n    \"display(Audio(orig_audio, rate=codec_audio_sr))\\n\",\n    \"\\n\",\n    \"print(\\\"edited:\\\")\\n\",\n    \"display(Audio(new_audio, rate=codec_audio_sr))\\n\",\n    \"\\n\",\n    \"# # save the audio\\n\",\n    \"# # output_dir\\n\",\n    \"# output_dir = \\\"./demo/generated_se\\\"\\n\",\n    \"# os.makedirs(output_dir, exist_ok=True)\\n\",\n    \"\\n\",\n    \"# save_fn_new = f\\\"{output_dir}/{os.path.basename(audio_fn)[:-4]}_new_seed{seed}.wav\\\"\\n\",\n    \"\\n\",\n    \"# torchaudio.save(save_fn_new, new_audio, codec_audio_sr)\\n\",\n    \"\\n\",\n    \"# save_fn_orig = f\\\"{output_dir}/{os.path.basename(audio_fn)[:-4]}_orig.wav\\\"\\n\",\n    \"# if not os.path.isfile(save_fn_orig):\\n\",\n    \"#     orig_audio, orig_sr = torchaudio.load(audio_fn)\\n\",\n    \"#     if orig_sr != codec_audio_sr:\\n\",\n    \"#         orig_audio = torchaudio.transforms.Resample(orig_sr, codec_audio_sr)(orig_audio)\\n\",\n    \"#     torchaudio.save(save_fn_orig, orig_audio, codec_audio_sr)\\n\",\n    \"\\n\",\n    \"# # if you get error importing T5 in transformers\\n\",\n    \"# # try \\n\",\n    \"# # pip uninstall Pillow\\n\",\n    \"# # pip install Pillow\\n\",\n    \"# # you are likely to get warning looks like WARNING:phonemizer:words count mismatch on 300.0% of the lines (3/1), this can be safely ignored\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"voicecraft\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.9.18\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "inference_speech_editing_scale.py",
    "content": "import argparse, pickle\nimport logging\nimport os, random\nimport numpy as np\nimport torch\nimport torchaudio\n\nfrom data.tokenizer import (\n    AudioTokenizer,\n    TextTokenizer,\n    tokenize_audio,\n    tokenize_text\n)\n\nfrom models import voicecraft\nimport argparse, time, tqdm\n\n# this script only works for the musicgen architecture\ndef get_args():\n    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)\n    parser.add_argument(\"--manifest_fn\", type=str, default=\"path/to/eval_metadata_file\")\n    parser.add_argument(\"--audio_root\", type=str, default=\"path/to/audio_folder\")\n    parser.add_argument(\"--exp_dir\", type=str, default=\"path/to/model_folder\")\n    parser.add_argument(\"--left_margin\", type=float, default=0.08, help=\"extra space on the left to the word boundary\")\n    parser.add_argument(\"--right_margin\", type=float, default=0.08, help=\"extra space on the right to the word boundary\")\n    parser.add_argument(\"--seed\", type=int, default=1)\n    parser.add_argument(\"--codec_audio_sr\", type=int, default=16000, help='the sample rate of audio that the codec is trained for')\n    parser.add_argument(\"--codec_sr\", type=int, default=50, help='the sample rate of the codec codes')\n    parser.add_argument(\"--top_k\", type=int, default=-1, help=\"sampling param\")\n    parser.add_argument(\"--top_p\", type=float, default=0.8, help=\"sampling param\")\n    parser.add_argument(\"--temperature\", type=float, default=1.0, help=\"sampling param\")\n    parser.add_argument(\"--output_dir\", type=str, default=None)\n    parser.add_argument(\"--device\", type=str, default=\"cuda\")\n    parser.add_argument(\"--signature\", type=str, default=None, help=\"path to the encodec model\")\n    parser.add_argument(\"--stop_repetition\", type=int, default=2, help=\"used for inference, when the number of consecutive repetition of a token is bigger than this, stop it\")\n    parser.add_argument(\"--kvcache\", type=int, default=1, help='if true, use kv cache, which is 4-8x faster than without')\n    parser.add_argument(\"--silence_tokens\", type=str, default=\"[1388,1898,131]\", help=\"note that if you are not using the pretrained encodec 6f79c6a8, make sure you specified it yourself, rather than using the default\")\n    return parser.parse_args()\n\n@torch.no_grad()\ndef inference_one_sample(model, model_args, phn2num, text_tokenizer, audio_tokenizer, audio_fn, target_text, mask_interval, device, decode_config):\n    # phonemize\n    text_tokens = [phn2num[phn] for phn in\n            tokenize_text(\n                text_tokenizer, text=target_text.strip()\n            ) if phn in phn2num\n        ]\n    text_tokens = torch.LongTensor(text_tokens).unsqueeze(0)\n    text_tokens_lens = torch.LongTensor([text_tokens.shape[-1]])\n\n    encoded_frames = tokenize_audio(audio_tokenizer, audio_fn)\n    original_audio = encoded_frames[0][0].transpose(2,1) # [1,T,K]\n    assert original_audio.ndim==3 and original_audio.shape[0] == 1 and original_audio.shape[2] == model_args.n_codebooks, original_audio.shape\n    logging.info(f\"with direct encodec encoding before input, original audio length: {original_audio.shape[1]} codec frames, which is {original_audio.shape[1]/decode_config['codec_sr']:.2f} sec.\")\n\n    # forward\n    stime = time.time()\n    encoded_frames = model.inference(\n        text_tokens.to(device),\n        text_tokens_lens.to(device),\n        original_audio[...,:model_args.n_codebooks].to(device), # [1,T,8]\n        mask_interval=mask_interval.unsqueeze(0).to(device),\n        top_k=decode_config['top_k'],\n        top_p=decode_config['top_p'],\n        temperature=decode_config['temperature'],\n        stop_repetition=decode_config['stop_repetition'],\n        kvcache=decode_config['kvcache'],\n        silence_tokens=eval(decode_config['silence_tokens']) if type(decode_config['silence_tokens']) == str else decode_config['silence_tokens'],\n    ) # output is [1,K,T]\n    logging.info(f\"inference on one sample take: {time.time() - stime:.4f} sec.\")\n    if type(encoded_frames) == tuple:\n        encoded_frames = encoded_frames[0]\n    logging.info(f\"generated encoded_frames.shape: {encoded_frames.shape}, which is {encoded_frames.shape[-1]/decode_config['codec_sr']} sec.\")\n    \n\n    # decode (both original and generated)\n    original_sample = audio_tokenizer.decode(\n        [(original_audio.transpose(2,1), None)] # [1,T,8] -> [1,8,T]\n    )\n    generated_sample = audio_tokenizer.decode(\n        [(encoded_frames, None)]\n    )\n\n    return original_sample, generated_sample\n\ndef get_model(exp_dir, device=None):\n    with open(os.path.join(exp_dir, \"args.pkl\"), \"rb\") as f:\n        model_args = pickle.load(f)\n\n    logging.info(\"load model weights...\")\n    model = voicecraft.VoiceCraft(model_args)\n    ckpt_fn = os.path.join(exp_dir, \"best_bundle.pth\")\n    ckpt = torch.load(ckpt_fn, map_location='cpu')['model']\n    phn2num = torch.load(ckpt_fn, map_location='cpu')['phn2num']\n    model.load_state_dict(ckpt)\n    del ckpt\n    logging.info(\"done loading weights...\")\n    if device == None:\n        device = torch.device(\"cpu\")\n        if torch.cuda.is_available():\n            device = torch.device(\"cuda:0\")\n    model.to(device)\n    model.eval()\n    return model, model_args, phn2num\n\n\ndef get_mask_interval(ali_fn, word_span_ind, editType):\n    with open(ali_fn, \"r\") as rf:\n        data = [l.strip().split(\",\") for l in rf.readlines()]\n        data = data[1:]\n    tmp = word_span_ind.split(\",\")\n    s, e = int(tmp[0]), int(tmp[-1])\n    start = None\n    for j, item in enumerate(data):\n        if j == s and item[3] == \"words\":\n            if editType == 'insertion':\n                start = float(item[1])\n            else:\n                start = float(item[0])\n        if j == e and item[3] == \"words\":\n            if editType == 'insertion':\n                end = float(item[0])\n            else:\n                end = float(item[1])\n            assert start != None\n            break\n    return (start, end)\n\nif __name__ == \"__main__\":\n    def seed_everything(seed):\n        os.environ['PYTHONHASHSEED'] = str(seed)\n        random.seed(seed)\n        np.random.seed(seed)\n        torch.manual_seed(seed)\n        torch.cuda.manual_seed(seed)\n        torch.backends.cudnn.benchmark = False\n        torch.backends.cudnn.deterministic = True\n    formatter = (\n        \"%(asctime)s [%(levelname)s] %(filename)s:%(lineno)d || %(message)s\"\n    )\n    logging.basicConfig(format=formatter, level=logging.INFO)\n    args = get_args()\n    # args.device = 'cpu'\n    args.allowed_repeat_tokens = eval(args.allowed_repeat_tokens)\n    seed_everything(args.seed)\n\n    # load model\n    stime = time.time()\n    logging.info(f\"loading model from {args.exp_dir}\")\n    model, model_args, phn2num = get_model(args.exp_dir)\n    if not os.path.isfile(model_args.exp_dir):\n        model_args.exp_dir = args.exp_dir\n    logging.info(f\"loading model done, took {time.time() - stime:.4f} sec\")\n\n    # setup text and audio tokenizer\n    text_tokenizer = TextTokenizer(backend=\"espeak\")\n    audio_tokenizer = AudioTokenizer(signature=args.signature) # will also put the neural codec model on gpu\n\n    with open(args.manifest_fn, \"r\") as rf:\n        manifest = [l.strip().split(\"\\t\") for l in rf.readlines()]\n    manifest = manifest[1:]\n    \n    # wav_fn\ttxt_fn\talingment_fn\tnum_words\tword_span_ind\n    audio_fns = []\n    target_texts = []\n    mask_intervals = []\n    edit_types = []\n    new_spans = []\n    orig_spans = []\n    os.makedirs(args.output_dir, exist_ok=True)\n    if args.crop_concat:\n        mfa_temp = f\"{args.output_dir}/mfa_temp\"\n        os.makedirs(mfa_temp, exist_ok=True)\n    for item in manifest:\n        audio_fn = os.path.join(args.audio_root, item[0])\n        temp = torchaudio.info(audio_fn)\n        audio_dur = temp.num_frames/temp.sample_rate\n        audio_fns.append(audio_fn)\n        target_text = item[2].split(\"|\")[-1]\n        edit_types.append(item[5].split(\"|\"))\n        new_spans.append(item[4].split(\"|\"))\n        orig_spans.append(item[3].split(\"|\"))\n        target_texts.append(target_text) # the last transcript is the target\n        # mi needs to be created from word_ind_span and alignment_fn, along with args.left_margin and args.right_margin\n        mis = []\n        all_ind_intervals = item[3].split(\"|\")\n        editTypes = item[5].split(\"|\")\n        smaller_indx = []\n        alignment_fn = os.path.join(args.audio_root, \"aligned\", item[0].replace(\".wav\", \".csv\"))\n        if not os.path.isfile(alignment_fn):\n            alignment_fn = alignment_fn.replace(\"/aligned/\", \"/aligned_csv/\")\n            assert os.path.isfile(alignment_fn), alignment_fn\n        for ind_inter,editType in zip(all_ind_intervals, editTypes):\n            # print(ind_inter)\n            mi = get_mask_interval(alignment_fn, ind_inter, editType)\n            mi = (max(mi[0] - args.left_margin, 1/args.codec_sr), min(mi[1] + args.right_margin, audio_dur)) # in seconds\n            mis.append(mi)\n            smaller_indx.append(mi[0])\n        ind = np.argsort(smaller_indx)\n        mis = [mis[id] for id in ind]\n        mask_intervals.append(mis)\n\n\n\n    for i, (audio_fn, target_text, mask_interval) in enumerate(tqdm.tqdm(zip(audio_fns, target_texts, mask_intervals))):\n        orig_mask_interval = mask_interval\n        mask_interval = [[round(cmi[0]*args.codec_sr), round(cmi[1]*args.codec_sr)] for cmi in mask_interval]\n        # logging.info(f\"i: {i}, mask_interval: {mask_interval}\")\n        mask_interval = torch.LongTensor(mask_interval) # [M,2]\n        orig_audio, new_audio = inference_one_sample(model, model_args, phn2num, text_tokenizer, audio_tokenizer, audio_fn, target_text, mask_interval, args.device, vars(args))\n        \n        # save segments for comparison\n        orig_audio, new_audio = orig_audio[0].cpu(), new_audio[0].cpu()\n        # logging.info(f\"length of the resynthesize orig audio: {orig_audio.shape}\")\n\n        save_fn_new = f\"{args.output_dir}/{os.path.basename(audio_fn)[:-4]}_new_seed{args.seed}.wav\"\n        \n        torchaudio.save(save_fn_new, new_audio, args.codec_audio_sr)\n\n        save_fn_orig = f\"{args.output_dir}/{os.path.basename(audio_fn)[:-4]}_orig.wav\"\n        if not os.path.isfile(save_fn_orig):\n            orig_audio, orig_sr = torchaudio.load(audio_fn)\n            if orig_sr != args.codec_audio_sr:\n                orig_audio = torchaudio.transforms.Resample(orig_sr, args.codec_audio_sr)(orig_audio)\n            torchaudio.save(save_fn_orig, orig_audio, args.codec_audio_sr)\n\n"
  },
  {
    "path": "inference_tts.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"VoiceCraft Inference Text To Speech Demo\\n\",\n    \"===\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Select 'voicecraft' as the kernel\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# import libs\\n\",\n    \"# if this throws an error, something went wrong installing dependencies or changing the kernel above!\\n\",\n    \"import os\\n\",\n    \"os.environ[\\\"CUDA_DEVICE_ORDER\\\"]=\\\"PCI_BUS_ID\\\"   \\n\",\n    \"os.environ[\\\"CUDA_VISIBLE_DEVICES\\\"]=\\\"0\\\"\\n\",\n    \"os.environ[\\\"USER\\\"] = \\\"me\\\" # TODO change this to your username\\n\",\n    \"\\n\",\n    \"import torch\\n\",\n    \"import torchaudio\\n\",\n    \"import numpy as np\\n\",\n    \"import random\\n\",\n    \"from argparse import Namespace\\n\",\n    \"\\n\",\n    \"from data.tokenizer import (\\n\",\n    \"    AudioTokenizer,\\n\",\n    \"    TextTokenizer,\\n\",\n    \")\\n\",\n    \"from huggingface_hub import hf_hub_download\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# # install MFA models and dictionaries if you haven't done so already, already done in the dockerfile or envrionment setup\\n\",\n    \"# !source ~/.bashrc && \\\\\\n\",\n    \"#     conda activate voicecraft && \\\\\\n\",\n    \"#     mfa model download dictionary english_us_arpa && \\\\\\n\",\n    \"#     mfa model download acoustic english_us_arpa\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Dora directory: /tmp/audiocraft_me\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# load model, encodec, and phn2num\\n\",\n    \"# # load model, tokenizer, and other necessary files\\n\",\n    \"device = \\\"cuda\\\" if torch.cuda.is_available() else \\\"cpu\\\"\\n\",\n    \"voicecraft_name=\\\"830M_TTSEnhanced.pth\\\" # or giga330M.pth, 330M_TTSEnhanced.pth, giga830M.pth\\n\",\n    \"\\n\",\n    \"# the new way of loading the model, with huggingface, recommended\\n\",\n    \"from models import voicecraft\\n\",\n    \"model = voicecraft.VoiceCraft.from_pretrained(f\\\"pyp1/VoiceCraft_{voicecraft_name.replace('.pth', '')}\\\")\\n\",\n    \"phn2num = model.args.phn2num\\n\",\n    \"config = vars(model.args)\\n\",\n    \"model.to(device)\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"# # the old way of loading the model\\n\",\n    \"# from models import voicecraft\\n\",\n    \"# filepath = hf_hub_download(repo_id=\\\"pyp1/VoiceCraft\\\", filename=voicecraft_name, repo_type=\\\"model\\\")\\n\",\n    \"# ckpt = torch.load(filepath, map_location=\\\"cpu\\\")\\n\",\n    \"# model = voicecraft.VoiceCraft(ckpt[\\\"config\\\"])\\n\",\n    \"# model.load_state_dict(ckpt[\\\"model\\\"])\\n\",\n    \"# config = vars(model.args)\\n\",\n    \"# phn2num = ckpt[\\\"phn2num\\\"]\\n\",\n    \"# model.to(device)\\n\",\n    \"# model.eval()\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"encodec_fn = \\\"./pretrained_models/encodec_4cb2048_giga.th\\\"\\n\",\n    \"if not os.path.exists(encodec_fn):\\n\",\n    \"    os.system(f\\\"wget https://huggingface.co/pyp1/VoiceCraft/resolve/main/encodec_4cb2048_giga.th\\\")\\n\",\n    \"    os.system(f\\\"mv encodec_4cb2048_giga.th ./pretrained_models/encodec_4cb2048_giga.th\\\")\\n\",\n    \"audio_tokenizer = AudioTokenizer(signature=encodec_fn, device=device) # will also put the neural codec model on gpu\\n\",\n    \"\\n\",\n    \"text_tokenizer = TextTokenizer(backend=\\\"espeak\\\")\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# Prepare your audio\\n\",\n    \"# point to the original audio whose speech you want to clone\\n\",\n    \"# write down the transcript for the file, or run whisper to get the transcript (and you can modify it if it's not accurate), save it as a .txt file\\n\",\n    \"orig_audio = \\\"./demo/5895_34622_000026_000002.wav\\\"\\n\",\n    \"orig_transcript = \\\"Gwynplaine had, besides, for his work and for his feats of strength, round his neck and over his shoulders, an esclavine of leather.\\\"\\n\",\n    \"\\n\",\n    \"# move the audio and transcript to temp folder\\n\",\n    \"temp_folder = \\\"./demo/temp\\\"\\n\",\n    \"os.makedirs(temp_folder, exist_ok=True)\\n\",\n    \"os.system(f\\\"cp {orig_audio} {temp_folder}\\\")\\n\",\n    \"filename = os.path.splitext(orig_audio.split(\\\"/\\\")[-1])[0]\\n\",\n    \"with open(f\\\"{temp_folder}/{filename}.txt\\\", \\\"w\\\") as f:\\n\",\n    \"    f.write(orig_transcript)\\n\",\n    \"# run MFA to get the alignment\\n\",\n    \"align_temp = f\\\"{temp_folder}/mfa_alignments\\\"\\n\",\n    \"!source ~/.bashrc && \\\\\\n\",\n    \"    conda activate voicecraft && \\\\\\n\",\n    \"    mfa align -v --clean -j 1 --output_format csv {temp_folder} \\\\\\n\",\n    \"        english_us_arpa english_us_arpa {align_temp}\\n\",\n    \"\\n\",\n    \"# # if the above fails, it could be because the audio is too hard for the alignment model, increasing the beam size usually solves the issue\\n\",\n    \"# !source ~/.bashrc && \\\\\\n\",\n    \"#     conda activate voicecraft && \\\\\\n\",\n    \"#     mfa align -v --clean -j 1 --output_format csv {temp_folder} \\\\\\n\",\n    \"#         english_us_arpa english_us_arpa {align_temp} --beam 1000 --retry_beam 2000\\n\",\n    \"\\n\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# take a look at demo/temp/mfa_alignment, decide which part of the audio to use as prompt\\n\",\n    \"cut_off_sec = 3.6 # NOTE: according to forced-alignment file demo/temp/mfa_alignments/5895_34622_000026_000002.wav, the word \\\"strength\\\" stop as 3.561 sec, so we use first 3.6 sec as the prompt. this should be different for different audio\\n\",\n    \"target_transcript = \\\"Gwynplaine had, besides, for his work and for his feats of strength, I cannot believe that the same model can also do text to speech synthesis too!\\\"\\n\",\n    \"# NOTE: 3 sec of reference is generally enough for high quality voice cloning, but longer is generally better, try e.g. 3~6 sec.\\n\",\n    \"audio_fn = f\\\"{temp_folder}/{filename}.wav\\\"\\n\",\n    \"info = torchaudio.info(audio_fn)\\n\",\n    \"audio_dur = info.num_frames / info.sample_rate\\n\",\n    \"\\n\",\n    \"assert cut_off_sec < audio_dur, f\\\"cut_off_sec {cut_off_sec} is larger than the audio duration {audio_dur}\\\"\\n\",\n    \"prompt_end_frame = int(cut_off_sec * info.sample_rate)\\n\",\n    \"\\n\",\n    \"# run the model to get the output\\n\",\n    \"# hyperparameters for inference\\n\",\n    \"codec_audio_sr = 16000\\n\",\n    \"codec_sr = 50\\n\",\n    \"top_k = 40 # can also try 20, 30, 50\\n\",\n    \"top_p = 1 # 1 means do not do top-p sampling\\n\",\n    \"temperature = 1\\n\",\n    \"silence_tokens=[1388,1898,131]\\n\",\n    \"kvcache = 1 # NOTE if OOM, change this to 0, or try the 330M model\\n\",\n    \"\\n\",\n    \"# NOTE adjust the below three arguments if the generation is not as good\\n\",\n    \"stop_repetition = 3 # NOTE if the model generate long silence, reduce the stop_repetition to 3, 2 or even 1\\n\",\n    \"sample_batch_size = 3 # NOTE: if the if there are long silence or unnaturally strecthed words, increase sample_batch_size to 4 or higher. What this will do to the model is that the model will run sample_batch_size examples of the same audio, and pick the one that's the shortest. So if the speech rate of the generated is too fast change it to a smaller number.\\n\",\n    \"seed = 1 # change seed if you are still unhappy with the result\\n\",\n    \"\\n\",\n    \"def seed_everything(seed):\\n\",\n    \"    os.environ['PYTHONHASHSEED'] = str(seed)\\n\",\n    \"    random.seed(seed)\\n\",\n    \"    np.random.seed(seed)\\n\",\n    \"    torch.manual_seed(seed)\\n\",\n    \"    torch.cuda.manual_seed(seed)\\n\",\n    \"    torch.backends.cudnn.benchmark = False\\n\",\n    \"    torch.backends.cudnn.deterministic = True\\n\",\n    \"seed_everything(seed)\\n\",\n    \"\\n\",\n    \"decode_config = {'top_k': top_k, 'top_p': top_p, 'temperature': temperature, 'stop_repetition': stop_repetition, 'kvcache': kvcache, \\\"codec_audio_sr\\\": codec_audio_sr, \\\"codec_sr\\\": codec_sr, \\\"silence_tokens\\\": silence_tokens, \\\"sample_batch_size\\\": sample_batch_size}\\n\",\n    \"from inference_tts_scale import inference_one_sample\\n\",\n    \"concated_audio, gen_audio = inference_one_sample(model, Namespace(**config), phn2num, text_tokenizer, audio_tokenizer, audio_fn, target_transcript, device, decode_config, prompt_end_frame)\\n\",\n    \"        \\n\",\n    \"# save segments for comparison\\n\",\n    \"concated_audio, gen_audio = concated_audio[0].cpu(), gen_audio[0].cpu()\\n\",\n    \"# logging.info(f\\\"length of the resynthesize orig audio: {orig_audio.shape}\\\")\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"# display the audio\\n\",\n    \"from IPython.display import Audio\\n\",\n    \"print(\\\"concatenate prompt and generated:\\\")\\n\",\n    \"display(Audio(concated_audio, rate=codec_audio_sr))\\n\",\n    \"\\n\",\n    \"print(\\\"generated:\\\")\\n\",\n    \"display(Audio(gen_audio, rate=codec_audio_sr))\\n\",\n    \"\\n\",\n    \"# # save the audio\\n\",\n    \"# # output_dir\\n\",\n    \"# output_dir = \\\"/home/pyp/VoiceCraft/demo/generated_tts\\\"\\n\",\n    \"# os.makedirs(output_dir, exist_ok=True)\\n\",\n    \"# seg_save_fn_gen = f\\\"{output_dir}/{os.path.basename(audio_fn)[:-4]}_gen_seed{seed}.wav\\\"\\n\",\n    \"# seg_save_fn_concat = f\\\"{output_dir}/{os.path.basename(audio_fn)[:-4]}_concat_seed{seed}.wav\\\"        \\n\",\n    \"\\n\",\n    \"# torchaudio.save(seg_save_fn_gen, gen_audio, codec_audio_sr)\\n\",\n    \"# torchaudio.save(seg_save_fn_concat, concated_audio, codec_audio_sr)\\n\",\n    \"\\n\",\n    \"# you are might get warnings like WARNING:phonemizer:words count mismatch on 300.0% of the lines (3/1), this can be safely ignored\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"voicecraft\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.9.18\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 4\n}\n"
  },
  {
    "path": "inference_tts_scale.py",
    "content": "import argparse, pickle\nimport logging\nimport os, random\nimport numpy as np\nimport torch\nimport torchaudio\n\nfrom data.tokenizer import (\n    AudioTokenizer,\n    TextTokenizer,\n    tokenize_audio,\n    tokenize_text\n)\n\nfrom models import voicecraft\nimport argparse, time, tqdm\n\n\n# this script only works for the musicgen architecture\ndef get_args():\n    parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)\n    parser.add_argument(\"--manifest_fn\", type=str, default=\"path/to/eval_metadata_file\")\n    parser.add_argument(\"--audio_root\", type=str, default=\"path/to/audio_folder\")\n    parser.add_argument(\"--exp_dir\", type=str, default=\"path/to/model_folder\")\n    parser.add_argument(\"--seed\", type=int, default=1)\n    parser.add_argument(\"--codec_audio_sr\", type=int, default=16000, help='the sample rate of audio that the codec is trained for')\n    parser.add_argument(\"--codec_sr\", type=int, default=50, help='the sample rate of the codec codes')\n    parser.add_argument(\"--top_k\", type=int, default=40, help=\"sampling param\")\n    parser.add_argument(\"--top_p\", type=float, default=1, help=\"sampling param\")\n    parser.add_argument(\"--temperature\", type=float, default=1.0, help=\"sampling param\")\n    parser.add_argument(\"--output_dir\", type=str, default=None)\n    parser.add_argument(\"--device\", type=str, default=\"cuda\")\n    parser.add_argument(\"--signature\", type=str, default=None, help=\"path to the encodec model\")\n    parser.add_argument(\"--crop_concat\", type=int, default=0)\n    parser.add_argument(\"--stop_repetition\", type=int, default=-1, help=\"used for inference, when the number of consecutive repetition of a token is bigger than this, stop it\")\n    parser.add_argument(\"--kvcache\", type=int, default=1, help='if true, use kv cache, which is 4-8x faster than without')\n    parser.add_argument(\"--sample_batch_size\", type=int, default=1, help=\"batch size for sampling, NOTE that it's not running inference for several samples, but duplicate one input sample batch_size times, and during inference, we only return the shortest generation\")\n    parser.add_argument(\"--silence_tokens\", type=str, default=\"[1388,1898,131]\", help=\"note that if you are not using the pretrained encodec 6f79c6a8, make sure you specified it yourself, rather than using the default\")\n    return parser.parse_args()\n\n\n@torch.no_grad()\ndef inference_one_sample(model, model_args, phn2num, text_tokenizer, audio_tokenizer, audio_fn, target_text, device, decode_config, prompt_end_frame):\n    # phonemize\n    text_tokens = [phn2num[phn] for phn in\n            tokenize_text(\n                text_tokenizer, text=target_text.strip()\n            ) if phn in phn2num\n        ]\n    text_tokens = torch.LongTensor(text_tokens).unsqueeze(0)\n    text_tokens_lens = torch.LongTensor([text_tokens.shape[-1]])\n\n    # encode audio\n    encoded_frames = tokenize_audio(audio_tokenizer, audio_fn, offset=0, num_frames=prompt_end_frame)\n    original_audio = encoded_frames[0][0].transpose(2,1) # [1,T,K]\n    assert original_audio.ndim==3 and original_audio.shape[0] == 1 and original_audio.shape[2] == model_args.n_codebooks, original_audio.shape\n    logging.info(f\"original audio length: {original_audio.shape[1]} codec frames, which is {original_audio.shape[1]/decode_config['codec_sr']:.2f} sec.\")\n\n    # forward\n    stime = time.time()\n    if decode_config['sample_batch_size'] <= 1:\n        logging.info(f\"running inference with batch size 1\")\n        concat_frames, gen_frames = model.inference_tts(\n            text_tokens.to(device),\n            text_tokens_lens.to(device),\n            original_audio[...,:model_args.n_codebooks].to(device), # [1,T,8]\n            top_k=decode_config['top_k'],\n            top_p=decode_config['top_p'],\n            temperature=decode_config['temperature'],\n            stop_repetition=decode_config['stop_repetition'],\n            kvcache=decode_config['kvcache'],\n            silence_tokens=eval(decode_config['silence_tokens']) if type(decode_config['silence_tokens'])==str else decode_config['silence_tokens']\n        ) # output is [1,K,T]\n    else:\n        logging.info(f\"running inference with batch size {decode_config['sample_batch_size']}, i.e. return the shortest among {decode_config['sample_batch_size']} generations.\")\n        concat_frames, gen_frames = model.inference_tts_batch(\n            text_tokens.to(device),\n            text_tokens_lens.to(device),\n            original_audio[...,:model_args.n_codebooks].to(device), # [1,T,8]\n            top_k=decode_config['top_k'],\n            top_p=decode_config['top_p'],\n            temperature=decode_config['temperature'],\n            stop_repetition=decode_config['stop_repetition'],\n            kvcache=decode_config['kvcache'],\n            batch_size = decode_config['sample_batch_size'],\n            silence_tokens=eval(decode_config['silence_tokens']) if type(decode_config['silence_tokens'])==str else decode_config['silence_tokens']\n        ) # output is [1,K,T]\n    logging.info(f\"inference on one sample take: {time.time() - stime:.4f} sec.\")\n\n    logging.info(f\"generated encoded_frames.shape: {gen_frames.shape}, which is {gen_frames.shape[-1]/decode_config['codec_sr']} sec.\")\n    \n    # for timestamp, codes in enumerate(gen_frames[0].transpose(1,0)):\n    #     logging.info(f\"{timestamp}: {codes.tolist()}\")\n    # decode (both original and generated)\n    concat_sample = audio_tokenizer.decode(\n        [(concat_frames, None)] # [1,T,8] -> [1,8,T]\n    )\n    gen_sample = audio_tokenizer.decode(\n        [(gen_frames, None)]\n    )\n    #Empty cuda cache between runs\n    if torch.cuda.is_available():\n        torch.cuda.empty_cache()\n    # return\n    return concat_sample, gen_sample\n\ndef get_model(exp_dir, device=None):\n    with open(os.path.join(exp_dir, \"args.pkl\"), \"rb\") as f:\n        model_args = pickle.load(f)\n\n    logging.info(\"load model weights...\")\n    model = voicecraft.VoiceCraft(model_args)\n    ckpt_fn = os.path.join(exp_dir, \"best_bundle.pth\")\n    ckpt = torch.load(ckpt_fn, map_location='cpu')['model']\n    phn2num = torch.load(ckpt_fn, map_location='cpu')['phn2num']\n    model.load_state_dict(ckpt)\n    del ckpt\n    logging.info(\"done loading weights...\")\n    if device == None:\n        device = torch.device(\"cpu\")\n        if torch.cuda.is_available():\n            device = torch.device(\"cuda:0\")\n    model.to(device)\n    model.eval()\n    return model, model_args, phn2num\n\nif __name__ == \"__main__\":\n    def seed_everything(seed):\n        os.environ['PYTHONHASHSEED'] = str(seed)\n        random.seed(seed)\n        np.random.seed(seed)\n        torch.manual_seed(seed)\n        torch.cuda.manual_seed(seed)\n        torch.backends.cudnn.benchmark = False\n        torch.backends.cudnn.deterministic = True\n    formatter = (\n        \"%(asctime)s [%(levelname)s] %(filename)s:%(lineno)d || %(message)s\"\n    )\n    logging.basicConfig(format=formatter, level=logging.INFO)\n    args = get_args()\n    # args.device='cpu'\n    seed_everything(args.seed)\n    \n    os.makedirs(args.output_dir, exist_ok=True)\n    # load model\n\n    with open(args.manifest_fn, \"r\") as rf:\n        manifest = [l.strip().split(\"\\t\") for l in rf.readlines()]\n    manifest = manifest[1:]\n    manifest = [[item[0], item[2], item[3], item[1], item[5]] for item in manifest]\n    \n    stime = time.time()\n    logging.info(f\"loading model from {args.exp_dir}\")\n    model, model_args, phn2num = get_model(args.exp_dir)\n    logging.info(f\"loading model done, took {time.time() - stime:.4f} sec\")\n\n    # setup text and audio tokenizer\n    text_tokenizer = TextTokenizer(backend=\"espeak\")\n    audio_tokenizer = AudioTokenizer(signature=args.signature) # will also put the neural codec model on gpu\n    \n    audio_fns = []\n    texts = []\n    prompt_end_frames = []\n    new_audio_fns = []\n    text_to_syn = []\n\n    for item in manifest:\n        audio_fn = os.path.join(args.audio_root, item[0])\n        audio_fns.append(audio_fn)\n        temp = torchaudio.info(audio_fn)\n        prompt_end_frames.append(round(float(item[2])*temp.sample_rate))\n        texts.append(item[1])\n        new_audio_fns.append(item[-2])\n        all_text = item[1].split(\" \")\n        start_ind = int(item[-1].split(\",\")[0])\n        text_to_syn.append(\" \".join(all_text[start_ind:]))\n\n    for i, (audio_fn, text, prompt_end_frame, new_audio_fn, to_syn) in enumerate(tqdm.tqdm((zip(audio_fns, texts, prompt_end_frames, new_audio_fns, text_to_syn)))):\n        output_expected_sr = args.codec_audio_sr\n        concated_audio, gen_audio = inference_one_sample(model, model_args, phn2num, text_tokenizer, audio_tokenizer, audio_fn, text, args.device, vars(args), prompt_end_frame)\n    \n        # save segments for comparison\n        concated_audio, gen_audio = concated_audio[0].cpu(), gen_audio[0].cpu()\n        if output_expected_sr != args.codec_audio_sr:\n            gen_audio = torchaudio.transforms.Resample(output_expected_sr, args.codec_audio_sr)(gen_audio)\n            concated_audio = torchaudio.transforms.Resample(output_expected_sr, args.codec_audio_sr)(concated_audio)\n\n        seg_save_fn_gen = f\"{args.output_dir}/gen_{new_audio_fn[:-4]}_{i}_seed{args.seed}.wav\"\n        seg_save_fn_concat = f\"{args.output_dir}/concat_{new_audio_fn[:-4]}_{i}_seed{args.seed}.wav\"        \n\n        torchaudio.save(seg_save_fn_gen, gen_audio, args.codec_audio_sr)\n        torchaudio.save(seg_save_fn_concat, concated_audio, args.codec_audio_sr)\n"
  },
  {
    "path": "main.py",
    "content": "from pathlib import Path\nimport torch\nimport pickle\nimport argparse\nimport logging\nimport torch.distributed as dist\nfrom config import MyParser\nfrom steps import trainer\n\n\nif __name__ == \"__main__\":\n    formatter = (\n        \"%(asctime)s [%(levelname)s] %(filename)s:%(lineno)d || %(message)s\"\n    )\n    logging.basicConfig(format=formatter, level=logging.INFO)\n    \n    torch.cuda.empty_cache()\n    args = MyParser().parse_args()\n    logging.info(args)\n    exp_dir = Path(args.exp_dir)\n    exp_dir.mkdir(exist_ok=True, parents=True)\n    logging.info(f\"exp_dir: {str(exp_dir)}\")\n\n    if args.resume:\n        resume = args.resume\n        assert(bool(args.exp_dir))\n        with open(\"%s/args.pkl\" % args.exp_dir, \"rb\") as f:\n            old_args = pickle.load(f)\n        new_args = vars(args)\n        old_args = vars(old_args)\n        for key in new_args:\n            if key not in old_args or old_args[key] != new_args[key]:\n                old_args[key] = new_args[key]\n        args = argparse.Namespace(**old_args)\n        args.resume = resume\n    else:\n        with open(\"%s/args.pkl\" % args.exp_dir, \"wb\") as f:\n            pickle.dump(args, f)\n\n    dist.init_process_group(backend='nccl', init_method='env://')\n    rank = dist.get_rank()\n    world_size = dist.get_world_size()\n    torch.cuda.set_device(rank)\n    my_trainer = trainer.Trainer(args, world_size, rank)\n    my_trainer.train()"
  },
  {
    "path": "models/codebooks_patterns.py",
    "content": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n# All rights reserved.\n#\n# This source code is licensed under the license found in the\n# LICENSE file in the root directory of this source tree.\n\nfrom collections import namedtuple\nfrom dataclasses import dataclass\nfrom functools import lru_cache\nimport logging\nimport typing as tp\n\nfrom abc import ABC, abstractmethod\nimport torch\n\nLayoutCoord = namedtuple('LayoutCoord', ['t', 'q'])  # (timestep, codebook index)\nPatternLayout = tp.List[tp.List[LayoutCoord]]  # Sequence of coordinates\n\n\n@dataclass\nclass Pattern:\n    \"\"\"Base implementation of a pattern over a sequence with multiple codebooks.\n\n    The codebook pattern consists in a layout, defining for each sequence step\n    the list of coordinates of each codebook timestep in the resulting interleaved sequence.\n    The first item of the pattern is always an empty list in order to properly insert a special token\n    to start with. For convenience, we also keep track of ``n_q`` the number of codebooks used for the pattern\n    and ``timesteps`` the number of timesteps corresponding to the original sequence.\n\n    The pattern provides convenient methods to build and revert interleaved sequences from it:\n    ``build_pattern_sequence`` maps a given a dense input tensor of multi-codebook sequence from [B, K, T]\n        to the interleaved sequence of shape [B, K, S] applying the pattern, with S being the batch size,\n        K being the number of codebooks, T the number of original timesteps and S the number of sequence steps\n        for the output sequence. The unfilled positions are replaced with a special token and the built sequence\n        is returned along with a mask indicating valid tokens.\n    ``revert_pattern_sequence`` maps back an interleaved sequence of shape [B, K, S] to the original alignment\n        of codebooks across timesteps to an output tensor of shape [B, K, T], using again a special token and a mask\n        to fill and specify invalid positions if needed.\n    See the dedicated methods for more details.\n    \"\"\"\n    # Pattern layout, for each sequence step, we have a list of coordinates\n    # corresponding to the original codebook timestep and position.\n    # The first list is always an empty list in order to properly insert\n    # a special token to start with.\n    layout: PatternLayout\n    timesteps: int\n    n_q: int\n\n    def __post_init__(self):\n        assert len(self.layout) > 0\n        assert self.layout[0] == []\n        self._validate_layout()\n        self._build_reverted_sequence_scatter_indexes = lru_cache(100)(self._build_reverted_sequence_scatter_indexes)\n        self._build_pattern_sequence_scatter_indexes = lru_cache(100)(self._build_pattern_sequence_scatter_indexes)\n        # logging.info(\"New pattern, time steps: %d, sequence steps: %d\", self.timesteps, len(self.layout))\n\n    def _validate_layout(self):\n        \"\"\"Runs checks on the layout to ensure a valid pattern is defined.\n        A pattern is considered invalid if:\n            - Multiple timesteps for a same codebook are defined in the same sequence step\n            - The timesteps for a given codebook are not in ascending order as we advance in the sequence\n              (this would mean that we have future timesteps before past timesteps).\n        \"\"\"\n        q_timesteps = {q: 0 for q in range(self.n_q)}\n        for s, seq_coords in enumerate(self.layout):\n            if len(seq_coords) > 0:\n                qs = set()\n                for coord in seq_coords:\n                    qs.add(coord.q)\n                    last_q_timestep = q_timesteps[coord.q]\n                    assert coord.t >= last_q_timestep, \\\n                        f\"Past timesteps are found in the sequence for codebook = {coord.q} at step {s}\"\n                    q_timesteps[coord.q] = coord.t\n                # each sequence step contains at max 1 coordinate per codebook\n                assert len(qs) == len(seq_coords), \\\n                    f\"Multiple entries for a same codebook are found at step {s}\"\n\n    @property\n    def num_sequence_steps(self):\n        return len(self.layout) - 1\n\n    @property\n    def max_delay(self):\n        max_t_in_seq_coords = 0\n        for seq_coords in self.layout[1:]:\n            for coords in seq_coords:\n                max_t_in_seq_coords = max(max_t_in_seq_coords, coords.t + 1)\n        return max_t_in_seq_coords - self.timesteps\n\n    @property\n    def valid_layout(self):\n        valid_step = len(self.layout) - self.max_delay\n        return self.layout[:valid_step]\n\n    def get_sequence_coords_with_timestep(self, t: int, q: tp.Optional[int] = None):\n        \"\"\"Get codebook coordinates in the layout that corresponds to the specified timestep t\n        and optionally to the codebook q. Coordinates are returned as a tuple with the sequence step\n        and the actual codebook coordinates.\n        \"\"\"\n        assert t <= self.timesteps, \"provided timesteps is greater than the pattern's number of timesteps\"\n        if q is not None:\n            assert q <= self.n_q, \"provided number of codebooks is greater than the pattern's number of codebooks\"\n        coords = []\n        for s, seq_codes in enumerate(self.layout):\n            for code in seq_codes:\n                if code.t == t and (q is None or code.q == q):\n                    coords.append((s, code))\n        return coords\n\n    def get_steps_with_timestep(self, t: int, q: tp.Optional[int] = None) -> tp.List[int]:\n        return [step for step, coords in self.get_sequence_coords_with_timestep(t, q)]\n\n    def get_first_step_with_timesteps(self, t: int, q: tp.Optional[int] = None) -> tp.Optional[int]:\n        steps_with_timesteps = self.get_steps_with_timestep(t, q)\n        return steps_with_timesteps[0] if len(steps_with_timesteps) > 0 else None\n\n    def _build_pattern_sequence_scatter_indexes(self, timesteps: int, n_q: int, keep_only_valid_steps: bool,\n                                                device: tp.Union[torch.device, str] = 'cpu'):\n        \"\"\"Build scatter indexes corresponding to the pattern, up to the provided sequence_steps.\n\n        Args:\n            timesteps (int): Maximum number of timesteps steps to consider.\n            keep_only_valid_steps (bool): Restrict the pattern layout to match only valid steps.\n            device (Union[torch.device, str]): Device for created tensors.\n        Returns:\n            indexes (torch.Tensor): Indexes corresponding to the sequence, of shape [K, S].\n            mask (torch.Tensor): Mask corresponding to indexes that matches valid indexes, of shape [K, S].\n        \"\"\"\n        assert n_q == self.n_q, f\"invalid number of codebooks for the sequence and the pattern: {n_q} != {self.n_q}\"\n        assert timesteps <= self.timesteps, \"invalid number of timesteps used to build the sequence from the pattern\"\n        # use the proper layout based on whether we limit ourselves to valid steps only or not,\n        # note that using the valid_layout will result in a truncated sequence up to the valid steps\n        ref_layout = self.valid_layout if keep_only_valid_steps else self.layout\n        # single item indexing being super slow with pytorch vs. numpy, so we use numpy here\n        indexes = torch.zeros(n_q, len(ref_layout), dtype=torch.long).numpy()\n        mask = torch.zeros(n_q, len(ref_layout), dtype=torch.bool).numpy()\n        # fill indexes with last sequence step value that will correspond to our special token\n        # the last value is n_q * timesteps as we have flattened z and append special token as the last token\n        # which will correspond to the index: n_q * timesteps\n        indexes[:] = n_q * timesteps\n        # iterate over the pattern and fill scattered indexes and mask\n        for s, sequence_coords in enumerate(ref_layout):\n            for coords in sequence_coords:\n                if coords.t < timesteps:\n                    indexes[coords.q, s] = coords.t + coords.q * timesteps\n                    mask[coords.q, s] = 1\n        indexes = torch.from_numpy(indexes).to(device)\n        mask = torch.from_numpy(mask).to(device)\n        return indexes, mask\n\n    def build_pattern_sequence(self, z: torch.Tensor, special_token: int, keep_only_valid_steps: bool = False):\n        \"\"\"Build sequence corresponding to the pattern from the input tensor z.\n        The sequence is built using up to sequence_steps if specified, and non-pattern\n        coordinates are filled with the special token.\n\n        Args:\n            z (torch.Tensor): Input tensor of multi-codebooks sequence, of shape [B, K, T].\n            special_token (int): Special token used to fill non-pattern coordinates in the new sequence.\n            keep_only_valid_steps (bool): Build a sequence from the pattern up to valid (= fully defined) steps.\n                Steps that are beyond valid steps will be replaced by the special_token in that case.\n        Returns:\n            values (torch.Tensor): Interleaved sequence matching the pattern, of shape [B, K, S] with S\n                corresponding either to the sequence_steps if provided, otherwise to the length of the pattern.\n            indexes (torch.Tensor): Indexes corresponding to the interleaved sequence, of shape [K, S].\n            mask (torch.Tensor): Mask corresponding to indexes that matches valid indexes of shape [K, S].\n        \"\"\"\n        B, K, T = z.shape\n        indexes, mask = self._build_pattern_sequence_scatter_indexes(\n            T, K, keep_only_valid_steps=keep_only_valid_steps, device=str(z.device)\n        )\n        z = z.view(B, -1)\n        # we append the special token as the last index of our flattened z tensor\n        z = torch.cat([z, torch.zeros_like(z[:, :1]) + special_token], dim=1)\n        values = z[:, indexes.view(-1)]\n        values = values.view(B, K, indexes.shape[-1])\n        return values, indexes, mask\n\n    def _build_reverted_sequence_scatter_indexes(self, sequence_steps: int, n_q: int,\n                                                 keep_only_valid_steps: bool = False,\n                                                 is_model_output: bool = False,\n                                                 device: tp.Union[torch.device, str] = 'cpu'):\n        \"\"\"Builds scatter indexes required to retrieve the original multi-codebook sequence\n        from interleaving pattern.\n\n        Args:\n            sequence_steps (int): Sequence steps.\n            n_q (int): Number of codebooks.\n            keep_only_valid_steps (bool): Build a sequence from the pattern up to valid (= fully defined) steps.\n                Steps that are beyond valid steps will be replaced by the special_token in that case.\n            is_model_output (bool): Whether to keep the sequence item corresponding to initial special token or not.\n            device (Union[torch.device, str]): Device for created tensors.\n        Returns:\n            torch.Tensor: Indexes for reconstructing the output, of shape [K, T].\n            mask (torch.Tensor): Mask corresponding to indexes that matches valid indexes of shape [K, T].\n        \"\"\"\n        ref_layout = self.valid_layout if keep_only_valid_steps else self.layout\n        # TODO(jade): Do we want to further truncate to only valid timesteps here as well?\n        timesteps = self.timesteps\n        assert n_q == self.n_q, f\"invalid number of codebooks for the sequence and the pattern: {n_q} != {self.n_q}\"\n        assert sequence_steps <= len(ref_layout), \\\n            f\"sequence to revert is longer than the defined pattern: {sequence_steps} > {len(ref_layout)}\"\n\n        # ensure we take the appropriate indexes to keep the model output from the first special token as well\n        if is_model_output:\n            ref_layout = ref_layout[1:]\n\n        # single item indexing being super slow with pytorch vs. numpy, so we use numpy here\n        indexes = torch.zeros(n_q, timesteps, dtype=torch.long).numpy()\n        mask = torch.zeros(n_q, timesteps, dtype=torch.bool).numpy()\n        # fill indexes with last sequence step value that will correspond to our special token\n        indexes[:] = n_q * sequence_steps\n        for s, sequence_codes in enumerate(ref_layout):\n            if s < sequence_steps:\n                for code in sequence_codes:\n                    if code.t < timesteps:\n                        indexes[code.q, code.t] = s + code.q * sequence_steps\n                        mask[code.q, code.t] = 1\n        indexes = torch.from_numpy(indexes).to(device)\n        mask = torch.from_numpy(mask).to(device)\n        return indexes, mask\n\n    def revert_pattern_sequence(self, s: torch.Tensor, special_token: int, keep_only_valid_steps: bool = False):\n        \"\"\"Revert a sequence built from the pattern back to the original multi-codebook sequence without interleaving.\n        The sequence is reverted using up to timesteps if specified, and non-pattern coordinates\n        are filled with the special token.\n\n        Args:\n            s (torch.Tensor): Interleaved sequence tensor obtained from the pattern, of shape [B, K, S].\n            special_token (int or float): Special token used to fill non-pattern coordinates in the new sequence.\n        Returns:\n            values (torch.Tensor): Interleaved sequence matching the pattern, of shape [B, K, T] with T\n                corresponding either to the timesteps if provided, or the total timesteps in pattern otherwise.\n            indexes (torch.Tensor): Indexes corresponding to the interleaved sequence, of shape [K, T].\n            mask (torch.Tensor): Mask corresponding to indexes that matches valid indexes of shape [K, T].\n        \"\"\"\n        B, K, S = s.shape\n        indexes, mask = self._build_reverted_sequence_scatter_indexes(\n            S, K, keep_only_valid_steps, is_model_output=False, device=str(s.device)\n        )\n        s = s.view(B, -1)\n        # we append the special token as the last index of our flattened z tensor\n        s = torch.cat([s, torch.zeros_like(s[:, :1]) + special_token], dim=1)\n        values = s[:, indexes.view(-1)]\n        values = values.view(B, K, indexes.shape[-1])\n        return values, indexes, mask\n\n    def revert_pattern_logits(self, logits: torch.Tensor, special_token: float, keep_only_valid_steps: bool = False):\n        \"\"\"Revert model logits obtained on a sequence built from the pattern\n        back to a tensor matching the original sequence.\n\n        This method is similar to ``revert_pattern_sequence`` with the following specificities:\n        1. It is designed to work with the extra cardinality dimension\n        2. We return the logits for the first sequence item that matches the special_token and\n        which matching target in the original sequence is the first item of the sequence,\n        while we skip the last logits as there is no matching target\n        \"\"\"\n        B, card, K, S = logits.shape\n        indexes, mask = self._build_reverted_sequence_scatter_indexes(\n            S, K, keep_only_valid_steps, is_model_output=True, device=logits.device\n        )\n        logits = logits.reshape(B, card, -1)\n        # we append the special token as the last index of our flattened z tensor\n        logits = torch.cat([logits, torch.zeros_like(logits[:, :, :1]) + special_token], dim=-1)  # [B, card, K x S]\n        values = logits[:, :, indexes.view(-1)]\n        values = values.view(B, card, K, indexes.shape[-1])\n        return values, indexes, mask\n\n\nclass CodebooksPatternProvider(ABC):\n    \"\"\"Abstraction around providing pattern for interleaving codebooks.\n\n    The CodebooksPatternProvider abstraction allows to implement various strategies to\n    define interleaving pattern of sequences composed of multiple codebooks. For a given\n    number of codebooks `n_q`, the pattern provider can generate a specified pattern\n    corresponding to a sequence of `T` timesteps with `n_q` parallel codebooks. This pattern\n    can be used to construct a new sequence from the original codes respecting the specified\n    pattern. The pattern is defined as a list of list of code coordinates, code coordinate\n    being a tuple with the original timestep and codebook to build the new sequence.\n    Note that all patterns must start with an empty list that is then used to insert a first\n    sequence step of special tokens in the newly generated sequence.\n\n    Args:\n        n_q (int): number of codebooks.\n        cached (bool): if True, patterns for a given length are cached. In general\n            that should be true for efficiency reason to avoid synchronization points.\n    \"\"\"\n    def __init__(self, n_q: int, cached: bool = True):\n        assert n_q > 0\n        self.n_q = n_q\n        self.get_pattern = lru_cache(100)(self.get_pattern)  # type: ignore\n\n    @abstractmethod\n    def get_pattern(self, timesteps: int) -> Pattern:\n        \"\"\"Builds pattern with specific interleaving between codebooks.\n\n        Args:\n            timesteps (int): Total numer of timesteps.\n        \"\"\"\n        raise NotImplementedError()\n\n\nclass DelayedPatternProvider(CodebooksPatternProvider):\n    \"\"\"Provider for delayed pattern across delayed codebooks.\n    Codebooks are delayed in the sequence and sequence steps will contain codebooks\n    from different timesteps.\n\n    Example:\n        Taking timesteps=4 and n_q=3, delays=None, the multi-codebook sequence:\n        [[1, 2, 3, 4],\n        [1, 2, 3, 4],\n        [1, 2, 3, 4]]\n        The resulting sequence obtained from the returned pattern is:\n        [[S, 1, 2, 3, 4],\n        [S, S, 1, 2, 3],\n        [S, S, S, 1, 2]]\n        (with S being a special token)\n\n    Args:\n        n_q (int): Number of codebooks.\n        delays (Optional[List[int]]): Delay for each of the codebooks.\n            If delays not defined, each codebook is delayed by 1 compared to the previous one.\n        flatten_first (int): Flatten the first N timesteps.\n        empty_initial (int): Prepend with N empty list of coordinates.\n    \"\"\"\n    def __init__(self, n_q: int, delays: tp.Optional[tp.List[int]] = None,\n                 flatten_first: int = 0, empty_initial: int = 0):\n        super().__init__(n_q)\n        if delays is None:\n            delays = list(range(n_q))\n        self.delays = delays\n        self.flatten_first = flatten_first\n        self.empty_initial = empty_initial\n        assert len(self.delays) == self.n_q\n        assert sorted(self.delays) == self.delays\n\n    def get_pattern(self, timesteps: int) -> Pattern:\n        out: PatternLayout = [[]]\n        max_delay = max(self.delays)\n        if self.empty_initial:\n            out += [[] for _ in range(self.empty_initial)]\n        if self.flatten_first:\n            for t in range(min(timesteps, self.flatten_first)):\n                for q in range(self.n_q):\n                    out.append([LayoutCoord(t, q)])\n        for t in range(self.flatten_first, timesteps + max_delay):\n            v = []\n            for q, delay in enumerate(self.delays):\n                t_for_q = t - delay\n                if t_for_q >= self.flatten_first:\n                    v.append(LayoutCoord(t_for_q, q))\n            out.append(v)\n        return Pattern(out, n_q=self.n_q, timesteps=timesteps)\n\n\nclass ParallelPatternProvider(DelayedPatternProvider):\n    \"\"\"Provider for parallel pattern across codebooks.\n    This pattern provider is a special case of the delayed pattern with actually no delay,\n    hence delays=repeat(0, n_q).\n\n    Args:\n        n_q (int): Number of codebooks.\n    \"\"\"\n    def __init__(self, n_q: int):\n        super().__init__(n_q, [0] * n_q)\n\n\nclass UnrolledPatternProvider(CodebooksPatternProvider):\n    \"\"\"Provider for unrolling codebooks pattern.\n    This pattern provider enables to represent the codebook flattened completely or only to some extend\n    while also specifying a given delay between the flattened codebooks representation, allowing to\n    unroll the codebooks in the sequence.\n\n    Example:\n        1. Flattening of the codebooks.\n        By default, the pattern provider will fully flatten the codebooks such as flattening=range(n_q),\n        taking n_q = 3 and timesteps = 4:\n        [[1, 2, 3, 4],\n         [1, 2, 3, 4],\n         [1, 2, 3, 4]]\n        will result into:\n        [[S, S, 1, S, S, 2, S, S, 3, S, S, 4],\n         [S, 1, S, S, 2, S, S, 3, S, S, 4, S],\n         [1, S, S, 2, S, S, 3, S, S, 4, S, S]]\n        2. Partial flattening of the codebooks. The ``flattening`` parameter allows to specify the inner step\n        for each of the codebook, allowing to define which codebook to flatten (or keep in parallel), for example\n        taking n_q = 3, timesteps = 4 and flattening = [0, 1, 1]:\n        [[1, 2, 3, 4],\n         [1, 2, 3, 4],\n         [1, 2, 3, 4]]\n        will result into:\n        [[S, 1, S, S, 2, S, S, 3, S, S, 4, S],\n         [S, 1, S, S, 2, S, S, 3, S, S, 4, S],\n         [1, S, S, 2, S, S, 3, S, S, 4, S, S]]\n        3. Flattening with delay. The ``delay`` parameter allows to further unroll the sequence of codebooks\n        allowing to specify the delay per codebook. Note that the delay between codebooks flattened to the\n        same inner timestep should be coherent. For example, taking n_q = 3, timesteps = 4, flattening = [0, 1, 1]\n        and delays = [0, 3, 3]:\n        [[1, 2, 3, 4],\n         [1, 2, 3, 4],\n         [1, 2, 3, 4]]\n        will result into:\n        [[S, S, S, 1, S, 2, S, 3, S, 4],\n         [S, S, S, 1, S, 2, S, 3, S, 4],\n         [1, 2, 3, S, 4, S, 5, S, 6, S]]\n\n    Args:\n        n_q (int): Number of codebooks.\n        flattening (Optional[List[int]]): Flattening schema over the codebooks. If not defined,\n            the codebooks will be flattened to 1 codebook per step, meaning that the sequence will\n            have n_q extra steps for each timestep.\n        delays (Optional[List[int]]): Delay for each of the codebooks. If not defined,\n            no delay is added and therefore will default to [0] * ``n_q``.\n            Note that two codebooks that will be flattened to the same inner step\n            should have the same delay, otherwise the pattern is considered as invalid.\n    \"\"\"\n    FlattenedCodebook = namedtuple('FlattenedCodebook', ['codebooks', 'delay'])\n\n    def __init__(self, n_q: int, flattening: tp.Optional[tp.List[int]] = None,\n                 delays: tp.Optional[tp.List[int]] = None):\n        super().__init__(n_q)\n        if flattening is None:\n            flattening = list(range(n_q))\n        if delays is None:\n            delays = [0] * n_q\n        assert len(flattening) == n_q\n        assert len(delays) == n_q\n        assert sorted(flattening) == flattening\n        assert sorted(delays) == delays\n        self._flattened_codebooks = self._build_flattened_codebooks(delays, flattening)\n        self.max_delay = max(delays)\n\n    def _build_flattened_codebooks(self, delays: tp.List[int], flattening: tp.List[int]):\n        \"\"\"Build a flattened codebooks representation as a dictionary of inner step\n        and the actual codebook indices corresponding to the flattened codebook. For convenience, we\n        also store the delay associated to the flattened codebook to avoid maintaining an extra mapping.\n        \"\"\"\n        flattened_codebooks: dict = {}\n        for q, (inner_step, delay) in enumerate(zip(flattening, delays)):\n            if inner_step not in flattened_codebooks:\n                flat_codebook = UnrolledPatternProvider.FlattenedCodebook(codebooks=[q], delay=delay)\n            else:\n                flat_codebook = flattened_codebooks[inner_step]\n                assert flat_codebook.delay == delay, (\n                    \"Delay and flattening between codebooks is inconsistent: \",\n                    \"two codebooks flattened to the same position should have the same delay.\"\n                )\n                flat_codebook.codebooks.append(q)\n            flattened_codebooks[inner_step] = flat_codebook\n        return flattened_codebooks\n\n    @property\n    def _num_inner_steps(self):\n        \"\"\"Number of inner steps to unroll between timesteps in order to flatten the codebooks.\n        \"\"\"\n        return max([inner_step for inner_step in self._flattened_codebooks.keys()]) + 1\n\n    def num_virtual_steps(self, timesteps: int) -> int:\n        return timesteps * self._num_inner_steps + 1\n\n    def get_pattern(self, timesteps: int) -> Pattern:\n        \"\"\"Builds pattern for delay across codebooks.\n\n        Args:\n            timesteps (int): Total numer of timesteps.\n        \"\"\"\n        # the PatternLayout is built as a tuple of sequence position and list of coordinates\n        # so that it can be reordered properly given the required delay between codebooks of given timesteps\n        indexed_out: list = [(-1, [])]\n        max_timesteps = timesteps + self.max_delay\n        for t in range(max_timesteps):\n            # for each timestep, we unroll the flattened codebooks,\n            # emitting the sequence step with the corresponding delay\n            for step in range(self._num_inner_steps):\n                if step in self._flattened_codebooks:\n                    # we have codebooks at this virtual step to emit\n                    step_codebooks = self._flattened_codebooks[step]\n                    t_for_q = t + step_codebooks.delay\n                    coords = [LayoutCoord(t, q) for q in step_codebooks.codebooks]\n                    if t_for_q < max_timesteps and t < max_timesteps:\n                        indexed_out.append((t_for_q, coords))\n                else:\n                    # there is no codebook in this virtual step so we emit an empty list\n                    indexed_out.append((t, []))\n        out = [coords for _, coords in sorted(indexed_out)]\n        return Pattern(out, n_q=self.n_q, timesteps=timesteps)\n\n\nclass VALLEPattern(CodebooksPatternProvider):\n    \"\"\"Almost VALL-E style pattern. We futher allow some delays for the\n    codebooks other than the first one.\n\n    Args:\n        n_q (int): Number of codebooks.\n        delays (Optional[List[int]]): Delay for each of the codebooks.\n            If delays not defined, each codebook is delayed by 1 compared to the previous one.\n    \"\"\"\n    def __init__(self, n_q: int, delays: tp.Optional[tp.List[int]] = None):\n        super().__init__(n_q)\n        if delays is None:\n            delays = [0] * (n_q - 1)\n        self.delays = delays\n        assert len(self.delays) == self.n_q - 1\n        assert sorted(self.delays) == self.delays\n\n    def get_pattern(self, timesteps: int) -> Pattern:\n        out: PatternLayout = [[]]\n        for t in range(timesteps):\n            out.append([LayoutCoord(t, 0)])\n        max_delay = max(self.delays)\n        for t in range(timesteps + max_delay):\n            v = []\n            for q, delay in enumerate(self.delays):\n                t_for_q = t - delay\n                if t_for_q >= 0:\n                    v.append(LayoutCoord(t_for_q, q + 1))\n            out.append(v)\n        return Pattern(out, n_q=self.n_q, timesteps=timesteps)\n\n\nclass MusicLMPattern(CodebooksPatternProvider):\n    \"\"\"Almost MusicLM style pattern. This is equivalent to full flattening\n    but in a different order.\n\n    Args:\n        n_q (int): Number of codebooks.\n        group_by (int): Number of codebooks to group together.\n    \"\"\"\n    def __init__(self, n_q: int, group_by: int = 2):\n        super().__init__(n_q)\n        self.group_by = group_by\n\n    def get_pattern(self, timesteps: int) -> Pattern:\n        out: PatternLayout = [[]]\n        for offset in range(0, self.n_q, self.group_by):\n            for t in range(timesteps):\n                for q in range(offset, offset + self.group_by):\n                    out.append([LayoutCoord(t, q)])\n        return Pattern(out, n_q=self.n_q, timesteps=timesteps)"
  },
  {
    "path": "models/modules/__init__.py",
    "content": ""
  },
  {
    "path": "models/modules/activation.py",
    "content": "# cp from https://github.com/lifeiteng/vall-e/blob/main/valle/modules/activation.py, modified by Puyuan Peng, 2024\nfrom typing import Optional, Tuple\n\nimport torch\nfrom torch import Tensor\nfrom torch.nn import Linear, Module\nfrom torch.nn import functional as F\nfrom torch.nn.init import constant_, xavier_normal_, xavier_uniform_\nfrom torch.nn.modules.linear import NonDynamicallyQuantizableLinear\nfrom torch.nn.parameter import Parameter\nimport logging\nfrom typing import Callable, List, Optional, Tuple, Union\nfrom typing import TYPE_CHECKING\nif TYPE_CHECKING:\n    from torch.types import _dtype as DType\nelse:\n    # The JIT doesn't understand Union, nor torch.dtype here\n    DType = int\n\ndef _canonical_mask(\n        mask: Optional[Tensor],\n        mask_name: str,\n        other_type: Optional[DType],\n        other_name: str,\n        target_type: DType,\n        check_other: bool = True,\n) -> Optional[Tensor]:\n\n    if mask is not None:\n        _mask_dtype = mask.dtype\n        _mask_is_float = torch.is_floating_point(mask)\n        if _mask_dtype != torch.bool and not _mask_is_float:\n            raise AssertionError(\n                f\"only bool and floating types of {mask_name} are supported\")\n        if check_other and other_type is not None:\n            if _mask_dtype != other_type:\n                warnings.warn(\n                    f\"Support for mismatched {mask_name} and {other_name} \"\n                    \"is deprecated. Use same type for both instead.\"\n                )\n        if not _mask_is_float:\n            mask = (\n                torch.zeros_like(mask, dtype=target_type)\n                .masked_fill_(mask, float(\"-inf\"))\n            )\n    return mask\n\ndef _in_projection_packed(\n    q: Tensor,\n    k: Tensor,\n    v: Tensor,\n    w: Tensor,\n    b: Optional[Tensor] = None,\n) -> List[Tensor]:\n    r\"\"\"\n    Performs the in-projection step of the attention operation, using packed weights.\n    Output is a triple containing projection tensors for query, key and value.\n\n    Args:\n        q, k, v: query, key and value tensors to be projected. For self-attention,\n            these are typically the same tensor; for encoder-decoder attention,\n            k and v are typically the same tensor. (We take advantage of these\n            identities for performance if they are present.) Regardless, q, k and v\n            must share a common embedding dimension; otherwise their shapes may vary.\n        w: projection weights for q, k and v, packed into a single tensor. Weights\n            are packed along dimension 0, in q, k, v order.\n        b: optional projection biases for q, k and v, packed into a single tensor\n            in q, k, v order.\n\n    Shape:\n        Inputs:\n        - q: :math:`(..., E)` where E is the embedding dimension\n        - k: :math:`(..., E)` where E is the embedding dimension\n        - v: :math:`(..., E)` where E is the embedding dimension\n        - w: :math:`(E * 3, E)` where E is the embedding dimension\n        - b: :math:`E * 3` where E is the embedding dimension\n\n        Output:\n        - in output list :math:`[q', k', v']`, each output tensor will have the\n            same shape as the corresponding input tensor.\n    \"\"\"\n    E = q.size(-1)\n    if k is v:\n        if q is k:\n            # self-attention\n            proj = F.linear(q, w, b)\n            # reshape to 3, E and not E, 3 is deliberate for better memory coalescing and keeping same order as chunk()\n            proj = proj.unflatten(-1, (3, E)).unsqueeze(0).transpose(0, -2).squeeze(-2).contiguous()\n            return proj[0], proj[1], proj[2]\n        else:\n            # encoder-decoder attention\n            w_q, w_kv = w.split([E, E * 2])\n            if b is None:\n                b_q = b_kv = None\n            else:\n                b_q, b_kv = b.split([E, E * 2])\n            q_proj = F.linear(q, w_q, b_q)\n            kv_proj = F.linear(k, w_kv, b_kv)\n            # reshape to 2, E and not E, 2 is deliberate for better memory coalescing and keeping same order as chunk()\n            kv_proj = kv_proj.unflatten(-1, (2, E)).unsqueeze(0).transpose(0, -2).squeeze(-2).contiguous()\n            return (q_proj, kv_proj[0], kv_proj[1])\n    else:\n        w_q, w_k, w_v = w.chunk(3)\n        if b is None:\n            b_q = b_k = b_v = None\n        else:\n            b_q, b_k, b_v = b.chunk(3)\n        return F.linear(q, w_q, b_q), F.linear(k, w_k, b_k), F.linear(v, w_v, b_v)\n\ndef _none_or_dtype(input: Optional[Tensor]) -> Optional[DType]:\n    if input is None:\n        return None\n    elif isinstance(input, torch.Tensor):\n        return input.dtype\n    raise RuntimeError(\"input to _none_or_dtype() must be None or torch.Tensor\")\nclass MultiheadAttention(Module):\n    r\"\"\"Allows the model to jointly attend to information\n    from different representation subspaces as described in the paper:\n    `Attention Is All You Need <https://arxiv.org/abs/1706.03762>`_.\n\n    Multi-Head Attention is defined as:\n\n    .. math::\n        \\text{MultiHead}(Q, K, V) = \\text{Concat}(head_1,\\dots,head_h)W^O\n\n    where :math:`head_i = \\text{Attention}(QW_i^Q, KW_i^K, VW_i^V)`.\n\n    ``forward()`` will use a special optimized implementation if all of the following\n    conditions are met:\n\n    - self attention is being computed (i.e., ``query``, ``key``, and ``value`` are the same tensor. This\n      restriction will be loosened in the future.)\n    - Either autograd is disabled (using ``torch.inference_mode`` or ``torch.no_grad``) or no tensor argument ``requires_grad``\n    - training is disabled (using ``.eval()``)\n    - dropout is 0\n    - ``add_bias_kv`` is ``False``\n    - ``add_zero_attn`` is ``False``\n    - ``batch_first`` is ``True`` and the input is batched\n    - ``kdim`` and ``vdim`` are equal to ``embed_dim``\n    - at most one of ``key_padding_mask`` or ``attn_mask`` is passed\n    - if a `NestedTensor <https://pytorch.org/docs/stable/nested.html>`_ is passed, neither ``key_padding_mask``\n      nor ``attn_mask`` is passed\n\n    If the optimized implementation is in use, a\n    `NestedTensor <https://pytorch.org/docs/stable/nested.html>`_ can be passed for\n    ``query``/``key``/``value`` to represent padding more efficiently than using a\n    padding mask. In this case, a `NestedTensor <https://pytorch.org/docs/stable/nested.html>`_\n    will be returned, and an additional speedup proportional to the fraction of the input\n    that is padding can be expected.\n\n    Args:\n        embed_dim: Total dimension of the model.\n        num_heads: Number of parallel attention heads. Note that ``embed_dim`` will be split\n            across ``num_heads`` (i.e. each head will have dimension ``embed_dim // num_heads``).\n        dropout: Dropout probability on ``attn_output_weights``. Default: ``0.0`` (no dropout).\n        bias: If specified, adds bias to input / output projection layers. Default: ``True``.\n        add_bias_kv: If specified, adds bias to the key and value sequences at dim=0. Default: ``False``.\n        add_zero_attn: If specified, adds a new batch of zeros to the key and value sequences at dim=1.\n            Default: ``False``.\n        kdim: Total number of features for keys. Default: ``None`` (uses ``kdim=embed_dim``).\n        vdim: Total number of features for values. Default: ``None`` (uses ``vdim=embed_dim``).\n        batch_first: If ``True``, then the input and output tensors are provided\n            as (batch, seq, feature). Default: ``False`` (seq, batch, feature).\n\n    Examples::\n\n        >>> # xdoctest: +SKIP\n        >>> multihead_attn = nn.MultiheadAttention(embed_dim, num_heads)\n        >>> attn_output, attn_output_weights = multihead_attn(query, key, value)\n\n    \"\"\"\n    __constants__ = [\"batch_first\"]\n    bias_k: Optional[torch.Tensor]\n    bias_v: Optional[torch.Tensor]\n\n    def __init__(\n        self,\n        embed_dim,\n        num_heads,\n        dropout=0.0,\n        bias=True,\n        add_bias_kv=False,\n        add_zero_attn=False,\n        kdim=None,\n        vdim=None,\n        batch_first=False,\n        linear1_cls=Linear,\n        linear2_cls=Linear,\n        device=None,\n        dtype=None,\n    ) -> None:\n        factory_kwargs = {\"device\": device, \"dtype\": dtype}\n        super(MultiheadAttention, self).__init__()\n        self.embed_dim = embed_dim\n        self.kdim = kdim if kdim is not None else embed_dim\n        self.vdim = vdim if vdim is not None else embed_dim\n        self._qkv_same_embed_dim = (\n            self.kdim == embed_dim and self.vdim == embed_dim\n        )\n\n        self.num_heads = num_heads\n        self.dropout = dropout\n        self.batch_first = batch_first\n        self.head_dim = embed_dim // num_heads\n        assert (\n            self.head_dim * num_heads == self.embed_dim\n        ), \"embed_dim must be divisible by num_heads\"\n\n        if add_bias_kv:\n            self.bias_k = Parameter(\n                torch.empty((1, 1, embed_dim), **factory_kwargs)\n            )\n            self.bias_v = Parameter(\n                torch.empty((1, 1, embed_dim), **factory_kwargs)\n            )\n        else:\n            self.bias_k = self.bias_v = None\n\n        if linear1_cls == Linear:\n            if not self._qkv_same_embed_dim:\n                self.q_proj_weight = Parameter(\n                    torch.empty((embed_dim, embed_dim), **factory_kwargs)\n                )\n                self.k_proj_weight = Parameter(\n                    torch.empty((embed_dim, self.kdim), **factory_kwargs)\n                )\n                self.v_proj_weight = Parameter(\n                    torch.empty((embed_dim, self.vdim), **factory_kwargs)\n                )\n                self.register_parameter(\"in_proj_weight\", None)\n            else:\n                # go down this route with voicecraft\n                self.in_proj_weight = Parameter(\n                    torch.empty((3 * embed_dim, embed_dim), **factory_kwargs)\n                )\n                self.register_parameter(\"q_proj_weight\", None)\n                self.register_parameter(\"k_proj_weight\", None)\n                self.register_parameter(\"v_proj_weight\", None)\n\n            if bias: # True by default\n                self.in_proj_bias = Parameter(\n                    torch.empty(3 * embed_dim, **factory_kwargs)\n                )\n            else:\n                self.register_parameter(\"in_proj_bias\", None)\n            self.out_proj = NonDynamicallyQuantizableLinear(\n                embed_dim, embed_dim, bias=bias, **factory_kwargs\n            )\n\n            self._reset_parameters()\n        else:\n            if not self._qkv_same_embed_dim:\n                raise NotImplementedError\n            else:\n                self.in_proj_linear = linear1_cls(\n                    embed_dim, 3 * embed_dim, bias=bias, **factory_kwargs\n                )\n                self.in_proj_weight = self.in_proj_linear.weight\n\n                self.register_parameter(\"q_proj_weight\", None)\n                self.register_parameter(\"k_proj_weight\", None)\n                self.register_parameter(\"v_proj_weight\", None)\n\n                if bias:\n                    self.in_proj_bias = self.in_proj_linear.bias\n                else:\n                    self.register_parameter(\"in_proj_bias\", None)\n\n            self.out_proj = linear2_cls(\n                embed_dim, embed_dim, bias=bias, **factory_kwargs\n            )\n\n            if self.bias_k is not None:\n                xavier_normal_(self.bias_k)\n            if self.bias_v is not None:\n                xavier_normal_(self.bias_v)\n\n        self.add_zero_attn = add_zero_attn\n\n    def _reset_parameters(self):\n        if self._qkv_same_embed_dim:\n            xavier_uniform_(self.in_proj_weight)\n        else:\n            xavier_uniform_(self.q_proj_weight)\n            xavier_uniform_(self.k_proj_weight)\n            xavier_uniform_(self.v_proj_weight)\n\n        if self.in_proj_bias is not None:\n            constant_(self.in_proj_bias, 0.0)\n            constant_(self.out_proj.bias, 0.0)\n\n        if self.bias_k is not None:\n            xavier_normal_(self.bias_k)\n        if self.bias_v is not None:\n            xavier_normal_(self.bias_v)\n\n    def __setstate__(self, state):\n        # Support loading old MultiheadAttention checkpoints generated by v1.1.0\n        if \"_qkv_same_embed_dim\" not in state:\n            state[\"_qkv_same_embed_dim\"] = True\n\n        super(MultiheadAttention, self).__setstate__(state)\n\n    def forward(\n        self,\n        query: Tensor,\n        key: Tensor,\n        value: Tensor,\n        key_padding_mask: Optional[Tensor] = None,\n        need_weights: bool = True,\n        attn_mask: Optional[Tensor] = None,\n        average_attn_weights: bool = True,\n        past: Optional[Tensor] = None,\n    ) -> Tuple[Tensor, Optional[Tensor]]:\n        r\"\"\"\n        Args:\n            query: Query embeddings of shape :math:`(L, E_q)` for unbatched input, :math:`(L, N, E_q)` when ``batch_first=False``\n                or :math:`(N, L, E_q)` when ``batch_first=True``, where :math:`L` is the target sequence length,\n                :math:`N` is the batch size, and :math:`E_q` is the query embedding dimension ``embed_dim``.\n                Queries are compared against key-value pairs to produce the output.\n                See \"Attention Is All You Need\" for more details.\n            key: Key embeddings of shape :math:`(S, E_k)` for unbatched input, :math:`(S, N, E_k)` when ``batch_first=False``\n                or :math:`(N, S, E_k)` when ``batch_first=True``, where :math:`S` is the source sequence length,\n                :math:`N` is the batch size, and :math:`E_k` is the key embedding dimension ``kdim``.\n                See \"Attention Is All You Need\" for more details.\n            value: Value embeddings of shape :math:`(S, E_v)` for unbatched input, :math:`(S, N, E_v)` when\n                ``batch_first=False`` or :math:`(N, S, E_v)` when ``batch_first=True``, where :math:`S` is the source\n                sequence length, :math:`N` is the batch size, and :math:`E_v` is the value embedding dimension ``vdim``.\n                See \"Attention Is All You Need\" for more details.\n            key_padding_mask: If specified, a mask of shape :math:`(N, S)` indicating which elements within ``key``\n                to ignore for the purpose of attention (i.e. treat as \"padding\"). For unbatched `query`, shape should be :math:`(S)`.\n                Binary and byte masks are supported.\n                For a binary mask, a ``True`` value indicates that the corresponding ``key`` value will be ignored for\n                the purpose of attention. For a float mask, it will be directly added to the corresponding ``key`` value.\n            need_weights: If specified, returns ``attn_output_weights`` in addition to ``attn_outputs``.\n                Default: ``True``.\n            attn_mask: If specified, a 2D or 3D mask preventing attention to certain positions. Must be of shape\n                :math:`(L, S)` or :math:`(N\\cdot\\text{num\\_heads}, L, S)`, where :math:`N` is the batch size,\n                :math:`L` is the target sequence length, and :math:`S` is the source sequence length. A 2D mask will be\n                broadcasted across the batch while a 3D mask allows for a different mask for each entry in the batch.\n                Binary, byte, and float masks are supported. For a binary mask, a ``True`` value indicates that the\n                corresponding position is not allowed to attend. For a byte mask, a non-zero value indicates that the\n                corresponding position is not allowed to attend. For a float mask, the mask values will be added to\n                the attention weight.\n            average_attn_weights: If true, indicates that the returned ``attn_weights`` should be averaged across\n                heads. Otherwise, ``attn_weights`` are provided separately per head. Note that this flag only has an\n                effect when ``need_weights=True``. Default: ``True`` (i.e. average weights across heads)\n\n        Outputs:\n            - **attn_output** - Attention outputs of shape :math:`(L, E)` when input is unbatched,\n              :math:`(L, N, E)` when ``batch_first=False`` or :math:`(N, L, E)` when ``batch_first=True``,\n              where :math:`L` is the target sequence length, :math:`N` is the batch size, and :math:`E` is the\n              embedding dimension ``embed_dim``.\n            - **attn_output_weights** - Only returned when ``need_weights=True``. If ``average_attn_weights=True``,\n              returns attention weights averaged across heads of shape :math:`(L, S)` when input is unbatched or\n              :math:`(N, L, S)`, where :math:`N` is the batch size, :math:`L` is the target sequence length, and\n              :math:`S` is the source sequence length. If ``average_attn_weights=False``, returns attention weights per\n              head of shape :math:`(\\text{num\\_heads}, L, S)` when input is unbatched or :math:`(N, \\text{num\\_heads}, L, S)`.\n\n            .. note::\n                `batch_first` argument is ignored for unbatched inputs.\n        \"\"\"\n        is_batched = query.dim() == 3\n        if key_padding_mask is not None:\n            _kpm_dtype = key_padding_mask.dtype\n            if _kpm_dtype != torch.bool and not torch.is_floating_point(\n                key_padding_mask\n            ):\n                raise AssertionError(\n                    \"only bool and floating types of key_padding_mask are supported\"\n                )\n        why_not_fast_path = \"\"\n        if not is_batched:\n            why_not_fast_path = f\"input not batched; expected query.dim() of 3 but got {query.dim()}\"\n        elif query is not key or key is not value:\n            # When lifting this restriction, don't forget to either\n            # enforce that the dtypes all match or test cases where\n            # they don't!\n            why_not_fast_path = \"non-self attention was used (query, key, and value are not the same Tensor)\"\n        elif (\n            self.in_proj_bias is not None\n            and query.dtype != self.in_proj_bias.dtype\n        ):\n            why_not_fast_path = f\"dtypes of query ({query.dtype}) and self.in_proj_bias ({self.in_proj_bias.dtype}) don't match\"\n        elif (\n            self.in_proj_weight is not None\n            and query.dtype != self.in_proj_weight.dtype\n        ):\n            # this case will fail anyway, but at least they'll get a useful error message.\n            why_not_fast_path = f\"dtypes of query ({query.dtype}) and self.in_proj_weight ({self.in_proj_weight.dtype}) don't match\"\n        elif self.training:\n            why_not_fast_path = \"training is enabled\"\n        elif not self.batch_first:\n            why_not_fast_path = \"batch_first was not True\"\n        elif self.bias_k is not None:\n            why_not_fast_path = \"self.bias_k was not None\"\n        elif self.bias_v is not None:\n            why_not_fast_path = \"self.bias_v was not None\"\n        elif self.dropout:\n            why_not_fast_path = f\"dropout was {self.dropout}, required zero\"\n        elif self.add_zero_attn:\n            why_not_fast_path = \"add_zero_attn was enabled\"\n        elif not self._qkv_same_embed_dim:\n            why_not_fast_path = \"_qkv_same_embed_dim was not True\"\n        elif attn_mask is not None:\n            why_not_fast_path = \"attn_mask was not None\"\n        elif query.is_nested and key_padding_mask is not None:\n            why_not_fast_path = (\n                \"key_padding_mask is not supported with NestedTensor input\"\n            )\n        elif self.num_heads % 2 == 1:\n            why_not_fast_path = \"num_heads is odd\"\n        elif torch.is_autocast_enabled():\n            why_not_fast_path = \"autocast is enabled\"\n\n        if not why_not_fast_path:\n            tensor_args = (\n                query,\n                key,\n                value,\n                self.in_proj_weight,\n                self.in_proj_bias,\n                self.out_proj.weight,\n                self.out_proj.bias,\n            )\n            # We have to use list comprehensions below because TorchScript does not support\n            # generator expressions.\n            if torch.overrides.has_torch_function(tensor_args):\n                why_not_fast_path = \"some Tensor argument has_torch_function\"\n            elif not all(\n                [\n                    (x is None or x.is_cuda or \"cpu\" in str(x.device))\n                    for x in tensor_args\n                ]\n            ):\n                why_not_fast_path = (\n                    \"some Tensor argument is neither CUDA nor CPU\"\n                )\n            elif torch.is_grad_enabled() and any(\n                [x is not None and x.requires_grad for x in tensor_args]\n            ):\n                why_not_fast_path = (\n                    \"grad is enabled and at least one of query or the \"\n                    \"input/output projection weights or biases requires_grad\"\n                )\n            if not why_not_fast_path:\n                return torch._native_multi_head_attention(\n                    query,\n                    key,\n                    value,\n                    self.embed_dim,\n                    self.num_heads,\n                    self.in_proj_weight,\n                    self.in_proj_bias,\n                    self.out_proj.weight,\n                    self.out_proj.bias,\n                    key_padding_mask\n                    if key_padding_mask is not None\n                    else attn_mask,\n                    need_weights,\n                    average_attn_weights,\n                    1\n                    if key_padding_mask is not None\n                    else 0\n                    if attn_mask is not None\n                    else None,\n                )\n\n        any_nested = query.is_nested or key.is_nested or value.is_nested\n        assert not any_nested, (\n            \"MultiheadAttention does not support NestedTensor outside of its fast path. \"\n            + f\"The fast path was not hit because {why_not_fast_path}\"\n        )\n\n        if self.batch_first and is_batched:\n            # make sure that the transpose op does not affect the \"is\" property\n            if key is value:\n                if query is key:\n                    query = key = value = query.transpose(1, 0)\n                else:\n                    query, key = [x.transpose(1, 0) for x in (query, key)]\n                    value = key\n            else:\n                query, key, value = [\n                    x.transpose(1, 0) for x in (query, key, value)\n                ]\n\n        if not self._qkv_same_embed_dim:\n            attn_output, attn_output_weights = F.multi_head_attention_forward(\n                query,\n                key,\n                value,\n                self.embed_dim,\n                self.num_heads,\n                self.in_proj_weight,\n                self.in_proj_bias,\n                self.bias_k,\n                self.bias_v,\n                self.add_zero_attn,\n                self.dropout,\n                self.out_proj.weight,\n                self.out_proj.bias,\n                training=self.training,\n                key_padding_mask=key_padding_mask,\n                need_weights=need_weights,\n                attn_mask=attn_mask,\n                use_separate_proj_weight=True,\n                q_proj_weight=self.q_proj_weight,\n                k_proj_weight=self.k_proj_weight,\n                v_proj_weight=self.v_proj_weight,\n                average_attn_weights=average_attn_weights,\n            )\n        else:\n            # re-write the self.attention here, to get k, v cache\n            tgt_len, bsz, embed_dim = query.shape\n            src_len, _, _ = key.shape\n            num_heads = self.num_heads\n            key_padding_mask = _canonical_mask(\n                mask=key_padding_mask,\n                mask_name=\"key_padding_mask\",\n                other_type=_none_or_dtype(attn_mask),\n                other_name=\"attn_mask\",\n                target_type=query.dtype\n            )\n            attn_mask = _canonical_mask(\n                            mask=attn_mask,\n                            mask_name=\"attn_mask\",\n                            other_type=None,\n                            other_name=\"\",\n                            target_type=query.dtype,\n                            check_other=False,\n                            )\n            head_dim = self.embed_dim // self.num_heads\n            assert head_dim * self.num_heads == self.embed_dim, f\"embed_dim {self.embed_dim} not divisible by num_heads {self.num_heads}\"\n            assert key.shape == value.shape, f\"key shape {key.shape} does not match value shape {value.shape}\"\n            q, k, v = _in_projection_packed(query, key, value, self.in_proj_weight, self.in_proj_bias)\n            # k_present, v_present = k, v\n            \n            #\n            # reshape q, k, v for multihead attention and make em batch first\n            #\n            \n            q = q.view(tgt_len, bsz * num_heads, head_dim).transpose(0, 1)\n            k = k.view(k.shape[0], bsz * num_heads, head_dim).transpose(0, 1)\n            v = v.view(v.shape[0], bsz * num_heads, head_dim).transpose(0, 1) # (bsz * num_heads, src_len, head_dim)\n            src_len = k.size(1)\n            if past is not None and past.ndim > 2:\n                expected_src_len = src_len + past[0].shape[-2]\n            else:\n                expected_src_len = src_len\n\n\n            # ensure attn_mask's dim is 3\n            if attn_mask.dim() == 2:\n                correct_2d_size = (tgt_len, expected_src_len)\n                if attn_mask.shape != correct_2d_size:\n                    raise RuntimeError(f\"The shape of the 2D attn_mask is {attn_mask.shape}, but should be {correct_2d_size}.\")\n                attn_mask = attn_mask.unsqueeze(0)\n            elif attn_mask.dim() == 3:\n                correct_3d_size = (bsz * num_heads, tgt_len, expected_src_len)\n                if attn_mask.shape != correct_3d_size:\n                    raise RuntimeError(f\"The shape of the 3D attn_mask is {attn_mask.shape}, but should be {correct_3d_size}.\")\n            else:\n                raise RuntimeError(f\"attn_mask's dimension {attn_mask.dim()} is not supported\")\n            \n            if key_padding_mask is not None:\n                assert key_padding_mask.shape == (bsz, expected_src_len), \\\n                    f\"expecting key_padding_mask shape of {(bsz, expected_src_len)}, but got {key_padding_mask.shape}\"\n                key_padding_mask = key_padding_mask.view(bsz, 1, 1, expected_src_len).   \\\n                    expand(-1, num_heads, -1, -1).reshape(bsz * num_heads, 1, expected_src_len)\n                if attn_mask is None:\n                    attn_mask = key_padding_mask\n                else:\n                    attn_mask = attn_mask + key_padding_mask\n            \n            if not self.training:\n                dropout_p = 0.0\n            else:\n                dropout_p = self.dropout\n\n            if need_weights:\n                raise NotImplementedError(\"need_weights not implemented for voicecraft\")\n                # B, Nt, E = q.shape\n                # q_scaled = q / math.sqrt(E)\n\n                # assert not (is_causal and attn_mask is None), \"FIXME: is_causal not implemented for need_weights\"\n\n                # if attn_mask is not None:\n                #     attn_output_weights = torch.baddbmm(attn_mask, q_scaled, k.transpose(-2, -1))\n                # else:\n                #     attn_output_weights = torch.bmm(q_scaled, k.transpose(-2, -1))\n                # attn_output_weights = softmax(attn_output_weights, dim=-1)\n                # if dropout_p > 0.0:\n                #     attn_output_weights = dropout(attn_output_weights, p=dropout_p)\n\n                # attn_output = torch.bmm(attn_output_weights, v)\n\n                # attn_output = attn_output.transpose(0, 1).contiguous().view(tgt_len * bsz, embed_dim)\n                # attn_output = linear(attn_output, out_proj_weight, out_proj_bias)\n                # attn_output = attn_output.view(tgt_len, bsz, attn_output.size(1))\n\n                # # optionally average attention weights over heads\n                # attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, src_len)\n                # if average_attn_weights:\n                #     attn_output_weights = attn_output_weights.mean(dim=1)\n\n                # if not is_batched:\n                #     # squeeze the output if input was unbatched\n                #     attn_output = attn_output.squeeze(1)\n                #     attn_output_weights = attn_output_weights.squeeze(0)\n                # return attn_output, attn_output_weights\n            else:\n                # attn_mask can be either (L,S) or (N*num_heads, L, S)\n                # if attn_mask's shape is (1, L, S) we need to unsqueeze to (1, 1, L, S)\n                # in order to match the input for SDPA of (N, num_heads, L, S)\n                if attn_mask is not None:\n                    if attn_mask.size(0) == 1 and attn_mask.dim() == 3:\n                        attn_mask = attn_mask.unsqueeze(0)\n                    else:\n                        attn_mask = attn_mask.view(bsz, num_heads, -1, expected_src_len)\n\n                q = q.view(bsz, num_heads, tgt_len, head_dim)\n                k = k.view(bsz, num_heads, src_len, head_dim)\n                v = v.view(bsz, num_heads, src_len, head_dim)\n                # logging.info(f\"shape of past: {past.shape}\")\n                if past is not None:\n                    present = torch.stack([k, v], dim=0) # (2, bsz, num_heads, src_len, head_dim)\n                    if past.ndim > 2: # this means we use kvcache, otherwise we just pass in a placeholder, but not actually using kvcache\n                        pk, pv = past\n                        k = torch.cat([pk, k], dim=-2)\n                        v = torch.cat([pv, v], dim=-2)\n                else:\n                    present = None\n                attn_output = F.scaled_dot_product_attention(q, k, v, attn_mask, dropout_p, is_causal=False)\n                attn_output = attn_output.permute(2, 0, 1, 3).contiguous().view(bsz * tgt_len, embed_dim)\n\n                attn_output = F.linear(attn_output, self.out_proj.weight, self.out_proj.bias)\n                attn_output = attn_output.view(tgt_len, bsz, attn_output.size(1))\n                if not is_batched:\n                    # squeeze the output if input was unbatched\n                    attn_output = attn_output.squeeze(1)\n                # if self.training:\n                #     return attn_output, None\n                # else:\n                #     return (attn_output, present), None\n\n        # harded coded, the code do not support returning attn weigths yet\n        attn_output_weights=None\n        if self.batch_first and is_batched:\n            return attn_output.transpose(1, 0), present\n        else:\n            return attn_output, present\n\n"
  },
  {
    "path": "models/modules/embedding.py",
    "content": "# cp from https://github.com/lifeiteng/vall-e/blob/main/valle/modules/embedding.py\n# Copyright    2023                             (authors: Feiteng Li)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport math\n\nimport torch\nimport torch.nn as nn\n\n\nclass TokenEmbedding(nn.Module):\n    def __init__(\n        self,\n        dim_model: int,\n        vocab_size: int,\n        dropout: float = 0.0,\n    ):\n        super().__init__()\n\n        self.vocab_size = vocab_size\n        self.dim_model = dim_model\n\n        self.dropout = torch.nn.Dropout(p=dropout)\n        self.word_embeddings = nn.Embedding(self.vocab_size, self.dim_model)\n\n    @property\n    def weight(self) -> torch.Tensor:\n        return self.word_embeddings.weight\n\n    def embedding(self, index: int) -> torch.Tensor:\n        return self.word_embeddings.weight[index : index + 1]\n\n    def forward(self, x: torch.Tensor):\n        X = self.word_embeddings(x)\n        X = self.dropout(X)\n\n        return X\n\n\nclass SinePositionalEmbedding(nn.Module):\n    def __init__(\n        self,\n        dim_model: int,\n        dropout: float = 0.0,\n        scale: bool = False,\n        alpha: bool = False,\n    ):\n        super().__init__()\n        self.dim_model = dim_model\n        self.x_scale = math.sqrt(dim_model) if scale else 1.0\n        self.alpha = nn.Parameter(torch.ones(1), requires_grad=alpha)\n        self.dropout = torch.nn.Dropout(p=dropout)\n\n        self.reverse = False\n        self.pe = None\n        self.extend_pe(torch.tensor(0.0).expand(1, 4000))\n\n    def extend_pe(self, x):\n        \"\"\"Reset the positional encodings.\"\"\"\n        if self.pe is not None:\n            if self.pe.size(1) >= x.size(1):\n                if self.pe.dtype != x.dtype or self.pe.device != x.device:\n                    self.pe = self.pe.to(dtype=x.dtype, device=x.device)\n                return\n        pe = torch.zeros(x.size(1), self.dim_model)\n        if self.reverse:\n            position = torch.arange(\n                x.size(1) - 1, -1, -1.0, dtype=torch.float32\n            ).unsqueeze(1)\n        else:\n            position = torch.arange(\n                0, x.size(1), dtype=torch.float32\n            ).unsqueeze(1)\n        div_term = torch.exp(\n            torch.arange(0, self.dim_model, 2, dtype=torch.float32)\n            * -(math.log(10000.0) / self.dim_model)\n        )\n        pe[:, 0::2] = torch.sin(position * div_term)\n        pe[:, 1::2] = torch.cos(position * div_term)\n        pe = pe.unsqueeze(0)\n        self.pe = pe.to(device=x.device, dtype=x.dtype).detach()\n\n    def forward(self, x: torch.Tensor) -> torch.Tensor:\n        self.extend_pe(x)\n        output = x.unsqueeze(-1) if x.ndim == 2 else x\n        output = output * self.x_scale + self.alpha * self.pe[:, : x.size(1)]\n        return self.dropout(output)"
  },
  {
    "path": "models/modules/sampling.py",
    "content": "import torch\nimport torch.nn.functional as F\n\ndef top_k_top_p_filtering(\n    logits, top_k=0, top_p=1.0, filter_value=-float(\"Inf\"), min_tokens_to_keep=1\n):\n    \"\"\"Filter a distribution of logits using top-k and/or nucleus (top-p) filtering\n    Args:\n        logits: logits distribution shape (batch size, vocabulary size)\n        if top_k > 0: keep only top k tokens with highest probability (top-k filtering).\n        if top_p < 1.0: keep the top tokens with cumulative probability >= top_p (nucleus filtering).\n            Nucleus filtering is described in Holtzman et al. (http://arxiv.org/abs/1904.09751)\n        Make sure we keep at least min_tokens_to_keep per batch example in the output\n    From: https://gist.github.com/thomwolf/1a5a29f6962089e871b94cbd09daf317\n    \"\"\"\n    if top_k > 0:\n        top_k = min(\n            max(top_k, min_tokens_to_keep), logits.size(-1)\n        )  # Safety check\n        # Remove all tokens with a probability less than the last token of the top-k\n        indices_to_remove = logits < torch.topk(logits, top_k)[0][..., -1, None]\n        logits[indices_to_remove] = filter_value\n\n    if top_p < 1.0:\n        sorted_logits, sorted_indices = torch.sort(logits, descending=True)\n        cumulative_probs = torch.cumsum(\n            F.softmax(sorted_logits, dim=-1), dim=-1\n        )\n\n        # Remove tokens with cumulative probability above the threshold (token with 0 are kept)\n        sorted_indices_to_remove = cumulative_probs > top_p\n        if min_tokens_to_keep > 1:\n            # Keep at least min_tokens_to_keep (set to min_tokens_to_keep-1 because we add the first one below)\n            sorted_indices_to_remove[..., :min_tokens_to_keep] = 0\n        # Shift the indices to the right to keep also the first token above the threshold\n        sorted_indices_to_remove[..., 1:] = sorted_indices_to_remove[\n            ..., :-1\n        ].clone()\n        sorted_indices_to_remove[..., 0] = 0\n\n        # scatter sorted tensors to original indexing\n        indices_to_remove = sorted_indices_to_remove.scatter(\n            1, sorted_indices, sorted_indices_to_remove\n        )\n        logits[indices_to_remove] = filter_value\n    return logits\n    \ndef topk_sampling(logits, top_k=10, top_p=1.0, temperature=1.0):\n    # temperature: (`optional`) float\n    #     The value used to module the next token probabilities. Must be strictly positive. Default to 1.0.\n    # top_k: (`optional`) int\n    #     The number of highest probability vocabulary tokens to keep for top-k-filtering. Between 1 and infinity. Default to 50.\n    # top_p: (`optional`) float\n    #     The cumulative probability of parameter highest probability vocabulary tokens to keep for nucleus sampling. Must be between 0 and 1. Default to 1.\n\n    # Temperature (higher temperature => more likely to sample low probability tokens)\n    if temperature != 1.0:\n        logits = logits / temperature\n    # Top-p/top-k filtering\n    logits = top_k_top_p_filtering(logits, top_k=top_k, top_p=top_p)\n    # Sample\n    token = torch.multinomial(F.softmax(logits, dim=-1), num_samples=1)\n    return token"
  },
  {
    "path": "models/modules/scaling.py",
    "content": "# cp from https://github.com/lifeiteng/vall-e/blob/main/valle/modules/scaling.py\n# Copyright    2022  Xiaomi Corp.        (authors: Daniel Povey)\n#\n# See ../../../../LICENSE for clarification regarding multiple authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\nimport collections\nimport logging\nimport random\nimport math\nfrom functools import reduce\nfrom itertools import repeat\nfrom typing import Optional, Tuple, Union\n\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch import Tensor\nfrom torch.nn import Embedding as ScaledEmbedding\n\n# from valle.utils import Transpose\n\nclass Transpose(nn.Identity):\n    \"\"\"(N, T, D) -> (N, D, T)\"\"\"\n\n    def forward(self, input: torch.Tensor) -> torch.Tensor:\n        return input.transpose(1, 2)\n    \nclass ActivationBalancerFunction(torch.autograd.Function):\n    @staticmethod\n    def forward(\n        ctx,\n        x: Tensor,\n        scale_factor: Tensor,\n        sign_factor: Optional[Tensor],\n        channel_dim: int,\n    ) -> Tensor:\n        if channel_dim < 0:\n            channel_dim += x.ndim\n        ctx.channel_dim = channel_dim\n        xgt0 = x > 0\n        if sign_factor is None:\n            ctx.save_for_backward(xgt0, scale_factor)\n        else:\n            ctx.save_for_backward(xgt0, scale_factor, sign_factor)\n        return x\n\n    @staticmethod\n    def backward(ctx, x_grad: Tensor) -> Tuple[Tensor, None, None, None]:\n        if len(ctx.saved_tensors) == 3:\n            xgt0, scale_factor, sign_factor = ctx.saved_tensors\n            for _ in range(ctx.channel_dim, x_grad.ndim - 1):\n                scale_factor = scale_factor.unsqueeze(-1)\n                sign_factor = sign_factor.unsqueeze(-1)\n            factor = sign_factor + scale_factor * (xgt0.to(x_grad.dtype) - 0.5)\n        else:\n            xgt0, scale_factor = ctx.saved_tensors\n            for _ in range(ctx.channel_dim, x_grad.ndim - 1):\n                scale_factor = scale_factor.unsqueeze(-1)\n            factor = scale_factor * (xgt0.to(x_grad.dtype) - 0.5)\n        neg_delta_grad = x_grad.abs() * factor\n        return (\n            x_grad - neg_delta_grad,\n            None,\n            None,\n            None,\n        )\n\n\ndef _compute_scale_factor(\n    x: Tensor,\n    channel_dim: int,\n    min_abs: float,\n    max_abs: float,\n    gain_factor: float,\n    max_factor: float,\n) -> Tensor:\n    if channel_dim < 0:\n        channel_dim += x.ndim\n    sum_dims = [d for d in range(x.ndim) if d != channel_dim]\n    x_abs_mean = torch.mean(x.abs(), dim=sum_dims).to(torch.float32)\n\n    if min_abs == 0.0:\n        below_threshold = 0.0\n    else:\n        # below_threshold is 0 if x_abs_mean > min_abs, can be at most max_factor if\n        # x_abs)_mean , min_abs.\n        below_threshold = (\n            (min_abs - x_abs_mean) * (gain_factor / min_abs)\n        ).clamp(min=0, max=max_factor)\n\n    above_threshold = ((x_abs_mean - max_abs) * (gain_factor / max_abs)).clamp(\n        min=0, max=max_factor\n    )\n\n    return below_threshold - above_threshold\n\n\ndef _compute_sign_factor(\n    x: Tensor,\n    channel_dim: int,\n    min_positive: float,\n    max_positive: float,\n    gain_factor: float,\n    max_factor: float,\n) -> Tensor:\n    if channel_dim < 0:\n        channel_dim += x.ndim\n    sum_dims = [d for d in range(x.ndim) if d != channel_dim]\n    proportion_positive = torch.mean((x > 0).to(torch.float32), dim=sum_dims)\n    if min_positive == 0.0:\n        factor1 = 0.0\n    else:\n        # 0 if proportion_positive >= min_positive, else can be\n        # as large as max_factor.\n        factor1 = (\n            (min_positive - proportion_positive) * (gain_factor / min_positive)\n        ).clamp_(min=0, max=max_factor)\n\n    if max_positive == 1.0:\n        factor2 = 0.0\n    else:\n        # 0 if self.proportion_positive <= max_positive, else can be\n        # as large as -max_factor.\n        factor2 = (\n            (proportion_positive - max_positive)\n            * (gain_factor / (1.0 - max_positive))\n        ).clamp_(min=0, max=max_factor)\n    sign_factor = factor1 - factor2\n    # require min_positive != 0 or max_positive != 1:\n    assert not isinstance(sign_factor, float)\n    return sign_factor\n\n\nclass ActivationScaleBalancerFunction(torch.autograd.Function):\n    \"\"\"\n    This object is used in class ActivationBalancer when the user specified\n    min_positive=0, max_positive=1, so there are no constraints on the signs\n    of the activations and only the absolute value has a constraint.\n    \"\"\"\n\n    @staticmethod\n    def forward(\n        ctx,\n        x: Tensor,\n        sign_factor: Tensor,\n        scale_factor: Tensor,\n        channel_dim: int,\n    ) -> Tensor:\n        if channel_dim < 0:\n            channel_dim += x.ndim\n        ctx.channel_dim = channel_dim\n        xgt0 = x > 0\n        ctx.save_for_backward(xgt0, sign_factor, scale_factor)\n        return x\n\n    @staticmethod\n    def backward(ctx, x_grad: Tensor) -> Tuple[Tensor, None, None, None]:\n        xgt0, sign_factor, scale_factor = ctx.saved_tensors\n        for _ in range(ctx.channel_dim, x_grad.ndim - 1):\n            sign_factor = sign_factor.unsqueeze(-1)\n            scale_factor = scale_factor.unsqueeze(-1)\n\n        factor = sign_factor + scale_factor * (xgt0.to(x_grad.dtype) - 0.5)\n        neg_delta_grad = x_grad.abs() * factor\n        return (\n            x_grad - neg_delta_grad,\n            None,\n            None,\n            None,\n        )\n\n\nclass RandomClampFunction(torch.autograd.Function):\n    @staticmethod\n    def forward(\n        ctx,\n        x: Tensor,\n        min: Optional[float],\n        max: Optional[float],\n        prob: float,\n        reflect: float,\n    ) -> Tensor:\n        x_clamped = torch.clamp(x, min=min, max=max)\n        mask = torch.rand_like(x) < prob\n        ans = torch.where(mask, x_clamped, x)\n        if x.requires_grad:\n            ctx.save_for_backward(ans == x)\n            ctx.reflect = reflect\n        if reflect != 0.0:\n            ans = ans * (1.0 + reflect) - (x * reflect)\n        return ans\n\n    @staticmethod\n    def backward(\n        ctx, ans_grad: Tensor\n    ) -> Tuple[Tensor, None, None, None, None]:\n        (is_same,) = ctx.saved_tensors\n        x_grad = ans_grad * is_same.to(ans_grad.dtype)\n        reflect = ctx.reflect\n        if reflect != 0.0:\n            x_grad = x_grad * (1.0 + reflect) - (ans_grad * reflect)\n        return x_grad, None, None, None, None\n\n\ndef random_clamp(\n    x: Tensor,\n    min: Optional[float] = None,\n    max: Optional[float] = None,\n    prob: float = 0.5,\n    reflect: float = 0.0,\n):\n    return RandomClampFunction.apply(x, min, max, prob, reflect)\n\n\ndef random_cast_to_half(x: Tensor, min_abs: float = 5.0e-06) -> Tensor:\n    \"\"\"\n    A randomized way of casting a floating point value to half precision.\n    \"\"\"\n    if x.dtype == torch.float16:\n        return x\n    x_abs = x.abs()\n    is_too_small = x_abs < min_abs\n    # for elements where is_too_small is true, random_val will contain +-min_abs with\n    # probability (x.abs() / min_abs), and 0.0 otherwise.  [so this preserves expectations,\n    # for those elements].\n    random_val = min_abs * x.sign() * (torch.rand_like(x) * min_abs < x_abs)\n    return torch.where(is_too_small, random_val, x).to(torch.float16)\n\n\nclass RandomGradFunction(torch.autograd.Function):\n    \"\"\"\n    Does nothing in forward pass; in backward pass, gets rid of very small grads using\n    randomized approach that preserves expectations (intended to reduce roundoff).\n    \"\"\"\n\n    @staticmethod\n    def forward(ctx, x: Tensor, min_abs: float) -> Tensor:\n        ctx.min_abs = min_abs\n        return x\n\n    @staticmethod\n    def backward(ctx, ans_grad: Tensor) -> Tuple[Tensor, None]:\n        if ans_grad.dtype == torch.float16:\n            return (\n                random_cast_to_half(\n                    ans_grad.to(torch.float32), min_abs=ctx.min_abs\n                ),\n                None,\n            )\n        else:\n            return ans_grad, None\n\n\nclass RandomGrad(torch.nn.Module):\n    \"\"\"\n    Gets rid of very small gradients using an expectation-preserving method, intended to increase\n    accuracy of training when using amp (automatic mixed precision)\n    \"\"\"\n\n    def __init__(self, min_abs: float = 5.0e-06):\n        super(RandomGrad, self).__init__()\n        self.min_abs = min_abs\n\n    def forward(self, x: Tensor):\n        if (\n            torch.jit.is_scripting()\n            or not self.training\n            or torch.jit.is_tracing()\n        ):\n            return x\n        else:\n            return RandomGradFunction.apply(x, self.min_abs)\n\n\nclass SoftmaxFunction(torch.autograd.Function):\n    \"\"\"\n    Tries to handle half-precision derivatives in a randomized way that should\n    be more accurate for training than the default behavior.\n    \"\"\"\n\n    @staticmethod\n    def forward(ctx, x: Tensor, dim: int):\n        ans = x.softmax(dim=dim)\n        # if x dtype is float16, x.softmax() returns a float32 because\n        # (presumably) that op does not support float16, and autocast\n        # is enabled.\n        if torch.is_autocast_enabled():\n            ans = ans.to(torch.float16)\n        ctx.save_for_backward(ans)\n        ctx.x_dtype = x.dtype\n        ctx.dim = dim\n        return ans\n\n    @staticmethod\n    def backward(ctx, ans_grad: Tensor):\n        (ans,) = ctx.saved_tensors\n        with torch.cuda.amp.autocast(enabled=False):\n            ans_grad = ans_grad.to(torch.float32)\n            ans = ans.to(torch.float32)\n            x_grad = ans_grad * ans\n            x_grad = x_grad - ans * x_grad.sum(dim=ctx.dim, keepdim=True)\n            return x_grad, None\n\n\ndef softmax(x: Tensor, dim: int):\n    if torch.jit.is_scripting() or torch.jit.is_tracing():\n        return x.softmax(dim)\n\n    return SoftmaxFunction.apply(x, dim)\n\n\nclass MaxEigLimiterFunction(torch.autograd.Function):\n    @staticmethod\n    def forward(\n        ctx,\n        x: Tensor,\n        coeffs: Tensor,\n        direction: Tensor,\n        channel_dim: int,\n        grad_scale: float,\n    ) -> Tensor:\n        ctx.channel_dim = channel_dim\n        ctx.grad_scale = grad_scale\n        ctx.save_for_backward(x.detach(), coeffs.detach(), direction.detach())\n        return x\n\n    @staticmethod\n    def backward(ctx, x_grad, *args):\n        with torch.enable_grad():\n            (x_orig, coeffs, new_direction) = ctx.saved_tensors\n            x_orig.requires_grad = True\n            num_channels = x_orig.shape[ctx.channel_dim]\n            x = x_orig.transpose(ctx.channel_dim, -1).reshape(-1, num_channels)\n            new_direction.requires_grad = False\n            x = x - x.mean(dim=0)\n            x_var = (x ** 2).mean()\n            x_residual = x - coeffs * new_direction\n            x_residual_var = (x_residual ** 2).mean()\n            # `variance_proportion` is the proportion of the variance accounted for\n            # by the top eigen-direction.  This is to be minimized.\n            variance_proportion = (x_var - x_residual_var) / (x_var + 1.0e-20)\n            variance_proportion.backward()\n        x_orig_grad = x_orig.grad\n        x_extra_grad = (\n            x_orig.grad\n            * ctx.grad_scale\n            * x_grad.norm()\n            / (x_orig_grad.norm() + 1.0e-20)\n        )\n        return x_grad + x_extra_grad.detach(), None, None, None, None\n\n\nclass BasicNorm(torch.nn.Module):\n    \"\"\"\n    This is intended to be a simpler, and hopefully cheaper, replacement for\n    LayerNorm.  The observation this is based on, is that Transformer-type\n    networks, especially with pre-norm, sometimes seem to set one of the\n    feature dimensions to a large constant value (e.g. 50), which \"defeats\"\n    the LayerNorm because the output magnitude is then not strongly dependent\n    on the other (useful) features.  Presumably the weight and bias of the\n    LayerNorm are required to allow it to do this.\n\n    So the idea is to introduce this large constant value as an explicit\n    parameter, that takes the role of the \"eps\" in LayerNorm, so the network\n    doesn't have to do this trick.  We make the \"eps\" learnable.\n\n    Args:\n       num_channels: the number of channels, e.g. 512.\n      channel_dim: the axis/dimension corresponding to the channel,\n        interprted as an offset from the input's ndim if negative.\n        shis is NOT the num_channels; it should typically be one of\n        {-2, -1, 0, 1, 2, 3}.\n       eps: the initial \"epsilon\" that we add as ballast in:\n             scale = ((input_vec**2).mean() + epsilon)**-0.5\n          Note: our epsilon is actually large, but we keep the name\n          to indicate the connection with conventional LayerNorm.\n       learn_eps: if true, we learn epsilon; if false, we keep it\n         at the initial value.\n    eps_min: float\n    eps_max: float\n    \"\"\"\n\n    def __init__(\n        self,\n        num_channels: int,\n        channel_dim: int = -1,  # CAUTION: see documentation.\n        eps: float = 0.25,\n        learn_eps: bool = True,\n        eps_min: float = -3.0,\n        eps_max: float = 3.0,\n    ) -> None:\n        super(BasicNorm, self).__init__()\n        self.num_channels = num_channels\n        self.channel_dim = channel_dim\n        if learn_eps:\n            self.eps = nn.Parameter(torch.tensor(eps).log().detach())\n        else:\n            self.register_buffer(\"eps\", torch.tensor(eps).log().detach())\n        self.eps_min = eps_min\n        self.eps_max = eps_max\n\n    def forward(self, x: Tensor) -> Tensor:\n        assert x.shape[self.channel_dim] == self.num_channels\n        eps = self.eps\n        if self.training and random.random() < 0.25:\n            # with probability 0.25, in training mode, clamp eps between the min\n            # and max; this will encourage it to learn parameters within the\n            # allowed range by making parameters that are outside the allowed\n            # range noisy.\n\n            # gradients to allow the parameter to get back into the allowed region if it happens to exit it.\n            eps = eps.clamp(min=self.eps_min, max=self.eps_max)\n        scales = (\n            torch.mean(x ** 2, dim=self.channel_dim, keepdim=True) + eps.exp()\n        ) ** -0.5\n        return x * scales\n\n\ndef ScaledLinear(*args, initial_scale: float = 1.0, **kwargs) -> nn.Linear:\n    \"\"\"\n    Behaves like a constructor of a modified version of nn.Linear\n    that gives an easy way to set the default initial parameter scale.\n\n    Args:\n        Accepts the standard args and kwargs that nn.Linear accepts\n        e.g. in_features, out_features, bias=False.\n\n        initial_scale: you can override this if you want to increase\n           or decrease the initial magnitude of the module's output\n           (affects the initialization of weight_scale and bias_scale).\n           Another option, if you want to do something like this, is\n           to re-initialize the parameters.\n    \"\"\"\n    ans = nn.Linear(*args, **kwargs)\n    with torch.no_grad():\n        ans.weight[:] *= initial_scale\n        if ans.bias is not None:\n            torch.nn.init.uniform_(\n                ans.bias, -0.1 * initial_scale, 0.1 * initial_scale\n            )\n    return ans\n\n\ndef ScaledConv1d(\n    *args,\n    initial_scale: float = 1.0,\n    kernel_size: int = 3,\n    padding: str = \"same\",\n    **kwargs,\n) -> nn.Conv1d:\n    \"\"\"\n    Behaves like a constructor of a modified version of nn.Conv1d\n    that gives an easy way to set the default initial parameter scale.\n\n    Args:\n        Accepts the standard args and kwargs that nn.Linear accepts\n        e.g. in_features, out_features, bias=False.\n\n        initial_scale: you can override this if you want to increase\n           or decrease the initial magnitude of the module's output\n           (affects the initialization of weight_scale and bias_scale).\n           Another option, if you want to do something like this, is\n           to re-initialize the parameters.\n    \"\"\"\n    ans = nn.Conv1d(*args, kernel_size=kernel_size, padding=padding, **kwargs)\n    with torch.no_grad():\n        ans.weight[:] *= initial_scale\n        if ans.bias is not None:\n            torch.nn.init.uniform_(\n                ans.bias, -0.1 * initial_scale, 0.1 * initial_scale\n            )\n    return ans\n\n\ndef TransposeScaledConv1d(\n    *args,\n    initial_scale: float = 1.0,\n    kernel_size: int = 3,\n    padding: str = \"same\",\n    **kwargs,\n) -> nn.Sequential:\n    \"\"\"\n    Transpose -> ScaledConv1d\n    \"\"\"\n    return nn.Sequential(\n        Transpose(),\n        ScaledConv1d(\n            *args,\n            initial_scale=initial_scale,\n            kernel_size=kernel_size,\n            padding=padding,\n            **kwargs,\n        ),\n    )\n\n\ndef ScaledConv1dTranspose(\n    *args,\n    initial_scale: float = 1.0,\n    kernel_size: int = 3,\n    padding: str = \"same\",\n    **kwargs,\n) -> nn.Sequential:\n    \"\"\"\n    Transpose -> ScaledConv1d\n    \"\"\"\n    return nn.Sequential(\n        ScaledConv1d(\n            *args,\n            initial_scale=initial_scale,\n            kernel_size=kernel_size,\n            padding=padding,\n            **kwargs,\n        ),\n        Transpose(),\n    )\n\n\ndef TransposeConv1d(\n    *args, kernel_size: int = 3, padding: str = \"same\", **kwargs\n) -> nn.Sequential:\n    \"\"\"\n    Transpose -> Conv1d\n    \"\"\"\n    return nn.Sequential(\n        Transpose(),\n        nn.Conv1d(*args, kernel_size=kernel_size, padding=padding, **kwargs),\n    )\n\n\ndef Conv1dTranspose(\n    *args, kernel_size: int = 3, padding: str = \"same\", **kwargs\n) -> nn.Sequential:\n    \"\"\"\n    ScaledConv1d -> Transpose\n    \"\"\"\n    return nn.Sequential(\n        nn.Conv1d(*args, kernel_size=kernel_size, padding=padding, **kwargs),\n        Transpose(),\n    )\n\n\nclass SRLinear(nn.Linear):\n    \"\"\"https://arxiv.org/abs/2303.06296\n    Stabilizing Transformer Training by Preventing Attention Entropy Collapse\n    \"\"\"\n\n    def __init__(self, in_features, out_features, bias=True, **kwargs):\n        super().__init__(in_features, out_features, bias=bias, **kwargs)\n        self.register_buffer(\n            \"u\", nn.functional.normalize(torch.randn(in_features), dim=0)\n        )\n        with torch.no_grad():\n            sigma = self.get_sigma()\n        self.register_buffer(\"spectral_norm\", sigma)\n        self.sigma = nn.Parameter(torch.ones(1))\n\n    def get_sigma(self):\n        with torch.no_grad():\n            u = self.u\n            v = self.weight.mv(u)\n            v = nn.functional.normalize(v, dim=0)\n            u = self.weight.T.mv(v)\n            u = nn.functional.normalize(u, dim=0)\n            self.u.data.copy_(u)\n        return torch.einsum(\"c,cd,d->\", v, self.weight, u)\n\n    def get_weight(self):\n        sigma = self.get_sigma()\n        if self.training:\n            self.spectral_norm.data.copy_(sigma)\n        weight = (self.sigma / sigma) * self.weight\n        return weight\n\n    def forward(self, x):\n        return nn.functional.linear(x, self.get_weight(), self.bias)\n\n\nclass SRConv1d(SRLinear):\n    def __init__(\n        self,\n        in_features,\n        out_features,\n        kernel_size,\n        stride: int = 1,\n        padding: str = \"same\",\n        bias: bool = True,\n        **kwargs,\n    ):\n        in_features = in_features * kernel_size\n        super().__init__(in_features, out_features, bias=bias, **kwargs)\n        nn.init.kaiming_uniform_(self.weight, a=math.sqrt(5))\n        self.kernel_size = kernel_size\n        self.stride = stride\n        self.padding = padding\n\n    def forward(self, x):\n        in_features = self.in_features // self.kernel_size\n        weight = self.get_weight().view(\n            self.out_features, in_features, self.kernel_size\n        )\n        return nn.functional.conv1d(\n            x, weight, bias=self.bias, stride=self.stride, padding=self.padding\n        )\n\n\ndef TransposeSRConv1d(\n    *args, kernel_size: int = 3, padding: str = \"same\", **kwargs\n) -> nn.Sequential:\n    \"\"\"\n    Transpose -> SRConv1d\n    \"\"\"\n    return nn.Sequential(\n        Transpose(),\n        SRConv1d(*args, kernel_size=kernel_size, padding=padding, **kwargs),\n    )\n\n\ndef SRConv1dTranspose(\n    *args, kernel_size: int = 3, padding: str = \"same\", **kwargs\n) -> nn.Sequential:\n    \"\"\"\n    SRConv1d -> Transpose\n    \"\"\"\n    return nn.Sequential(\n        SRConv1d(*args, kernel_size=kernel_size, padding=padding, **kwargs),\n        Transpose(),\n    )\n\n\nclass ActivationBalancer(torch.nn.Module):\n    \"\"\"\n    Modifies the backpropped derivatives of a function to try to encourage, for\n    each channel, that it is positive at least a proportion `threshold` of the\n    time.  It does this by multiplying negative derivative values by up to\n    (1+max_factor), and positive derivative values by up to (1-max_factor),\n    interpolated from 1 at the threshold to those extremal values when none\n    of the inputs are positive.\n\n    Args:\n           num_channels: the number of channels\n           channel_dim: the dimension/axis corresponding to the channel, e.g.\n               -1, 0, 1, 2; will be interpreted as an offset from x.ndim if negative.\n           min_positive: the minimum, per channel, of the proportion of the time\n               that (x > 0), below which we start to modify the derivatives.\n           max_positive: the maximum, per channel, of the proportion of the time\n               that (x > 0), above which we start to modify the derivatives.\n           max_factor: the maximum factor by which we modify the derivatives for\n              either the sign constraint or the magnitude constraint;\n              e.g. with max_factor=0.02, the the derivatives would be multiplied by\n              values in the range [0.98..1.02].\n           sign_gain_factor: determines the 'gain' with which we increase the\n              change in gradient once the constraints on min_positive and max_positive\n              are violated.\n           scale_gain_factor: determines the 'gain' with which we increase the\n              change in gradient once the constraints on min_abs and max_abs\n              are violated.\n           min_abs:  the minimum average-absolute-value difference from the mean\n               value per channel, which we allow, before we start to modify\n               the derivatives to prevent this.\n           max_abs:  the maximum average-absolute-value difference from the mean\n               value per channel, which we allow, before we start to modify\n               the derivatives to prevent this.\n          min_prob: determines the minimum probability with which we modify the\n             gradients for the {min,max}_positive and {min,max}_abs constraints,\n             on each forward().  This is done randomly to prevent all layers\n             from doing it at the same time.  Early in training we may use\n             higher probabilities than this; it will decay to this value.\n    \"\"\"\n\n    def __init__(\n        self,\n        num_channels: int,\n        channel_dim: int,\n        min_positive: float = 0.05,\n        max_positive: float = 0.95,\n        max_factor: float = 0.04,\n        sign_gain_factor: float = 0.01,\n        scale_gain_factor: float = 0.02,\n        min_abs: float = 0.2,\n        max_abs: float = 100.0,\n        min_prob: float = 0.1,\n    ):\n        super(ActivationBalancer, self).__init__()\n        self.num_channels = num_channels\n        self.channel_dim = channel_dim\n        self.min_positive = min_positive\n        self.max_positive = max_positive\n        self.max_factor = max_factor\n        self.min_abs = min_abs\n        self.max_abs = max_abs\n        self.min_prob = min_prob\n        self.sign_gain_factor = sign_gain_factor\n        self.scale_gain_factor = scale_gain_factor\n\n        # count measures how many times the forward() function has been called.\n        # We occasionally sync this to a tensor called `count`, that exists to\n        # make sure it is synced to disk when we load and save the model.\n        self.cpu_count = 0\n        self.register_buffer(\"count\", torch.tensor(0, dtype=torch.int64))\n\n    def forward(self, x: Tensor) -> Tensor:\n        if (\n            torch.jit.is_scripting()\n            or not x.requires_grad\n            or torch.jit.is_tracing()\n        ):\n            return _no_op(x)\n\n        count = self.cpu_count\n        self.cpu_count += 1\n\n        if random.random() < 0.01:\n            # Occasionally sync self.cpu_count with self.count.\n            # count affects the decay of 'prob'.  don't do this on every iter,\n            # because syncing with the GPU is slow.\n            self.cpu_count = max(self.cpu_count, self.count.item())\n            self.count.fill_(self.cpu_count)\n\n        # the prob of doing some work exponentially decreases from 0.5 till it hits\n        # a floor at min_prob (==0.1, by default)\n        prob = max(self.min_prob, 0.5 ** (1 + (count / 4000.0)))\n\n        if random.random() < prob:\n            sign_gain_factor = 0.5\n            if self.min_positive != 0.0 or self.max_positive != 1.0:\n                sign_factor = _compute_sign_factor(\n                    x,\n                    self.channel_dim,\n                    self.min_positive,\n                    self.max_positive,\n                    gain_factor=self.sign_gain_factor / prob,\n                    max_factor=self.max_factor,\n                )\n            else:\n                sign_factor = None\n\n            scale_factor = _compute_scale_factor(\n                x.detach(),\n                self.channel_dim,\n                min_abs=self.min_abs,\n                max_abs=self.max_abs,\n                gain_factor=self.scale_gain_factor / prob,\n                max_factor=self.max_factor,\n            )\n            return ActivationBalancerFunction.apply(\n                x,\n                scale_factor,\n                sign_factor,\n                self.channel_dim,\n            )\n        else:\n            return _no_op(x)\n\n\ndef penalize_abs_values_gt(x: Tensor, limit: float, penalty: float) -> Tensor:\n    \"\"\"\n    Returns x unmodified, but in backprop will put a penalty for the excess of\n    the absolute values of elements of x over the limit \"limit\".  E.g. if\n    limit == 10.0, then if x has any values over 10 it will get a penalty.\n\n    Caution: the value of this penalty will be affected by grad scaling used\n    in automatic mixed precision training.  For this reasons we use this,\n    it shouldn't really matter, or may even be helpful; we just use this\n    to disallow really implausible values of scores to be given to softmax.\n    \"\"\"\n    x_sign = x.sign()\n    over_limit = (x.abs() - limit) > 0\n    # The following is a memory efficient way to penalize the absolute values of\n    # x that's over the limit.  (The memory efficiency comes when you think\n    # about which items torch needs to cache for the autograd, and which ones it\n    # can throw away).  The numerical value of aux_loss as computed here will\n    # actually be larger than it should be, by limit * over_limit.sum(), but it\n    # has the same derivative as the real aux_loss which is penalty * (x.abs() -\n    # limit).relu().\n    aux_loss = penalty * ((x_sign * over_limit).to(torch.int8) * x)\n    # note: we don't do sum() here on aux)_loss, but it's as if we had done\n    # sum() due to how with_loss() works.\n    x = with_loss(x, aux_loss)\n    # you must use x for something, or this will be ineffective.\n    return x\n\n\ndef _diag(x: Tensor):  # like .diag(), but works for tensors with 3 dims.\n    if x.ndim == 2:\n        return x.diag()\n    else:\n        (batch, dim, dim) = x.shape\n        x = x.reshape(batch, dim * dim)\n        x = x[:, :: dim + 1]\n        assert x.shape == (batch, dim)\n        return x\n\n\ndef _whitening_metric(x: Tensor, num_groups: int):\n    \"\"\"\n    Computes the \"whitening metric\", a value which will be 1.0 if all the eigenvalues of\n    of the centered feature covariance are the same within each group's covariance matrix\n    and also between groups.\n    Args:\n        x: a Tensor of shape (*, num_channels)\n     num_groups:  the number of groups of channels, a number >=1 that divides num_channels\n    Returns:\n        Returns a scalar Tensor that will be 1.0 if the data is \"perfectly white\" and\n    greater than 1.0 otherwise.\n    \"\"\"\n    assert x.dtype != torch.float16\n    x = x.reshape(-1, x.shape[-1])\n    (num_frames, num_channels) = x.shape\n    assert num_channels % num_groups == 0\n    channels_per_group = num_channels // num_groups\n    x = x.reshape(num_frames, num_groups, channels_per_group).transpose(0, 1)\n    # x now has shape (num_groups, num_frames, channels_per_group)\n    # subtract the mean so we use the centered, not uncentered, covariance.\n    # My experience has been that when we \"mess with the gradients\" like this,\n    # it's better not do anything that tries to move the mean around, because\n    # that can easily cause instability.\n    x = x - x.mean(dim=1, keepdim=True)\n    # x_covar: (num_groups, channels_per_group, channels_per_group)\n    x_covar = torch.matmul(x.transpose(1, 2), x)\n    x_covar_mean_diag = _diag(x_covar).mean()\n    # the following expression is what we'd get if we took the matrix product\n    # of each covariance and measured the mean of its trace, i.e.\n    # the same as _diag(torch.matmul(x_covar, x_covar)).mean().\n    x_covarsq_mean_diag = (x_covar ** 2).sum() / (\n        num_groups * channels_per_group\n    )\n    # this metric will be >= 1.0; the larger it is, the less 'white' the data was.\n    metric = x_covarsq_mean_diag / (x_covar_mean_diag ** 2 + 1.0e-20)\n    return metric\n\n\nclass WhiteningPenaltyFunction(torch.autograd.Function):\n    @staticmethod\n    def forward(\n        ctx,\n        x: Tensor,\n        num_groups: int,\n        whitening_limit: float,\n        grad_scale: float,\n    ) -> Tensor:\n        ctx.save_for_backward(x)\n        ctx.num_groups = num_groups\n        ctx.whitening_limit = whitening_limit\n        ctx.grad_scale = grad_scale\n        return x\n\n    @staticmethod\n    def backward(ctx, x_grad: Tensor):\n        (x_orig,) = ctx.saved_tensors\n        with torch.enable_grad():\n            with torch.cuda.amp.autocast(enabled=False):\n                x_detached = x_orig.to(torch.float32).detach()\n                x_detached.requires_grad = True\n\n                metric = _whitening_metric(x_detached, ctx.num_groups)\n\n                if random.random() < 0.005 or __name__ == \"__main__\":\n                    logging.info(\n                        f\"Whitening: num_groups={ctx.num_groups}, num_channels={x_orig.shape[-1]}, \"\n                        f\"metric={metric.item():.2f} vs. limit={ctx.whitening_limit}\"\n                    )\n\n                (metric - ctx.whitening_limit).relu().backward()\n                penalty_grad = x_detached.grad\n                scale = ctx.grad_scale * (\n                    x_grad.to(torch.float32).norm()\n                    / (penalty_grad.norm() + 1.0e-20)\n                )\n                penalty_grad = penalty_grad * scale\n        return x_grad + penalty_grad.to(x_grad.dtype), None, None, None\n\n\nclass Whiten(nn.Module):\n    def __init__(\n        self,\n        num_groups: int,\n        whitening_limit: float,\n        prob: Union[float, Tuple[float, float]],\n        grad_scale: float,\n    ):\n        \"\"\"\n        Args:\n          num_groups: the number of groups to divide the channel dim into before\n            whitening.  We will attempt to make the feature covariance\n            within each group, after mean subtraction, as \"white\" as possible,\n            while having the same trace across all groups.\n         whitening_limit: a value greater than 1.0, that dictates how much\n           freedom we have to violate the constraints.  1.0 would mean perfectly\n           white, with exactly the same trace across groups; larger values\n           give more freedom.  E.g. 2.0.\n         prob: the probability with which we apply the gradient modification\n           (also affects the grad scale).  May be supplied as a float,\n           or as a pair (min_prob, max_prob)\n\n          grad_scale: determines the scale on the gradient term from this object,\n            relative to the rest of the gradient on the attention weights.\n            E.g. 0.02 (you may want to use smaller values than this if prob is large)\n        \"\"\"\n        super(Whiten, self).__init__()\n        assert num_groups >= 1\n        assert whitening_limit >= 1\n        assert grad_scale >= 0\n        self.num_groups = num_groups\n        self.whitening_limit = whitening_limit\n        if isinstance(prob, float):\n            assert 0 < prob <= 1\n            self.prob = prob\n        else:\n            (self.min_prob, self.max_prob) = prob\n            assert 0 < self.min_prob < self.max_prob <= 1\n            self.prob = self.max_prob\n\n        self.grad_scale = grad_scale\n\n    def forward(self, x: Tensor) -> Tensor:\n        \"\"\"\n        In the forward pass, this function just returns the input unmodified.\n        In the backward pass, it will modify the gradients to ensure that the\n        distribution in each group has close to (lambda times I) as the covariance\n        after mean subtraction, with the same lambda across groups.\n        For whitening_limit > 1, there will be more freedom to violate this\n        constraint.\n\n        Args:\n           x: the input of shape (*, num_channels)\n\n        Returns:\n            x, unmodified.   You should make sure\n        you use the returned value, or the graph will be freed\n        and nothing will happen in backprop.\n        \"\"\"\n        if (\n            not x.requires_grad\n            or random.random() > self.prob\n            or self.grad_scale == 0\n        ):\n            return _no_op(x)\n        else:\n            if hasattr(self, \"min_prob\") and random.random() < 0.25:\n                # occasionally switch between min_prob and max_prob, based on whether\n                # we are above or below the threshold.\n                if (\n                    _whitening_metric(x.to(torch.float32), self.num_groups)\n                    > self.whitening_limit\n                ):\n                    # there would be a change to the grad.\n                    self.prob = self.max_prob\n                else:\n                    self.prob = self.min_prob\n\n            return WhiteningPenaltyFunction.apply(\n                x, self.num_groups, self.whitening_limit, self.grad_scale\n            )\n\n\nclass WithLoss(torch.autograd.Function):\n    @staticmethod\n    def forward(ctx, x: Tensor, y: Tensor):\n        ctx.y_shape = y.shape\n        return x\n\n    @staticmethod\n    def backward(ctx, ans_grad: Tensor):\n        return ans_grad, torch.ones(\n            ctx.y_shape, dtype=ans_grad.dtype, device=ans_grad.device\n        )\n\n\ndef with_loss(x, y):\n    if torch.jit.is_scripting() or torch.jit.is_tracing():\n        return x\n    # returns x but adds y.sum() to the loss function.\n    return WithLoss.apply(x, y)\n\n\ndef _no_op(x: Tensor) -> Tensor:\n    if torch.jit.is_scripting() or torch.jit.is_tracing():\n        return x\n    else:\n        # a no-op function that will have a node in the autograd graph,\n        # to avoid certain bugs relating to backward hooks\n        return x.chunk(1, dim=-1)[0]\n\n\nclass Identity(torch.nn.Module):\n    def __init__(self):\n        super(Identity, self).__init__()\n\n    def forward(self, x):\n        return _no_op(x)\n\n\nclass MaxEig(torch.nn.Module):\n    \"\"\"\n    Modifies the backpropped derivatives of a function to try to discourage\n    that any given direction in activation space accounts for more than\n    a specified proportion of the covariance (e.g. 0.2).\n\n\n    Args:\n           num_channels: the number of channels\n           channel_dim: the dimension/axis corresponding to the channel, e.g.\n               -1, 0, 1, 2; will be interpreted as an offset from x.ndim if negative.\n           max_var_per_eig:  the maximum proportion of the variance of the\n               features/channels, after mean subtraction, that can come from\n               any given eigenvalue.\n           min_prob: the minimum probability with which we apply this during any invocation\n               of forward(), assuming last time we applied the constraint it was\n               not active; supplied for speed.\n           scale: determines the scale with which we modify the gradients, relative\n               to the existing / unmodified gradients\n    \"\"\"\n\n    def __init__(\n        self,\n        num_channels: int,\n        channel_dim: int,\n        max_var_per_eig: float = 0.2,\n        min_prob: float = 0.01,\n        scale: float = 0.01,\n    ):\n        super(MaxEig, self).__init__()\n        self.num_channels = num_channels\n        self.channel_dim = channel_dim\n        self.scale = scale\n        assert max_var_per_eig == 0.0 or max_var_per_eig > 1.0 / num_channels\n        self.max_var_per_eig = max_var_per_eig\n\n        # we figure out the dominant direction using the power method: starting with\n        # a random vector, keep multiplying by the covariance and renormalizing.\n        with torch.no_grad():\n            # arbitrary.. would use randn() but want to leave the rest of the model's\n            # random parameters unchanged for comparison\n            direction = torch.arange(num_channels).to(torch.float)\n            direction = direction / direction.norm()\n            self.register_buffer(\"max_eig_direction\", direction)\n\n        self.min_prob = min_prob\n        # cur_prob is the current probability we'll use to apply the ActivationBalancer.\n        # We'll regress this towards prob, each tiem we try to apply it and it is not\n        # active.\n        self.cur_prob = 1.0\n\n    def forward(self, x: Tensor) -> Tensor:\n        if (\n            torch.jit.is_scripting()\n            or self.max_var_per_eig <= 0\n            or random.random() > self.cur_prob\n            or torch.jit.is_tracing()\n        ):\n            return _no_op(x)\n\n        with torch.cuda.amp.autocast(enabled=False):\n            eps = 1.0e-20\n            orig_x = x\n            x = x.to(torch.float32)\n            with torch.no_grad():\n                x = x.transpose(self.channel_dim, -1).reshape(\n                    -1, self.num_channels\n                )\n                x = x - x.mean(dim=0)\n                new_direction, coeffs = self._find_direction_coeffs(\n                    x, self.max_eig_direction\n                )\n                x_var = (x ** 2).mean()\n                x_residual = x - coeffs * new_direction\n                x_residual_var = (x_residual ** 2).mean()\n\n                # `variance_proportion` is the proportion of the variance accounted for\n                # by the top eigen-direction.\n                variance_proportion = (x_var - x_residual_var) / (\n                    x_var + 1.0e-20\n                )\n\n                # ensure new direction is nonzero even if x == 0, by including `direction`.\n                self._set_direction(\n                    0.1 * self.max_eig_direction + new_direction\n                )\n\n            if random.random() < 0.01 or __name__ == \"__main__\":\n                logging.info(\n                    f\"variance_proportion = {variance_proportion.item()}, shape={tuple(orig_x.shape)}, cur_prob={self.cur_prob}\"\n                )\n\n            if variance_proportion >= self.max_var_per_eig:\n                # The constraint is active.  Note, we should quite rarely\n                # reach here, only near the beginning of training if we are\n                # starting to diverge, should this constraint be active.\n                cur_prob = self.cur_prob\n                self.cur_prob = (\n                    1.0  # next time, do the update with probability 1.0.\n                )\n                return MaxEigLimiterFunction.apply(\n                    orig_x, coeffs, new_direction, self.channel_dim, self.scale\n                )\n            else:\n                # let self.cur_prob exponentially approach self.min_prob, as\n                # long as the constraint is inactive.\n                self.cur_prob = 0.75 * self.cur_prob + 0.25 * self.min_prob\n                return orig_x\n\n    def _set_direction(self, direction: Tensor):\n        \"\"\"\n        Sets self.max_eig_direction to a normalized version of `direction`\n        \"\"\"\n        direction = direction.detach()\n        direction = direction / direction.norm()\n        direction_sum = direction.sum().item()\n        if direction_sum - direction_sum == 0:  # no inf/nan\n            self.max_eig_direction[:] = direction\n        else:\n            logging.info(\n                f\"Warning: sum of direction in MaxEig is {direction_sum}, \"\n                \"num_channels={self.num_channels}, channel_dim={self.channel_dim}\"\n            )\n\n    def _find_direction_coeffs(\n        self, x: Tensor, prev_direction: Tensor\n    ) -> Tuple[Tensor, Tensor, Tensor]:\n        \"\"\"\n            Figure out (an approximation to) the proportion of the variance of a set of\n            feature vectors that can be attributed to the top eigen-direction.\n            Args:\n             x: a Tensor of shape (num_frames, num_channels), with num_frames > 1.\n          prev_direction:  a Tensor of shape (num_channels,), that is our previous estimate\n                   of the top eigen-direction, or a random direction if this is the first\n                   iteration.  Does not have to be normalized, but should be nonzero.\n\n        Returns: (cur_direction, coeffs), where:\n             cur_direction: a Tensor of shape (num_channels,) that is the current\n                estimate of the top eigen-direction.\n             coeffs: a Tensor of shape (num_frames, 1) that minimizes, or\n                approximately minimizes, (x - coeffs * cur_direction).norm()\n        \"\"\"\n        (num_frames, num_channels) = x.shape\n        assert num_channels > 1 and num_frames > 1\n        assert prev_direction.shape == (num_channels,)\n        # `coeffs` are the coefficients of `prev_direction` in x.\n        # actually represent the coeffs up to a constant positive factor.\n        coeffs = (x * prev_direction).sum(dim=1, keepdim=True) + 1.0e-10\n        cur_direction = (x * coeffs).sum(dim=0) / (\n            (coeffs ** 2).sum() + 1.0e-20\n        )\n        return cur_direction, coeffs\n\n\nclass DoubleSwishFunction(torch.autograd.Function):\n    \"\"\"\n      double_swish(x) = x * torch.sigmoid(x-1)\n    This is a definition, originally motivated by its close numerical\n    similarity to swish(swish(x)), where swish(x) =  x * sigmoid(x).\n\n    Memory-efficient derivative computation:\n     double_swish(x) = x * s, where s(x) = torch.sigmoid(x-1)\n     double_swish'(x) = d/dx double_swish(x) =  x * s'(x) + x' * s(x) = x * s'(x) + s(x).\n     Now, s'(x) = s(x) * (1-s(x)).\n     double_swish'(x) =  x * s'(x) + s(x).\n                      =  x * s(x) * (1-s(x)) + s(x).\n                     = double_swish(x) * (1-s(x)) + s(x)\n     ... so we just need to remember s(x) but not x itself.\n    \"\"\"\n\n    @staticmethod\n    def forward(ctx, x: Tensor) -> Tensor:\n        requires_grad = x.requires_grad\n        x_dtype = x.dtype\n        if x.dtype == torch.float16:\n            x = x.to(torch.float32)\n\n        s = torch.sigmoid(x - 1.0)\n        y = x * s\n\n        if requires_grad:\n            deriv = y * (1 - s) + s\n            # notes on derivative of x * sigmoid(x - 1):\n            # https://www.wolframalpha.com/input?i=d%2Fdx+%28x+*+sigmoid%28x-1%29%29\n            # min \\simeq -0.043638.  Take floor as -0.043637 so it's a lower bund\n            # max \\simeq 1.1990.   Take ceil to be 1.2 so it's an upper bound.\n            # the combination of \"+ torch.rand_like(deriv)\" and casting to torch.uint8 (which\n            # floors), should be expectation-preserving.\n            floor = -0.043637\n            ceil = 1.2\n            d_scaled = (deriv - floor) * (\n                255.0 / (ceil - floor)\n            ) + torch.rand_like(deriv)\n            if __name__ == \"__main__\":\n                # for self-testing only.\n                assert d_scaled.min() >= 0.0\n                assert d_scaled.max() < 256.0\n            d_int = d_scaled.to(torch.uint8)\n            ctx.save_for_backward(d_int)\n        if x.dtype == torch.float16 or torch.is_autocast_enabled():\n            y = y.to(torch.float16)\n        return y\n\n    @staticmethod\n    def backward(ctx, y_grad: Tensor) -> Tensor:\n        (d,) = ctx.saved_tensors\n        # the same constants as used in forward pass.\n        floor = -0.043637\n        ceil = 1.2\n        d = d * ((ceil - floor) / 255.0) + floor\n        return y_grad * d\n\n\nclass DoubleSwish(torch.nn.Module):\n    def forward(self, x: Tensor) -> Tensor:\n        \"\"\"Return double-swish activation function which is an approximation to Swish(Swish(x)),\n        that we approximate closely with x * sigmoid(x-1).\n        \"\"\"\n        if torch.jit.is_scripting() or torch.jit.is_tracing():\n            return x * torch.sigmoid(x - 1.0)\n        return DoubleSwishFunction.apply(x)\n\n\ndef BalancedDoubleSwish(\n    d_model, channel_dim=-1, max_abs=10.0, min_prob=0.25\n) -> nn.Sequential:\n    \"\"\"\n    ActivationBalancer -> DoubleSwish\n    \"\"\"\n    balancer = ActivationBalancer(\n        d_model, channel_dim=channel_dim, max_abs=max_abs, min_prob=min_prob\n    )\n    return nn.Sequential(\n        balancer,\n        DoubleSwish(),\n    )\n\n\ndef _test_max_eig():\n    for proportion in [0.1, 0.5, 10.0]:\n        logging.info(f\"proportion = {proportion}\")\n        x = torch.randn(100, 128)\n        direction = torch.randn(128)\n        coeffs = torch.randn(100, 1)\n        x += proportion * direction * coeffs\n\n        x.requires_grad = True\n\n        num_channels = 128\n        m = MaxEig(\n            num_channels, 1, 0.5, scale=0.1  # channel_dim  # max_var_per_eig\n        )  # grad_scale\n\n        for _ in range(4):\n            y = m(x)\n\n        y_grad = torch.randn_like(x)\n        y.backward(gradient=y_grad)\n\n        if proportion < 0.2:\n            assert torch.allclose(x.grad, y_grad, atol=1.0e-02)\n        elif proportion > 1.0:\n            assert not torch.allclose(x.grad, y_grad)\n\n\ndef _test_whiten():\n    for proportion in [0.1, 0.5, 10.0]:\n        logging.info(f\"_test_whiten(): proportion = {proportion}\")\n        x = torch.randn(100, 128)\n        direction = torch.randn(128)\n        coeffs = torch.randn(100, 1)\n        x += proportion * direction * coeffs\n\n        x.requires_grad = True\n\n        num_channels = 128\n        m = Whiten(\n            1, 5.0, prob=1.0, grad_scale=0.1  # num_groups  # whitening_limit,\n        )  # grad_scale\n\n        for _ in range(4):\n            y = m(x)\n\n        y_grad = torch.randn_like(x)\n        y.backward(gradient=y_grad)\n\n        if proportion < 0.2:\n            assert torch.allclose(x.grad, y_grad)\n        elif proportion > 1.0:\n            assert not torch.allclose(x.grad, y_grad)\n\n\ndef _test_activation_balancer_sign():\n    probs = torch.arange(0, 1, 0.01)\n    N = 1000\n    x = 1.0 * (\n        (2.0 * (torch.rand(probs.numel(), N) < probs.unsqueeze(-1))) - 1.0\n    )\n    x = x.detach()\n    x.requires_grad = True\n    m = ActivationBalancer(\n        probs.numel(),\n        channel_dim=0,\n        min_positive=0.05,\n        max_positive=0.95,\n        max_factor=0.2,\n        min_abs=0.0,\n    )\n\n    y_grad = torch.sign(torch.randn(probs.numel(), N))\n\n    y = m(x)\n    y.backward(gradient=y_grad)\n    print(\"_test_activation_balancer_sign: x = \", x)\n    print(\"_test_activation_balancer_sign: y grad = \", y_grad)\n    print(\"_test_activation_balancer_sign: x grad = \", x.grad)\n\n\ndef _test_activation_balancer_magnitude():\n    magnitudes = torch.arange(0, 1, 0.01)\n    N = 1000\n    x = torch.sign(torch.randn(magnitudes.numel(), N)) * magnitudes.unsqueeze(\n        -1\n    )\n    x = x.detach()\n    x.requires_grad = True\n    m = ActivationBalancer(\n        magnitudes.numel(),\n        channel_dim=0,\n        min_positive=0.0,\n        max_positive=1.0,\n        max_factor=0.2,\n        min_abs=0.2,\n        max_abs=0.8,\n        min_prob=1.0,\n    )\n\n    y_grad = torch.sign(torch.randn(magnitudes.numel(), N))\n\n    y = m(x)\n    y.backward(gradient=y_grad)\n    print(\"_test_activation_balancer_magnitude: x = \", x)\n    print(\"_test_activation_balancer_magnitude: y grad = \", y_grad)\n    print(\"_test_activation_balancer_magnitude: x grad = \", x.grad)\n\n\ndef _test_basic_norm():\n    num_channels = 128\n    m = BasicNorm(num_channels=num_channels, channel_dim=1)\n\n    x = torch.randn(500, num_channels)\n\n    y = m(x)\n\n    assert y.shape == x.shape\n    x_rms = (x ** 2).mean().sqrt()\n    y_rms = (y ** 2).mean().sqrt()\n    print(\"x rms = \", x_rms)\n    print(\"y rms = \", y_rms)\n    assert y_rms < x_rms\n    assert y_rms > 0.5 * x_rms\n\n\ndef _test_double_swish_deriv():\n    x = torch.randn(10, 12, dtype=torch.double) * 3.0\n    x.requires_grad = True\n    m = DoubleSwish()\n\n    tol = (1.2 - (-0.043637)) / 255.0\n    torch.autograd.gradcheck(m, x, atol=tol)\n\n    # for self-test.\n    x = torch.randn(1000, 1000, dtype=torch.double) * 3.0\n    x.requires_grad = True\n    y = m(x)\n\n\ndef _test_softmax():\n    a = torch.randn(2, 10, dtype=torch.float64)\n    b = a.clone()\n    a.requires_grad = True\n    b.requires_grad = True\n    a.softmax(dim=1)[:, 0].sum().backward()\n    print(\"a grad = \", a.grad)\n    softmax(b, dim=1)[:, 0].sum().backward()\n    print(\"b grad = \", b.grad)\n    assert torch.allclose(a.grad, b.grad)\n\n\nif __name__ == \"__main__\":\n    logging.getLogger().setLevel(logging.INFO)\n    torch.set_num_threads(1)\n    torch.set_num_interop_threads(1)\n    _test_softmax()\n    _test_whiten()\n    _test_max_eig()\n    _test_activation_balancer_sign()\n    _test_activation_balancer_magnitude()\n    _test_basic_norm()\n    _test_double_swish_deriv()"
  },
  {
    "path": "models/modules/transformer.py",
    "content": "# cp from https://github.com/lifeiteng/vall-e/blob/main/valle/modules/transformer.py, modified by Puyuan Peng 2024\nimport copy\nimport numbers\nfrom functools import partial\nfrom typing import Any, Callable, List, Optional, Tuple, Union\n\nimport torch\nfrom torch import Tensor, nn\nfrom torch.nn import functional as F\n\nfrom .activation import MultiheadAttention\nfrom .scaling import ActivationBalancer, BalancedDoubleSwish\nfrom .scaling import BasicNorm as _BasicNorm\n\n_shape_t = Union[int, List[int], torch.Size]\n\n\nclass LayerNorm(nn.Module):\n    __constants__ = [\"normalized_shape\", \"eps\", \"elementwise_affine\"]\n    normalized_shape: Tuple[int, ...]\n    eps: float\n    elementwise_affine: bool\n\n    def __init__(\n        self,\n        normalized_shape: _shape_t,\n        eps: float = 1e-5,\n        elementwise_affine: bool = True,\n        device=None,\n        dtype=None,\n    ) -> None:\n        factory_kwargs = {\"device\": device, \"dtype\": dtype}\n        super(LayerNorm, self).__init__()\n        if isinstance(normalized_shape, numbers.Integral):\n            # mypy error: incompatible types in assignment\n            normalized_shape = (normalized_shape,)  # type: ignore[assignment]\n        self.normalized_shape = tuple(normalized_shape)  # type: ignore[arg-type]\n        self.eps = eps\n        self.elementwise_affine = elementwise_affine\n        if self.elementwise_affine:\n            self.weight = nn.Parameter(\n                torch.empty(self.normalized_shape, **factory_kwargs)\n            )\n            self.bias = nn.Parameter(\n                torch.empty(self.normalized_shape, **factory_kwargs)\n            )\n        else:\n            self.register_parameter(\"weight\", None)\n            self.register_parameter(\"bias\", None)\n\n        self.reset_parameters()\n\n    def reset_parameters(self) -> None:\n        if self.elementwise_affine:\n            nn.init.ones_(self.weight)\n            nn.init.zeros_(self.bias)\n\n    def forward(self, input: Tensor, embedding: Any = None) -> Tensor:\n        if isinstance(input, tuple):\n            input, embedding = input\n            return (\n                F.layer_norm(\n                    input,\n                    self.normalized_shape,\n                    self.weight,\n                    self.bias,\n                    self.eps,\n                ),\n                embedding,\n            )\n\n        assert embedding is None\n        return F.layer_norm(\n            input, self.normalized_shape, self.weight, self.bias, self.eps\n        )\n\n    def extra_repr(self) -> str:\n        return (\n            \"{normalized_shape}, eps={eps}, \"\n            \"elementwise_affine={elementwise_affine}\".format(**self.__dict__)\n        )\n\n\nclass AdaptiveLayerNorm(nn.Module):\n    r\"\"\"Adaptive Layer Normalization\"\"\"\n\n    def __init__(self, d_model, norm) -> None:\n        super(AdaptiveLayerNorm, self).__init__()\n        self.project_layer = nn.Linear(d_model, 2 * d_model)\n        self.norm = norm\n        self.d_model = d_model\n        self.eps = self.norm.eps\n\n    def forward(self, input: Tensor, embedding: Tensor = None) -> Tensor:\n        if isinstance(input, tuple):\n            input, embedding = input\n            weight, bias = torch.split(\n                self.project_layer(embedding),\n                split_size_or_sections=self.d_model,\n                dim=-1,\n            )\n            return (weight * self.norm(input) + bias, embedding)\n\n        weight, bias = torch.split(\n            self.project_layer(embedding),\n            split_size_or_sections=self.d_model,\n            dim=-1,\n        )\n        return weight * self.norm(input) + bias\n\n\nclass BasicNorm(_BasicNorm):\n    def __init__(\n        self,\n        d_model: int,\n        eps: float = 1e-5,\n        device=None,\n        dtype=None,\n    ):\n        super(BasicNorm, self).__init__(d_model, eps=eps)\n\n    def forward(self, input: Tensor, embedding: Any = None) -> Tensor:\n        if isinstance(input, tuple):\n            input, embedding = input\n            return (\n                super(BasicNorm, self).forward(input),\n                embedding,\n            )\n\n        assert embedding is None\n        return super(BasicNorm, self).forward(input)\n\n\nclass BalancedBasicNorm(nn.Module):\n    def __init__(\n        self,\n        d_model: int,\n        eps: float = 1e-5,\n        device=None,\n        dtype=None,\n    ):\n        super(BalancedBasicNorm, self).__init__()\n        self.balancer = ActivationBalancer(\n            d_model,\n            channel_dim=-1,\n            min_positive=0.45,\n            max_positive=0.55,\n            max_abs=6.0,\n        )\n        self.norm = BasicNorm(d_model, eps, device=device, dtype=dtype)\n\n    def forward(self, input: Tensor, embedding: Any = None) -> Tensor:\n        if isinstance(input, tuple):\n            input, embedding = input\n            return self.norm((self.balancer(input), embedding))\n\n        assert embedding is None\n        return self.norm(self.balancer(input))\n\n\nclass IdentityNorm(nn.Module):\n    def __init__(\n        self,\n        d_model: int,\n        eps: float = 1e-5,\n        device=None,\n        dtype=None,\n    ) -> None:\n        super(IdentityNorm, self).__init__()\n\n    def forward(self, input: Tensor, embedding: Any = None) -> Tensor:\n        if isinstance(input, tuple):\n            return input\n\n        assert embedding is None\n        return input\n\n\nclass TransformerEncoderLayer(nn.Module):\n    __constants__ = [\"batch_first\", \"norm_first\"]\n\n    def __init__(\n        self,\n        d_model: int,\n        nhead: int,\n        dim_feedforward: int = 2048,\n        dropout: float = 0.1,\n        activation: Union[str, Callable[[Tensor], Tensor]] = F.relu,\n        batch_first: bool = False,\n        norm_first: bool = False,\n        device=None,\n        dtype=None,\n        linear1_self_attention_cls: nn.Module = nn.Linear,\n        linear2_self_attention_cls: nn.Module = nn.Linear,\n        linear1_feedforward_cls: nn.Module = nn.Linear,\n        linear2_feedforward_cls: nn.Module = nn.Linear,\n        layer_norm_cls: nn.Module = LayerNorm,\n        layer_norm_eps: float = 1e-5,\n        adaptive_layer_norm=False,\n    ) -> None:\n        factory_kwargs = {\"device\": device, \"dtype\": dtype}\n        super(TransformerEncoderLayer, self).__init__()\n        self.self_attn = MultiheadAttention(\n            d_model,\n            nhead,\n            dropout=dropout,\n            batch_first=batch_first,\n            linear1_cls=linear1_self_attention_cls,\n            linear2_cls=linear2_self_attention_cls,\n            **factory_kwargs,\n        )\n\n        # Implementation of Feedforward model\n        self.linear1 = linear1_feedforward_cls(\n            d_model, dim_feedforward, **factory_kwargs\n        )\n        self.dropout = nn.Dropout(dropout)\n        self.linear2 = linear2_feedforward_cls(\n            dim_feedforward, d_model, **factory_kwargs\n        )\n\n        self.norm_first = norm_first\n        self.dropout1 = nn.Dropout(dropout)\n        self.dropout2 = nn.Dropout(dropout)\n\n        # Legacy string support for activation function.\n        if isinstance(activation, str):\n            activation = _get_activation_fn(activation)\n        elif isinstance(activation, partial):\n            activation = activation(d_model)\n        elif activation == BalancedDoubleSwish:\n            activation = BalancedDoubleSwish(d_model)\n\n        # # We can't test self.activation in forward() in TorchScript,\n        # # so stash some information about it instead.\n        # if activation is F.relu or isinstance(activation, torch.nn.ReLU):\n        #     self.activation_relu_or_gelu = 1\n        # elif activation is F.gelu or isinstance(activation, torch.nn.GELU):\n        #     self.activation_relu_or_gelu = 2\n        # else:\n        #     self.activation_relu_or_gelu = 0\n        self.activation = activation\n\n        norm1 = layer_norm_cls(d_model, eps=layer_norm_eps, **factory_kwargs)\n        if layer_norm_cls == IdentityNorm:\n            norm2 = BalancedBasicNorm(\n                d_model, eps=layer_norm_eps, **factory_kwargs\n            )\n        else:\n            norm2 = layer_norm_cls(\n                d_model, eps=layer_norm_eps, **factory_kwargs\n            )\n\n        if adaptive_layer_norm:\n            self.norm1 = AdaptiveLayerNorm(d_model, norm1)\n            self.norm2 = AdaptiveLayerNorm(d_model, norm2)\n        else:\n            self.norm1 = norm1\n            self.norm2 = norm2\n\n    def __setstate__(self, state):\n        super(TransformerEncoderLayer, self).__setstate__(state)\n        if not hasattr(self, \"activation\"):\n            self.activation = F.relu\n\n    def forward(\n        self,\n        src: Tensor,\n        src_mask: Optional[Tensor] = None,\n        src_key_padding_mask: Optional[Tensor] = None,\n        need_weights: Optional[bool] = False,\n        past: Optional[Tensor] = None,\n    ) -> Tensor:\n        r\"\"\"Pass the input through the encoder layer.\n\n        Args:\n            src: the sequence to the encoder layer (required).\n            src_mask: the mask for the src sequence (optional).\n            src_key_padding_mask: the mask for the src keys per batch (optional).\n\n        Shape:\n            see the docs in Transformer class.\n        \"\"\"\n        x, stage_embedding = src, None\n        is_src_tuple = False\n        if isinstance(src, tuple):\n            x, stage_embedding = src\n            is_src_tuple = True\n\n        if src_key_padding_mask is not None:\n            _skpm_dtype = src_key_padding_mask.dtype\n            if _skpm_dtype != torch.bool and not torch.is_floating_point(\n                src_key_padding_mask\n            ):\n                raise AssertionError(\n                    \"only bool and floating types of key_padding_mask are supported\"\n                )\n        if need_weights:\n            if self.norm_first:\n                out, attn = self._sa_block_attn(\n                    self.norm1(x, stage_embedding),\n                    src_mask,\n                    src_key_padding_mask,\n                    past\n                )\n                out, present = out # present is the kvcache of the present timestep\n                x = x + out\n                x = x + self._ff_block(self.norm2(x, stage_embedding))\n            else:\n                out, attn = self._sa_block_attn(x, src_mask, src_key_padding_mask, past)\n                out, present = out # present is the kvcache of the present timestep\n                x = self.norm1(\n                    x + out,\n                    stage_embedding,\n                )\n                x = self.norm2(x + self._ff_block(x), stage_embedding)\n            assert not is_src_tuple\n                # return (x, stage_embedding)\n            return (x, attn)\n        else:\n            if self.norm_first:\n                out = self._sa_block(\n                    self.norm1(x, stage_embedding),\n                    src_mask,\n                    src_key_padding_mask, past\n                )\n                out, present = out # present is the kvcache of the present timestep\n                x = x + out\n                x = x + self._ff_block(self.norm2(x, stage_embedding))\n            else:\n                out = self._sa_block(x, src_mask, src_key_padding_mask)\n                out, present = out # present is the kvcache of the present timestep\n                x = self.norm1(\n                    x + out,\n                    stage_embedding, past\n                )\n                x = self.norm2(x + self._ff_block(x), stage_embedding)\n            \n            if is_src_tuple:\n                x = (x, stage_embedding)\n            if present != None:\n                x = [x, present]\n            return x\n\n    # self-attention block\n    def _sa_block(\n        self,\n        x: Tensor,\n        attn_mask: Optional[Tensor],\n        key_padding_mask: Optional[Tensor],\n        past: Optional[Tensor] = None,\n    ) -> Tensor:\n        x = self.self_attn(\n            x,\n            x,\n            x,\n            attn_mask=attn_mask,\n            key_padding_mask=key_padding_mask,\n            need_weights=False,\n            past=past\n        )\n        x, present = x\n        return self.dropout1(x), present\n\n    # self-attention block, also return attention weights\n    def _sa_block_attn(\n        self,\n        x: Tensor,\n        attn_mask: Optional[Tensor],\n        key_padding_mask: Optional[Tensor],\n        past: Optional[Tensor] = None,\n    ) -> Tensor:\n        x, attn = self.self_attn(\n            x,\n            x,\n            x,\n            attn_mask=attn_mask,\n            key_padding_mask=key_padding_mask,\n            need_weights=True,\n            past=past\n        )\n        x, present = x\n        return (self.dropout1(x), present), attn\n\n    # feed forward block\n    def _ff_block(self, x: Tensor) -> Tensor:\n        x = self.linear2(self.dropout(self.activation(self.linear1(x))))\n        return self.dropout2(x)\n\n\nclass TransformerEncoder(nn.Module):\n    r\"\"\"TransformerEncoder is a stack of N encoder layers. Users can build the\n    BERT(https://arxiv.org/abs/1810.04805) model with corresponding parameters.\n\n    Args:\n        encoder_layer: an instance of the TransformerEncoderLayer() class (required).\n        num_layers: the number of sub-encoder-layers in the encoder (required).\n        norm: the layer normalization component (optional).\n        enable_nested_tensor: if True, input will automatically convert to nested tensor\n            (and convert back on output). This will improve the overall performance of\n            TransformerEncoder when padding rate is high. Default: ``True`` (enabled).\n\n    Examples::\n        >>> encoder_layer = TransformerEncoderLayer(d_model=512, nhead=8)\n        >>> transformer_encoder = TransformerEncoder(encoder_layer, num_layers=6)\n        >>> src = torch.rand(10, 32, 512)\n        >>> out = transformer_encoder(src)\n    \"\"\"\n    __constants__ = [\"norm\"]\n\n    def __init__(self, encoder_layer, num_layers, norm=None):\n        super(TransformerEncoder, self).__init__()\n        self.layers = _get_clones(encoder_layer, num_layers)\n        self.num_layers = num_layers\n        self.norm = norm\n\n    def forward(\n        self,\n        src: Tensor,\n        mask: Optional[Tensor] = None,\n        src_key_padding_mask: Optional[Tensor] = None,\n        return_layer_states: bool = False,\n        need_weights:Optional[bool] = False,\n        past: Optional[Tensor] = None,\n    ) -> Tensor:\n        r\"\"\"Pass the input through the encoder layers in turn.\n\n        Args:\n            src: the sequence to the encoder (required).\n            mask: the mask for the src sequence (optional).\n            src_key_padding_mask: the mask for the src keys per batch (optional).\n            return_layer_states: return layers' state (optional).\n\n        Shape:\n            see the docs in Transformer class.\n        \"\"\"\n        if return_layer_states:\n            assert not need_weights\n            layer_states = []  # layers' output\n            output = src\n            for mod in self.layers:\n                output = mod(\n                    output,\n                    src_mask=mask,\n                    src_key_padding_mask=src_key_padding_mask,\n                    past=past\n                )\n                layer_states.append(output[0])\n\n            if self.norm is not None:\n                output = self.norm(output)\n\n            return layer_states, output\n        if need_weights:\n            assert not return_layer_states\n            layer_attn = []  # layers' output\n            output = src\n            for mod in self.layers:\n                output = mod(\n                    output,\n                    src_mask=mask,\n                    src_key_padding_mask=src_key_padding_mask,\n                    need_weights=True,\n                    past=past\n                )\n                layer_attn.append(output[1])\n\n            if self.norm is not None:\n                output = self.norm(output)\n\n            return layer_attn, output\n        \n        output = src\n        all_present = []\n        for n_layer, mod in enumerate(self.layers):\n            output = mod(\n                output, src_mask=mask, src_key_padding_mask=src_key_padding_mask, past=None if past is None else past[n_layer]\n            )\n            if isinstance(output, list):\n                output, present = output\n                all_present.append(present)\n\n        if self.norm is not None:\n            output = self.norm(output)\n        if all_present != []:\n            all_present = torch.stack(all_present, dim=0) # (num_layers, 2, batch_size, num_heads, seq_len, head_dim)\n            output = [output, all_present]\n        return output\n\n\nclass TransformerDecoderLayer(nn.Module):\n    __constants__ = [\"batch_first\", \"norm_first\"]\n\n    def __init__(\n        self,\n        d_model: int,\n        nhead: int,\n        dim_feedforward: int = 2048,\n        dropout: float = 0.1,\n        activation: Union[str, Callable[[Tensor], Tensor]] = F.relu,\n        linear1_self_attention_cls: nn.Module = nn.Linear,\n        linear2_self_attention_cls: nn.Module = nn.Linear,\n        linear1_feedforward_cls: nn.Module = nn.Linear,\n        linear2_feedforward_cls: nn.Module = nn.Linear,\n        batch_first: bool = False,\n        norm_first: bool = False,\n        device=None,\n        dtype=None,\n        layer_norm_cls: nn.Module = LayerNorm,\n        layer_norm_eps: float = 1e-5,\n        adaptive_layer_norm=False,\n    ) -> None:\n        factory_kwargs = {\"device\": device, \"dtype\": dtype}\n        super(TransformerDecoderLayer, self).__init__()\n        self.self_attn = MultiheadAttention(\n            d_model,\n            nhead,\n            dropout=dropout,\n            batch_first=batch_first,\n            linear1_cls=linear1_self_attention_cls,\n            linear2_cls=linear2_self_attention_cls,\n            **factory_kwargs,\n        )\n        self.multihead_attn = MultiheadAttention(\n            d_model,\n            nhead,\n            dropout=dropout,\n            batch_first=batch_first,\n            linear1_cls=linear1_self_attention_cls,\n            linear2_cls=linear2_self_attention_cls,\n            **factory_kwargs,\n        )\n        # Implementation of Feedforward model\n        self.linear1 = linear1_feedforward_cls(\n            d_model, dim_feedforward, **factory_kwargs\n        )\n        self.dropout = nn.Dropout(dropout)\n        self.linear2 = linear2_feedforward_cls(\n            dim_feedforward, d_model, **factory_kwargs\n        )\n\n        self.norm_first = norm_first\n        self.dropout1 = nn.Dropout(dropout)\n        self.dropout2 = nn.Dropout(dropout)\n        self.dropout3 = nn.Dropout(dropout)\n\n        # Legacy string support for activation function.\n        if isinstance(activation, str):\n            self.activation = _get_activation_fn(activation)\n        elif isinstance(activation, partial):\n            self.activation = activation(d_model)\n        elif activation == BalancedDoubleSwish:\n            self.activation = BalancedDoubleSwish(d_model)\n        else:\n            self.activation = activation\n\n        if adaptive_layer_norm:\n            norm1 = layer_norm_cls(\n                d_model, eps=layer_norm_eps, **factory_kwargs\n            )\n            norm2 = layer_norm_cls(\n                d_model, eps=layer_norm_eps, **factory_kwargs\n            )\n            norm3 = layer_norm_cls(\n                d_model, eps=layer_norm_eps, **factory_kwargs\n            )\n\n            self.norm1 = AdaptiveLayerNorm(d_model, norm1)\n            self.norm2 = AdaptiveLayerNorm(d_model, norm2)\n            self.norm3 = AdaptiveLayerNorm(d_model, norm3)\n        else:\n            self.norm1 = layer_norm_cls(\n                d_model, eps=layer_norm_eps, **factory_kwargs\n            )\n            self.norm2 = layer_norm_cls(\n                d_model, eps=layer_norm_eps, **factory_kwargs\n            )\n            if layer_norm_cls == IdentityNorm:\n                self.norm3 = BalancedBasicNorm(\n                    d_model, eps=layer_norm_eps, **factory_kwargs\n                )\n            else:\n                self.norm3 = layer_norm_cls(\n                    d_model, eps=layer_norm_eps, **factory_kwargs\n                )\n\n    def forward(\n        self,\n        tgt: Tensor,\n        memory: Tensor,\n        tgt_mask: Optional[Tensor] = None,\n        memory_mask: Optional[Tensor] = None,\n        tgt_key_padding_mask: Optional[Tensor] = None,\n        memory_key_padding_mask: Optional[Tensor] = None,\n    ) -> Tensor:\n        r\"\"\"Pass the inputs (and mask) through the decoder layer.\n\n        Args:\n            tgt: the sequence to the decoder layer (required).\n            memory: the sequence from the last layer of the encoder (required).\n            tgt_mask: the mask for the tgt sequence (optional).\n            memory_mask: the mask for the memory sequence (optional).\n            tgt_key_padding_mask: the mask for the tgt keys per batch (optional).\n            memory_key_padding_mask: the mask for the memory keys per batch (optional).\n\n        Shape:\n            see the docs in Transformer class.\n        \"\"\"\n        tgt_is_tuple = False\n        if isinstance(tgt, tuple):\n            x, stage_embedding = tgt\n            tgt_is_tuple = True\n        else:\n            x, stage_embedding = tgt, None\n\n        if self.norm_first:\n            x = x + self._sa_block(\n                self.norm1(x, stage_embedding), tgt_mask, tgt_key_padding_mask\n            )\n            x = x + self._mha_block(\n                self.norm2(x, stage_embedding),\n                memory,\n                memory_mask,\n                memory_key_padding_mask,\n            )\n            x = x + self._ff_block(self.norm3(x, stage_embedding))\n        else:\n            x = self.norm1(\n                x + self._sa_block(x, tgt_mask, tgt_key_padding_mask),\n                stage_embedding,\n            )\n            x = self.norm2(\n                x\n                + self._mha_block(\n                    x, memory, memory_mask, memory_key_padding_mask\n                ),\n                stage_embedding,\n            )\n            x = self.norm3(x + self._ff_block(x), stage_embedding)\n\n        if tgt_is_tuple:\n            return (x, stage_embedding)\n        return x\n\n    # self-attention block\n    def _sa_block(\n        self,\n        x: Tensor,\n        attn_mask: Optional[Tensor],\n        key_padding_mask: Optional[Tensor],\n    ) -> Tensor:\n        x = self.self_attn(\n            x,\n            x,\n            x,\n            attn_mask=attn_mask,\n            key_padding_mask=key_padding_mask,\n            need_weights=False,\n        )[0]\n        return self.dropout1(x)\n\n    # multihead attention block\n    def _mha_block(\n        self,\n        x: Tensor,\n        mem: Tensor,\n        attn_mask: Optional[Tensor],\n        key_padding_mask: Optional[Tensor],\n    ) -> Tensor:\n        x = self.multihead_attn(\n            x,\n            mem,\n            mem,\n            attn_mask=attn_mask,\n            key_padding_mask=key_padding_mask,\n            need_weights=False,\n        )[0]\n        return self.dropout2(x)\n\n    # feed forward block\n    def _ff_block(self, x: Tensor) -> Tensor:\n        x = self.linear2(self.dropout(self.activation(self.linear1(x))))\n        return self.dropout3(x)\n\n\ndef _get_clones(module, N):\n    return nn.ModuleList([copy.deepcopy(module) for i in range(N)])\n\n\ndef _get_activation_fn(activation: str) -> Callable[[Tensor], Tensor]:\n    if activation == \"relu\":\n        return F.relu\n    elif activation == \"gelu\":\n        return F.gelu\n\n    raise RuntimeError(\n        \"activation should be relu/gelu, not {}\".format(activation)\n    )"
  },
  {
    "path": "models/modules/utils.py",
    "content": "# cp from https://github.com/lifeiteng/vall-e/blob/main/valle/modules/transformer.py, modified by Puyuan Peng\nimport torch\n\n\ndef make_pad_mask(lengths: torch.Tensor, max_len: int = 0) -> torch.Tensor:\n    \"\"\"\n    Args:\n      lengths:\n        A 1-D tensor containing sentence lengths.\n      max_len:\n        The length of masks.\n    Returns:\n      Return a 2-D bool tensor, where masked positions\n      are filled with `True` and non-masked positions are\n      filled with `False`.\n\n    >>> lengths = torch.tensor([1, 3, 2, 5])\n    >>> make_pad_mask(lengths)\n    tensor([[False,  True,  True,  True,  True],\n            [False, False, False,  True,  True],\n            [False, False,  True,  True,  True],\n            [False, False, False, False, False]])\n    \"\"\"\n    assert lengths.ndim == 1, lengths.ndim\n    max_len = max(max_len, lengths.max())\n    n = lengths.size(0)\n    seq_range = torch.arange(0, max_len, device=lengths.device)\n    expaned_lengths = seq_range.unsqueeze(0).expand(n, max_len)\n\n    return expaned_lengths >= lengths.unsqueeze(-1)\n\ndef generate_partial_autoregressive_mask(sz, start, end):\n    mask = torch.zeros(sz, sz).bool()\n    mask[start:end, start:end] = torch.triu(torch.ones(end-start, end-start,dtype=torch.bool), diagonal=1)\n    mask[:start, start:end] = True\n    mask[end:, start:end] = True\n    return mask\n"
  },
  {
    "path": "models/voicecraft.py",
    "content": "import random\n\nimport numpy as np\nimport logging\nimport argparse, copy\nfrom typing import Dict, Optional\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torchmetrics.classification import MulticlassAccuracy\n\nfrom .modules.utils import make_pad_mask\n\nfrom .modules.embedding import SinePositionalEmbedding, TokenEmbedding\nfrom .modules.transformer import (\n    LayerNorm,\n    TransformerEncoder,\n    TransformerEncoderLayer,\n)\nfrom .codebooks_patterns import DelayedPatternProvider\n\nfrom argparse import Namespace\nfrom huggingface_hub import PyTorchModelHubMixin\n\n\ndef top_k_top_p_filtering(\n    logits, top_k=0, top_p=1.0, filter_value=-float(\"Inf\"), min_tokens_to_keep=1\n):\n    \"\"\"Filter a distribution of logits using top-k and/or nucleus (top-p) filtering\n    Args:\n        logits: logits distribution shape (batch size, vocabulary size)\n        if top_k > 0: keep only top k tokens with highest probability (top-k filtering).\n        if top_p < 1.0: keep the top tokens with cumulative probability >= top_p (nucleus filtering).\n            Nucleus filtering is described in Holtzman et al. (http://arxiv.org/abs/1904.09751)\n        Make sure we keep at least min_tokens_to_keep per batch example in the output\n    From: https://gist.github.com/thomwolf/1a5a29f6962089e871b94cbd09daf317\n    \"\"\"\n    if top_k > 0:\n        top_k = min(\n            max(top_k, min_tokens_to_keep), logits.size(-1)\n        )  # Safety check\n        # Remove all tokens with a probability less than the last token of the top-k\n        indices_to_remove = logits < torch.topk(logits, top_k)[0][..., -1, None]\n        logits[indices_to_remove] = filter_value\n\n    if top_p < 1.0:\n        sorted_logits, sorted_indices = torch.sort(logits, descending=True)\n        cumulative_probs = torch.cumsum(\n            F.softmax(sorted_logits, dim=-1), dim=-1\n        )\n\n        # Remove tokens with cumulative probability above the threshold (token with 0 are kept)\n        sorted_indices_to_remove = cumulative_probs > top_p\n        if min_tokens_to_keep > 1:\n            # Keep at least min_tokens_to_keep (set to min_tokens_to_keep-1 because we add the first one below)\n            sorted_indices_to_remove[..., :min_tokens_to_keep] = 0\n        # Shift the indices to the right to keep also the first token above the threshold\n        sorted_indices_to_remove[..., 1:] = sorted_indices_to_remove[\n            ..., :-1\n        ].clone()\n        sorted_indices_to_remove[..., 0] = 0\n\n        # scatter sorted tensors to original indexing\n        indices_to_remove = sorted_indices_to_remove.scatter(\n            1, sorted_indices, sorted_indices_to_remove\n        )\n        logits[indices_to_remove] = filter_value\n    return logits\n\n\ndef topk_sampling(logits, top_k=10, top_p=1.0, temperature=1.0):\n    # temperature: (`optional`) float\n    #     The value used to module the next token probabilities. Must be strictly positive. Default to 1.0.\n    # top_k: (`optional`) int\n    #     The number of highest probability vocabulary tokens to keep for top-k-filtering. Between 1 and infinity. Default to 50.\n    # top_p: (`optional`) float\n    #     The cumulative probability of parameter highest probability vocabulary tokens to keep for nucleus sampling. Must be between 0 and 1. Default to 1.\n\n    # Temperature (higher temperature => more likely to sample low probability tokens)\n    if temperature != 1.0:\n        logits = logits / temperature\n    # Top-p/top-k filtering\n    logits = top_k_top_p_filtering(logits, top_k=top_k, top_p=top_p)\n    # Sample\n    token = torch.multinomial(F.softmax(logits, dim=-1), num_samples=1)\n    return token\n\n\n\nclass VoiceCraft(\n        nn.Module,\n        PyTorchModelHubMixin,\n        library_name=\"voicecraft\",\n        repo_url=\"https://github.com/jasonppy/VoiceCraft\",\n        tags=[\"text-to-speech\"],\n    ):\n    def __new__(cls, args: Optional[Namespace] = None, config: Optional[Dict] = None, **kwargs) -> \"VoiceCraft\":\n        # If initialized from Namespace args => convert to dict config for 'PyTorchModelHubMixin' to serialize it as config.json\n        # Won't affect instance initialization\n        if args is not None:\n            if config is not None:\n                raise ValueError(\"Cannot provide both `args` and `config`.\")\n            config = vars(args)\n        return super().__new__(cls, args=args, config=config, **kwargs)\n\n    def __init__(self, args: Optional[Namespace] = None, config: Optional[Dict] = None):\n        super().__init__()\n\n        # If loaded from HF Hub => convert config.json to Namespace args before initializing\n        if args is None:\n            if config is None:\n                raise ValueError(\"Either `args` or `config` must be provided.\")\n            args = Namespace(**config)\n\n        self.args = copy.copy(args)\n        self.pattern = DelayedPatternProvider(n_q=self.args.n_codebooks)\n        if not getattr(self.args, \"special_first\", False):\n            self.args.special_first = 0\n        if not getattr(self.args, \"n_special\", False):\n            self.args.n_special = 3\n        self.args.eos = getattr(self.args, \"eos\", -1)\n        self.eog = nn.Parameter(torch.full((self.args.n_codebooks, 1), self.args.eog, dtype=torch.long), requires_grad=False) # [K 1]\n        if self.args.eos > 0:\n            assert self.args.eos != self.args.audio_pad_token and self.args.eos != self.args.empty_token, self.args.eos\n            self.eos = nn.Parameter(torch.full((self.args.n_codebooks, 1), self.args.eos, dtype=torch.long), requires_grad=False) # [K 1]\n        if isinstance(self.args.audio_vocab_size, str):\n            self.args.audio_vocab_size = eval(self.args.audio_vocab_size)\n\n        self.n_text_tokens = self.args.text_vocab_size + 1\n        assert self.args.text_pad_token == self.args.text_vocab_size, f\"self.args.text_vocab_size: {self.args.text_vocab_size}, self.args.text_pad_token: {self.args.text_pad_token}\"\n\n        self.n_audio_tokens = [self.args.audio_vocab_size + self.args.n_special] * self.args.n_codebooks # special tokens: empty token, EOG token, audio pad token\n        assert self.args.audio_vocab_size == self.args.empty_token, self.args.empty_token\n        assert self.args.eog == self.args.audio_vocab_size + 1, self.args.eog\n        assert self.args.audio_pad_token == self.args.audio_vocab_size + 2, self.args.audio_pad_token\n\n        self.text_embedding = TokenEmbedding(\n            dim_model=self.args.d_model,\n            vocab_size=self.n_text_tokens, \n            dropout=self.args.text_embedding_dropout\n        )\n\n        self.audio_embedding = nn.ModuleList(\n            [\n                TokenEmbedding(\n                dim_model=self.args.audio_embedding_dim, \n                vocab_size=self.n_audio_tokens[k], \n                dropout=self.args.audio_embedding_dropout\n            ) for k in range(self.args.n_codebooks)\n            ]\n        )\n        self.mask_embedding = nn.Parameter(torch.randn(self.args.max_n_spans, self.args.d_model), requires_grad=True)\n        self.text_positional_embedding = SinePositionalEmbedding(\n            self.args.d_model,\n            dropout=self.args.text_positional_embedding_dropout,\n            scale=False,\n            alpha=True, # learnable scaler, scale the volume of positional embedding\n        )\n        self.audio_positional_embedding = SinePositionalEmbedding(\n            self.args.d_model,\n            dropout=self.args.audio_positional_embedding_dropout,\n            scale=False,\n            alpha=True, # learnable scaler, scale the volume of positional embedding\n        )\n\n        dec_layer = TransformerEncoderLayer(\n            self.args.d_model,\n            self.args.nhead,\n            dim_feedforward=self.args.d_model * 4,\n            dropout=self.args.trm_dropout,\n            batch_first=True,\n            norm_first=True,\n            layer_norm_cls=LayerNorm\n        )\n        self.decoder = TransformerEncoder(\n            dec_layer,\n            num_layers=self.args.num_decoder_layers,\n            norm=LayerNorm(self.args.d_model),\n        )\n        \n        self.predict_layer = nn.ModuleList(\n            [\n                nn.Sequential(nn.Linear(self.args.d_model, self.args.audio_vocab_size//2), nn.GELU(), nn.Linear(self.args.audio_vocab_size//2, self.n_audio_tokens[k])) for k in range(self.args.n_codebooks)\n            ]\n        )\n        \n        self.accuracy_metrics = nn.ModuleList(\n            [MulticlassAccuracy(\n                self.n_audio_tokens[k],\n                top_k=10,\n                average=\"micro\",\n                multidim_average=\"global\",\n                ignore_index=None,\n            ) for k in range(self.args.n_codebooks)]\n        )\n\n    \n    def prepare_mask_intervals(self, y_lens):\n        mask_intervals = []\n        non_mask_intervals = []\n\n        for i, y_len in enumerate(y_lens):\n            if self.args.mask_sample_dist == \"uniform\":\n                n_spans = random.choice(range(1, self.args.max_n_spans+1))\n            elif \"poisson\" in self.args.mask_sample_dist.lower():\n                param = float(self.args.mask_sample_dist[len(\"poisson\"):])\n                poisson_sample = torch.poisson(torch.tensor([param]))\n                n_spans = int(poisson_sample.clamp(1, self.args.max_n_spans).item())\n\n            starts = random.sample(range(1, y_len-1-self.args.mask_len_min), n_spans)\n            starts = sorted(starts)\n\n            for j in range(len(starts)-1, 0, -1):\n                if starts[j] - starts[j-1] < self.args.min_gap:\n                    del starts[j] # If elements are too close, delete the later one\n            assert len(starts) > 0, f\"there is no masked span left, y_len: {y_len}, sampled n_spans: {n_spans}\"\n\n            temp_starts =  starts + [y_len]\n            gaps = [temp_starts[j+1] - temp_starts[j] for j in range(len(temp_starts)-1)]\n\n            ends = []\n\n            for j, (start, gap) in enumerate(zip(starts, gaps)):\n                mask_len = random.randint(self.args.mask_len_min, self.args.mask_len_max)\n                # if mask_len > gap * self.args.max_mask_portion: # make sure the masks are not overlapping with each other\n                if mask_len > gap - 1: # make sure the masks are not overlapping with each other\n                    # temp_mask_start = int(0.6*gap*self.args.max_mask_portion)\n                    # temp_mask_end = int(gap*self.args.max_mask_portion)\n                    temp_mask_start = 1\n                    temp_mask_end = gap - 1\n                    mask_len = random.randint(temp_mask_start, temp_mask_end)\n                ends.append(start + mask_len)\n            \n            mask_intervals.append([(s,e) for s,e in zip(starts, ends)])\n            non_mask_intervals.append([(ns,ne) for ns, ne in zip([0]+ends, starts+[y_len])])\n\n        return mask_intervals, non_mask_intervals\n    \n    def rearrange(self, y, non_mask_intervals, mask_intervals):\n        reduced_eog = getattr(self.args, \"reduced_eog\", 0)\n        rearranged_y = []\n        for i in range(len(y)):\n            if self.args.eos > 0:\n                assert reduced_eog\n                cur_y = [y[i, :, item[0]: item[1]] for item in non_mask_intervals[i][:-1]] + [torch.cat([y[i, :, non_mask_intervals[i][-1][0]: non_mask_intervals[i][-1][1]], self.eos], dim=-1)] + [torch.cat([y[i, :, item[0]: item[1]], self.eog], dim=-1) for item in mask_intervals[i]] # only insert eog to the last non-mask-interval, which is when the utterance actual ends\n            else:\n                if reduced_eog:\n                    cur_y = [y[i, :, item[0]: item[1]] for item in non_mask_intervals[i][:-1]] + [torch.cat([y[i, :, non_mask_intervals[i][-1][0]: non_mask_intervals[i][-1][1]], self.eog], dim=-1)] + [torch.cat([y[i, :, item[0]: item[1]], self.eog], dim=-1) for item in mask_intervals[i]] # only insert eog to the last non-mask-interval, which is when the utterance actual ends\n                else:\n                    cur_y = [torch.cat([y[i, :, item[0]: item[1]], self.eog], dim=-1) for item in non_mask_intervals[i]] + [torch.cat([y[i, :, item[0]: item[1]], self.eog], dim=-1) for item in mask_intervals[i]] # eog is added to each section TODO this is not correct, I should add eog to non_mask_intervals if that segment is not the ending segment (as there is no way for the model to predict eog for those segments, and this will do harm to tts experiment, where the model randomly output eog for the first segment)\n            rearranged_y.append(cur_y)\n        return rearranged_y\n        \n    def shift(self, rearranged_y):\n        shifted_y = []\n        patterns = []\n        for i in range(len(rearranged_y)):\n            cur_patterns = [self.pattern.get_pattern(cur_y.shape[1]) for cur_y in rearranged_y[i]]\n            out = [cur_pattern.build_pattern_sequence(z=cur_y.unsqueeze(0).contiguous(), special_token=self.args.empty_token, keep_only_valid_steps=False) for cur_pattern, cur_y in zip(cur_patterns, rearranged_y[i])]\n            shifted_y.append([item[0].squeeze(0) for item in out]) # the first item is values, later two are indexes and mask\n            patterns.append(cur_patterns)\n        return shifted_y, patterns\n    \n    def insert_mask(self, shifted_y):\n        inserted_y = []\n        mask_position = []\n        mask_value = []\n        for i in range(len(shifted_y)):\n            num_masks = (len(shifted_y[i]) - 1) // 2\n            assert num_masks == (len(shifted_y[i]) - 1) / 2, len(shifted_y[i])\n            emb_inds = list(range(self.args.max_n_spans))\n            if self.args.shuffle_mask_embedding:\n                random.shuffle(emb_inds)\n            emb_inds_use = emb_inds[:num_masks]\n            emb_inds_use = emb_inds_use + emb_inds_use\n            mask_value.append(emb_inds_use)\n            cur_inserted_y = []\n            cur_mask_position = []\n            for j in range(len(shifted_y[i])-1):\n                cur_inserted_y.append(shifted_y[i][j])\n                cur_mask_position.append(sum([item.shape[1] for item in cur_inserted_y])) # each item is of shape [K S], so take shape[1]\n                cur_inserted_y.append(self.eog) # insert mask token of shape [K, 1], BUT we are actually using the eog token as a place holder here, as the real mask will be inserted in embed_y function\n\n            cur_inserted_y.append(shifted_y[i][-1])\n\n            inserted_y.append(cur_inserted_y)\n            mask_position.append(cur_mask_position)\n        return inserted_y, mask_position, mask_value\n    \n    def cat_y(self, inserted_y, mask_position, y_lens):\n        reduced_eog = getattr(self.args, \"reduced_eog\", 0)\n        cated_y = []\n        new_y_lens = []\n        for i in range(len(inserted_y)):\n            cur_cated_y = torch.cat(inserted_y[i], dim=1) #[K S]\n            cur_cated_y = cur_cated_y.transpose(1,0) # [S K]\n            cur_cated_y_len = cur_cated_y.shape[0]\n            if reduced_eog:\n                assert cur_cated_y_len == y_lens[i] + len(mask_position[i]) + (len(mask_position[i]) + 1) * self.args.n_codebooks + (len(mask_position[i])/2 + 1), f\"cur_cated_y_len == {cur_cated_y_len}, but it should be y_lens[i] ({y_lens[i]}) + len(mask_position[i]) ({len(mask_position[i])}) + (len(mask_position[i]) + 1) * self.args.n_codebooks ({(len(mask_position[i]) + 1) * self.args.n_codebooks}) + (len(mask_position[i])/2 + 1) ({len(mask_position[i])/2 + 1})={y_lens[i] + len(mask_position[i]) + (len(mask_position[i]) + 1) * self.args.n_codebooks + (len(mask_position[i])/2 + 1)}\"\n            else:\n                assert cur_cated_y_len == y_lens[i] + len(mask_position[i]) + (len(mask_position[i]) + 1) * self.args.n_codebooks + (len(mask_position[i]) + 1), f\"cur_cated_y_len == {cur_cated_y_len}, but it should be y_lens[i] ({y_lens[i]}) + len(mask_position[i]) ({len(mask_position[i])}) + (len(mask_position[i]) + 1) * self.args.n_codebooks ({(len(mask_position[i]) + 1) * self.args.n_codebooks}) + (len(mask_position[i]) + 1) ({len(mask_position[i]) + 1})\" # the last term represent the inserted eog token, originally it's inserted at the end of every token, but this is wrong\n            new_y_lens.append(cur_cated_y_len)\n            cated_y.append(cur_cated_y)\n\n        cated_y = torch.nn.utils.rnn.pad_sequence(cated_y, batch_first=False, padding_value=self.args.audio_pad_token)\n        assert cated_y.shape == torch.Size([max(new_y_lens),len(inserted_y), self.args.n_codebooks]), f\"cated_y.shape: {cated_y.shape}, but it should be {torch.Size([max(new_y_lens,len(inserted_y), self.args.n_codebooks)])}\"\n        cated_y = cated_y.permute(2,0,1) # [T,B,K]->[K,T,B]\n        assert cated_y.shape[0] == self.args.n_codebooks, cated_y.shape\n        return cated_y, torch.LongTensor(new_y_lens).to(cated_y.device)\n\n    def embed_y(self, cated_y, mask_position, mask_value):\n        embedded_y = torch.stack([self.audio_embedding[k](cated_y[k]) for k in range(self.args.n_codebooks)], dim=0) # [K, T, B, D]\n        assert embedded_y.shape[0] == self.args.n_codebooks, embedded_y.shape\n        assert embedded_y.shape[-1] == self.args.d_model, embedded_y.shape\n        embedded_y = embedded_y.sum(dim=0) # [K,T,B,D]->[T,B,D]\n        embedded_y = embedded_y.transpose(1,0) # [T,B,D]->[B,T,D]\n        for i in range(len(embedded_y)):\n            if len(mask_position[i]) > 0:\n                embedded_y[i, mask_position[i]] = self.mask_embedding[mask_value[i]] \n        return embedded_y\n    \n    def prepare_input_target(self, y, y_lens):\n        # rearrange y\n        # assume y shape: [B T K], K is n_codebooks\n        assert y.shape[1] == self.args.n_codebooks, y.shape\n        # sample mask_intervals\n        mask_intervals, non_mask_intervals = self.prepare_mask_intervals(y_lens)\n\n        # need to have EOG in each section (SOG will be generated by the pattern class)\n        # but mask can be inserted later after we have shifted the input\n        # y could be rearranged in this way:\n        # [\n        # [tensor[4, 12], tensor[4, 45], tensor[4, 102], tensor[4, 32]], tensor[4, 22]],\n        # [tensor[4, 44], tensor[4, 56], tensor[4, 19]],\n        # ...\n        # ]\n        # for the first list of tensors (4 tensors), first 3 tensors are non_masked part, last 2 are masked part.\n        # NOTE #non_masked_part = #masked_part + 1\n        # NOTE *these are also the targets*\n        # added eog at the end of each segment (masked segment and unmasked segment)\n        rearranged_y = self.rearrange(y, non_mask_intervals, mask_intervals)\n        targets = rearranged_y # each element in each sample is of shape [K T]\n        assert targets[0][0].shape[0] == self.args.n_codebooks, targets[0][0].shape\n\n        # next we need to apply pattern shifting to each tensor, after which, we'll replace the starting tokens of each section with a token that's different from the special padding token\n        #  [[5, 1, 2, 3, 4, 5, 5],\n        #  [5, 5, 1, 2, 3, 4, 5],\n        #  [5, 5, 5, 1, 2, 3, 4]]\n        shifted_y, patterns = self.shift(rearranged_y) # each element [K S]\n        assert shifted_y[0][0].shape[0] == self.args.n_codebooks, shifted_y[0][0].shape[0]\n\n\n        # then, insert mask token at the intersection of each tensor (we want to decide the arrangement of the mask (shuffle or not)), we better have a separate nn.embedding for it\n        # we also need to record the position of the inserted mask\n        inserted_y, mask_position, mask_value = self.insert_mask(shifted_y)\n        assert inserted_y[0][0].shape[0] == self.args.n_codebooks, inserted_y[0][0].shape[0]\n        assert inserted_y[0][1].shape == torch.Size((self.args.n_codebooks, 1)), f\"this should be a mask, so should have shape {(self.args.n_codebooks, 1)}, but it's {inserted_y[0][1].shape}\"\n        \n        # then concat tensors that belong to the same sample (in order) then get the length of each sample, and then stack them in batch dimension, pad them with pad_token\n        cated_y, new_y_lens = self.cat_y(inserted_y, mask_position, y_lens) # KTB\n        assert cated_y.shape == torch.Size((self.args.n_codebooks, cated_y.shape[1], len(inserted_y)))\n        \n\n        # embed remember to separately embed the mask tokens\n        embedded_y = self.embed_y(cated_y, mask_position, mask_value) #BTD\n        assert embedded_y.shape[1:] == torch.Size((max(new_y_lens), self.args.d_model)), embedded_y.shape\n        \n        # positional embedding\n        y_input = self.audio_positional_embedding(embedded_y)\n\n        # make attention mask and padding mask\n        y_padding_mask = make_pad_mask(new_y_lens).to(y.device)\n        y_attention_mask = torch.triu(torch.ones(y_input.shape[1], y_input.shape[1]), diagonal=1).bool().to(y_padding_mask.device)\n        return y_input, new_y_lens, targets, y_padding_mask, y_attention_mask, mask_position, patterns\n\n    def remove_mask(self, logits, mask_position, new_y_lens):\n        # logits: [B K S card]\n        logits_use = []\n        for i in range(len(logits)):\n            non_mask_positions = [-1] + mask_position[i] + [new_y_lens[i]]\n            non_mask_intervals = [[non_mask_positions[i]+1, non_mask_positions[i+1]] for i in range(len(non_mask_positions)-1)]\n            cur_logits_use = [logits[i, :, l:r] for l,r in non_mask_intervals]\n            logits_use.append(cur_logits_use)\n        \n        return logits_use\n    \n    def revert_pattern(self, patterns, logits_use):\n        logits_final = []\n        logit_masks = []\n        for i in range(len(logits_use)):\n            cur_logits = [\n                item.unsqueeze(0).permute(0, 3, 1, 2).contiguous() for item in logits_use[i]\n            ] # each item is of shape [1 K S card] [1 card K S]\n            cur_logits_final = [\n                cur_pattern.revert_pattern_logits(\n                item, 0, keep_only_valid_steps=False\n                )\n                for cur_pattern, item in zip(patterns[i], cur_logits)\n            ] # if input output order doesn't match, this step will give an error\n            cur_logits_final_ret = [item[0].permute(0,2,3,1).squeeze(0) for item in cur_logits_final] # each element is of shape [K,T,card]\n            logits_final.append(cur_logits_final_ret)\n            logit_masks.append([item[2] for item in cur_logits_final])\n\n        return logits_final, logit_masks\n\n    def dec_forward(\n            self, \n            x_input, \n            x_lens,\n            x_attention_mask,\n            x_padding_mask,\n            y_input,\n            new_y_lens,\n            y_attention_mask,\n            y_padding_mask,\n            past=None,\n            last_3_tokens=False\n        ):\n            x_attn_mask = F.pad(\n                x_attention_mask,\n                (0, new_y_lens.max()),\n                value=True,\n            ) # x attn to all x, doesn't attn to any y, this follow figure 3 of the valle paper\n            y_attn_mask = F.pad(\n                y_attention_mask,\n                (x_lens.max(), 0), # y is padded at the front\n                value=False,\n            ) # y attn to all x, for y itself use lower triangle mask to ensure autoregressive\n            xy_attn_mask = torch.concat([x_attn_mask, y_attn_mask], dim=0)\n\n            # merge key padding and attention masks\n            bsz, src_len = x_input.shape[0], x_lens.max() + new_y_lens.max()\n            xy_padding_mask = torch.concat([x_padding_mask, y_padding_mask], dim=1)\n            _xy_padding_mask = (\n                xy_padding_mask.view(bsz, 1, 1, src_len)\n                .expand(-1, self.args.nhead, -1, -1)\n                .reshape(bsz * self.args.nhead, 1, src_len)\n            )\n            # Check shapes and resize+broadcast as necessary\n            if xy_attn_mask.shape != _xy_padding_mask.shape:\n                assert xy_attn_mask.ndim + 1 == _xy_padding_mask.ndim, f\"xy_attn_mask.shape: {xy_attn_mask.shape}, _xy_padding_mask: {_xy_padding_mask.shape}\"\n                xy_attn_mask = xy_attn_mask.unsqueeze(0).repeat(_xy_padding_mask.shape[0], 1, 1)  # Example approach\n            xy_attn_mask = xy_attn_mask.logical_or(_xy_padding_mask)\n\n            new_attn_mask = torch.zeros_like(xy_attn_mask)\n            new_attn_mask.masked_fill_(xy_attn_mask, float(\"-inf\"))\n            xy_attn_mask = new_attn_mask\n\n            xy_input = torch.cat([x_input, y_input], dim=1)\n\n            if past == None: # do not use kvcache\n                out, _ =  self.decoder((xy_input, None), mask=xy_attn_mask)\n                return out[:, x_lens.max():], None\n            else: # use kvcache\n                if past.ndim > 3: # uses kvcache, only need to pass the last tokens, this doesn't work with multi-span speech editing yet\n                    if last_3_tokens:\n                        xy_input = xy_input[:, -3:]\n                        xy_attn_mask = xy_attn_mask[:, -3:]\n                    else:\n                        xy_input = xy_input[:, -1:]\n                        xy_attn_mask = xy_attn_mask[:, -1:]\n\n                out, present =  self.decoder((xy_input, None), mask=xy_attn_mask, past=past)\n                if isinstance(out, tuple): # get rid of stage_embedding\n                    out = out[0]\n\n                if out.shape[1] > x_lens.max(): # the first pass, not kvcache yet\n                    return out[:, x_lens.max():], present\n                else: # used kvcache\n                    return out, present\n\n    def forward(self, batch):\n        \"\"\"\n        Args:\n          x:\n            A 2-D tensor of shape (N, S).\n          x_lens:\n            A 1-D tensor of shape (N,). It contains the number of tokens in `x`\n            before padding.\n          y:\n            A 3-D tensor of shape (N, K, T).\n            where K is the number of codebooks\n          y_lens:\n            A 1-D tensor of shape (N,). It contains the number of tokens in `x`\n            before padding.\n        \"\"\"\n        x, x_lens, y, y_lens = batch[\"x\"], batch[\"x_lens\"], batch[\"y\"], batch[\"y_lens\"]\n        if len(x) == 0:\n            return None\n        x = x[:, :x_lens.max()] # this deal with gradient accumulation, where x_lens.max() might not be longer than the length of the current slice of x\n        y = y[:, :, :y_lens.max()]\n        assert x.ndim == 2, x.shape\n        assert x_lens.ndim == 1, x_lens.shape\n        assert y.ndim == 3 and y.shape[1] == self.args.n_codebooks, y.shape\n        assert y_lens.ndim == 1, y_lens.shape\n        # makes attention mask and padding mask for x\n        x_padding_mask = make_pad_mask(x_lens).to(x.device)\n        x_attention_mask = torch.triu(torch.ones(x.shape[1], x.shape[1]), diagonal=1).bool().to(x_padding_mask.device)\n        x_input = self.text_embedding(x)\n        x_input = self.text_positional_embedding(x_input)\n        y_input, new_y_lens, targets, y_padding_mask, y_attention_mask, mask_position, patterns = self.prepare_input_target(y, y_lens)\n        y_out = self.dec_forward(\n                    x_input, \n                    x_lens,\n                    x_attention_mask,\n                    x_padding_mask,\n                    y_input,\n                    new_y_lens,\n                    y_attention_mask,\n                    y_padding_mask\n                )\n        y_out = y_out[0] # no kv-caching during training\n        assert y_out.shape == y_input.shape, f\"y_out.shape: {y_out.shape}, y_input.shape: {y_input.shape}\" # [B S D]\n        \n        logits = torch.stack([self.predict_layer[i](y_out) for i in range(self.args.n_codebooks)], dim=1) # [B K S card]\n        # take out the mask token (using mask_position and new_y_lens) and revert (using function provided by self.pattern)\n        assert logits.shape[1] == self.args.n_codebooks and logits.shape[3] == self.n_audio_tokens[0], logits.shape\n\n        logits_use = self.remove_mask(logits, mask_position, new_y_lens)\n        \n        # revert the pattern shift for each logits section in each sample\n        logits_final, logit_masks = self.revert_pattern(patterns, logits_use)\n        assert logits_final[0][0].shape[0] == self.args.n_codebooks and logits_final[0][0].shape[2] == self.n_audio_tokens[0], f\"it is: {logits_final[0][0].shape}, but should be [K, T, card]\"\n        # testing\n        sample_to_test = 0\n        assert len(logits_final[sample_to_test]) == len(targets[sample_to_test]), f\"{len(logits_final[sample_to_test])}, {len(targets[sample_to_test])}\"\n        temp = sum([logits_final[sample_to_test][i].shape[:-1] != targets[sample_to_test][i].shape for i in range(len(targets[sample_to_test]))])\n        assert temp == 0, f\"none equal positions: {temp}, total number of elements: {len(targets[sample_to_test])}\"\n\n        logit_masked = sum([(item==False).any() for cur_mask in logit_masks for item in cur_mask])\n        assert logit_masked == 0, logit_masks\n\n        logits = torch.cat([torch.cat(item, dim=1) for item in logits_final], dim=1) # [K, T1+T2+T3+..., card]\n        targets = torch.cat([torch.cat(item, dim=1) for item in targets], dim=1) # [K, T1+T2+T3+...]\n        assert targets.shape[0] == logits.shape[0], f\"{targets.shape}, {logits.shape}\"\n        loss = []\n        ntokens = []\n        top10acc = []\n        for k, (logit, target) in enumerate(zip(logits, targets)):\n            loss.append(F.cross_entropy(logit, target, reduction='mean'))\n            top10acc.append(self.accuracy_metrics[k](logit.detach(), target))\n            ntokens.append(len(logit))\n        \n        all_ntokens = sum(ntokens)\n        if self.args.codebook_weight != None:\n            codebook_weight = eval(self.args.codebook_weight)\n        else:\n            codebook_weight = [1.] * self.args.n_codebooks\n        loss = sum([l*nt*cw for l, nt, cw in zip(loss, ntokens, codebook_weight)])\n        top10acc_by_codebook = [t10a*nt for t10a, nt in zip(top10acc, ntokens)]\n        top10acc = sum(top10acc_by_codebook)\n        ntokens = torch.tensor(all_ntokens).to(logits.device)\n\n        return {\n            \"loss\": loss,\n            \"top10acc\": top10acc,\n            \"top10acc_by_codebook\": top10acc_by_codebook,\n            \"effective_ntoken\": ntokens,\n        }\n    \n    def inference(\n        self,\n        x: torch.Tensor,\n        x_lens: torch.Tensor,\n        y: torch.Tensor,\n        mask_interval: list[torch.Tensor],\n        top_k: int=-100,\n        top_p: float=1.0,\n        temperature: float=1.0,\n        stop_repetition: int=-1,\n        kvcache: int=1,\n        silence_tokens: list[int]=[1388,1898,131],\n    ) -> torch.Tensor:\n        \"\"\"\n        Args:\n          x:\n            A 2-D tensor of shape (1, L).\n          x_lens:\n            A 1-D tensor of shape (1,). It contains the number of tokens in `x`\n            before padding.\n          y:\n            A 3-D tensor of shape (1, T, K).\n          mask_interval:\n            a list of tensors of shape (M, 2). contains M mask_start and mask_end. list length is actually 1, because we only support single sample inference for now\n          top_k: (`optional`) int\n            The number of highest probability tokens to keep for top-k-filtering. Default to -100.\n          top_p: (`optional`) float\n            For Neucleus sampling\n          temperature: (`optional`) float\n            The value used to module the next token probabilities. Must be strictly positive. Default to 1.0.\n          eog_coef: (`optional`) float\n            if 0, no change to eog token logits, otherwise, will adjust eog token logit based on the difference between acoustic token and phn token length\n          stop_repetition (`optional`) int\n            if not -1, will set the logits of a token that repeated this many times to be -100000, to avoid generating it again. This only apply to tokens from the first codebook\n          allowed_repeat_tokens (`optional`) list of ints\n            by inspecting the validation set, get a few tokens that indeed repeat a significant amount of time, and exclude those tokens from prevent repetition\n          ultimate_stop_repetition (`optional`) int\n            no matter that token it is, stop repetition once after this number\n        \"\"\"\n        assert x.ndim == 2, x.shape\n        assert x_lens.ndim == 1, x_lens.shape\n        assert y.ndim == 3, y.shape\n        if self.args.special_first:\n            y = y + int(self.args.n_special)\n        y = y.transpose(2,1) # [1,T,K] -> [1,K,T]\n        assert y.shape[0] == 1 and y.shape[1] == self.args.n_codebooks, y.shape # there is no padding\n        assert mask_interval.shape == torch.Size((1, mask_interval.shape[1], 2)), mask_interval\n\n        # make x attention mask and x_input\n        x_attention_mask = torch.triu(torch.ones(x.shape[1], x.shape[1]), diagonal=1).bool().to(x.device)\n        # x_attention_mask = torch.zeros(x.shape[1], x.shape[1]).bool().to(x.device)\n        x_input = self.text_embedding(x)\n        x_input = self.text_positional_embedding(x_input)\n\n        # make initial y_input\n\n        # make mask_interval and non_mask_interval\n        y_len = y.shape[2]\n        y_lens = torch.LongTensor([y_len]).to(y.device)\n        mask_interval = mask_interval[0]\n        starts =  [item[0].item() for item in mask_interval] + [y_len]\n        ends = [0] + [item[1].item() for item in mask_interval]\n        mask_intervals = [[\n            (item[0].item(), item[1].item()) for item in mask_interval\n        ]] # a werid name change, mask_interval is input, now is mask_intervals, with one more dimension\n        non_mask_intervals = [[\n            (ns, ne) for ns, ne in zip(ends, starts)\n        ]]\n        \n        # rearrange y\n        # will add have EOG in each section (SOG will be generated by the pattern class)\n        # but mask can be inserted later after we have shifted the input\n        # y could be rearranged in this way:\n        # [\n        # [tensor[4, 12], tensor[4, 45], tensor[4, 102], tensor[4, 32]], tensor[4, 22]],\n        # [tensor[4, 44], tensor[4, 56], tensor[4, 19]],\n        # ...\n        # ]\n        # for the first list of tensors (4 tensors), first 3 tensors are non_masked part, last 2 are masked part.\n        # NOTE #non_masked_part = #masked_part + 1\n        rearranged_y = self.rearrange(y, non_mask_intervals, mask_intervals)\n        assert rearranged_y[0][0].shape[0] == self.args.n_codebooks, rearranged_y[0][0].shape\n\n        # shift each element of y\n        # next we need to apply pattern shifting to each tensor, after which, we'll replace the starting tokens of each section with a token that's different from the special padding token\n        #  [\n        #  [empty, 1, 2, 3, eog, empty, empty, empty],\n        #  [empty, empty, 1, 2, 3, eog, empty, empty],\n        #  [empty, empty, empty, 1, 2, 3, eog, empty],\n        #  [empty, empty, empty, empty, 1, 2, 3, eog]\n        # ]\n        shifted_y, patterns = self.shift(rearranged_y) # each element [K S], patterns is not used, as we directly use the original input y\n        assert shifted_y[0][0].shape[0] == self.args.n_codebooks, shifted_y[0][0].shape\n\n        # insert mask token at the intersction of each tensor, but *actually inserted eog as place holder*\n        # the position of inserted mask is also recorded\n        # and the mask_value, the index of the mask emb is recorded\n        inserted_y, mask_position, mask_value = self.insert_mask(shifted_y)\n        assert inserted_y[0][0].shape[0] == self.args.n_codebooks, inserted_y[0][0].shape[0]\n        assert inserted_y[0][1].shape == torch.Size((self.args.n_codebooks, 1)), f\"this should be a mask, so should have shape {(self.args.n_codebooks, 1)}, but it's {inserted_y[0][1].shape}\"\n        \n        # then concat tensors that belong to the same sample (in order) then get the length of each sample, and then stack them in batch dimension, pad them with pad_token\n        cated_y, new_y_lens = self.cat_y(inserted_y, mask_position, y_lens) # KTB\n        assert cated_y.shape == torch.Size((self.args.n_codebooks, cated_y.shape[1], len(inserted_y)))\n        assert not (cated_y == self.args.audio_pad_token).any(), cated_y\n\n        ### NOTE this is different from forward, as we will remove the masked tokens\n        ### say there are two masked region\n        ### the cated_y should be like\n        ### [empty a a a a mask0 empty b b b mask1 empty c c mask0 empty]\n        ### which means we need to take the part after the last empty out\n        num_mask = len(mask_position[0])//2\n        assert num_mask == len(mask_position[0])/2, mask_position\n        cated_y = cated_y[:, :mask_position[0][num_mask]+2] # of shape [K,T,B]\n        # logging.info(f\"mask_position[0][num_mask]+2: {mask_position[0][num_mask]+2}\")\n        more_mask_value = mask_value[0][num_mask+1:] # NOTE this will be used in the generation loop for reference for inserting mask embedding\n        new_y_lens[0] = mask_position[0][num_mask]+2\n        mask_position[0] = mask_position[0][:num_mask+1]\n        assert mask_position[0][num_mask]+2 == cated_y.shape[1], f\"num_mask: {num_mask}, mask_position: {mask_position}, cated_y.shape: {cated_y.shape}\"\n\n        # embed: remember to separately embed the mask tokens\n        embedded_y = self.embed_y(cated_y, mask_position, [mask_value[0][:num_mask+1]]) #BTD\n        # assert embedded_y.shape == torch.Size((y.shape[0], max(new_y_lens), self.args.d_model)), embedded_y.shape\n\n        # positional embedding\n        y_input = self.audio_positional_embedding(embedded_y)\n\n        # make attention mask and padding mask\n        y_attention_mask = torch.triu(torch.ones(y_input.shape[1], y_input.shape[1]), diagonal=1).bool().to(y.device)\n        # y_lens = torch.LongTensor([y_input.shape[1]]).to(y.device)\n\n        x_padding_mask = torch.full((1,x_lens[0]), False).to(x.device)\n        y_padding_mask = torch.full((1,new_y_lens[0]), False).to(y.device)\n\n\n        codebook_eog = [False] * self.args.n_codebooks\n        generated = [] # doesn't contain any empty_token, contains eog\n        cur_generated = []\n        # say 0 is empty, 4 is eog\n        # tensor([[ 1,  2,  3,  4,  0,  0],\n        #         [ 0,  1,  2,  3,  4,  0],\n        #         [ 0,  0,  1,  2,  3,  4]])\n        num_gen = []\n        cur_num_gen = 0\n        ##################### silence repetition handling #####################\n        ##################### silence repetition handling #####################\n        logging.info(f\"silence tokens: {silence_tokens}, note that if you are not using the pretrained encodec 6f79c6a8, make sure you specified it yourself, rather than using the default\")\n        consec_silence_count = 0\n        prev_token = None\n        ##################### silence repetition handling #####################\n        ##################### silence repetition handling #####################\n        # prepare the cache placeholder\n        # n_layers, 2, bsz, num_heads, src_len, head_dim\n        past = torch.ones([self.args.num_decoder_layers, 2, x.shape[0]], device=x.device, dtype=torch.float32) if kvcache else None\n        # handle multi-span kv-cache\n        new_masked_span = False\n        \n        def sample_helper(n_eog, logits, codebook_eog, top_k, top_p, temperature, prev_token, consec_silence_count, stop_repetition, silence_tokens, cur_num_gen):\n            if n_eog == 0:\n                logits_adjust = logits\n                for jj in range(1,self.args.n_codebooks):\n                    logits_adjust[jj][self.args.eog] = -10000\n                    logits_adjust[jj][self.args.empty_token] = -10000\n                ##################### silence repetition handling #####################\n                if stop_repetition > 0 and prev_token in silence_tokens and consec_silence_count > stop_repetition:\n                    if logits_adjust[0, prev_token] < 0:\n                        logits_adjust[0, prev_token] = logits_adjust[0, prev_token] * (consec_silence_count - (stop_repetition-1))\n                    else:\n                        logits_adjust[0, prev_token] = logits_adjust[0, prev_token] / (consec_silence_count - (stop_repetition-1))\n                ##################### silence repetition handling #####################\n                if type(logits_adjust) == list:\n                    samples_list= []\n                    for logit in logits_adjust:\n                        # print(logit)\n                        # print(logit.shape)\n                        cur_sample = topk_sampling(\n                            logit.unsqueeze(0), top_k=top_k, top_p=top_p, temperature=temperature\n                        ) # [1, 1]\n                        samples_list.append(cur_sample)\n                    samples = torch.cat(samples_list, dim=0) # [K, 1]\n                else:\n                    samples = topk_sampling(\n                            logits_adjust, top_k=top_k, top_p=top_p, temperature=temperature\n                        ) # [K, 1]\n                assert samples.shape == torch.Size((self.args.n_codebooks, 1)), f\"samples.shape: {samples.shape}\"\n                if cur_num_gen < self.args.n_codebooks-1:\n                    for jj in range(1, self.args.n_codebooks - cur_num_gen):\n                        samples[-jj, 0] = self.args.empty_token\n\n                if (\n                    samples[0,0] == self.args.eog or torch.argmax(logits[0], dim=-1) == self.args.eog or y_input.shape[1] > x_lens[0] * 10\n                ): # last one means y is already too long, shouldn't happen, but put it here\n                    samples[0,0] = self.args.eog\n                    codebook_eog[0] = True\n                ##################### silence repetition handling #####################\n                ##################### silence repetition handling #####################\n                if samples[0,0] in silence_tokens and samples[0,0] == prev_token:\n                    consec_silence_count += 1\n                else:\n                    consec_silence_count = 0\n                prev_token = samples[0,0]\n                ##################### silence repetition handling #####################\n                ##################### silence repetition handling #####################\n                return samples, codebook_eog, prev_token, consec_silence_count\n            else:\n                assert sum(codebook_eog[i] for i in range(n_eog)) == n_eog, f\"codebook_eog: {codebook_eog}, but n_eog: {n_eog}\"\n                logits_adjust = logits\n                for jj in range(n_eog+1,self.args.n_codebooks):\n                    logits_adjust[jj][self.args.eog] = -10000\n                    logits_adjust[jj][self.args.empty_token] = -10000\n                if type(logits_adjust) == list:\n                    samples_list= []\n                    for logit in logits_adjust:\n                        cur_sample = topk_sampling(\n                            logit.unsqueeze(0), top_k=top_k, top_p=top_p, temperature=temperature\n                        ) # [1, 1]\n                        samples_list.append(cur_sample)\n                    samples = torch.cat(samples_list, dim=0) # [K, 1]\n                else:\n                    samples = topk_sampling(\n                            logits_adjust, top_k=top_k, top_p=top_p, temperature=temperature\n                        ) # [K, 1]\n                for jj in range(n_eog):\n                    samples[jj, 0] = self.args.empty_token\n                samples[n_eog, 0] = self.args.eog\n                codebook_eog[n_eog] = True\n                return samples, codebook_eog, prev_token, consec_silence_count\n\n        while True:\n            y_out, present = self.dec_forward(\n                                    x_input, \n                                    x_lens,\n                                    x_attention_mask,\n                                    x_padding_mask,\n                                    y_input,\n                                    new_y_lens,\n                                    y_attention_mask,\n                                    y_padding_mask,\n                                    past=past,\n                                    last_3_tokens = new_masked_span\n                                    )\n            if new_masked_span:\n                new_masked_span = False\n\n            if past != None:\n                past = torch.cat([past, present.to(past.dtype)], dim=-2) if past.ndim > 3 else present.to(past.dtype)\n\n            y_out = y_out[:, -1:] # only take the last one\n\n            logits = torch.stack([self.predict_layer[i](y_out) for i in range(self.args.n_codebooks)], dim=1) # [B K S card], B==S==1, so [1 K 1 card]\n            logits = logits.squeeze(0).squeeze(1) # [K card]\n            assert logits.shape == torch.Size((self.args.n_codebooks, self.n_audio_tokens[0])), f\"{logits.shape}\"\n\n            n_eog = sum(codebook_eog)\n            assert n_eog < self.args.n_codebooks\n            if self.args.eos > 0: # eos stands for end-of-sentence, which shouldn't be used as we are doing speech editing\n                for jj in range(self.args.n_codebooks):\n                    logits[jj][self.args.eos] = -10000.\n            # need to use a helper function to hand different n_eog cases\n            samples, codebook_eog, prev_token, consec_silence_count = sample_helper(n_eog, logits, codebook_eog, top_k, top_p, temperature, prev_token, consec_silence_count, stop_repetition, silence_tokens, cur_num_gen)\n            cur_num_gen += 1\n            cur_generated.append(samples.squeeze(-1)) # [K,1] -> [K]\n            # get samples_emb\n            samples_emb = torch.stack([self.audio_embedding[k](samples[k]) for k in range(self.args.n_codebooks)], dim=0) # [K,1,D]\n            samples_emb = samples_emb.sum(dim=0,keepdim=True) # [1,1,D]\n\n            if sum(codebook_eog) == self.args.n_codebooks: # generation for the current span is done\n                # re-init\n                codebook_eog = [False] * self.args.n_codebooks\n                num_gen.append(cur_num_gen)\n                cur_num_gen = 0\n                generated.append(cur_generated)\n                cur_generated = []\n\n                # if the current mask span is the last span, then all done\n                # else\n                # append the next mask token and the four empty tokens to start the next generation \n                if len(more_mask_value) > 0:\n                    next_mask_ind = more_mask_value.pop(0)\n                    mask_emb = self.mask_embedding[next_mask_ind].unsqueeze(0).unsqueeze(0) # [1,1,D]\n                    assert mask_emb.shape == torch.Size((1,1,self.args.d_model)), mask_emb.shape\n                    empty_token = torch.LongTensor([self.args.empty_token]).to(y.device)\n                    empty_emb = torch.stack([\n                        self.audio_embedding[k](empty_token) for k in range(self.args.n_codebooks)], dim=0\n                    ).sum(dim=0, keepdim=True) # [1,1,D]\n                    assert empty_emb.shape == torch.Size((1,1,self.args.d_model)), empty_emb.shape\n                    extra_emb = torch.cat([mask_emb, empty_emb], dim=1) # [1,2,D]\n                    samples_emb = torch.cat([samples_emb, extra_emb], dim=1) # [1,3,D] # prev_last_token, mask_token, empty token\n                    assert samples_emb.shape == torch.Size((1,3,self.args.d_model)), f\"samples_emb.shape: {samples_emb.shape}\"\n                    ##################### silence repetition handling #####################\n                    ##################### silence repetition handling #####################\n                    consec_silence_count = 0\n                    prev_token = None\n                    ##################### silence repetition handling #####################\n                    ##################### silence repetition handling #####################\n\n                    # handling kv-caching for multi-span editing\n                    new_masked_span = True\n                else:\n                    break\n            else:\n                assert samples_emb.shape == torch.Size((1,1,self.args.d_model)), f\"samples_emb.shape: {samples_emb.shape}\"\n\n            embedded_y = torch.cat([embedded_y, samples_emb], dim=1)\n            # positional embedding\n            y_input = self.audio_positional_embedding(embedded_y) # [B T D]\n            # make attention mask and padding mask\n            y_attention_mask = torch.triu(torch.ones(y_input.shape[1], y_input.shape[1]), diagonal=1).bool().to(y.device)\n            new_y_lens = torch.LongTensor([y_input.shape[1]]).to(y.device)\n            y_padding_mask = torch.full((1,new_y_lens[0]), False).to(y.device)\n        \n        assert len(generated) == num_mask, f\"len(generated): {len(generated)}, num_mask: {num_mask}\"\n\n        # # combine non_masked_span with generated spans\n        # first need to shift the generated part back\n        flatten_gen = []\n        for l, orig_span in enumerate(generated):\n            span = torch.stack(orig_span, dim=0) # [T K]\n            span = span.transpose(1,0) # [K, T]\n            assert span.shape[0] == self.args.n_codebooks, span.shape\n            unshifted_span = []\n            for j, s in enumerate(span):\n                start_from = j\n                end_at = - (self.args.n_codebooks - start_from)\n                unshifted_span.append(s[start_from:end_at])\n            unshifted_span = torch.stack(unshifted_span, dim=0)\n\n            assert unshifted_span.shape[1] == num_gen[l] - self.args.n_codebooks, f\"len(unshifted_spans[0]): {len(unshifted_span[0])}, num_gen[l]: {num_gen[l]}\"\n            flatten_gen.append(unshifted_span)\n        # logging.info(f\"unshfited_span: {unshifted_span.shape}\")\n        # raise\n        assert len(non_mask_intervals[0]) - 1 == len(flatten_gen), f\"len(non_mask_intervals[0]): {len(non_mask_intervals[0])}, len(flatten_gen): {len(flatten_gen)}\"\n        res = []\n        for orig_interval, gen in zip(non_mask_intervals[0], flatten_gen):\n            res.append(y[0, :, orig_interval[0]:orig_interval[1]])\n            res.append(gen)\n        res.append(y[0, :, non_mask_intervals[0][-1][0]:non_mask_intervals[0][-1][1]])\n        res = torch.cat(res, dim=1).unsqueeze(0) # [K,new_T] -> [1, K, new_T]\n\n        expected_y_len = y_len - sum([item[1] - item[0] for item in mask_intervals[0]]) + sum([item - self.args.n_codebooks for item in num_gen])\n        assert res.shape == torch.Size((1, self.args.n_codebooks, expected_y_len)), f\"res.shape: {res.shape}, expected_y_len: {expected_y_len}. y_len - sum([item[1] - item[0] for item in mask_interval]) + sum([item - self.args.n_codebooks for item in num_gen]): {y_len}-{sum([item[1] - item[0] for item in mask_interval])} + {sum([item - self.args.n_codebooks for item in num_gen])}\"\n        \n        if self.args.special_first:\n            res = res - int(self.args.n_special)\n\n        return res\n\n    def inference_tts(\n        self,\n        x: torch.Tensor,\n        x_lens: torch.Tensor,\n        y: torch.Tensor,\n        top_k: int=-100,\n        top_p: float=1.0,\n        temperature: float=1.0,\n        stop_repetition: int=3,\n        kvcache: int=1,\n        silence_tokens: list[int]=[1388,1898,131],\n        *kargs\n    ) -> torch.Tensor:\n        \"\"\"\n        different from inference_tts, this implementation uses kvcache, which should have significant speed up\n        Args:\n          x:\n            A 2-D tensor of shape (1, L).\n          x_lens:\n            A 1-D tensor of shape (1,). It contains the number of tokens in `x`\n            before padding.\n          y:\n            A 3-D tensor of shape (1, T, K).\n          top_k: (`optional`) int\n            The number of highest probability tokens to keep for top-k-filtering. Default to -100.\n          top_p: (`optional`) float\n            For Neucleus sampling\n          temperature: (`optional`) float\n            The value used to module the next token probabilities. Must be strictly positive. Default to 1.0.\n        \"\"\"\n        eog_inference = self.args.eos if self.args.eos>0 else self.args.eog\n        assert x.ndim == 2, x.shape\n        assert x_lens.ndim == 1, x_lens.shape\n        assert y.ndim == 3, y.shape\n        if self.args.special_first:\n            y = y + int(self.args.n_special)\n        y = y.transpose(2,1) # [1,T,K] -> [1,K,T]\n        assert y.shape[0] == 1 and y.shape[1] == self.args.n_codebooks, y.shape # there is no padding\n\n        # make x attention mask and x_input\n        x_attention_mask = torch.triu(torch.ones(x.shape[1], x.shape[1]), diagonal=1).bool().to(x.device)\n        # x_attention_mask = torch.zeros(x.shape[1], x.shape[1]).bool().to(x.device)\n        x_input = self.text_embedding(x)\n        x_input = self.text_positional_embedding(x_input)\n\n        y_len = y.shape[2]\n        y_lens = torch.LongTensor([y_len]).to(y.device)\n\n        # rearrange y, we don't add eog to the end, this doesn't actually do anything in the tts scenario\n        rearranged_y = [[y[0]]]\n        assert rearranged_y[0][0].shape[0] == self.args.n_codebooks, rearranged_y[0][0].shape\n\n        # shift y to create the delayed pattern\n        shifted_y, patterns = self.shift(rearranged_y) # each element [K S], patterns is not used, as we directly use the original input y\n        assert shifted_y[0][0].shape[0] == self.args.n_codebooks, shifted_y[0][0].shape\n        assert len(shifted_y[0]) == 1, len(shifted_y[0])\n\n        # below is different from forward or inference\n        # where we cut this shifted part \n        shifted_y[0][0] = shifted_y[0][0][:, :-(self.args.n_codebooks-1)]\n        assert not (shifted_y[0][0][self.args.n_codebooks:] == self.args.empty_token).any() and not (shifted_y[0][0][self.args.n_codebooks:] == self.args.eog).any(), shifted_y[0][0]\n\n        # next section in inference is insert mask at the intersection of each tensor in a sample, but we don't need to do that \n        # next section is concate tensors of each sample to one tensor, which we also don't need\n        cated_y = shifted_y[0][0].unsqueeze(-1) #[K,S]->[K,S,B]\n        new_y_lens = torch.LongTensor([cated_y.shape[1]]).to(cated_y.device)\n        assert cated_y.shape == torch.Size((self.args.n_codebooks, cated_y.shape[1], 1))\n        assert not (cated_y == self.args.audio_pad_token).any(), cated_y\n\n        # replace tokens in y with the embeddings, add sum codebooks up\n        embedded_y = torch.stack([self.audio_embedding[k](cated_y[k]) for k in range(self.args.n_codebooks)], dim=0) # [K, S, B, D]\n        assert embedded_y.shape[0] == self.args.n_codebooks, embedded_y.shape\n        assert embedded_y.shape[-1] == self.args.d_model, embedded_y.shape\n        embedded_y = embedded_y.sum(dim=0) # [K,S,B,D]->[S,B,D]\n        embedded_y = embedded_y.transpose(1,0) # [S,B,D]->[B,S,D]\n        \n        # positional embedding\n        y_input = self.audio_positional_embedding(embedded_y)\n\n        # make attention mask and padding mask\n        y_attention_mask = torch.triu(torch.ones(y_input.shape[1], y_input.shape[1]), diagonal=1).bool().to(y.device)\n\n        x_padding_mask = torch.full((1,x_lens[0]), False).to(x.device)\n        y_padding_mask = torch.full((1,new_y_lens[0]), False).to(y.device)\n\n        # entering the generation stage\n        # starting from line 708\n        codebook_eog = [False] * self.args.n_codebooks\n        generated = [] # doesn't contain any empty token, contain eog\n        cur_generated = []\n        # say 0 is empty, 4 is eog\n        # tensor([[ 1,  2,  3,  4,  0,  0],\n        #         [ 0,  1,  2,  3,  4,  0],\n        #         [ 0,  0,  1,  2,  3,  4]])\n        num_gen = []\n        cur_num_gen = 0\n        ##################### silence repetition handling #####################\n        ##################### silence repetition handling #####################\n        logging.info(f\"silence tokens: {silence_tokens}, note that if you are not using the pretrained encodec 6f79c6a8, make sure you specified it yourself, rather than using the default\")\n        consec_silence_count = 0\n        prev_token = None\n        ##################### silence repetition handling #####################\n        ##################### silence repetition handling #####################\n\n        # prepare the cache placeholder\n        # n_layers, 2, bsz, num_heads, src_len, head_dim\n        past = torch.ones([self.args.num_decoder_layers, 2, x.shape[0]], device=x.device, dtype=torch.float32) if kvcache else None\n        # logging.info(f\"number of decoder layers: {self.args.num_decoder_layers}\")\n        # logging.info(f\"number of decoder layers: {self.args.num_decoder_layers}\")\n        # logging.info(f\"number of decoder layers: {self.args.num_decoder_layers}\")\n        def sample_helper(n_eog, logits, codebook_eog, top_k, top_p, temperature, prev_token, consec_silence_count, stop_repetition, silence_tokens, cur_num_gen):\n            if n_eog == 0:\n                logits_adjust = logits\n                for jj in range(1,self.args.n_codebooks):\n                    logits_adjust[jj][eog_inference] = -10000\n                    logits_adjust[jj][self.args.empty_token] = -10000\n                if cur_num_gen <= self.args.encodec_sr // 5: # this shouldn't happen, but just in case the model stopped too early\n                    logits_adjust[0][eog_inference] = -10000\n                ##################### silence repetition handling #####################\n                if stop_repetition > 0 and prev_token in silence_tokens and consec_silence_count > stop_repetition:\n                    if logits_adjust[0, prev_token] < 0:\n                        logits_adjust[0, prev_token] = logits_adjust[0, prev_token] * (consec_silence_count - (stop_repetition-1))\n                    else:\n                        logits_adjust[0, prev_token] = logits_adjust[0, prev_token] / (consec_silence_count - (stop_repetition-1))\n                ##################### silence repetition handling #####################\n                samples = topk_sampling(\n                        logits_adjust, top_k=top_k, top_p=top_p, temperature=temperature\n                    ) # [K, 1]\n                assert samples.shape == torch.Size((self.args.n_codebooks, 1)), f\"samples.shape: {samples.shape}\"\n                if cur_num_gen < self.args.n_codebooks-1:\n                    for jj in range(1, self.args.n_codebooks - cur_num_gen):\n                        samples[-jj, 0] = self.args.empty_token\n\n                if (\n                    samples[0,0] == eog_inference or torch.argmax(logits[0], dim=-1) == eog_inference or y_input.shape[1] > x_lens[0] * (self.args.encodec_sr//5)\n                ): # last one means y is already too long, shouldn't happen, but put it here\n                    samples[0,0] = eog_inference\n                    codebook_eog[0] = True\n                ##################### silence repetition handling #####################\n                if samples[0,0] in silence_tokens and samples[0,0] == prev_token:\n                    consec_silence_count += 1\n                else:\n                    consec_silence_count = 0\n                prev_token = samples[0,0]\n                ##################### silence repetition handling #####################\n                return samples, codebook_eog, prev_token, consec_silence_count\n            else:\n                assert sum(codebook_eog[i] for i in range(n_eog)) == n_eog, f\"codebook_eog: {codebook_eog}, but n_eog: {n_eog}\"\n                logits_adjust = logits\n                for jj in range(n_eog+1,self.args.n_codebooks):\n                    logits_adjust[jj][eog_inference] = -10000\n                    logits_adjust[jj][self.args.empty_token] = -10000\n                samples = topk_sampling(\n                        logits_adjust, top_k=top_k, top_p=top_p, temperature=temperature\n                    ) # [K, 1]\n                for jj in range(n_eog):\n                    samples[jj, 0] = self.args.empty_token\n                samples[n_eog, 0] = eog_inference\n                codebook_eog[n_eog] = True\n                return samples, codebook_eog, prev_token, consec_silence_count\n        while True:\n            y_out, present = self.dec_forward(\n                            x_input, \n                            x_lens,\n                            x_attention_mask,\n                            x_padding_mask,\n                            y_input,\n                            new_y_lens,\n                            y_attention_mask,\n                            y_padding_mask,\n                            past=past\n                        )\n            if past != None:\n                past = torch.cat([past, present.to(past.dtype)], dim=-2) if past.ndim > 3 else present.to(past.dtype)\n\n\n            y_out = y_out[:, -1:] # only take the last token\n            logits = torch.stack([self.predict_layer[i](y_out) for i in range(self.args.n_codebooks)], dim=1) # [B K S card], B==S==1, so [1 K 1 card]\n            logits = logits.squeeze(0).squeeze(1) # [K card]\n            assert logits.shape == torch.Size((self.args.n_codebooks, self.n_audio_tokens[0])), f\"{logits.shape}\"\n\n            n_eog = sum(codebook_eog)\n            assert n_eog < self.args.n_codebooks\n            if self.args.eos > 0: # if we are using end-of-sentence token (which is used by default), eog shouldn't be used here, as there is no masked spans\n                for jj in range(self.args.n_codebooks):\n                    logits[jj][self.args.eog] = -10000.\n            \n            samples, codebook_eog, prev_token, consec_silence_count = sample_helper(n_eog, logits, codebook_eog, top_k, top_p, temperature, prev_token, consec_silence_count, stop_repetition, silence_tokens, cur_num_gen)\n            \n            cur_num_gen += 1\n            cur_generated.append(samples.squeeze(-1)) # [K,1] -> [K]\n\n            # samples.shape is [K,1]\n            # ge samples_emb\n            samples_emb = torch.stack([self.audio_embedding[k](samples[k]) for k in range(self.args.n_codebooks)], dim=0) # [K,1,D]\n            samples_emb = samples_emb.sum(dim=0,keepdim=True) # [1,1,D]\n\n            if sum(codebook_eog) == self.args.n_codebooks: # generation for the current span is done\n                codebook_eog = [False] * self.args.n_codebooks\n                num_gen.append(cur_num_gen)\n                cur_num_gen = 0\n                generated.append(cur_generated)\n                cur_generated = []\n                break\n            else:\n                assert samples_emb.shape == torch.Size((1,1,self.args.d_model)), f\"samples_emb.shape: {samples_emb.shape}\"\n            \n            embedded_y = torch.cat([embedded_y, samples_emb], dim=1)\n            y_input = self.audio_positional_embedding(embedded_y) # [B T D]\n            # make attention mask and padding mask\n            y_attention_mask = torch.triu(torch.ones(y_input.shape[1], y_input.shape[1]), diagonal=1).bool().to(y.device)\n            new_y_lens = torch.LongTensor([y_input.shape[1]]).to(y.device)\n            y_padding_mask = torch.full((1,new_y_lens[0]), False).to(y.device)\n        \n        assert len(generated) == 1, f\"len(generated): {len(generated)}\"\n\n        # revert the pattern\n        flatten_gen = []\n        for l, orig_span in enumerate(generated):\n            span = torch.stack(orig_span, dim=0) # [T, K]\n            span = span.transpose(1,0) # [K, T]\n            assert span.shape[0] == self.args.n_codebooks, span.shape\n            unshifted_span = []\n            for j, s in enumerate(span):\n                start_from = j\n                end_at = - (self.args.n_codebooks - start_from)\n                unshifted_span.append(s[start_from:end_at])\n            unshifted_span = torch.stack(unshifted_span, dim=0)\n\n            assert unshifted_span.shape[1] == num_gen[l] - self.args.n_codebooks, f\"len(unshifted_spans[0]): {len(unshifted_span[0])}, num_gen[l]: {num_gen[l]}\"\n\n            flatten_gen.append(unshifted_span)\n        assert len(flatten_gen) == 1, len(flatten_gen)\n        \n        # combine \n        res = [y[0], flatten_gen[0]]\n        res = torch.cat(res, dim=1).unsqueeze(0) # [K, new_t] -> [1, K, new_T]\n\n        expected_y_len = y_len + sum([item - self.args.n_codebooks for item in num_gen])\n        assert res.shape == torch.Size((1, self.args.n_codebooks, expected_y_len)), f\"res.shape: {res.shape}, expected_y_len: {expected_y_len}. y_len + sum([item - self.args.n_codebooks for item in num_gen]): {y_len} + {sum([item - self.args.n_codebooks for item in num_gen])}\"\n\n        if self.args.special_first:\n            res = res - int(self.args.n_special)\n            flatten_gen = flatten_gen - int(self.args.n_special)\n\n        return res, flatten_gen[0].unsqueeze(0)\n\n\n    def inference_tts_batch(\n        self,\n        x: torch.Tensor,\n        x_lens: torch.Tensor,\n        y: torch.Tensor,\n        top_k: int=-100,\n        top_p: float=1.0,\n        temperature: float=1.0,\n        stop_repetition: int=3,\n        kvcache: int=1,\n        batch_size: int=5,\n        silence_tokens: list[int]=[1388,1898,131],\n        *kargs\n    ) -> torch.Tensor:\n        \"\"\"\n        have a batch size when forward passing, but they are equivalant to same example but different random seed, therefore as long as one example generated eog, we can drop all other samlpes\n        different from inference_tts, this implementation uses kvcache, which should have significant speed up\n        Args:\n          x:\n            A 2-D tensor of shape (1, L).\n          x_lens:\n            A 1-D tensor of shape (1,). It contains the number of tokens in `x`\n            before padding.\n          y:\n            A 3-D tensor of shape (1, T, K).\n          top_k: (`optional`) int\n            The number of highest probability tokens to keep for top-k-filtering. Default to -100.\n          top_p: (`optional`) float\n            For Neucleus sampling\n          temperature: (`optional`) float\n            The value used to module the next token probabilities. Must be strictly positive. Default to 1.0.\n        \"\"\"\n        eog_inference = self.args.eos if self.args.eos>0 else self.args.eog\n        assert x.ndim == 2, x.shape\n        assert x_lens.ndim == 1, x_lens.shape\n        assert y.ndim == 3, y.shape\n        if self.args.special_first:\n            y = y + int(self.args.n_special)\n        y = y.transpose(2,1) # [1,T,K] -> [1,K,T]\n        assert y.shape[0] == 1 and y.shape[1] == self.args.n_codebooks, y.shape # there is no padding\n\n        # make x attention mask and x_input\n        x_attention_mask = torch.triu(torch.ones(x.shape[1], x.shape[1]), diagonal=1).bool().to(x.device)\n        # x_attention_mask = torch.zeros(x.shape[1], x.shape[1]).bool().to(x.device)\n        x_input = self.text_embedding(x)\n        x_input = self.text_positional_embedding(x_input)\n\n        y_len = y.shape[2]\n        y_lens = torch.LongTensor([y_len]).to(y.device)\n\n        # rearrange y, we don't add eog to the end, this doesn't actually do anything in the tts scenario\n        rearranged_y = [[y[0]]]\n        assert rearranged_y[0][0].shape[0] == self.args.n_codebooks, rearranged_y[0][0].shape\n\n        # shift y to create the delayed pattern\n        shifted_y, patterns = self.shift(rearranged_y) # each element [K S], patterns is not used, as we directly use the original input y\n        assert shifted_y[0][0].shape[0] == self.args.n_codebooks, shifted_y[0][0].shape\n        assert len(shifted_y[0]) == 1, len(shifted_y[0])\n\n        # below is different from forward or inference\n        # where we cut this shifted part \n        shifted_y[0][0] = shifted_y[0][0][:, :-(self.args.n_codebooks-1)]\n        assert not (shifted_y[0][0][self.args.n_codebooks:] == self.args.empty_token).any() and not (shifted_y[0][0][self.args.n_codebooks:] == self.args.eog).any(), shifted_y[0][0]\n\n        # next section in inference is insert mask at the intersection of each tensor in a sample, but we don't need to do that \n        # next section is concate tensors of each sample to one tensor, which we also don't need\n        cated_y = shifted_y[0][0].unsqueeze(-1) #[K,S]->[K,S,B]\n        new_y_lens = torch.LongTensor([cated_y.shape[1]]).to(cated_y.device)\n        assert cated_y.shape == torch.Size((self.args.n_codebooks, cated_y.shape[1], 1))\n        assert not (cated_y == self.args.audio_pad_token).any(), cated_y\n\n        # replace tokens in y with the embeddings, add sum codebooks up\n        embedded_y = torch.stack([self.audio_embedding[k](cated_y[k]) for k in range(self.args.n_codebooks)], dim=0) # [K, S, B, D]\n        assert embedded_y.shape[0] == self.args.n_codebooks, embedded_y.shape\n        assert embedded_y.shape[-1] == self.args.d_model, embedded_y.shape\n        embedded_y = embedded_y.sum(dim=0) # [K,S,B,D]->[S,B,D]\n        embedded_y = embedded_y.transpose(1,0) # [S,B,D]->[B,S,D]\n        \n        # positional embedding\n        y_input = self.audio_positional_embedding(embedded_y)\n\n        # make attention mask and padding mask\n        y_attention_mask = torch.triu(torch.ones(y_input.shape[1], y_input.shape[1]), diagonal=1).bool().to(y.device)\n\n        x_padding_mask = torch.full((1,x_lens[0]), False).to(x.device)\n        y_padding_mask = torch.full((1,new_y_lens[0]), False).to(y.device)\n\n        # entering the generation stage\n        # starting from line 708\n        codebook_eog = [False] * self.args.n_codebooks\n        generated = [] # doesn't contain any empty token, contain eog\n        cur_generated = [[] for _ in range(batch_size)]\n        # say 0 is empty, 4 is eog\n        # tensor([[ 1,  2,  3,  4,  0,  0],\n        #         [ 0,  1,  2,  3,  4,  0],\n        #         [ 0,  0,  1,  2,  3,  4]])\n        num_gen = []\n        cur_num_gen = 0\n        ##################### silence repetition handling #####################\n        ##################### silence repetition handling #####################\n        logging.info(f\"silence tokens: {silence_tokens}, note that if you are not using the pretrained encodec 6f79c6a8, make sure you specified it yourself, rather than using the default\")\n        consec_silence_counts = [0 for _ in range(batch_size)]\n        prev_tokens = [None for _ in range(batch_size)]\n        ##################### silence repetition handling #####################\n        ##################### silence repetition handling #####################\n\n        # prepare the cache placeholder\n        # n_layers, 2, bsz, num_heads, src_len, head_dim\n        past = torch.ones([self.args.num_decoder_layers, 2, x.shape[0]], device=x.device, dtype=torch.float32) if kvcache else None\n        # logging.info(f\"number of decoder layers: {self.args.num_decoder_layers}\")\n        # logging.info(f\"number of decoder layers: {self.args.num_decoder_layers}\")\n        # logging.info(f\"number of decoder layers: {self.args.num_decoder_layers}\")\n        keep = None # NOTE: this very important, tells which sample to keep\n        def sample_helper(n_eog, logits, codebook_eog, top_k, top_p, temperature, prev_tokens, consec_silence_counts, stop_repetition, silence_tokens, cur_num_gen, keep):\n            if n_eog == 0:\n                logits_adjust = logits\n                for jj in range(1,self.args.n_codebooks):\n                    logits_adjust[:,jj,eog_inference] = -10000\n                    logits_adjust[:,jj,self.args.empty_token] = -10000\n                if cur_num_gen <= self.args.encodec_sr // 5: # this shouldn't happen, but just in case the model stopped too early\n                    logits_adjust[:,:,eog_inference] = -10000\n                ##################### silence repetition handling #####################\n                for b in range(batch_size):\n                    prev_token = prev_tokens[b]\n                    consec_silence_count = consec_silence_counts[b]\n                    if stop_repetition > 0 and prev_token in silence_tokens and consec_silence_count > stop_repetition:\n                        if logits_adjust[b, 0, prev_token] < 0:\n                            logits_adjust[b, 0, prev_token] = logits_adjust[b, 0, prev_token] * (consec_silence_count - (stop_repetition-1))\n                        else:\n                            logits_adjust[b, 0, prev_token] = logits_adjust[b, 0, prev_token] / (consec_silence_count - (stop_repetition-1))\n                ##################### silence repetition handling #####################\n                samples = topk_sampling(\n                        logits_adjust.reshape(batch_size * self.args.n_codebooks, logits_adjust.shape[-1]), top_k=top_k, top_p=top_p, temperature=temperature\n                    ) # [B*K, 1]\n                samples = samples.reshape(batch_size, self.args.n_codebooks, 1)\n                assert samples.shape == torch.Size((batch_size, self.args.n_codebooks, 1)), f\"samples.shape: {samples.shape}\"\n                for b in range(batch_size):\n                    if cur_num_gen < self.args.n_codebooks-1:\n                        for jj in range(1, self.args.n_codebooks - cur_num_gen):\n                            samples[b, -jj, 0] = self.args.empty_token\n\n                    if (\n                        samples[b,0,0] == eog_inference or torch.argmax(logits[b,0], dim=-1) == eog_inference or y_input.shape[1] > x_lens[b] * (self.args.encodec_sr//5)\n                    ): # last one means y is already too long, shouldn't happen, but put it here\n                        samples[b,0,0] = eog_inference\n                        codebook_eog[0] = True\n                        keep = b # NOTE keep is a very important variable, we only return this one, note that if eog shows up in two samples, keep will be overwritten by the later one (or the last one)\n                    ##################### silence repetition handling #####################\n                    if samples[b,0,0] in silence_tokens and samples[b,0,0] == prev_tokens[b]:\n                        consec_silence_counts[b] += 1\n                    else:\n                        consec_silence_counts[b] = 0\n                    prev_tokens[b] = samples[b,0,0]\n                ##################### silence repetition handling #####################\n                return samples, codebook_eog, prev_tokens, consec_silence_counts, keep\n            else:\n                assert sum(codebook_eog[i] for i in range(n_eog)) == n_eog, f\"codebook_eog: {codebook_eog}, but n_eog: {n_eog}\"\n                logits_adjust = logits\n                for jj in range(n_eog+1,self.args.n_codebooks):\n                    logits_adjust[:,jj,eog_inference] = -10000\n                    logits_adjust[:,jj,self.args.empty_token] = -10000\n                samples = topk_sampling(\n                        logits_adjust.reshape(batch_size * self.args.n_codebooks, logits_adjust.shape[-1]), top_k=top_k, top_p=top_p, temperature=temperature\n                    ) # [B, K, 1]\n                samples = samples.reshape(batch_size, self.args.n_codebooks, 1)\n                for jj in range(n_eog):\n                    samples[keep, jj, 0] = self.args.empty_token\n                samples[keep, n_eog, 0] = eog_inference\n                codebook_eog[n_eog] = True\n                return samples, codebook_eog, prev_tokens, consec_silence_counts, keep\n        while True:\n            # if cur_num_gen > 0, should have everything in kvcache, so only pass in the last token\n            # in the first generation step, we repeat each tensor to make their first dimension of length the batch size \n            if cur_num_gen == 0:\n                assert x_input.ndim == 3 and x_input.shape[0] == 1, x_input.shape\n                assert x_padding_mask.ndim == 2 and x_padding_mask.shape[0] == 1, x_padding_mask.shape\n                assert y_input.ndim == 3 and y_input.shape[0] == 1 and y_input.shape[1] == new_y_lens[0], y_input.shape\n                assert embedded_y.ndim == 3 and embedded_y.shape[0] == 1 and embedded_y.shape[1] == new_y_lens[0], embedded_y.shape\n                x_input = x_input.repeat(batch_size, 1, 1)\n                x_lens = x_lens.repeat(batch_size)\n                # x_attention_mask = x_attention_mask.repeat(batch_size, 1, 1) # no need to work with attention mask, it doesn't contain batch dimension\n                x_padding_mask = x_padding_mask.repeat(batch_size, 1)\n                y_input = y_input.repeat(batch_size, 1, 1)\n                new_y_lens = new_y_lens.repeat(batch_size)\n                # y_attention_mask = y_attention_mask.repeat(batch_size, 1, 1) # no need to work with attention mask, it doesn't contain batch dimension\n                y_padding_mask = y_padding_mask.repeat(batch_size, 1)\n                embedded_y = embedded_y.repeat(batch_size, 1, 1) # will be used to concat with newly generated token embedding\n                past = past.repeat(1, 1, batch_size) if past != None else None\n            else:\n                assert x_input.shape[0] == batch_size and x_padding_mask.shape[0] == batch_size and y_input.shape[0] == batch_size and new_y_lens.shape[0] == batch_size, f\"x_input.shape: {x_input.shape}, x_padding_mask.shape: {x_padding_mask.shape}, y_input.shape: {y_input.shape}, new_y_lens.shape: {new_y_lens.shape}\"\n            y_out, present = self.dec_forward(\n                            x_input, \n                            x_lens,\n                            x_attention_mask,\n                            x_padding_mask,\n                            y_input,\n                            new_y_lens,\n                            y_attention_mask,\n                            y_padding_mask,\n                            past=past\n                        )\n            if past != None:\n                past = torch.cat([past, present.to(past.dtype)], dim=-2) if past.ndim > 3 else present.to(past.dtype)\n\n            # if no eog emerges, y_out should have batch size of batch_size\n            if sum(codebook_eog) == 0:\n                assert y_out.shape[0] == batch_size and y_out.ndim == 3, y_out.shape\n            y_out = y_out[:, -1:] # only take the last token\n            logits = torch.stack([self.predict_layer[i](y_out) for i in range(self.args.n_codebooks)], dim=1) # [B K S card], S==1, so [B K 1 card]\n            logits = logits.squeeze(2) # [B K card]\n            assert logits.shape == torch.Size((batch_size, self.args.n_codebooks, self.n_audio_tokens[0])), f\"{logits.shape}\"\n\n            n_eog = sum(codebook_eog)\n            if self.args.eos > 0:\n                for jj in range(self.args.n_codebooks):\n                    logits[:,jj,self.args.eog] = -10000.\n            samples, codebook_eog, prev_tokens, consec_silence_counts, keep = sample_helper(n_eog, logits, codebook_eog, top_k, top_p, temperature, prev_tokens, consec_silence_counts, stop_repetition, silence_tokens, cur_num_gen, keep)\n            \n            cur_num_gen += 1\n            if sum(codebook_eog) == 0: # no eog yet, keep batch_size of samples\n                assert keep == None\n                for b in range(batch_size):\n                    cur_generated[b].append(samples[b].squeeze(-1))\n            elif sum(codebook_eog) == 1: # the first eog just showed up in this step\n                assert keep != None\n                cur_generated = cur_generated[keep]\n                cur_generated.append(samples[keep].squeeze(-1))\n            else: # we are generating the rest eogs for the 'keep' sample \n                cur_generated.append(samples[keep].squeeze(-1))\n\n            # samples.shape is [K,1]\n            # ge samples_emb\n            samples_emb = torch.stack([self.audio_embedding[k](samples[:, k]) for k in range(self.args.n_codebooks)], dim=1) # [B, K,1,D]\n            assert samples_emb.shape == torch.Size([batch_size, self.args.n_codebooks, 1, self.args.d_model])\n            samples_emb = samples_emb.sum(dim=1,keepdim=False) # [B,1,D]\n            if sum(codebook_eog) == self.args.n_codebooks: # generation for the current span is done\n                codebook_eog = [False] * self.args.n_codebooks\n                num_gen.append(cur_num_gen)\n                cur_num_gen = 0\n                generated.append(cur_generated)\n                cur_generated = [[] for _ in range(batch_size)]\n                break\n            else:\n                assert samples_emb.shape == torch.Size((batch_size,1,self.args.d_model)), f\"samples_emb.shape: {samples_emb.shape}\"\n            \n            embedded_y = torch.cat([embedded_y, samples_emb], dim=1)\n            y_input = self.audio_positional_embedding(embedded_y) # [B T D]\n            # make attention mask and padding mask\n            y_attention_mask = torch.triu(torch.ones(y_input.shape[1], y_input.shape[1]), diagonal=1).bool().to(y.device)\n            new_y_lens = torch.LongTensor([y_input.shape[1]]).to(y.device).repeat(batch_size)\n            y_padding_mask = torch.full((batch_size,new_y_lens[0]), False).to(y.device)\n        \n        assert len(generated) == 1, f\"len(generated): {len(generated)}\"\n\n        # revert the pattern\n        flatten_gen = []\n        for l, orig_span in enumerate(generated):\n            span = torch.stack(orig_span, dim=0) # [T, K]\n            span = span.transpose(1,0) # [K, T]\n            assert span.shape[0] == self.args.n_codebooks, span.shape\n            unshifted_span = []\n            for j, s in enumerate(span):\n                start_from = j\n                end_at = - (self.args.n_codebooks - start_from)\n                unshifted_span.append(s[start_from:end_at])\n            unshifted_span = torch.stack(unshifted_span, dim=0)\n\n            assert unshifted_span.shape[1] == num_gen[l] - self.args.n_codebooks, f\"len(unshifted_spans[0]): {len(unshifted_span[0])}, num_gen[l]: {num_gen[l]}\"\n\n            flatten_gen.append(unshifted_span)\n        assert len(flatten_gen) == 1, len(flatten_gen)\n        \n        # combine \n        res = [y[0], flatten_gen[0]]\n        res = torch.cat(res, dim=1).unsqueeze(0) # [K, new_t] -> [1, K, new_T]\n\n        expected_y_len = y_len + sum([item - self.args.n_codebooks for item in num_gen])\n        assert res.shape == torch.Size((1, self.args.n_codebooks, expected_y_len)), f\"res.shape: {res.shape}, expected_y_len: {expected_y_len}. y_len + sum([item - self.args.n_codebooks for item in num_gen]): {y_len} + {sum([item - self.args.n_codebooks for item in num_gen])}\"\n\n        if self.args.special_first:\n            res = res - int(self.args.n_special)\n            flatten_gen = flatten_gen - int(self.args.n_special)\n\n        return res, flatten_gen[0].unsqueeze(0)\n"
  },
  {
    "path": "predict.py",
    "content": "# Prediction interface for Cog ⚙️\n# https://github.com/replicate/cog/blob/main/docs/python.md\n\nimport os\nimport time\nimport random\nimport getpass\nimport shutil\nimport subprocess\nimport torch\nimport numpy as np\nimport torchaudio\nfrom cog import BasePredictor, Input, Path, BaseModel\n\nos.environ[\"USER\"] = getpass.getuser()\n\nfrom data.tokenizer import (\n    AudioTokenizer,\n    TextTokenizer,\n)\nfrom models import voicecraft\nfrom inference_tts_scale import inference_one_sample\nfrom edit_utils import get_span\nfrom inference_speech_editing_scale import (\n    inference_one_sample as inference_one_sample_editing,\n)\n\n\nMODEL_URL = \"https://weights.replicate.delivery/default/pyp1/VoiceCraft-models.tar\"  # all the models are cached and uploaded to replicate.delivery for faster booting\nMODEL_CACHE = \"model_cache\"\n\n\nclass ModelOutput(BaseModel):\n    whisper_transcript_orig_audio: str\n    generated_audio: Path\n\n\nclass WhisperxAlignModel:\n    def __init__(self):\n        from whisperx import load_align_model\n\n        self.model, self.metadata = load_align_model(\n            language_code=\"en\", device=\"cuda:0\"\n        )\n\n    def align(self, segments, audio_path):\n        from whisperx import align, load_audio\n\n        audio = load_audio(audio_path)\n        return align(\n            segments,\n            self.model,\n            self.metadata,\n            audio,\n            device=\"cuda:0\",\n            return_char_alignments=False,\n        )[\"segments\"]\n\n\nclass WhisperxModel:\n    def __init__(self, model_name, align_model: WhisperxAlignModel, device=\"cuda\"):\n        from whisperx import load_model\n\n        # the model weights are cached from Systran/faster-whisper-base.en etc\n        self.model = load_model(\n            model_name,\n            device,\n            asr_options={\n                \"suppress_numerals\": True,\n                \"max_new_tokens\": None,\n                \"clip_timestamps\": None,\n                \"hallucination_silence_threshold\": None,\n            },\n        )\n        self.align_model = align_model\n\n    def transcribe(self, audio_path):\n        segments = self.model.transcribe(audio_path, language=\"en\", batch_size=8)[\n            \"segments\"\n        ]\n        return self.align_model.align(segments, audio_path)\n\n\ndef download_weights(url, dest):\n    start = time.time()\n    print(\"downloading url: \", url)\n    print(\"downloading to: \", dest)\n    subprocess.check_call([\"pget\", \"-x\", url, dest], close_fds=False)\n    print(\"downloading took: \", time.time() - start)\n\n\nclass Predictor(BasePredictor):\n    def setup(self):\n        \"\"\"Load the model into memory to make running multiple predictions efficient\"\"\"\n        self.device = \"cuda\"\n\n        if not os.path.exists(MODEL_CACHE):\n            download_weights(MODEL_URL, MODEL_CACHE)\n\n        encodec_fn = f\"{MODEL_CACHE}/encodec_4cb2048_giga.th\"\n        self.models, self.ckpt, self.phn2num = {}, {}, {}\n        for voicecraft_name in [\n            \"giga830M.pth\",\n            \"giga330M.pth\",\n            \"gigaHalfLibri330M_TTSEnhanced_max16s.pth\",\n        ]:\n            ckpt_fn = f\"{MODEL_CACHE}/{voicecraft_name}\"\n\n            self.ckpt[voicecraft_name] = torch.load(ckpt_fn, map_location=\"cpu\")\n            self.models[voicecraft_name] = voicecraft.VoiceCraft(\n                self.ckpt[voicecraft_name][\"config\"]\n            )\n            self.models[voicecraft_name].load_state_dict(\n                self.ckpt[voicecraft_name][\"model\"]\n            )\n            self.models[voicecraft_name].to(self.device)\n            self.models[voicecraft_name].eval()\n\n            self.phn2num[voicecraft_name] = self.ckpt[voicecraft_name][\"phn2num\"]\n\n        self.text_tokenizer = TextTokenizer(backend=\"espeak\")\n        self.audio_tokenizer = AudioTokenizer(signature=encodec_fn, device=self.device)\n\n        align_model = WhisperxAlignModel()\n        self.transcribe_models = {\n            k: WhisperxModel(f\"{MODEL_CACHE}/whisperx_{k.split('.')[0]}\", align_model)\n            for k in [\"base.en\", \"small.en\", \"medium.en\"]\n        }\n\n    def predict(\n        self,\n        task: str = Input(\n            description=\"Choose a task\",\n            choices=[\n                \"speech_editing-substitution\",\n                \"speech_editing-insertion\",\n                \"speech_editing-deletion\",\n                \"zero-shot text-to-speech\",\n            ],\n            default=\"zero-shot text-to-speech\",\n        ),\n        voicecraft_model: str = Input(\n            description=\"Choose a model\",\n            choices=[\"giga830M.pth\", \"giga330M.pth\", \"giga330M_TTSEnhanced.pth\"],\n            default=\"giga330M_TTSEnhanced.pth\",\n        ),\n        orig_audio: Path = Input(description=\"Original audio file\"),\n        orig_transcript: str = Input(\n            description=\"Optionally provide the transcript of the input audio. Leave it blank to use the WhisperX model below to generate the transcript. Inaccurate transcription may lead to error TTS or speech editing\",\n            default=\"\",\n        ),\n        whisperx_model: str = Input(\n            description=\"If orig_transcript is not provided above, choose a WhisperX model for generating the transcript. Inaccurate transcription may lead to error TTS or speech editing. You can modify the generated transcript and provide it directly to orig_transcript above\",\n            choices=[\n                \"base.en\",\n                \"small.en\",\n                \"medium.en\",\n            ],\n            default=\"base.en\",\n        ),\n        target_transcript: str = Input(\n            description=\"Transcript of the target audio file\",\n        ),\n        cut_off_sec: float = Input(\n            description=\"Only used for for zero-shot text-to-speech task. The first seconds of the original audio that are used for zero-shot text-to-speech. 3 sec of reference is generally enough for high quality voice cloning, but longer is generally better, try e.g. 3~6 sec\",\n            default=3.01,\n        ),\n        kvcache: int = Input(\n            description=\"Set to 0 to use less VRAM, but with slower inference\",\n            choices=[0, 1],\n            default=1,\n        ),\n        left_margin: float = Input(\n            description=\"Margin to the left of the editing segment\",\n            default=0.08,\n        ),\n        right_margin: float = Input(\n            description=\"Margin to the right of the editing segment\",\n            default=0.08,\n        ),\n        temperature: float = Input(\n            description=\"Adjusts randomness of outputs, greater than 1 is random and 0 is deterministic. Do not recommend to change\",\n            default=1,\n        ),\n        top_p: float = Input(\n            description=\"Default value for TTS is 0.9, and 0.8 for speech editing\",\n            default=1,\n        ),\n        stop_repetition: int = Input(\n            default=3,\n            description=\"Default value for TTS is 3, and -1 for speech editing. -1 means do not adjust prob of silence tokens. if there are long silence or unnaturally stretched words, increase sample_batch_size to 2, 3 or even 4\",\n        ),\n        sample_batch_size: int = Input(\n            description=\"Default value for TTS is 4, and 1 for speech editing. The higher the number, the faster the output will be. Under the hood, the model will generate this many samples and choose the shortest one\",\n            default=4,\n        ),\n        seed: int = Input(\n            description=\"Random seed. Leave blank to randomize the seed\", default=None\n        ),\n    ) -> ModelOutput:\n        \"\"\"Run a single prediction on the model\"\"\"\n\n        if seed is None:\n            seed = int.from_bytes(os.urandom(2), \"big\")\n        print(f\"Using seed: {seed}\")\n\n        seed_everything(seed)\n\n        segments = self.transcribe_models[whisperx_model].transcribe(\n            str(orig_audio)\n        )\n\n        state = get_transcribe_state(segments)\n\n        whisper_transcript = state[\"transcript\"].strip()\n\n        if len(orig_transcript.strip()) == 0:\n            orig_transcript = whisper_transcript\n\n        print(f\"The transcript from the Whisper model: {whisper_transcript}\")\n\n        temp_folder = \"exp_dir\"\n        if os.path.exists(temp_folder):\n            shutil.rmtree(temp_folder)\n\n        os.makedirs(temp_folder)\n\n        filename = \"orig_audio\"\n        audio_fn = str(orig_audio)\n\n        info = torchaudio.info(audio_fn)\n        audio_dur = info.num_frames / info.sample_rate\n\n        # hyperparameters for inference\n        codec_audio_sr = 16000\n        codec_sr = 50\n        top_k = 40\n        silence_tokens = [1388, 1898, 131]\n\n        if voicecraft_model == \"giga330M_TTSEnhanced.pth\":\n            voicecraft_model = \"gigaHalfLibri330M_TTSEnhanced_max16s.pth\"\n\n        if task == \"zero-shot text-to-speech\":\n            assert (\n                cut_off_sec < audio_dur\n            ), f\"cut_off_sec {cut_off_sec} is larger than the audio duration {audio_dur}\"\n            prompt_end_frame = int(cut_off_sec * info.sample_rate)\n\n            idx = find_closest_cut_off_word(state[\"word_bounds\"], cut_off_sec)\n            orig_transcript_until_cutoff_time = \" \".join(\n                [word_bound[\"word\"] for word_bound in state[\"word_bounds\"][: idx + 1]]\n            )\n        else:\n            edit_type = task.split(\"-\")[-1]\n            orig_span, new_span = get_span(\n                orig_transcript, target_transcript, edit_type\n            )\n            if orig_span[0] > orig_span[1]:\n                RuntimeError(f\"example {audio_fn} failed\")\n            if orig_span[0] == orig_span[1]:\n                orig_span_save = [orig_span[0]]\n            else:\n                orig_span_save = orig_span\n            if new_span[0] == new_span[1]:\n                new_span_save = [new_span[0]]\n            else:\n                new_span_save = new_span\n            orig_span_save = \",\".join([str(item) for item in orig_span_save])\n            new_span_save = \",\".join([str(item) for item in new_span_save])\n\n            start, end = get_mask_interval_from_word_bounds(\n                state[\"word_bounds\"], orig_span_save, edit_type\n            )\n\n            # span in codec frames\n            morphed_span = (\n                max(start - left_margin, 1 / codec_sr),\n                min(end + right_margin, audio_dur),\n            )  # in seconds\n            mask_interval = [\n                [round(morphed_span[0] * codec_sr), round(morphed_span[1] * codec_sr)]\n            ]\n            mask_interval = torch.LongTensor(mask_interval)  # [M,2], M==1 for now\n\n        decode_config = {\n            \"top_k\": top_k,\n            \"top_p\": top_p,\n            \"temperature\": temperature,\n            \"stop_repetition\": stop_repetition,\n            \"kvcache\": kvcache,\n            \"codec_audio_sr\": codec_audio_sr,\n            \"codec_sr\": codec_sr,\n            \"silence_tokens\": silence_tokens,\n        }\n\n        if task == \"zero-shot text-to-speech\":\n            decode_config[\"sample_batch_size\"] = sample_batch_size\n            _, gen_audio = inference_one_sample(\n                self.models[voicecraft_model],\n                self.ckpt[voicecraft_model][\"config\"],\n                self.phn2num[voicecraft_model],\n                self.text_tokenizer,\n                self.audio_tokenizer,\n                audio_fn,\n                orig_transcript_until_cutoff_time.strip()\n                + \" \"\n                + target_transcript.strip(),\n                self.device,\n                decode_config,\n                prompt_end_frame,\n            )\n        else:\n            _, gen_audio = inference_one_sample_editing(\n                self.models[voicecraft_model],\n                self.ckpt[voicecraft_model][\"config\"],\n                self.phn2num[voicecraft_model],\n                self.text_tokenizer,\n                self.audio_tokenizer,\n                audio_fn,\n                target_transcript,\n                mask_interval,\n                self.device,\n                decode_config,\n            )\n\n        # save segments for comparison\n        gen_audio = gen_audio[0].cpu()\n\n        out = \"/tmp/out.wav\"\n        torchaudio.save(out, gen_audio, codec_audio_sr)\n        return ModelOutput(\n            generated_audio=Path(out), whisper_transcript_orig_audio=whisper_transcript\n        )\n\n\ndef seed_everything(seed):\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    random.seed(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.benchmark = False\n    torch.backends.cudnn.deterministic = True\n\n\ndef get_transcribe_state(segments):\n    words_info = [word_info for segment in segments for word_info in segment[\"words\"]]\n    return {\n        \"transcript\": \" \".join([segment[\"text\"].strip() for segment in segments]),\n        \"word_bounds\": [\n            {\"word\": word[\"word\"], \"start\": word[\"start\"], \"end\": word[\"end\"]}\n            for word in words_info\n        ],\n    }\n\n\ndef find_closest_cut_off_word(word_bounds, cut_off_sec):\n    min_distance = float(\"inf\")\n\n    for i, word_bound in enumerate(word_bounds):\n        distance = abs(word_bound[\"start\"] - cut_off_sec)\n\n        if distance < min_distance:\n            min_distance = distance\n\n        if word_bound[\"end\"] > cut_off_sec:\n            break\n\n    return i\n\n\ndef get_mask_interval_from_word_bounds(word_bounds, word_span_ind, editType):\n    tmp = word_span_ind.split(\",\")\n    s, e = int(tmp[0]), int(tmp[-1])\n    start = None\n    for j, item in enumerate(word_bounds):\n        if j == s:\n            if editType == \"insertion\":\n                start = float(item[\"end\"])\n            else:\n                start = float(item[\"start\"])\n        if j == e:\n            if editType == \"insertion\":\n                end = float(item[\"start\"])\n            else:\n                end = float(item[\"end\"])\n            assert start is not None\n            break\n    return (start, end)\n"
  },
  {
    "path": "pretrained_models/.gitkeep",
    "content": ""
  },
  {
    "path": "start-jupyter.bat",
    "content": "@echo off\n\necho Creating and running the Jupyter container...\n\ndocker run -it -d ^\n    --gpus all ^\n    -p 8888:8888 ^\n    -p 7860:7860 ^\n    --name jupyter ^\n    --user root ^\n    -e NB_USER=\"%username%\" ^\n    -e CHOWN_HOME=yes ^\n    -e GRANT_SUDO=yes ^\n    -e JUPYTER_TOKEN=mytoken ^\n    -w \"/home/%username%\" ^\n    -v \"%cd%\":\"/home/%username%/work\" ^\n    voicecraft\n\nif %errorlevel% == 0 (\n    echo Jupyter container created and running.\n\n    echo Jupyter container is running.\n    echo To access the Jupyter web UI, please follow these steps:\n    echo 1. Open your web browser\n    echo 2. Navigate to http://localhost:8888/?token=mytoken\n    echo 3. !! The default token is \"mytoken\" and should be changed. !!\n    pause\n) else (\n    echo Failed to create and run the Jupyter container.\n)\n"
  },
  {
    "path": "start-jupyter.sh",
    "content": "#!/usr/bin/env bash\n## Assumes you have docker installed with nvidia container container-toolkit\n# https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/1.13.5/install-guide.html\n# sudo apt-get install -y nvidia-container-toolkit-base || yay -Syu nvidia-container-toolkit || echo etc...\n## Try to start an existing container otherwise create a new one\ndocker start jupyter 2> /dev/null || \\\ndocker run -it \\\n    -d \\\n    --gpus all \\\n    -p 8888:8888 \\\n    -p 7860:7860 \\\n    --name jupyter \\\n    --user root \\\n    -e NB_USER=\"$USER\" \\\n    -e CHOWN_HOME=yes \\\n    -e GRANT_SUDO=yes \\\n    -w \"/home/${NB_USER}\" \\\n    -v \"$PWD\":\"/home/$USER/work\" \\\n    voicecraft\n\n## `docker logs jupyter` to get the URL link and token e.g.\n## http://127.0.0.1:8888/lab?token=blahblahblahblabhlaabhalbhalbhal\n"
  },
  {
    "path": "steps/__init__.py",
    "content": ""
  },
  {
    "path": "steps/optim.py",
    "content": "# Copyright      2022  Xiaomi Corp.        (authors: Daniel Povey)\n#\n# See ../LICENSE for clarification regarding multiple authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport contextlib\nimport logging\nimport random\nfrom collections import defaultdict\nfrom typing import List, Optional, Tuple, Union\n\nimport torch\nimport torch.nn as nn\nfrom torch import Tensor\nfrom torch.optim import Optimizer\n\n\nclass BatchedOptimizer(Optimizer):\n    \"\"\"\n    This class adds to class Optimizer the capability to optimize parameters in batches:\n    it will stack the parameters and their grads for you so the optimizer can work\n    on tensors with an extra leading dimension.  This is intended for speed with GPUs,\n    as it reduces the number of kernels launched in the optimizer.\n\n    Args:\n      params:\n    \"\"\"\n\n    def __init__(self, params, defaults):\n        super(BatchedOptimizer, self).__init__(params, defaults)\n\n    @contextlib.contextmanager\n    def batched_params(self, param_group, group_params_names):\n        \"\"\"\n        This function returns (technically, yields) a list of\n          of tuples (p, state), where\n        p is a `fake` parameter that is stacked (over axis 0) from real parameters\n        that share the same shape, and its gradient is also stacked;\n        `state` is the state corresponding to this batch of parameters\n        (it will be physically located in the \"state\" for one of the real\n        parameters, the last one that has any particular shape and dtype).\n\n        This function is decorated as a context manager so that it can\n        write parameters back to their \"real\" locations.\n\n        The idea is, instead of doing:\n        <code>\n          for p in group[\"params\"]:\n             state = self.state[p]\n             ...\n        </code>\n        you can do:\n        <code>\n          with self.batched_params(group[\"params\"]) as batches:\n             for p, state, p_names in batches:\n                 ...\n        </code>\n\n        Args:\n          group: a parameter group, which is a list of parameters; should be\n                one of self.param_groups.\n          group_params_names: name for each parameter in group,\n                which is List[str].\n        \"\"\"\n        batches = defaultdict(\n            list\n        )  # `batches` maps from tuple (dtype_as_str,*shape) to list of nn.Parameter\n        batches_names = defaultdict(\n            list\n        )  # `batches` maps from tuple (dtype_as_str,*shape) to list of str\n\n        assert len(param_group) == len(group_params_names), f\"len(param_group): {len(param_group)}, len(group_params_names): {len(group_params_names)}\"\n        for p, named_p in zip(param_group, group_params_names):\n            key = (str(p.dtype), *p.shape)\n            batches[key].append(p)\n            batches_names[key].append(named_p)\n\n        batches_names_keys = list(batches_names.keys())\n        sorted_idx = sorted(\n            range(len(batches_names)), key=lambda i: batches_names_keys[i]\n        )\n        batches_names = [\n            batches_names[batches_names_keys[idx]] for idx in sorted_idx\n        ]\n        batches = [batches[batches_names_keys[idx]] for idx in sorted_idx]\n\n        stacked_params_dict = dict()\n\n        # turn batches into a list, in deterministic order.\n        # tuples will contain tuples of (stacked_param, state, stacked_params_names),\n        # one for each batch in `batches`.\n        tuples = []\n\n        for batch, batch_names in zip(batches, batches_names):\n            p = batch[0]\n            # we arbitrarily store the state in the\n            # state corresponding to the 1st parameter in the\n            # group.  class Optimizer will take care of saving/loading state.\n            state = self.state[p]\n            p_stacked = torch.stack(batch)\n            grad = torch.stack(\n                [\n                    torch.zeros_like(p) if p.grad is None else p.grad\n                    for p in batch\n                ]\n            )\n            p_stacked.grad = grad\n            stacked_params_dict[key] = p_stacked\n            tuples.append((p_stacked, state, batch_names))\n\n        yield tuples  # <-- calling code will do the actual optimization here!\n\n        for ((stacked_params, _state, _names), batch) in zip(tuples, batches):\n            for i, p in enumerate(batch):  # batch is list of Parameter\n                p.copy_(stacked_params[i])\n\n\nclass ScaledAdam(BatchedOptimizer):\n    \"\"\"\n     Implements 'Scaled Adam', a variant of Adam where we scale each parameter's update\n     proportional to the norm of that parameter; and also learn the scale of the parameter,\n     in log space, subject to upper and lower limits (as if we had factored each parameter as\n     param = underlying_param * log_scale.exp())\n\n\n     Args:\n          params:  The parameters or param_groups to optimize (like other Optimizer subclasses)\n              lr:  The learning rate.  We will typically use a learning rate schedule that starts\n                   at 0.03 and decreases over time, i.e. much higher than other common\n                   optimizers.\n     clipping_scale: (e.g. 2.0)\n                   A scale for gradient-clipping: if specified, the normalized gradients\n                   over the whole model will be clipped to have 2-norm equal to\n                   `clipping_scale` times the median 2-norm over the most recent period\n                   of `clipping_update_period` minibatches.  By \"normalized gradients\",\n                   we mean after multiplying by the rms parameter value for this tensor\n                   [for non-scalars]; this is appropriate because our update is scaled\n                   by this quantity.\n            betas: beta1,beta2 are momentum constants for regular momentum, and moving sum-sq grad.\n                   Must satisfy 0 < beta <= beta2 < 1.\n     scalar_lr_scale: A scaling factor on the learning rate, that we use to update the\n                   scale of each parameter tensor and scalar parameters of the mode..\n                   If each parameter were decomposed\n                   as p * p_scale.exp(), where (p**2).mean().sqrt() == 1.0, scalar_lr_scale\n                   would be a the scaling factor on the learning rate of p_scale.\n              eps:  A general-purpose epsilon to prevent division by zero\n    param_min_rms: Minimum root-mean-square value of parameter tensor, for purposes of\n                   learning the scale on the parameters (we'll constrain the rms of each non-scalar\n                   parameter tensor to be >= this value)\n    param_max_rms: Maximum root-mean-square value of parameter tensor, for purposes of\n                   learning the scale on the parameters (we'll constrain the rms of each non-scalar\n                   parameter tensor to be <= this value)\n       scalar_max: Maximum absolute value for scalar parameters (applicable if your\n                   model has any parameters with numel() == 1).\n    size_update_period: The periodicity, in steps, with which we update the size (scale)\n                   of the parameter tensor.  This is provided to save a little time\n                   in the update.\n     clipping_update_period: if clipping_scale is specified, this is the period\n    \"\"\"\n\n    def __init__(\n        self,\n        params,\n        lr=3e-02,\n        clipping_scale=None,\n        betas=(0.9, 0.98),\n        scalar_lr_scale=0.1,\n        eps=1.0e-08,\n        param_min_rms=1.0e-05,\n        param_max_rms=3.0,\n        scalar_max=10.0,\n        size_update_period=4,\n        clipping_update_period=100,\n        parameters_names=None,\n        show_dominant_parameters=True,\n    ):\n\n        assert parameters_names is not None, (\n            \"Please prepare parameters_names,\"\n            \"which is a List[List[str]]. Each List[str] is for a group\"\n            \"and each str is for a parameter\"\n        )\n        defaults = dict(\n            lr=lr,\n            clipping_scale=clipping_scale,\n            betas=betas,\n            scalar_lr_scale=scalar_lr_scale,\n            eps=eps,\n            param_min_rms=param_min_rms,\n            param_max_rms=param_max_rms,\n            scalar_max=scalar_max,\n            size_update_period=size_update_period,\n            clipping_update_period=clipping_update_period,\n        )\n\n        super(ScaledAdam, self).__init__(params, defaults)\n        assert len(self.param_groups) == len(parameters_names)\n        self.parameters_names = parameters_names\n        self.show_dominant_parameters = show_dominant_parameters\n\n    def __setstate__(self, state):\n        super(ScaledAdam, self).__setstate__(state)\n\n    @torch.no_grad()\n    def step(self, closure=None):\n        \"\"\"Performs a single optimization step.\n\n        Arguments:\n            closure (callable, optional): A closure that reevaluates the model\n                and returns the loss.\n        \"\"\"\n        loss = None\n        if closure is not None:\n            with torch.enable_grad():\n                loss = closure()\n\n        batch = True\n\n        for group, group_params_names in zip(\n            self.param_groups, self.parameters_names\n        ):\n\n            with self.batched_params(\n                group[\"params\"], group_params_names\n            ) as batches:\n\n                # batches is list of pairs (stacked_param, state).  stacked_param is like\n                # a regular parameter, and will have a .grad, but the 1st dim corresponds to\n                # a stacking dim, it is not a real dim.\n\n                if (\n                    len(batches[0][1]) == 0\n                ):  # if len(first state) == 0: not yet initialized\n                    clipping_scale = 1\n                else:\n                    clipping_scale = self._get_clipping_scale(group, batches)\n\n                for p, state, _ in batches:\n                    # Perform optimization step.\n                    # grad is not going to be None, we handled that when creating the batches.\n                    grad = p.grad\n                    if grad.is_sparse:\n                        raise RuntimeError(\n                            \"ScaledAdam optimizer does not support sparse gradients\"\n                        )\n                    # State initialization\n                    if len(state) == 0:\n                        self._init_state(group, p, state)\n\n                    self._step_one_batch(group, p, state, clipping_scale)\n\n        return loss\n\n    def _init_state(self, group: dict, p: Tensor, state: dict):\n        \"\"\"\n        Initializes state dict for parameter 'p'.  Assumes that dim 0 of tensor p\n        is actually the batch dimension, corresponding to batched-together\n        parameters of a given shape.\n\n\n        Args:\n           group:   Dict to look up configuration values.\n               p: The parameter that we are initializing the state for\n           state: Dict from string to whatever state we are initializing\n        \"\"\"\n        size_update_period = group[\"size_update_period\"]\n\n        state[\"step\"] = 0\n\n        kwargs = {\"device\": p.device, \"dtype\": p.dtype}\n\n        # 'delta' implements conventional momentum.  There are\n        # several different kinds of update going on, so rather than\n        # compute \"exp_avg\" like in Adam, we store and decay a\n        # parameter-change \"delta\", which combines all forms of\n        # update.  this is equivalent to how it's done in Adam,\n        # except for the first few steps.\n        state[\"delta\"] = torch.zeros_like(\n            p, memory_format=torch.preserve_format\n        )\n\n        batch_size = p.shape[0]\n        numel = p.numel() // batch_size\n        numel = p.numel()\n\n        if numel > 1:\n            # \"param_rms\" just periodically records the scalar root-mean-square value of\n            # the parameter tensor.\n            # it has a shape like (batch_size, 1, 1, 1, 1)\n            param_rms = (\n                (p ** 2).mean(dim=list(range(1, p.ndim)), keepdim=True).sqrt()\n            )\n            state[\"param_rms\"] = param_rms\n\n            state[\"scale_exp_avg_sq\"] = torch.zeros_like(param_rms)\n            state[\"scale_grads\"] = torch.zeros(\n                size_update_period, *param_rms.shape, **kwargs\n            )\n\n        # exp_avg_sq is the weighted sum of scaled gradients. as in Adam.\n        state[\"exp_avg_sq\"] = torch.zeros_like(\n            p, memory_format=torch.preserve_format\n        )\n\n    def _get_clipping_scale(\n        self, group: dict, tuples: List[Tuple[Tensor, dict, List[str]]]\n    ) -> float:\n        \"\"\"\n        Returns a scalar factor <= 1.0 that dictates gradient clipping, i.e. we will scale the gradients\n        by this amount before applying the rest of the update.\n\n        Args:\n           group: the parameter group, an item in self.param_groups\n           tuples: a list of tuples of (param, state, param_names)\n                where param is a batched set of parameters,\n                with a .grad (1st dim is batch dim)\n                and state is the state-dict where optimization parameters are kept.\n                param_names is a List[str] while each str is name for a parameter\n                in batched set of parameters \"param\".\n        \"\"\"\n        assert len(tuples) >= 1\n        clipping_scale = group[\"clipping_scale\"]\n        (first_p, first_state, _) = tuples[0]\n        step = first_state[\"step\"]\n        if clipping_scale is None or step == 0:\n            # no clipping.  return early on step == 0 because the other\n            # parameters' state won't have been initialized yet.\n            return 1.0\n        clipping_update_period = group[\"clipping_update_period\"]\n\n        tot_sumsq = torch.tensor(0.0, device=first_p.device)\n        for (p, state, param_names) in tuples:\n            grad = p.grad\n            if grad.is_sparse:\n                raise RuntimeError(\n                    \"ScaledAdam optimizer does not support sparse gradients\"\n                )\n            if p.numel() == p.shape[0]:  # a batch of scalars\n                tot_sumsq += (\n                    grad ** 2\n                ).sum()  # sum() to change shape [1] to []\n            else:\n                tot_sumsq += ((grad * state[\"param_rms\"]) ** 2).sum()\n\n        tot_norm = tot_sumsq.sqrt()\n        if \"model_norms\" not in first_state:\n            first_state[\"model_norms\"] = torch.zeros(\n                clipping_update_period, device=p.device\n            )\n        first_state[\"model_norms\"][step % clipping_update_period] = tot_norm\n\n        if step % clipping_update_period == 0:\n            # Print some stats.\n            # We don't reach here if step == 0 because we would have returned\n            # above.\n            sorted_norms = first_state[\"model_norms\"].sort()[0].to(\"cpu\")\n            quartiles = []\n            for n in range(0, 5):\n                index = min(\n                    clipping_update_period - 1,\n                    (clipping_update_period // 4) * n,\n                )\n                quartiles.append(sorted_norms[index].item())\n\n            median = quartiles[2]\n            threshold = clipping_scale * median\n            first_state[\"model_norm_threshold\"] = threshold\n            percent_clipped = (\n                first_state[\"num_clipped\"] * 100.0 / clipping_update_period\n                if \"num_clipped\" in first_state\n                else 0.0\n            )\n            first_state[\"num_clipped\"] = 0\n            quartiles = \" \".join([\"%.3e\" % x for x in quartiles])\n            logging.info(\n                f\"Clipping_scale={clipping_scale}, grad-norm quartiles {quartiles}, \"\n                f\"threshold={threshold:.3e}, percent-clipped={percent_clipped:.1f}\"\n            )\n\n        if step < clipping_update_period:\n            return 1.0  # We have not yet estimated a norm to clip to.\n        else:\n            try:\n                model_norm_threshold = first_state[\"model_norm_threshold\"]\n            except KeyError:\n                logging.info(\n                    \"Warning: model_norm_threshold not in state: possibly \"\n                    \"you changed config when restarting, adding clipping_scale option?\"\n                )\n                return 1.0\n            ans = min(1.0, (model_norm_threshold / (tot_norm + 1.0e-20)).item())\n            if ans < 1.0:\n                first_state[\"num_clipped\"] += 1\n            if ans < 0.1:\n                logging.warn(\n                    f\"Scaling gradients by {ans}, model_norm_threshold={model_norm_threshold}\"\n                )\n                if self.show_dominant_parameters:\n                    assert p.shape[0] == len(param_names)\n                    self._show_gradient_dominating_parameter(tuples, tot_sumsq)\n            return ans\n\n    def _show_gradient_dominating_parameter(\n        self, tuples: List[Tuple[Tensor, dict, List[str]]], tot_sumsq: Tensor\n    ):\n        \"\"\"\n        Show information of parameter wihch dominanting tot_sumsq.\n\n        Args:\n           tuples: a list of tuples of (param, state, param_names)\n                where param is a batched set of parameters,\n                with a .grad (1st dim is batch dim)\n                and state is the state-dict where optimization parameters are kept.\n                param_names is a List[str] while each str is name for a parameter\n                in batched set of parameters \"param\".\n            tot_sumsq: sumsq of all parameters. Though it's could be calculated\n                from tuples, we still pass it to save some time.\n        \"\"\"\n        all_sumsq_orig = {}\n        for (p, state, batch_param_names) in tuples:\n            # p is a stacked batch parameters.\n            batch_grad = p.grad\n            if p.numel() == p.shape[0]:  # a batch of scalars\n                batch_sumsq_orig = batch_grad ** 2\n                # Dummpy values used by following `zip` statement.\n                batch_rms_orig = torch.ones(p.shape[0])\n            else:\n                batch_rms_orig = state[\"param_rms\"]\n                batch_sumsq_orig = ((batch_grad * batch_rms_orig) ** 2).sum(\n                    dim=list(range(1, batch_grad.ndim))\n                )\n\n            for name, sumsq_orig, rms, grad in zip(\n                batch_param_names, batch_sumsq_orig, batch_rms_orig, batch_grad\n            ):\n\n                proportion_orig = sumsq_orig / tot_sumsq\n                all_sumsq_orig[name] = (proportion_orig, sumsq_orig, rms, grad)\n\n        assert torch.isclose(\n            sum([value[0] for value in all_sumsq_orig.values()]).cpu(),\n            torch.tensor(1.0),\n        )\n        sorted_by_proportion = {\n            k: v\n            for k, v in sorted(\n                all_sumsq_orig.items(),\n                key=lambda item: item[1][0],\n                reverse=True,\n            )\n        }\n        dominant_param_name = next(iter(sorted_by_proportion))\n        (\n            dominant_proportion,\n            dominant_sumsq,\n            dominant_rms,\n            dominant_grad,\n        ) = sorted_by_proportion[dominant_param_name]\n        logging.info(\n            f\"Parameter Dominanting tot_sumsq {dominant_param_name}\"\n            f\" with proportion {dominant_proportion:.2f},\"\n            f\" where dominant_sumsq=(grad_sumsq*orig_rms_sq)\"\n            f\"={dominant_sumsq:.3e},\"\n            f\" grad_sumsq = {(dominant_grad**2).sum():.3e},\"\n            f\" orig_rms_sq={(dominant_rms**2).item():.3e}\"\n        )\n\n    def _step_one_batch(\n        self, group: dict, p: Tensor, state: dict, clipping_scale: float\n    ):\n        \"\"\"\n        Do the step for one parameter, which is actually going to be a batch of\n        `real` parameters, with dim 0 as the batch dim.\n        Args:\n                  group:  dict to look up configuration values\n                    p: parameter to update (actually multiple parameters stacked together\n                       as a batch)\n                  state: state-dict for p, to look up the optimizer state\n        \"\"\"\n        lr = group[\"lr\"]\n        size_update_period = group[\"size_update_period\"]\n        beta1 = group[\"betas\"][0]\n\n        grad = p.grad\n        if clipping_scale != 1.0:\n            grad = grad * clipping_scale\n        step = state[\"step\"]\n        delta = state[\"delta\"]\n\n        delta.mul_(beta1)\n        batch_size = p.shape[0]\n        numel = p.numel() // batch_size\n        if numel > 1:\n            # Update the size/scale of p, and set param_rms\n            scale_grads = state[\"scale_grads\"]\n            scale_grads[step % size_update_period] = (p * grad).sum(\n                dim=list(range(1, p.ndim)), keepdim=True\n            )\n            if step % size_update_period == size_update_period - 1:\n                param_rms = state[\"param_rms\"]  # shape: (batch_size, 1, 1, ..)\n                param_rms.copy_(\n                    (p ** 2)\n                    .mean(dim=list(range(1, p.ndim)), keepdim=True)\n                    .sqrt()\n                )\n                if step > 0:\n                    # self._size_update() learns the overall scale on the\n                    # parameter, by shrinking or expanding it.\n                    self._size_update(group, scale_grads, p, state)\n\n        if numel == 1:\n            # For parameters with 1 element we just use regular Adam.\n            # Updates delta.\n            self._step_scalar(group, p, state)\n        else:\n            self._step(group, p, state)\n\n        state[\"step\"] = step + 1\n\n    def _size_update(\n        self, group: dict, scale_grads: Tensor, p: Tensor, state: dict\n    ) -> None:\n        \"\"\"\n               Called only where p.numel() > 1, this updates the scale of the parameter.\n               If we imagine: p =  underlying_param * scale.exp(), and we are doing\n               gradient descent on underlying param and on scale, this function does the update\n               on `scale`.\n\n               Args:\n              group: dict to look up configuration values\n        scale_grads: a tensor of shape (size_update_period, batch_size, 1, 1,...) containing\n                      grads w.r.t. the scales.\n                  p:  The parameter to update\n               state: The state-dict of p\n        \"\"\"\n\n        param_rms = state[\"param_rms\"]\n        beta1, beta2 = group[\"betas\"]\n        size_lr = group[\"lr\"] * group[\"scalar_lr_scale\"]\n        param_min_rms = group[\"param_min_rms\"]\n        param_max_rms = group[\"param_max_rms\"]\n        eps = group[\"eps\"]\n        step = state[\"step\"]\n        batch_size = p.shape[0]\n\n        size_update_period = scale_grads.shape[0]\n        # correct beta2 for the size update period: we will have\n        # faster decay at this level.\n        beta2_corr = beta2 ** size_update_period\n\n        scale_exp_avg_sq = state[\n            \"scale_exp_avg_sq\"\n        ]  # shape: (batch_size, 1, 1, ..)\n        scale_exp_avg_sq.mul_(beta2_corr).add_(\n            (scale_grads ** 2).mean(\n                dim=0\n            ),  # mean over dim `size_update_period`\n            alpha=1 - beta2_corr,\n        )  # shape is (batch_size, 1, 1, ...)\n\n        # The 1st time we reach here is when size_step == 1.\n        size_step = (step + 1) // size_update_period\n        bias_correction2 = 1 - beta2_corr ** size_step\n        # we don't bother with bias_correction1; this will help prevent divergence\n        # at the start of training.\n\n        denom = scale_exp_avg_sq.sqrt() + eps\n\n        scale_step = (\n            -size_lr\n            * (bias_correction2 ** 0.5)\n            * scale_grads.sum(dim=0)\n            / denom\n        )\n\n        is_too_small = param_rms < param_min_rms\n        is_too_large = param_rms > param_max_rms\n\n        # when the param gets too small, just don't shrink it any further.\n        scale_step.masked_fill_(is_too_small, 0.0)\n        # when it gets too large, stop it from getting any larger.\n        scale_step.masked_fill_(is_too_large, -size_lr * size_update_period)\n        delta = state[\"delta\"]\n        # the factor of (1-beta1) relates to momentum.\n        delta.add_(p * scale_step, alpha=(1 - beta1))\n\n    def _step(self, group: dict, p: Tensor, state: dict):\n        \"\"\"\n        This function does the core update of self.step(), in the case where the members of\n        the batch have more than 1 element.\n\n        Args:\n            group: A dict which will be used to look up configuration values\n                p: The parameter to be updated\n             grad: The grad of p\n            state: The state-dict corresponding to parameter p\n\n        This function modifies p.\n        \"\"\"\n        grad = p.grad\n        lr = group[\"lr\"]\n        beta1, beta2 = group[\"betas\"]\n        eps = group[\"eps\"]\n        param_min_rms = group[\"param_min_rms\"]\n        step = state[\"step\"]\n\n        exp_avg_sq = state[\"exp_avg_sq\"]\n        exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=(1 - beta2))\n\n        this_step = state[\"step\"] - (\n            state[\"zero_step\"] if \"zero_step\" in state else 0\n        )\n        bias_correction2 = 1 - beta2 ** (this_step + 1)\n        if bias_correction2 < 0.99:\n            # note: not in-place.\n            exp_avg_sq = exp_avg_sq * (1.0 / bias_correction2)\n\n        denom = exp_avg_sq.sqrt()\n        denom += eps\n        grad = grad / denom\n\n        alpha = -lr * (1 - beta1) * state[\"param_rms\"].clamp(min=param_min_rms)\n\n        delta = state[\"delta\"]\n        delta.add_(grad * alpha)\n        p.add_(delta)\n\n    def _step_scalar(self, group: dict, p: Tensor, state: dict):\n        \"\"\"\n        A simplified form of the core update for scalar tensors, where we cannot get a good\n        estimate of the parameter rms.\n        \"\"\"\n        beta1, beta2 = group[\"betas\"]\n        scalar_max = group[\"scalar_max\"]\n        eps = group[\"eps\"]\n        lr = group[\"lr\"] * group[\"scalar_lr_scale\"]\n        grad = p.grad\n\n        exp_avg_sq = state[\"exp_avg_sq\"]  # shape: (batch_size,)\n        exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)\n\n        # bias_correction2 is like in Adam.  Don't bother with bias_correction1;\n        # slower update at the start will help stability anyway.\n        bias_correction2 = 1 - beta2 ** (state[\"step\"] + 1)\n        denom = (exp_avg_sq / bias_correction2).sqrt() + eps\n\n        delta = state[\"delta\"]\n        delta.add_(grad / denom, alpha=-lr * (1 - beta1))\n        p.clamp_(min=-scalar_max, max=scalar_max)\n        p.add_(delta)\n\n\nclass LRScheduler(object):\n    \"\"\"\n    Base-class for learning rate schedulers where the learning-rate depends on both the\n    batch and the epoch.\n    \"\"\"\n\n    def __init__(self, optimizer: Optimizer, verbose: bool = False):\n        # Attach optimizer\n        if not isinstance(optimizer, Optimizer):\n            raise TypeError(\n                \"{} is not an Optimizer\".format(type(optimizer).__name__)\n            )\n        self.optimizer = optimizer\n        self.verbose = verbose\n\n        for group in optimizer.param_groups:\n            group.setdefault(\"base_lr\", group[\"lr\"])\n\n        self.base_lrs = [group[\"base_lr\"] for group in optimizer.param_groups]\n\n        self.epoch = 0\n        self.batch = 0\n\n    def state_dict(self):\n        \"\"\"Returns the state of the scheduler as a :class:`dict`.\n\n        It contains an entry for every variable in self.__dict__ which\n        is not the optimizer.\n        \"\"\"\n        return {\n            \"base_lrs\": self.base_lrs,\n            \"epoch\": self.epoch,\n            \"batch\": self.batch,\n        }\n\n    def load_state_dict(self, state_dict):\n        \"\"\"Loads the schedulers state.\n\n        Args:\n            state_dict (dict): scheduler state. Should be an object returned\n                from a call to :meth:`state_dict`.\n        \"\"\"\n        self.__dict__.update(state_dict)\n\n    def get_last_lr(self) -> List[float]:\n        \"\"\"Return last computed learning rate by current scheduler.  Will be a list of float.\"\"\"\n        return self._last_lr\n\n    def get_lr(self):\n        # Compute list of learning rates from self.epoch and self.batch and\n        # self.base_lrs; this must be overloaded by the user.\n        # e.g. return [some_formula(self.batch, self.epoch, base_lr) for base_lr in self.base_lrs ]\n        raise NotImplementedError\n\n    def step_batch(self, batch: Optional[int] = None) -> None:\n        # Step the batch index, or just set it.  If `batch` is specified, it\n        # must be the batch index from the start of training, i.e. summed over\n        # all epochs.\n        # You can call this in any order; if you don't provide 'batch', it should\n        # of course be called once per batch.\n        if batch is not None:\n            self.batch = batch\n        else:\n            self.batch = self.batch + 1\n        self._set_lrs()\n\n    def step_epoch(self, epoch: Optional[int] = None):\n        # Step the epoch index, or just set it.  If you provide the 'epoch' arg,\n        # you should call this at the start of the epoch; if you don't provide the 'epoch'\n        # arg, you should call it at the end of the epoch.\n        if epoch is not None:\n            self.epoch = epoch\n        else:\n            self.epoch = self.epoch + 1\n        self._set_lrs()\n\n    def _set_lrs(self):\n        values = self.get_lr()\n        assert len(values) == len(self.optimizer.param_groups)\n\n        for i, data in enumerate(zip(self.optimizer.param_groups, values)):\n            param_group, lr = data\n            param_group[\"lr\"] = lr\n            self.print_lr(self.verbose, i, lr)\n        self._last_lr = [group[\"lr\"] for group in self.optimizer.param_groups]\n\n    def print_lr(self, is_verbose, group, lr):\n        \"\"\"Display the current learning rate.\"\"\"\n        if is_verbose:\n            logging.info(\n                f\"Epoch={self.epoch}, batch={self.batch}: adjusting learning rate\"\n                f\" of group {group} to {lr:.4e}.\"\n            )\n\n\nclass Eden(LRScheduler):\n    \"\"\"\n    Eden scheduler.\n    The basic formula (before warmup) is:\n      lr = base_lr * (((batch**2 + lr_batches**2) / lr_batches**2) ** -0.25 *\n                     (((epoch**2 + lr_epochs**2) / lr_epochs**2) ** -0.25)) * warmup\n    where `warmup` increases from linearly 0.5 to 1 over `warmup_batches` batches\n    and then stays constant at 1.\n\n\n     E.g. suggest base_lr = 0.04 (passed to optimizer) if used with ScaledAdam\n\n    Args:\n        optimizer: the optimizer to change the learning rates on\n        lr_batches: the number of batches after which we start significantly\n              decreasing the learning rate, suggest 5000.\n        lr_epochs: the number of epochs after which we start significantly\n              decreasing the learning rate, suggest 6 if you plan to do e.g.\n              20 to 40 epochs, but may need smaller number if dataset is huge\n              and you will do few epochs.\n    \"\"\"\n\n    def __init__(\n        self,\n        optimizer: Optimizer,\n        lr_batches: Union[int, float],\n        lr_epochs: Union[int, float],\n        warmup_batches: Union[int, float] = 500.0,\n        verbose: bool = False,\n    ):\n        super(Eden, self).__init__(optimizer, verbose)\n        self.lr_batches = lr_batches\n        self.lr_epochs = lr_epochs\n        self.warmup_batches = warmup_batches\n\n    def get_lr(self):\n        factor = (\n            (self.batch ** 2 + self.lr_batches ** 2) / self.lr_batches ** 2\n        ) ** -0.25 * (\n            ((self.epoch ** 2 + self.lr_epochs ** 2) / self.lr_epochs ** 2)\n            ** -0.25\n        )\n        warmup_factor = (\n            1.0\n            if self.batch >= self.warmup_batches\n            else 0.5 + 0.5 * (self.batch / self.warmup_batches)\n        )\n\n        return [x * factor * warmup_factor for x in self.base_lrs]\n\n\ndef _test_eden():\n    m = torch.nn.Linear(100, 100)\n    optim = ScaledAdam(m.parameters(), lr=0.03)\n\n    scheduler = Eden(optim, lr_batches=100, lr_epochs=2, verbose=True)\n\n    for epoch in range(10):\n        scheduler.step_epoch(epoch)  # sets epoch to `epoch`\n\n        for step in range(20):\n            x = torch.randn(200, 100).detach()\n            x.requires_grad = True\n            y = m(x)\n            dy = torch.randn(200, 100).detach()\n            f = (y * dy).sum()\n            f.backward()\n\n            optim.step()\n            scheduler.step_batch()\n            optim.zero_grad()\n\n    logging.info(f\"last lr = {scheduler.get_last_lr()}\")\n    logging.info(f\"state dict = {scheduler.state_dict()}\")\n\n\n# This is included mostly as a baseline for ScaledAdam.\nclass Eve(Optimizer):\n    \"\"\"\n    Implements Eve algorithm.  This is a modified version of AdamW with a special\n    way of setting the weight-decay / shrinkage-factor, which is designed to make the\n    rms of the parameters approach a particular target_rms (default: 0.1).  This is\n    for use with networks with 'scaled' versions of modules (see scaling.py), which\n    will be close to invariant to the absolute scale on the parameter matrix.\n\n    The original Adam algorithm was proposed in `Adam: A Method for Stochastic Optimization`_.\n    The AdamW variant was proposed in `Decoupled Weight Decay Regularization`_.\n    Eve is unpublished so far.\n\n    Arguments:\n        params (iterable): iterable of parameters to optimize or dicts defining\n            parameter groups\n        lr (float, optional): learning rate (default: 1e-3)\n        betas (Tuple[float, float], optional): coefficients used for computing\n            running averages of gradient and its square (default: (0.9, 0.999))\n        eps (float, optional): term added to the denominator to improve\n            numerical stability (default: 1e-8)\n        weight_decay (float, optional): weight decay coefficient (default: 3e-4;\n            this value means that the weight would decay significantly after\n            about 3k minibatches.  Is not multiplied by learning rate, but\n            is conditional on RMS-value of parameter being > target_rms.\n        target_rms (float, optional): target root-mean-square value of\n           parameters, if they fall below this we will stop applying weight decay.\n\n\n    .. _Adam: A Method for Stochastic Optimization:\n        https://arxiv.org/abs/1412.6980\n    .. _Decoupled Weight Decay Regularization:\n        https://arxiv.org/abs/1711.05101\n    .. _On the Convergence of Adam and Beyond:\n        https://openreview.net/forum?id=ryQu7f-RZ\n    \"\"\"\n\n    def __init__(\n        self,\n        params,\n        lr=1e-3,\n        betas=(0.9, 0.98),\n        eps=1e-8,\n        weight_decay=1e-3,\n        target_rms=0.1,\n    ):\n        if not 0.0 <= lr:\n            raise ValueError(\"Invalid learning rate: {}\".format(lr))\n        if not 0.0 <= eps:\n            raise ValueError(\"Invalid epsilon value: {}\".format(eps))\n        if not 0.0 <= betas[0] < 1.0:\n            raise ValueError(\n                \"Invalid beta parameter at index 0: {}\".format(betas[0])\n            )\n        if not 0.0 <= betas[1] < 1.0:\n            raise ValueError(\n                \"Invalid beta parameter at index 1: {}\".format(betas[1])\n            )\n        if not 0 <= weight_decay <= 0.1:\n            raise ValueError(\n                \"Invalid weight_decay value: {}\".format(weight_decay)\n            )\n        if not 0 < target_rms <= 10.0:\n            raise ValueError(\"Invalid target_rms value: {}\".format(target_rms))\n        defaults = dict(\n            lr=lr,\n            betas=betas,\n            eps=eps,\n            weight_decay=weight_decay,\n            target_rms=target_rms,\n        )\n        super(Eve, self).__init__(params, defaults)\n\n    def __setstate__(self, state):\n        super(Eve, self).__setstate__(state)\n\n    @torch.no_grad()\n    def step(self, closure=None):\n        \"\"\"Performs a single optimization step.\n\n        Arguments:\n            closure (callable, optional): A closure that reevaluates the model\n                and returns the loss.\n        \"\"\"\n        loss = None\n        if closure is not None:\n            with torch.enable_grad():\n                loss = closure()\n\n        for group in self.param_groups:\n            for p in group[\"params\"]:\n                if p.grad is None:\n                    continue\n\n                # Perform optimization step\n                grad = p.grad\n                if grad.is_sparse:\n                    raise RuntimeError(\n                        \"AdamW does not support sparse gradients\"\n                    )\n\n                state = self.state[p]\n\n                # State initialization\n                if len(state) == 0:\n                    state[\"step\"] = 0\n                    # Exponential moving average of gradient values\n                    state[\"exp_avg\"] = torch.zeros_like(\n                        p, memory_format=torch.preserve_format\n                    )\n                    # Exponential moving average of squared gradient values\n                    state[\"exp_avg_sq\"] = torch.zeros_like(\n                        p, memory_format=torch.preserve_format\n                    )\n\n                exp_avg, exp_avg_sq = state[\"exp_avg\"], state[\"exp_avg_sq\"]\n\n                beta1, beta2 = group[\"betas\"]\n\n                state[\"step\"] += 1\n                bias_correction1 = 1 - beta1 ** state[\"step\"]\n                bias_correction2 = 1 - beta2 ** state[\"step\"]\n\n                # Decay the first and second moment running average coefficient\n                exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1)\n                exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)\n                denom = (exp_avg_sq.sqrt() * (bias_correction2 ** -0.5)).add_(\n                    group[\"eps\"]\n                )\n\n                step_size = group[\"lr\"] / bias_correction1\n                target_rms = group[\"target_rms\"]\n                weight_decay = group[\"weight_decay\"]\n\n                if p.numel() > 1:\n                    # avoid applying this weight-decay on \"scaling factors\"\n                    # (which are scalar).\n                    is_above_target_rms = p.norm() > (\n                        target_rms * (p.numel() ** 0.5)\n                    )\n                    p.mul_(1 - (weight_decay * is_above_target_rms))\n\n                p.addcdiv_(exp_avg, denom, value=-step_size)\n\n                # if random.random() < 0.0005:\n                #     step = (exp_avg / denom) * step_size\n                #     logging.info(\n                #         f\"Delta rms = {(step**2).mean().item()}, shape = {step.shape}\"\n                #     )\n\n        return loss\n\ndef ScaledLinear(*args, initial_scale: float = 1.0, **kwargs) -> nn.Linear:\n    \"\"\"\n    Behaves like a constructor of a modified version of nn.Linear\n    that gives an easy way to set the default initial parameter scale.\n\n    Args:\n        Accepts the standard args and kwargs that nn.Linear accepts\n        e.g. in_features, out_features, bias=False.\n\n        initial_scale: you can override this if you want to increase\n           or decrease the initial magnitude of the module's output\n           (affects the initialization of weight_scale and bias_scale).\n           Another option, if you want to do something like this, is\n           to re-initialize the parameters.\n    \"\"\"\n    ans = nn.Linear(*args, **kwargs)\n    with torch.no_grad():\n        ans.weight[:] *= initial_scale\n        if ans.bias is not None:\n            torch.nn.init.uniform_(\n                ans.bias, -0.1 * initial_scale, 0.1 * initial_scale\n            )\n    return ans\ndef _test_scaled_adam(hidden_dim: int):\n    import timeit\n\n    E = 100\n    B = 4\n    T = 2\n    logging.info(\"in test_eve_cain\")\n    # device = torch.device('cuda')\n    device = torch.device(\"cpu\")\n    dtype = torch.float32\n\n    # these input_magnitudes and output_magnitudes are to test that\n    # Abel is working as we expect and is able to adjust scales of\n    # different dims differently.\n    input_magnitudes = (1.0 * torch.randn(E, dtype=dtype, device=device)).exp()\n    output_magnitudes = (1.0 * torch.randn(E, dtype=dtype, device=device)).exp()\n\n    for iter in [1, 0]:\n        Linear = torch.nn.Linear if iter == 0 else ScaledLinear\n\n        m = torch.nn.Sequential(\n            Linear(E, hidden_dim),\n            torch.nn.PReLU(),\n            Linear(hidden_dim, hidden_dim),\n            torch.nn.PReLU(),\n            Linear(hidden_dim, E),\n        ).to(device)\n\n        train_pairs = [\n            (\n                100.0\n                * torch.randn(B, T, E, device=device, dtype=dtype)\n                * input_magnitudes,\n                torch.randn(B, T, E, device=device, dtype=dtype)\n                * output_magnitudes,\n            )\n            for _ in range(20)\n        ]\n\n        if iter == 0:\n            optim = Eve(m.parameters(), lr=0.003)\n        elif iter == 1:\n            optim = ScaledAdam(m.parameters(), lr=0.03, clipping_scale=2.0)\n        scheduler = Eden(optim, lr_batches=200, lr_epochs=5, verbose=False)\n\n        start = timeit.default_timer()\n        avg_loss = 0.0\n        for epoch in range(180):\n            scheduler.step_epoch()\n            # if epoch == 100 and iter in [2,3]:\n            #    optim.reset_speedup()  # check it doesn't crash.\n\n            # if epoch == 130:\n            #    opts = diagnostics.TensorDiagnosticOptions(\n            #        2 ** 22\n            #    )  # allow 4 megabytes per sub-module\n            #    diagnostic = diagnostics.attach_diagnostics(m, opts)\n\n            for n, (x, y) in enumerate(train_pairs):\n                y_out = m(x)\n                loss = ((y_out - y) ** 2).mean() * 100.0\n                if epoch == 0 and n == 0:\n                    avg_loss = loss.item()\n                else:\n                    avg_loss = 0.98 * avg_loss + 0.02 * loss.item()\n                if n == 0 and epoch % 5 == 0:\n                    # norm1 = '%.2e' % (m[0].weight**2).mean().sqrt().item()\n                    # norm1b = '%.2e' % (m[0].bias**2).mean().sqrt().item()\n                    # norm2 = '%.2e' % (m[2].weight**2).mean().sqrt().item()\n                    # norm2b = '%.2e' % (m[2].bias**2).mean().sqrt().item()\n                    # scale1 = '%.2e' % (m[0].weight_scale.exp().item())\n                    # scale1b = '%.2e' % (m[0].bias_scale.exp().item())\n                    # scale2 = '%.2e' % (m[2].weight_scale.exp().item())\n                    # scale2b = '%.2e' % (m[2].bias_scale.exp().item())\n                    lr = scheduler.get_last_lr()[0]\n                    logging.info(\n                        f\"Iter {iter}, epoch {epoch}, batch {n}, avg_loss {avg_loss:.4g}, lr={lr:.4e}\"\n                    )  # , norms={norm1,norm1b,norm2,norm2b}\") # scales={scale1,scale1b,scale2,scale2b}\n                loss.log().backward()\n                optim.step()\n                optim.zero_grad()\n                scheduler.step_batch()\n\n        # diagnostic.print_diagnostics()\n\n        stop = timeit.default_timer()\n        logging.info(f\"Iter={iter}, Time taken: {stop - start}\")\n\n        logging.info(f\"last lr = {scheduler.get_last_lr()}\")\n        # logging.info(\"state dict = \", scheduler.state_dict())\n        # logging.info(\"optim state_dict = \", optim.state_dict())\n        logging.info(f\"input_magnitudes = {input_magnitudes}\")\n        logging.info(f\"output_magnitudes = {output_magnitudes}\")\n\n\nif __name__ == \"__main__\":\n    torch.set_num_threads(1)\n    torch.set_num_interop_threads(1)\n    logging.getLogger().setLevel(logging.INFO)\n    import subprocess\n\n    s = subprocess.check_output(\n        \"git status -uno .; git log -1; git diff HEAD .\", shell=True\n    )\n    logging.info(s)\n    import sys\n\n    if len(sys.argv) > 1:\n        hidden_dim = int(sys.argv[1])\n    else:\n        hidden_dim = 200\n\n    _test_scaled_adam(hidden_dim)\n    _test_eden()\n"
  },
  {
    "path": "steps/trainer.py",
    "content": "import time\nimport os, random\nimport torch\nimport math, pickle\nfrom tqdm import tqdm\nfrom torch.optim import AdamW\nfrom torch.optim.lr_scheduler import LambdaLR\nimport torch.nn as nn\nimport torch.distributed as dist\nfrom torch.utils.tensorboard import SummaryWriter\nimport numpy as np\nfrom torch.utils.data.distributed import DistributedSampler\nimport logging\nfrom data import gigaspeech\nfrom models import voicecraft\n\nfrom .trainer_utils import DistributedDynamicBatchSampler, StatefulDistributedSampler, AverageMeter, print_model_info\nfrom .optim import ScaledAdam, Eden\n\n\nclass Trainer:\n    \n    def __init__(self, args, world_size, rank):\n        self.start_time = time.time()\n        self.args = args\n        self.world_size, self.rank = world_size, rank\n        self.device = torch.device(f\"cuda:{rank}\" if torch.cuda.is_available() else \"cpu\")\n        if self.rank == 0:\n            self.writer = SummaryWriter(args.exp_dir)\n        self.seed_everything(seed=self.args.seed)\n        self.meters = self._setup_meters()\n\n        self.progress, self.total_progress = self._setup_progress()\n\n        self.model, self.trainables, self.optim_states, self.scheduler_states = self._setup_models()\n\n        self.train_dataset_length, self.train_sampler, self.train_loader, self.valid_loader = self._setup_dataloader()\n        if self.args.num_steps != None:\n            self.total_step = self.args.num_steps\n            self.args.num_epochs = math.ceil(self.total_step / math.floor(self.train_dataset_length / self.args.batch_size)) if not self.args.dynamic_batching else None\n        else:\n            self.total_step = int(math.floor(self.train_dataset_length / self.args.batch_size))*self.args.num_epochs\n\n        self.optimizer, self.scheduler = self._setup_optimizer()\n        self.scaler = torch.cuda.amp.GradScaler()\n        self.model = torch.nn.parallel.DistributedDataParallel(self.model, device_ids=[self.rank], find_unused_parameters=False)\n        \n        if self.rank == 0:\n            self.early_stop_accu_steps = 0\n            if self.args.dynamic_batching:\n                logging.info(f\"max number of tokens per GPU in a training batch: {self.args.max_num_tokens}, max number of tokens per GPU in a inference batch: {self.args.val_max_num_tokens}\")\n            else:\n                logging.info(f\"batch size (summed over all GPUs): {self.args.batch_size}\")\n\n    def train(self):\n        flag = True\n        skip_flag = False\n        data_start_time = time.time()\n        while flag:\n            self.train_sampler.set_epoch(self.progress['epoch'])\n            for i, batch in enumerate(self.train_loader):\n                data_end_time = time.time()\n                self.model.train()\n                if self.progress['step'] > self.total_step:\n                    flag = False\n                    self.validate_and_save()\n                    if self.rank == 0:\n                        self.writer.close()\n                    break\n                if isinstance(self.scheduler, Eden):\n                    self.scheduler.step_epoch(self.progress['step']//self.args.pseudo_epoch_size + 1)\n                if self.args.optimizer_name == \"ScaledAdam\":\n                    cur_lr = self.scheduler.get_last_lr()[0]\n                else:\n                    lrs = [param_group['lr'] for param_group in self.optimizer.param_groups]\n                    assert lrs[0] == lrs[1]\n                    cur_lr = lrs[0]\n\n                if self.rank == 0 and self.progress['step'] % self.args.tb_write_every_n_steps == 0:\n                    self.writer.add_scalar(\"train/lr\", cur_lr, self.progress['step'])\n\n                all_inds = list(range(len(batch['y'])))\n                sum_losses = 0\n                sum_top10acc = 0\n                sum_ntoken = 0\n                sum_top10acc_cbi = [0 for _ in range(self.args.n_codebooks)]\n                for j in range(self.args.gradient_accumulation_steps):\n                    cur_ind = all_inds[j::self.args.gradient_accumulation_steps]\n                    cur_batch = {key: batch[key][cur_ind] for key in batch}\n                    with torch.cuda.amp.autocast(dtype=torch.float16 if self.args.precision==\"float16\" else torch.float32):\n                        out = self.model(cur_batch)\n                        if out == None:\n                            continue\n\n                    record_loss = out['loss'].detach().to(self.rank) \n                    top10acc = out['top10acc'].to(self.rank)\n                    effective_ntoken = out['effective_ntoken'].to(self.rank)\n                    is_nan = torch.tensor(int(torch.isnan(record_loss).any()), dtype=torch.float32, device=self.rank)\n                    \n                    dist.all_reduce(record_loss, op=dist.ReduceOp.SUM)\n                    dist.all_reduce(top10acc, op=dist.ReduceOp.SUM)\n                    dist.all_reduce(effective_ntoken, op=dist.ReduceOp.SUM)\n                    dist.all_reduce(is_nan, op=dist.ReduceOp.SUM)\n                    \n                    # check if loss is nan\n                    if is_nan.item() > 0:\n                        logging.info(f\"loss at step {self.progress['step']} is nan, therefore skip this batch\")\n                        skip_flag = True\n                        continue\n\n                    sum_losses += record_loss.item()\n                    sum_top10acc += top10acc.item()\n                    sum_ntoken += effective_ntoken.item()\n\n                    if 'top10acc_by_codebook' in out:\n                        for cb in range(self.args.n_codebooks):\n                            top10acc_cbi = out['top10acc_by_codebook'][cb]\n                            dist.all_reduce(top10acc_cbi, op=dist.ReduceOp.SUM)\n                            sum_top10acc_cbi[cb] += top10acc_cbi.item()\n                        \n                    if self.rank == 0:\n                        average_loss = sum_losses / sum_ntoken\n                        average_top10acc = sum_top10acc / sum_ntoken\n                        self.meters['train_loss'].update(average_loss, batch['x'].shape[0]*self.world_size)\n                        self.meters['train_top10acc'].update(average_top10acc, batch['x'].shape[0]*self.world_size)\n                        self.meters['train_top10acc'].update(average_top10acc, batch['x'].shape[0]*self.world_size)\n                        average_top10acc_cbi = [sum_top10acc_cbi[cb] / sum_ntoken * self.args.n_codebooks for cb in range(self.args.n_codebooks)]\n                        for cb in range(self.args.n_codebooks):\n                            self.meters[f'train_top10acc_cb{cb+1}'].update(average_top10acc_cbi[cb], batch['x'].shape[0]*self.world_size)\n\n                        if self.progress['step'] % self.args.tb_write_every_n_steps == 0:\n                            self.writer.add_scalar('train/loss', average_loss, self.progress['step'])\n                            self.writer.add_scalar('train/top10acc', average_top10acc, self.progress['step'])\n                            self.writer.add_scalar(\"train/ntokens\", sum_ntoken, self.progress['step'])\n                            for cb in range(self.args.n_codebooks):\n                                self.writer.add_scalar(f'train/top10acc_cb{cb+1}', average_top10acc_cbi[cb], self.progress['step'])\n\n                    if self.args.optimizer_name == \"ScaledAdam\":\n                        self.scaler.scale(out['loss']).backward() \n                    else:\n                        self.scaler.scale(out['loss']/out['effective_ntoken']).backward()\n\n                if skip_flag:\n                    self.optimizer.zero_grad()\n                    skip_flag = False\n                    continue\n\n                if self.args.optimizer_name != \"ScaledAdam\":\n                    self.scaler.unscale_(self.optimizer)\n                    torch.nn.utils.clip_grad_norm_(self.model.parameters(), self.args.gradient_clip_val)\n                self.scaler.step(self.optimizer)\n                self.scaler.update()\n\n                self.optimizer.zero_grad()\n\n                if self.args.optimizer_name == \"ScaledAdam\":\n                    self.scheduler.step_batch(self.progress['step'])\n                else:\n                    self.scheduler.step()\n\n                if self.rank == 0:\n                    self.meters['data_time'].update(data_end_time - data_start_time)\n                    self.meters['train_time'].update(time.time() - data_end_time)\n                    if self.progress['step'] % self.args.tb_write_every_n_steps == 0:\n                        self.writer.add_scalar(\"train/data_time\", data_end_time - data_start_time, self.progress['step'])\n                        self.writer.add_scalar(\"train/train_time\", time.time() - data_end_time, self.progress['step'])\n                        \n\n                    # logging\n                    if self.progress['step'] % self.args.print_every_n_steps == 0:\n                        log_out = {}\n                        log_out['cur_epoch'] = f\"{self.progress['epoch']}/{self.args.num_epochs}\" if self.args.num_epochs is not None else f\"{self.progress['epoch']}\"\n                        log_out['cur_step'] = f\"{int(self.progress['cur_step']+1)}\"\n                        log_out['total_step'] = f\"{self.progress['step']}/{self.args.num_steps}\"\n                        log_out['lr'] = f\"{cur_lr:.7f}\"\n                        log_out['ntokens'] = f\"{sum_ntoken}\"\n                        for key in self.meters:\n                            if self.meters[key].val != 0 or self.meters[key].avg != 0:\n                                log_out[key] = f\"{self.meters[key].val:.4f} ({self.meters[key].avg:.4f})\" if isinstance(self.meters[key].val, float) else f\"{self.meters[key].val}\"\n                        logging.info(log_out)\n                        if np.isnan(self.meters['train_loss'].avg):\n                            logging.warning(\"training diverged...\")\n                            raise RuntimeError(\"training diverged...\")\n\n                # validation and save models\n                if self.progress['step'] % self.args.val_every_n_steps == 0:\n                    dist.barrier()\n                    self.validate_and_save()\n\n                self.progress['step'] += 1\n                self.progress['cur_step'] += 1\n\n                data_start_time = time.time()\n            self.progress['epoch'] += 1\n            self.progress['cur_step'] = 0 # reset cur_step to be 0\n        dist.destroy_process_group()\n\n    def validate_and_save(self):\n        self.model.eval()\n        \n        score = self.validate(self.valid_loader)\n\n        if self.rank == 0:\n            if self.args.early_stop_threshold > 0:\n                if self.progress['best_score'] - score < self.args.early_stop_threshold:\n                    self.early_stop_accu_steps += self.args.val_every_n_steps\n                    if self.early_stop_accu_steps >= self.args.early_stop_step-1:\n                        logging.info(f\"early stop based on self.args.early_stop_threshold: {self.args.early_stop_threshold}, and self.args.early_stop_step: {self.args.early_stop_step}\")\n                        logging.info(f\"best validation score at step: {self.progress['best_step']}, and the score is {self.progress['best_score']:.4f}\")\n                        dist.destroy_process_group()\n                        raise RuntimeError(\"early stop\")\n                else:\n                    self.early_stop_accu_steps = 0\n\n            if (score < self.progress['best_score']):\n                self.progress['best_step'] = self.progress['step']\n                self.progress['best_score'] = score\n                save_path = os.path.join(self.args.exp_dir,\"best_bundle.pth\")\n                torch.save(\n                    {\n                        \"model\": self.model.module.state_dict(),\n                        \"optimizer\":  self.optimizer.state_dict(),\n                        \"scheduler\": self.scheduler.state_dict(),\n                        \"config\": self.args,\n                        \"phn2num\": self.train_loader.dataset.phn2num\n                    },save_path\n                )\n                logging.info(f\"save *best* models at {save_path} at global step {self.progress['step']}\")\n            self._save_progress()\n            save_path = os.path.join(self.args.exp_dir,\"bundle.pth\")\n            torch.save(\n                {\n                    \"model\": self.model.module.state_dict(),\n                    \"optimizer\":  self.optimizer.state_dict(),\n                    \"scheduler\": self.scheduler.state_dict(),\n                    \"config\": self.args,\n                    \"phn2num\": self.train_loader.dataset.phn2num\n                    },save_path\n            )\n            logging.info(f\"save models, indices, acc and other statistics at {save_path} and {self.args.exp_dir}/progress.pkl at global step {self.progress['step']}\")\n\n        dist.barrier()\n\n    def validate(self, valid_loader=None, hide_progress=True):\n        if valid_loader == None:\n            valid_loader = self.valid_loader\n        self.model.eval()\n\n        start_val_time = time.time()\n        sum_losses = 0\n        sum_top10acc = 0\n        sum_ntoken = 0\n        sum_top10acc_cbi = [0 for _ in range(self.args.n_codebooks)]\n\n        with torch.no_grad():\n            for i, batch in enumerate(tqdm(valid_loader, disable=hide_progress)):\n                out = self.model(batch)\n                sum_losses += out['loss']\n                sum_top10acc += out['top10acc']\n                sum_ntoken += out['effective_ntoken']\n                if 'top10acc_by_codebook' in out:\n                    for cb in range(self.args.n_codebooks):\n                        sum_top10acc_cbi[cb] += out['top10acc_by_codebook'][cb]\n                        \n        dist.all_reduce(sum_losses, op=dist.ReduceOp.SUM)\n        dist.all_reduce(sum_top10acc, op=dist.ReduceOp.SUM)\n        dist.all_reduce(sum_ntoken, op=dist.ReduceOp.SUM)\n        \n        if 'top10acc_by_codebook' in out:\n            for cb in range(self.args.n_codebooks):\n                dist.all_reduce(sum_top10acc_cbi[cb], op=dist.ReduceOp.SUM)\n        \n        if self.rank == 0:\n            val_loss = sum_losses / sum_ntoken\n            val_top10acc = sum_top10acc / sum_ntoken\n            # logging\n            self.meters['val_loss'].update(val_loss)\n            logging.info(f\"val loss: {val_loss:.5f}\")\n            self.writer.add_scalar(\"val/loss\", val_loss, self.progress['step'])\n\n            self.meters['val_top10acc'].update(val_top10acc)\n            logging.info(f\"val top10acc: {val_top10acc:.5f}\")\n            self.writer.add_scalar(\"val/top10acc\", val_top10acc, self.progress['step'])\n            for cb in range(self.args.n_codebooks):\n                average_top10acc_cbi = sum_top10acc_cbi[cb] / sum_ntoken * self.args.n_codebooks\n                self.meters[f'val_top10acc_cb{cb+1}'].update(average_top10acc_cbi)\n                self.writer.add_scalar(f'val/top10acc_cb{cb+1}', average_top10acc_cbi, self.progress['step'])\n\n            logging.info(f\"validation takes: {time.time() - start_val_time:.2f}s\")\n            logging.info(f\"Step [{self.progress['step']}/{self.total_step}]\\t Time elapsed {(time.time() - self.start_time)/3600.:.2f}h, Val Loss: {val_loss:.4f}, Val Top10Acc: {val_top10acc:.4f}\")\n            return val_loss.item()\n        else:\n            return None\n\n    def _setup_meters(self):\n        meters = {}\n        meter_names = ['train_loss', 'val_loss', 'train_top10acc', 'val_top10acc', 'data_time', 'train_time']\n        meter_names += ['train_dur_loss', 'train_dur_acc', 'val_dur_loss', 'val_dur_acc']\n        meter_names += [f'train_top10acc_cb{cb+1}' for cb in range(self.args.n_codebooks)]\n        meter_names += [f'val_top10acc_cb{cb+1}' for cb in range(self.args.n_codebooks)]\n        for name in meter_names:\n            meters[name] = AverageMeter()\n        return meters\n    def _setup_progress(self):\n        progress = {}\n        progress['best_step'] = 1\n        progress['best_score'] = np.inf # this records loss value\n        progress['step'] = 1\n        progress['epoch'] = 1\n        progress['cur_step'] = 0 # step in the current epoch, for resuming the sampler\n        total_progress = []\n        # if self.args.resume or self.args.validate:\n        if self.args.resume:\n            progress_pkl = \"%s/progress.pkl\" % self.args.exp_dir\n            with open(progress_pkl, \"rb\") as f:\n                total_progress = pickle.load(f)\n                progress['best_step'], progress['best_score'], progress['step'], progress['epoch'], progress['cur_step'], _ = total_progress[-1]\n            if self.rank == 0:\n                logging.info(\"\\nResume training from:\")\n                logging.info(\"  epoch = %s\" % progress['epoch'])\n                logging.info(\"  cur_step = %s\" % progress['cur_step'])\n                logging.info(\"  step = %s\" % progress['step'])\n                logging.info(\"  best_step = %s\" % progress['best_step'])\n                logging.info(\"  best_score = %s\" % progress['best_score'])\n        return progress, total_progress\n    \n    def _save_progress(self):\n        self.total_progress.append([self.progress['best_step'], self.progress['best_score'], int(self.progress['step']+1), self.progress['epoch'], int(self.progress['cur_step']+1), time.time() - self.start_time])\n        with open(\"%s/progress.pkl\" % self.args.exp_dir, \"wb\") as f:\n            pickle.dump(self.total_progress, f)\n\n    def _setup_dataloader(self):\n        assert self.args.dataset == 'gigaspeech', \"only gigaspeech is supported for now\"\n        train_dataset, val_dataset = gigaspeech.dataset(self.args, 'train'), gigaspeech.dataset(self.args, 'validation')\n        \n        if self.args.dynamic_batching:\n            train_sampler = DistributedDynamicBatchSampler(train_dataset, self.args, num_replicas=self.world_size, rank=self.rank, shuffle=True, seed=self.args.seed, drop_last=True, lengths_list=train_dataset.lengths_list, verbose=True, epoch=0)\n            valid_sampler = DistributedDynamicBatchSampler(val_dataset, self.args, num_replicas=self.world_size, rank=self.rank, shuffle=True, seed=self.args.seed, drop_last=True, lengths_list=val_dataset.lengths_list, verbose=True, epoch=0)\n        else:\n            train_sampler = StatefulDistributedSampler(train_dataset, self.args.batch_size//self.world_size, num_replicas=self.world_size, rank=self.rank, shuffle=True, seed=self.args.seed, drop_last=True)\n            valid_sampler = DistributedSampler(val_dataset, num_replicas=self.world_size, rank=self.rank, shuffle=False, seed=self.args.seed, drop_last=False)\n            \n        if self.progress['step'] > 1:\n            train_sampler.set_epoch_resume(self.progress['epoch'], self.progress['cur_step'])\n\n        if self.args.dynamic_batching:\n            train_loader = torch.utils.data.DataLoader(train_dataset, \n                            batch_sampler=train_sampler, \n                            num_workers=self.args.num_workers//self.world_size,\n                            collate_fn=train_dataset.collate, persistent_workers=True\n                            )\n            valid_loader = torch.utils.data.DataLoader(val_dataset, \n                            batch_sampler=valid_sampler, \n                            num_workers=self.args.num_workers//self.world_size,\n                            collate_fn=val_dataset.collate, persistent_workers=True\n                            )\n        else:\n            train_loader = torch.utils.data.DataLoader(train_dataset, \n                            batch_size=self.args.batch_size//self.world_size, sampler=train_sampler, num_workers=self.args.num_workers//self.world_size,\n                            collate_fn=train_dataset.collate, persistent_workers=True\n                            )\n            valid_loader = torch.utils.data.DataLoader(val_dataset, \n                            batch_size=self.args.batch_size//self.world_size, sampler=valid_sampler,\n                            num_workers=self.args.num_workers//self.world_size,\n                            collate_fn=val_dataset.collate, persistent_workers=True\n                            )\n        return len(train_dataset), train_sampler, train_loader, valid_loader\n        \n\n        \n    def _setup_models(self):\n        model = voicecraft.VoiceCraft(self.args)\n\n        if self.rank == 0:\n            logging.info(model)\n            logging.info(\"model parameters\")\n            print_model_info(model)\n\n        if self.progress['step'] > 1:\n            bundle = torch.load(os.path.join(self.args.exp_dir, \"bundle.pth\"), map_location=\"cpu\")\n            model.load_state_dict(bundle['model'])\n            optim_states = bundle['optimizer']\n            scheduler_states = bundle['scheduler']\n            if self.rank == 0:\n                logging.info(\"loaded parameters and data indices from epoch %d, global step %d\" % (self.progress['epoch'], self.progress['step']))\n            del bundle['model']\n        else:\n            optim_states = None\n            scheduler_states = None\n\n        if self.args.load_model_from != None and self.progress['step'] <= 1:\n            sd = torch.load(self.args.load_model_from, map_location=\"cpu\")['model']\n            model.load_state_dict(sd)\n            del sd\n        \n        if self.args.optimizer_name == \"ScaledAdam\":\n            trainables = [p for p in model.parameters() if p.requires_grad]\n        else:\n            no_decay = [\".bias\", \".audio_embeddings.weight\", \".text_embeddings.weight\", \".norm.weight\", \".norm1.weight\", \".norm2.weight\"]\n            optimizer_grouped_parameters = [\n                {\n                    \"params\": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay) and p.requires_grad],\n                    \"weight_decay\": self.args.weight_decay,\n                },\n                {\n                    \"params\": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay) and p.requires_grad],\n                    \"weight_decay\": 0.0,\n                },\n            ]\n            if len(optimizer_grouped_parameters[1]['params']) == 0:\n                logging.info(\"there is no embedding weights, bias, and layernorm parameters in the model, which should be True, check model parameter names\")\n                trainables = optimizer_grouped_parameters[0]\n            else:\n                trainables = optimizer_grouped_parameters\n        model.to(self.device)\n\n        return model, trainables, optim_states, scheduler_states\n\n    \n    def _setup_optimizer(self):\n        if self.args.optimizer_name == \"ScaledAdam\":\n            parameters_names = []\n            parameters_names.append([n for n,p in self.model.named_parameters() if p.requires_grad])\n            optimizer = ScaledAdam(\n                self.trainables,\n                lr=self.args.lr,\n                betas=(0.9, 0.95),\n                clipping_scale=2.0,\n                parameters_names=parameters_names,\n                show_dominant_parameters=False,\n                clipping_update_period=self.args.clipping_update_period,\n            )\n            scheduler = Eden(optimizer, self.args.reduce_lr_start_step, self.args.reduce_lr_start_epoch, warmup_batches=self.total_step * self.args.warmup_fraction)\n\n        else:\n            optimizer = AdamW(self.trainables, lr=self.args.lr)\n            warmup_steps = self.total_step * self.args.warmup_fraction\n            def lr_lambda(current_step: int):\n                if current_step < warmup_steps:\n                    return float(current_step) / float(max(1, warmup_steps))\n                return max(\n                    0.0, float(self.total_step - current_step) / float(max(1, self.total_step - warmup_steps))\n                )\n\n            scheduler = LambdaLR(optimizer, lr_lambda, last_epoch=-1)\n            \n        # if resume\n        if self.progress['step'] > 1:\n            optimizer.load_state_dict(self.optim_states)\n            for state in optimizer.state.values():\n                for k, v in state.items():\n                    if isinstance(v, torch.Tensor):\n                        state[k] = v.cuda()\n            del self.optim_states\n\n            scheduler.load_state_dict(self.scheduler_states)\n\n        optimizer.zero_grad()\n        return optimizer, scheduler\n    \n    def seed_everything(self, seed=1):\n        os.environ['PYTHONHASHSEED'] = str(seed)\n        random.seed(seed)\n        np.random.seed(seed)\n        torch.manual_seed(seed)\n        torch.cuda.manual_seed(seed)\n        torch.backends.cudnn.benchmark = False\n        torch.backends.cudnn.deterministic = True"
  },
  {
    "path": "steps/trainer_utils.py",
    "content": "\nimport torch\nimport math\nimport torch.distributed as dist\nfrom torch.utils.data.sampler import Sampler\nimport copy\nimport numpy as np\nfrom typing import List\nfrom scipy.stats import lognorm\nimport logging\n\nclass StatefulDistributedSampler(Sampler[int]):\n    def __init__(self, dataset, batch_size, num_replicas = None, rank = None, shuffle = True, seed = 0, drop_last = False):\n        if num_replicas is None:\n            if not dist.is_available():\n                raise RuntimeError(\"Requires distributed package to be available\")\n            num_replicas = dist.get_world_size()\n        if rank is None:\n            if not dist.is_available():\n                raise RuntimeError(\"Requires distributed package to be available\")\n            rank = dist.get_rank()\n        if rank >= num_replicas or rank < 0:\n            raise ValueError(\n                \"Invalid rank {}, rank should be in the interval\"\n                \" [0, {}]\".format(rank, num_replicas - 1))\n        self.dataset = dataset\n        self.batch_size = batch_size\n        self.num_replicas = num_replicas\n        self.rank = rank\n        self.epoch = 0\n        self.cur_epoch = 0\n        self.drop_last = drop_last\n        # If the dataset length is evenly divisible by # of replicas, then there\n        # is no need to drop any data, since the dataset will be split equally.\n        if self.drop_last and len(self.dataset) % self.num_replicas != 0:  # type: ignore[arg-type]\n            # Split to nearest available length that is evenly divisible.\n            # This is to ensure each rank receives the same amount of data when\n            # using this Sampler.\n            self.num_samples = math.ceil(\n                (len(self.dataset) - self.num_replicas) / self.num_replicas  # type: ignore[arg-type]\n            )\n        else:\n            self.num_samples = math.ceil(len(self.dataset) / self.num_replicas)  # type: ignore[arg-type]\n        self.total_size = self.num_samples * self.num_replicas\n        self.shuffle = shuffle\n        self.seed = seed\n        self.continue_flag = False\n    def __len__(self):\n        return self.num_samples\n\n    def set_epoch(self, epoch):\n        r\"\"\"\n        Sets the epoch for this sampler. When :attr:`shuffle=True`, this ensures all replicas\n        use a different random ordering for each epoch. Otherwise, the next iteration of this\n        sampler will yield the same ordering.\n\n        Args:\n            epoch (int): Epoch number.\n        \"\"\"\n        self.epoch = epoch\n\n        if self.shuffle:\n            # deterministically shuffle based on epoch and seed\n            g = torch.Generator()\n            g.manual_seed(self.seed + self.epoch)\n            indices = torch.randperm(len(self.dataset), generator=g).tolist()  # type: ignore[arg-type]\n        else:\n            indices = list(range(len(self.dataset)))  # type: ignore[arg-type]\n\n        if not self.drop_last:\n            # add extra samples to make it evenly divisible\n            padding_size = self.total_size - len(indices)\n            if padding_size <= len(indices):\n                indices += indices[:padding_size]\n            else:\n                indices += (indices * math.ceil(padding_size / len(indices)))[:padding_size]\n        else:\n            # remove tail of data to make it evenly divisible.\n            indices = indices[:self.total_size]\n        assert len(indices) == self.total_size\n\n        # subsample\n        indices = indices[self.rank:self.total_size:self.num_replicas]\n        assert len(indices) == self.num_samples\n        self.indices = indices\n\n        if self.continue_flag:\n            self.indices = self.indices[int(self.cur_step*self.batch_size):]\n            self.num_samples = len(self.indices)\n            self.continue_flag = False\n                \n    def __iter__(self):\n        for idx in self.indices:\n            yield idx  \n\n    def set_epoch_resume(self, epoch, cur_step):\n        self.epoch = epoch\n        self.cur_step = cur_step\n        self.continue_flag = True\n\n\nclass StatefulSampler(Sampler):\n    def __init__(self, data_source_length, batch_size, use_random=True, seed=1, epoch=0):\n        self.use_random = use_random\n        self.data_source_length = data_source_length\n        self.num_samples = self.data_source_length\n        self.batch_size = batch_size\n        self.continue_flag = False\n        self.seed = seed\n        self.epoch = epoch\n        self.cur_step = 0\n\n    def __len__(self):\n        return self.num_samples\n\n    def __iter__(self):\n\n        for idx in self.indices:\n            yield idx\n\n    def set_epoch(self, epoch):\n        self.epoch = epoch\n        if self.use_random:\n            # deterministically shuffle based on epoch and seed\n            g = torch.Generator()\n            g.manual_seed(self.seed + self.epoch)\n            self.indices = torch.randperm(self.data_source_length, generator=g).tolist()  # type: ignore[arg-type]\n        else:\n            self.indices = list(range(self.data_source_length))  # type: ignore[arg-type]\n        if self.continue_flag == True:\n            self.continue_flag = False\n            self.indices = self.indices[int(self.cur_step*self.batch_size):]\n        \n        self.num_samples = len(self.indices)\n    \n    def set_epoch_resume(self, epoch, cur_step):\n        self.epoch = epoch\n        self.cur_step = cur_step\n        self.continue_flag = True\n\n\nclass AverageMeter:\n    \"\"\"Computes and stores the average and current value\"\"\"\n    def __init__(self):\n        self.reset()\n\n    def reset(self):\n        self.val = 0\n        self.avg = 0\n        self.sum = 0\n        self.count = 0\n\n    def update(self, val, n=1):\n        self.val = val\n        self.sum += val * n\n        self.count += n\n        self.avg = self.sum / self.count\n\ndef print_model_info(model, print_model = False, print_params = True):\n    if print_model:\n        logging.info(model)\n    if print_params:\n        all_params = {}\n        for name, p in model.named_parameters():\n            name = name.split(\".\")[0]\n            if name in all_params:\n                all_params[name] += p.numel()\n            else:\n                all_params[name] = p.numel()\n        logging.info(\"num of parameters of each components:\")\n        for name in all_params:\n            logging.info(f\"{name}: {all_params[name]/1000000.:.2f}m\")\n\n\nclass DistributedDynamicBatchSampler(Sampler):\n    \"\"\"\n    modified from SpeechBrian, https://github.com/speechbrain/speechbrain/blob/develop/speechbrain/dataio/sampler.py#L307\n    This BatchSampler batches examples together by grouping them by their length.\n\n    Every example in the batch have approximately the same length and\n    thus padding is minimized.\n    This enables faster training on datasets\n    where length of examples can vary significantly (e.g Librispeech).\n    Inspired by: https://www.tensorflow.org/api_docs/python/tf/data/experimental/bucket_by_sequence_length\n\n    Dynamic batching is performed by specifying a max_batch_length which is the\n    upper limit for the sum of the length of examples in a batch:\n    e.g., if ex1 has length 4, ex2 length 5 and if max_batch_length is set to 6\n    ex1 and ex2 will be placed, alone, in two distinct batches.\n\n    Length for each example can be obtained in two manners.\n    If the input dataset is a DynamicItemDataset it can be obtained by specifying a\n    length_func. Default assumes a \"duration\" entry is in the annotation.\n    Length for each example can also be passed to this class upon instantiation\n    by specifying a list containing the length for each example and passing it to\n    lengths_list.\n\n    Examples are grouped together by defining a set of possible discrete intervals\n    (buckets). Examples whose length fall into these intervals can be batched together.\n\n    The number of buckets can be specified by using the arg num_buckets.\n    There is usually an optimal range for the value of this argument.\n\n    If num_buckets == 1, all examples can be batched together. You have maximum randomization\n    but your training speed will be slower due to the fact that a large amount of the values will be padding\n    as long and short examples can be batched together.\n    As the number of buckets grows only examples with similar\n    length can be grouped together.\n    This trades-off speed with randomization.\n    TLDR: Low number -> better randomization, High number -> faster training.\n    NOTE THAT: if set too high the training speed will decrease. If num_buckets -> number of examples in the dataset the batch size\n    will be small impacting training speed and possibly performance.\n\n    The buckets can also be specified by passing a list to the bucket_boundaries\n    argument instead of specifying a left_bucket_length and a bucket_length_multiplier.\n\n    Example\n    -------\n    >>> import torch\n    >>> import speechbrain as sb\n    >>> from speechbrain.dataio.sampler import DynamicBatchSampler\n    >>> from speechbrain.dataio.dataset import DynamicItemDataset\n    >>> from speechbrain.dataio.dataloader import SaveableDataLoader\n    >>> from speechbrain.dataio.batch import PaddedBatch\n    >>> import numpy as np\n    >>> item_lengths = sorted([np.random.randint(10, 100) for x in range(20)])\n    >>> dataset = {\"ex_{}\".format(x) : {\"wav\" :torch.randn(x)} for x in item_lengths}\n    >>> dataset = DynamicItemDataset(dataset)\n    >>> dataset.set_output_keys([\"wav\"])\n    >>> length_func = lambda x : len(x) # trivial in this example\n    >>> bsampler = DynamicBatchSampler(dataset, 20, 4, length_func, shuffle=False, batch_ordering='descending')\n    >>> dataloader = SaveableDataLoader(dataset, batch_sampler=bsampler, collate_fn=PaddedBatch)\n    >>> for i, b in enumerate(dataloader):\n    ...     data, length = b[\"wav\"]\n    >>> assert data.shape[-1] == max(item_lengths)\n\n    Arguments\n    ---------\n    dataset : torch.utils.data.Dataset\n        Pytorch Dataset from which elements will be sampled.\n    max_batch_length : int\n        Upper limit for the sum of the length of examples in a batch.\n        Should be chosen based on your GPU memory.\n    num_buckets : int\n        Number of discrete buckets used to group examples together.\n        If num_buckets == 1, all examples can be batched together. As the number of buckets grows only examples with similar\n        length can be grouped together. This trades-off speed with randomization.\n        Low number -> better randomization, High number -> faster training.\n        However if set too high the training speed will decrease. If num_buckets -> number of examples in the dataset the batch size\n        will be small impacting training speed and possibly performance.\n        NOTE: you have either to specify manually the bucket_boundaries or the number of buckets.\n    length_func : callable\n        Function used to get length of each example from the dataset.\n        This argument can be used only when the dataset is a Speechbrain DynamicItemDataset object.\n        Can be anything: e.g. lambda x: x[\"duration\"]*16000 returns number of samples\n        if duration key in the annotation is in seconds and the file has 16kHz sampling freq.\n    shuffle : bool\n        Whether or not shuffle examples between each epoch.\n    batch_ordering : string\n        If ``random``, batches are randomly permuted; otherwise ``ascending`` or ``descending`` sorted by length.\n    max_batch_ex: int\n        If set, it limits the maximum number of examples that can be in a batch superseeding max_batch_length\n        in instances where the amount of examples will exceeed the value specified here.\n        E.g. you have a lot of short examples and the batch size for those will be too high, you can use this argument\n        to limit the batch size for these short examples.\n    bucket_boundaries : list\n        Overrides bucket_length_multiplier and left_bucket_length by specifying manually\n        the buckets right boundaries.\n    lengths_list: list\n        Overrides length_func by passing a list containing the length of each example\n        in the dataset. This argument must be set when the dataset is a plain\n        Pytorch Dataset object and not a DynamicItemDataset object as length_func\n        cannot be used on Pytorch Datasets.\n    epoch : int\n        The epoch to start at.\n    drop_last : bool\n         If ``True``, the sampler will drop the last examples which\n         have not been grouped.\n    verbose: bool\n        If ``True``, log also the stats for each batch at the first epoch.\n    \"\"\"\n\n    def __init__(\n        self,\n        dataset,\n        args,\n        num_replicas = None, \n        rank = None, \n        shuffle = True, \n        seed = 0, \n        drop_last = False,\n        length_func=lambda x: x[\"duration\"],\n        batch_ordering: str = \"random\",\n        max_batch_ex: int = None,\n        bucket_boundaries: List[int] = [],\n        lengths_list: List[int] = None,\n        epoch: int = 0,\n        verbose: bool = False,\n    ):\n        self.args = args\n        if num_replicas is None:\n            if not dist.is_available():\n                raise RuntimeError(\"Requires distributed package to be available\")\n            num_replicas = dist.get_world_size()\n        if rank is None:\n            if not dist.is_available():\n                raise RuntimeError(\"Requires distributed package to be available\")\n            rank = dist.get_rank()\n        if rank >= num_replicas or rank < 0:\n            raise ValueError(\n                \"Invalid rank {}, rank should be in the interval\"\n                \" [0, {}]\".format(rank, num_replicas - 1))\n        self.num_replicas = num_replicas\n        self.rank = rank\n        max_batch_length = self.args.max_num_tokens if dataset.split == \"train\" else self.args.val_max_num_tokens\n        logging.info(f\"max_num_tokens per GPU for {dataset.split} split: {max_batch_length}\")\n        num_buckets = self.args.num_buckets\n        #############\n        \n\n\n\n        self._dataset = dataset\n        self._ex_lengths = {}\n        # ex_ids = self._dataset.data_ids\n        self.verbose = verbose\n\n        # We do not put a default on num_buckets to encourage users to play with this parameter\n        if num_buckets is None and len(bucket_boundaries) == 0:\n            raise RuntimeError(\n                \"Please specify either num_buckets or bucket boundaries.\"\n                \"Check the docs, and/or the tutorial !\"\n            )\n        assert lengths_list != None\n        max_len = int(self.args.audio_max_length * self.args.encodec_sr)\n        lengths_list = [min(l, max_len) for l in lengths_list] # replace all utt whose length is longer than max_len to max_len, will also do this in __getitem__ in dataset\n        for indx in range(len(lengths_list)):\n            self._ex_lengths[str(indx)] = lengths_list[indx]\n        # if lengths_list is not None:\n        #     # take length of examples from this argument and bypass length_key\n        #     for indx in range(len(lengths_list)):\n        #         self._ex_lengths[str(indx)] = lengths_list[indx]\n        # else:\n        #     # use length func\n        #     if not isinstance(dataset, DynamicItemDataset):\n        #         raise NotImplementedError(\n        #             \"Dataset should be a Speechbrain DynamicItemDataset when using length function\"\n        #         )\n        #     for indx in range(len(self._dataset)):\n        #         self._ex_lengths[str(indx)] = length_func(\n        #             self._dataset.data[ex_ids[indx]]\n        #         )\n\n        if len(bucket_boundaries) > 0:\n            if not all([x >= 0 for x in bucket_boundaries]):\n                raise ValueError(\n                    \"All elements in bucket boundaries should be non-negative (>= 0).\"\n                )\n            if not len(set(bucket_boundaries)) == len(bucket_boundaries):\n                raise ValueError(\n                    \"Bucket_boundaries should not contain duplicates.\"\n                )\n            np.testing.assert_array_equal(\n                np.array(bucket_boundaries),\n                np.array(sorted(bucket_boundaries)),\n                err_msg=\"The arg bucket_boundaries should be an ascending sorted list of non negative values values!\",\n            )\n            self._bucket_boundaries = np.array(sorted(bucket_boundaries))\n        else:\n            # use num_buckets\n            self._bucket_boundaries = np.array(\n                self._get_boundaries_through_warping(\n                    # max_batch_length=max_batch_length,\n                    max_batch_length=max(lengths_list),\n                    num_quantiles=num_buckets,\n                )\n            )\n\n        self._max_batch_length = max_batch_length\n        self._shuffle_ex = shuffle\n        self._batch_ordering = batch_ordering\n        self._seed = seed\n        self._drop_last = drop_last\n        if max_batch_ex is None:\n            max_batch_ex = np.inf\n        self._max_batch_ex = max_batch_ex\n        # Calculate bucket lengths - how often does one bucket boundary fit into max_batch_length?\n        self._bucket_lens = [\n            max(1, int(max_batch_length / self._bucket_boundaries[i]))\n            for i in range(len(self._bucket_boundaries))\n        ] + [1]\n        self._epoch = epoch\n        self._cur_step = 0\n        self.continue_flag = False\n        self._generate_batches()\n        self.num_samples = int(math.floor(len(self._batches) / self.num_replicas))\n        self.total_size = int(self.num_samples * self.num_replicas)\n        self._replica_batches = self._batches[self.rank:self.total_size:self.num_replicas]\n        assert len(self._replica_batches) == self.num_samples, f\"len(self._batches): {len(self._batches)}, self.total_size: {self.total_size}, self.num_samples: {self.num_samples},len(self._replica_batches): {len(self._replica_batches)}\"\n        logging.info(f\"len(self._batches): {len(self._batches)}\")\n        logging.info(f\"self.num_replicas: {self.num_replicas}\")\n        logging.info(f\"num of batches on each replica: {self.num_samples}\")\n\n    def get_durations(self, batch):\n        \"\"\"Gets durations of the elements in the batch.\"\"\"\n        return [self._ex_lengths[str(idx)] for idx in batch]\n\n    def _get_boundaries_through_warping(\n        self, max_batch_length: int, num_quantiles: int,\n    ) -> List[int]:\n\n        # NOTE: the following lines do not cover that there is only one example in the dataset\n        # warp frames (duration) distribution of train data\n        logging.info(\"Batch quantisation in latent space\")\n        # linspace set-up\n        num_boundaries = num_quantiles + 1\n        # create latent linearly equal spaced buckets\n        latent_boundaries = np.linspace(\n            1 / num_boundaries, num_quantiles / num_boundaries, num_quantiles,\n        )\n        # get quantiles using lognormal distribution\n        quantiles = lognorm.ppf(latent_boundaries, 1)\n        # scale up to to max_batch_length\n        bucket_boundaries = quantiles * max_batch_length / quantiles[-1]\n        # compute resulting bucket length multipliers\n        length_multipliers = [\n            bucket_boundaries[x + 1] / bucket_boundaries[x]\n            for x in range(num_quantiles - 1)\n        ]\n        # logging\n        logging.debug(\n            \"Latent bucket boundary - buckets: {} - length multipliers: {}\".format(\n                list(map(\"{:.2f}\".format, bucket_boundaries)),\n                list(map(\"{:.2f}\".format, length_multipliers)),\n            )\n        )\n        return list(sorted(bucket_boundaries))\n\n    def _permute_batches(self):\n\n        if self._batch_ordering == \"random\":\n            # deterministically shuffle based on epoch and seed\n            g = torch.Generator()\n            g.manual_seed(self._seed + self._epoch) # since the random seed is based on self._seed and self._epoch, it should be the same for different processes when using DDP, and therefore the generated order should be the same across different process, this is important, because each replica will only take a portion of it, we want to make sure they take a non-overlapping portion, and all of them constitute the entire dataset\n            sampler = torch.randperm(\n                len(self._batches), generator=g\n            ).tolist()  # type: ignore\n            tmp = []\n            for idx in sampler:\n                tmp.append(self._batches[idx])\n            self._batches = tmp\n\n        elif self._batch_ordering == \"ascending\":\n            self._batches = sorted(\n                self._batches,\n                key=lambda x: max([self._ex_lengths[str(idx)] for idx in x]),\n            )\n        elif self._batch_ordering == \"descending\":\n            self._batches = sorted(\n                self._batches,\n                key=lambda x: max([self._ex_lengths[str(idx)] for idx in x]),\n                reverse=True,\n            )\n        else:\n            raise NotImplementedError\n\n    def _generate_batches(self):\n        logging.info(\"DynamicBatchSampler: Generating dynamic batches\")\n        if self._shuffle_ex:\n            # deterministically shuffle based on epoch and seed\n            g = torch.Generator()\n            g.manual_seed(self._seed + self._epoch) # since the random seed is based on self._seed and self._epoch, it should be the same for different processes when using DDP, and therefore the generated order should be the same across different process, this is important, because each replica will only take a portion of it, we want to make sure they take a non-overlapping portion, and all of them constitute the entire dataset\n            sampler = torch.randperm(len(self._dataset), generator=g).tolist()  # type: ignore \n            # pyp note: this is actually randomly permoted indices\n        else:\n            # take examples as they are: e.g. they have been sorted\n            sampler = range(len(self._dataset))  # type: ignore\n\n        self._batches = []\n        bucket_batches = [[] for i in self._bucket_lens]\n\n        stats_tracker = [\n            {\"min\": np.inf, \"max\": -np.inf, \"tot\": 0, \"n_ex\": 0}\n            for i in self._bucket_lens\n        ]\n\n        for idx in sampler:\n            # length of pre-sampled audio\n            item_len = self._ex_lengths[str(idx)]\n            # bucket to fill up most padding\n            bucket_id = np.searchsorted(self._bucket_boundaries, item_len)\n            # fill audio's duration into that bucket\n            bucket_batches[bucket_id].append(idx)\n\n            stats_tracker[bucket_id][\"min\"] = min(\n                stats_tracker[bucket_id][\"min\"], item_len\n            )\n            stats_tracker[bucket_id][\"max\"] = max(\n                stats_tracker[bucket_id][\"max\"], item_len\n            )\n            stats_tracker[bucket_id][\"tot\"] += item_len\n            stats_tracker[bucket_id][\"n_ex\"] += 1\n            # track #samples - why not duration/#frames; rounded up?\n            # keep track of durations, if necessary\n\n            if (\n                len(bucket_batches[bucket_id]) >= self._bucket_lens[bucket_id]\n                or len(bucket_batches[bucket_id]) >= self._max_batch_ex\n            ):\n                self._batches.append(bucket_batches[bucket_id])\n                bucket_batches[bucket_id] = []\n                # keep track of durations\n\n        # Dump remaining batches\n        if not self._drop_last:\n            for batch in bucket_batches:\n                if batch:\n                    self._batches.append(batch)\n\n        self._permute_batches()  # possibly reorder batches\n\n        if self._epoch == 0:  # only log at first epoch\n            # frames per batch & their padding remaining\n            boundaries = [0] + self._bucket_boundaries.tolist()\n\n            for bucket_indx in range(len(self._bucket_boundaries)):\n                try:\n                    num_batches = stats_tracker[bucket_indx][\"tot\"] // (\n                        self._max_batch_length\n                    )\n                    pad_factor = (\n                        stats_tracker[bucket_indx][\"max\"]\n                        - stats_tracker[bucket_indx][\"min\"]\n                    ) / (\n                        stats_tracker[bucket_indx][\"tot\"]\n                        / stats_tracker[bucket_indx][\"n_ex\"]\n                    )\n                except ZeroDivisionError:\n                    num_batches = 0\n                    pad_factor = 0\n\n                logging.debug(\n                    (\n                        \"DynamicBatchSampler: Bucket {} with boundary {:.1f}-{:.1f} and \"\n                        + \"batch_size {}: Num Examples {:.1f}, Num Full Batches {:.3f}, Pad Factor {:.3f}.\"\n                    ).format(\n                        bucket_indx,\n                        boundaries[bucket_indx],\n                        boundaries[bucket_indx + 1],\n                        self._bucket_lens[bucket_indx],\n                        stats_tracker[bucket_indx][\"n_ex\"],\n                        num_batches,\n                        pad_factor * 100,\n                    )\n                )\n\n            if self.verbose:\n                batch_stats = {\n                    \"tot_frames\": [],\n                    \"tot_pad_frames\": [],\n                    \"pad_%\": [],\n                }\n                for batch in self._batches:\n                    tot_frames = sum(\n                        [self._ex_lengths[str(idx)] for idx in batch]\n                    )\n                    batch_stats[\"tot_frames\"].append(tot_frames)\n                    max_frames = max(\n                        [self._ex_lengths[str(idx)] for idx in batch]\n                    )\n                    tot_pad = sum(\n                        [\n                            max_frames - self._ex_lengths[str(idx)]\n                            for idx in batch\n                        ]\n                    )\n                    batch_stats[\"tot_pad_frames\"].append(tot_pad)\n                    batch_stats[\"pad_%\"].append(tot_pad / tot_frames * 100)\n\n                padding_details = \"Batch {} with {:.1f} frames with {} files - {:.1f} padding, {:.2f} (%) of total.\"\n                padding_details = \"DynamicBatchSampler: \" + padding_details\n                for i in range(len(self._batches)):\n                    logging.debug(\n                        padding_details.format(\n                            i,\n                            batch_stats[\"tot_frames\"][i],\n                            len(self._batches[i]),\n                            batch_stats[\"tot_pad_frames\"][i],\n                            batch_stats[\"pad_%\"][i],\n                        )\n                    )\n\n    def __iter__(self):\n\n        for batch in self._replica_batches:\n            yield batch\n\n\n        # if self._shuffle_ex:  # re-generate examples if ex_ordering == \"random\"\n        #     self._generate_batches()\n        # if self._batch_ordering == \"random\":\n        #     # we randomly permute the batches only --> faster\n        #     self._permute_batches()\n\n    def set_epoch(self, epoch):\n        \"\"\"\n        You can also just access self.epoch, but we maintain this interface\n        to mirror torch.utils.data.distributed.DistributedSampler\n        \"\"\"\n        self._epoch = epoch\n        self._generate_batches()\n        self._replica_batches = self._batches[self.rank:self.total_size:self.num_replicas]\n        self.num_samples = int(math.floor(len(self._batches) / self.num_replicas))\n        assert len(self._replica_batches) == self.num_samples, f\"len(self._batches): {len(self._batches)}, self.total_size: {self.total_size}, self.num_samples: {self.num_samples},len(self._replica_batches): {len(self._replica_batches)}\"\n\n        if self.continue_flag:\n            self.continue_flag = False\n            self._replica_batches = self._replica_batches[self._cur_step:]\n            self.num_samples = len(self._replica_batches)\n \n\n    def __len__(self):\n        return self.num_samples\n    \n    def set_epoch_resume(self, epoch, cur_step):\n        self.continue_flag = True\n        self._epoch = epoch\n        self._cur_step = cur_step\n"
  },
  {
    "path": "tts_demo.py",
    "content": "\"\"\"\nThis script will allow you to run TTS inference with Voicecraft\nBefore getting started, be sure to follow the environment setup.\n\"\"\"\n\nfrom inference_tts_scale import inference_one_sample\nfrom models import voicecraft\nfrom data.tokenizer import (\n    AudioTokenizer,\n    TextTokenizer,\n)\nimport argparse\nimport random\nimport numpy as np\nimport torchaudio\nimport torch\nimport os\nos.environ[\"USER\"] = \"me\"  # TODO change this to your username\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\n\ndef parse_arguments():\n    parser = argparse.ArgumentParser(\n        description=\"VoiceCraft TTS Inference: see the script for more information on the options\")\n\n    parser.add_argument(\"-m\", \"--model_name\", type=str, default=\"giga830M\", choices=[\n                        \"giga330M\", \"giga830M\", \"giga330M_TTSEnhanced\", \"giga830M_TTSEnhanced\"],\n                        help=\"VoiceCraft model to use\")\n    parser.add_argument(\"-st\", \"--silence_tokens\", type=int, nargs=\"*\",\n                        default=[1388, 1898, 131], help=\"Silence token IDs\")\n    parser.add_argument(\"-casr\", \"--codec_audio_sr\", type=int,\n                        default=16000, help=\"Codec audio sample rate.\")\n    parser.add_argument(\"-csr\", \"--codec_sr\", type=int, default=50,\n                        help=\"Codec sample rate.\")\n\n    parser.add_argument(\"-k\", \"--top_k\", type=float,\n                        default=0, help=\"Top k value.\")\n    parser.add_argument(\"-p\", \"--top_p\", type=float,\n                        default=0.8, help=\"Top p value.\")\n    parser.add_argument(\"-t\", \"--temperature\", type=float,\n                        default=1, help=\"Temperature value.\")\n    parser.add_argument(\"-kv\", \"--kvcache\", type=float, choices=[0, 1],\n                        default=0, help=\"Kvcache value.\")\n    parser.add_argument(\"-sr\", \"--stop_repetition\", type=int,\n                        default=-1, help=\"Stop repetition for generation\")\n    parser.add_argument(\"--sample_batch_size\", type=int,\n                        default=3, help=\"Batch size for sampling\")\n    parser.add_argument(\"-s\", \"--seed\", type=int,\n                        default=1, help=\"Seed value.\")\n    parser.add_argument(\"-bs\", \"--beam_size\", type=int, default=50,\n                        help=\"beam size for MFA alignment\")\n    parser.add_argument(\"-rbs\", \"--retry_beam_size\", type=int, default=200,\n                        help=\"retry beam size for MFA alignment\")\n    parser.add_argument(\"--output_dir\", type=str, default=\"./generated_tts\",\n                        help=\"directory to save generated audio\")\n    parser.add_argument(\"-oa\", \"--original_audio\", type=str,\n                        default=\"./demo/5895_34622_000026_000002.wav\", help=\"location of audio file\")\n    parser.add_argument(\"-ot\", \"--original_transcript\", type=str,\n                        default=\"Gwynplaine had, besides, for his work and for his feats of strength, round his neck and over his shoulders, an esclavine of leather.\",\n                        help=\"original transcript\")\n    parser.add_argument(\"-tt\", \"--target_transcript\", type=str,\n                        default=\"I cannot believe that the same model can also do text to speech synthesis too!\",\n                        help=\"target transcript\")\n    parser.add_argument(\"-co\", \"--cut_off_sec\", type=float, default=3.6,\n                        help=\"cut off point in seconds for input prompt\")\n    parser.add_argument(\"-ma\", \"--margin\", type=float, default=0.04,\n                    help=\"margin in seconds between the end of the cutoff words and the start of the next word. If the next word is not immediately following the cutoff word, the algorithm is more tolerant to word alignment errors\")\n    parser.add_argument(\"-cuttol\", \"--cutoff_tolerance\", type=float, default=1, help=\"tolerance in seconds for the cutoff time, if given cut_off_sec plus the tolerance, we still are not able to find the next word, we will use the best cutoff time found, i.e. likely no margin or very small margin between the end of the cutoff word and the start of the next word\")\n\n    args = parser.parse_args()\n    return args\n\n\nargs = parse_arguments()\nvoicecraft_name = args.model_name\n# hyperparameters for inference\ncodec_audio_sr = args.codec_audio_sr\ncodec_sr = args.codec_sr\ntop_k = args.top_k\ntop_p = args.top_p  # defaults to 0.9 can also try 0.8, but 0.9 seems to work better\ntemperature = args.temperature\nsilence_tokens = args.silence_tokens\nkvcache = args.kvcache  # NOTE if OOM, change this to 0, or try the 330M model\n\n# NOTE adjust the below three arguments if the generation is not as good\n# NOTE if the model generate long silence, reduce the stop_repetition to 3, 2 or even 1\nstop_repetition = args.stop_repetition\n\n# NOTE: if the if there are long silence or unnaturally strecthed words,\n# increase sample_batch_size to 4 or higher. What this will do to the model is that the\n# model will run sample_batch_size examples of the same audio, and pick the one that's the shortest.\n# So if the speech rate of the generated is too fast change it to a smaller number.\nsample_batch_size = args.sample_batch_size\nseed = args.seed  # change seed if you are still unhappy with the result\n\n# load the model\nif voicecraft_name == \"330M\":\n    voicecraft_name = \"giga330M\"\nelif voicecraft_name == \"830M\":\n    voicecraft_name = \"giga830M\"\nelif voicecraft_name == \"330M_TTSEnhanced\":\n    voicecraft_name = \"330M_TTSEnhanced\"\nelif voicecraft_name == \"830M_TTSEnhanced\":\n    voicecraft_name = \"830M_TTSEnhanced\"\nmodel = voicecraft.VoiceCraft.from_pretrained(\n    f\"pyp1/VoiceCraft_{voicecraft_name.replace('.pth', '')}\")\nphn2num = model.args.phn2num\nconfig = vars(model.args)\nmodel.to(device)\n\nencodec_fn = \"./pretrained_models/encodec_4cb2048_giga.th\"\nif not os.path.exists(encodec_fn):\n    os.system(\n        f\"wget https://huggingface.co/pyp1/VoiceCraft/resolve/main/encodec_4cb2048_giga.th -O ./pretrained_models/encodec_4cb2048_giga.th\")\n# will also put the neural codec model on gpu\naudio_tokenizer = AudioTokenizer(signature=encodec_fn, device=device)\n\ntext_tokenizer = TextTokenizer(backend=\"espeak\")\n\n# Prepare your audio\n# point to the original audio whose speech you want to clone\n# write down the transcript for the file, or run whisper to get the transcript (and you can modify it if it's not accurate), save it as a .txt file\norig_audio = args.original_audio\norig_transcript = args.original_transcript\n\n# move the audio and transcript to temp folder\ntemp_folder = \"./demo/temp\"\nos.makedirs(temp_folder, exist_ok=True)\nos.system(f\"cp {orig_audio} {temp_folder}\")\nfilename = os.path.splitext(orig_audio.split(\"/\")[-1])[0]\nwith open(f\"{temp_folder}/{filename}.txt\", \"w\") as f:\n    f.write(orig_transcript)\n# run MFA to get the alignment\nalign_temp = f\"{temp_folder}/mfa_alignments\"\nbeam_size = args.beam_size\nretry_beam_size = args.retry_beam_size\nalignments = f\"{temp_folder}/mfa_alignments/{filename}.csv\"\nif not os.path.isfile(alignments):\n    os.system(f\"mfa align -v --clean -j 1 --output_format csv {temp_folder} \\\n            english_us_arpa english_us_arpa {align_temp} --beam {beam_size} --retry_beam {retry_beam_size}\")\n# if the above fails, it could be because the audio is too hard for the alignment model,\n# increasing the beam_size and retry_beam_size usually solves the issue\n\ndef find_closest_word_boundary(alignments, cut_off_sec, margin, cutoff_tolerance = 1):\n    with open(alignments, 'r') as file:\n        # skip header\n        next(file)\n        cutoff_time = None\n        cutoff_index = None\n        cutoff_time_best = None\n        cutoff_index_best = None\n        lines = [l for l in file.readlines()]\n        for i, line in enumerate(lines):\n            end = float(line.strip().split(',')[1])\n            if end >= cut_off_sec and cutoff_time == None:\n                cutoff_time = end\n                cutoff_index = i\n            if end >= cut_off_sec and end < cut_off_sec + cutoff_tolerance and float(lines[i+1].strip().split(',')[0]) - end >= margin:\n                    cutoff_time_best = end + margin * 2 / 3\n                    cutoff_index_best = i\n                    break\n        if cutoff_time_best != None:\n            cutoff_time = cutoff_time_best\n            cutoff_index = cutoff_index_best\n        return cutoff_time, cutoff_index\n\n# take a look at demo/temp/mfa_alignment, decide which part of the audio to use as prompt\n# NOTE: according to forced-alignment file demo/temp/mfa_alignments/5895_34622_000026_000002.wav, the word \"strength\" stop as 3.561 sec, so we use first 3.6 sec as the prompt. this should be different for different audio\ncut_off_sec = args.cut_off_sec\nmargin = args.margin\naudio_fn = f\"{temp_folder}/{filename}.wav\"\n\ncut_off_sec, cut_off_word_idx = find_closest_word_boundary(alignments, cut_off_sec, margin, args.cutoff_tolerance)\ntarget_transcript = \" \".join(orig_transcript.split(\" \")[:cut_off_word_idx+1]) + \" \" + args.target_transcript\n# NOTE: 3 sec of reference is generally enough for high quality voice cloning, but longer is generally better, try e.g. 3~6 sec.\ninfo = torchaudio.info(audio_fn)\naudio_dur = info.num_frames / info.sample_rate\n\nassert cut_off_sec < audio_dur, f\"cut_off_sec {cut_off_sec} is larger than the audio duration {audio_dur}\"\nprompt_end_frame = int(cut_off_sec * info.sample_rate)\n\n\ndef seed_everything(seed):\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    random.seed(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.benchmark = False\n    torch.backends.cudnn.deterministic = True\n\n\nseed_everything(seed)\n\n# inference\ndecode_config = {'top_k': top_k, 'top_p': top_p, 'temperature': temperature, 'stop_repetition': stop_repetition, 'kvcache': kvcache,\n                 \"codec_audio_sr\": codec_audio_sr, \"codec_sr\": codec_sr, \"silence_tokens\": silence_tokens, \"sample_batch_size\": sample_batch_size}\nconcated_audio, gen_audio = inference_one_sample(model, argparse.Namespace(\n    **config), phn2num, text_tokenizer, audio_tokenizer, audio_fn, target_transcript, device, decode_config, prompt_end_frame)\n\n# save segments for comparison\nconcated_audio, gen_audio = concated_audio[0].cpu(), gen_audio[0].cpu()\n# logging.info(f\"length of the resynthesize orig audio: {orig_audio.shape}\")\n\n# save the audio\n# output_dir\noutput_dir = args.output_dir\nos.makedirs(output_dir, exist_ok=True)\nseg_save_fn_gen = f\"{output_dir}/{os.path.basename(audio_fn)[:-4]}_gen_seed{seed}.wav\"\nseg_save_fn_concat = f\"{output_dir}/{os.path.basename(audio_fn)[:-4]}_concat_seed{seed}.wav\"\n\ntorchaudio.save(seg_save_fn_gen, gen_audio, codec_audio_sr)\ntorchaudio.save(seg_save_fn_concat, concated_audio, codec_audio_sr)\n\n# you might get warnings like WARNING:phonemizer:words count mismatch on 300.0% of the lines (3/1), this can be safely ignored\n"
  },
  {
    "path": "voicecraft-gradio-colab.ipynb",
    "content": "{\n  \"cells\": [\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"colab_type\": \"text\",\n        \"id\": \"view-in-github\"\n      },\n      \"source\": [\n        \"<a href=\\\"https://colab.research.google.com/github/Sewlell/VoiceCraft-gradio-colab/blob/master/voicecraft.ipynb\\\" target=\\\"_parent\\\"><img src=\\\"https://colab.research.google.com/assets/colab-badge.svg\\\" alt=\\\"Open In Colab\\\"/></a>\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"execution_count\": null,\n      \"metadata\": {\n        \"id\": \"Y87ixxsUVIhM\"\n      },\n      \"outputs\": [],\n      \"source\": [\n        \"!git clone https://github.com/jasonppy/VoiceCraft\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"execution_count\": null,\n      \"metadata\": {\n        \"id\": \"-w3USR91XdxY\"\n      },\n      \"outputs\": [],\n      \"source\": [\n        \"!pip install tensorboard\\n\",\n        \"!pip install phonemizer\\n\",\n        \"!pip install datasets\\n\",\n        \"!pip install torchmetrics\\n\",\n        \"\\n\",\n        \"!apt-get install -y espeak espeak-data libespeak1 libespeak-dev\\n\",\n        \"!apt-get install -y festival*\\n\",\n        \"!apt-get install -y build-essential\\n\",\n        \"!apt-get install -y flac libasound2-dev libsndfile1-dev vorbis-tools\\n\",\n        \"!apt-get install -y libxml2-dev libxslt-dev zlib1g-dev\\n\",\n        \"\\n\",\n        \"!pip install -e git+https://github.com/facebookresearch/audiocraft.git@c5157b5bf14bf83449c17ea1eeb66c19fb4bc7f0#egg=audiocraft\\n\",\n        \"\\n\",\n        \"!pip install -r \\\"/content/VoiceCraft/gradio_requirements.txt\\\"\\n\",\n        \"!pip install typer==0.7.0\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"jNuzjrtmv2n1\"\n      },\n      \"source\": [\n        \"# Let it restarted, it won't let your entire installation be aborted.\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"AnqGEwZ4NxtJ\"\n      },\n      \"source\": [\n        \"# Note before launching the `gradio_app.py`\\n\",\n        \"\\n\",\n        \"***You will get JSON warning if you move anything beside `sample_batch_size`, `stop_repetition` and `seed`.*** Which for most advanced setting, `kvache` and `temperature` unable to set in different value.\\n\",\n        \"\\n\",\n        \"You will download a .file File when you download the output audio for some reason. You will need to **convert the file from .snd to .wav/.mp3 manually**. Or if you enable showing file type in the name in Windows or wherever you are, change the file name to \\\"xxx.wav\\\" or \\\"xxx.mp3\\\". (know the solution? pull request my repository)\\n\",\n        \"\\n\",\n        \"Frequency of VRAM spikes no longer exist as well in April 5 Update.\\n\",\n        \"* Nevermind, I have observed some weird usage on Colab's GPU Memory Monitor. It can spike up to 13.5GB VRAM even in WhisperX mode. (April 11)\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"dE0W76cMN3Si\"\n      },\n      \"source\": [\n        \"Don't make your `prompt end time` too long, 6-9s is fine. Or else it will **either raise up JSON issue or cut off your generated audio**. This one is due to how VoiceCraft worked (so probably unfixable). It will add those text you want to get audio from at the end of the input audio transcript. It was way too much word for application or code to handle as it added up with original transcript. So please keep it short.\\n\",\n        \"\\n\",\n        \"Your total audio length (`prompt end time` + add-up audio) must not exceed 16 or 17s.\"\n      ]\n    },\n    {\n      \"cell_type\": \"markdown\",\n      \"metadata\": {\n        \"id\": \"nnu2cY4t8P6X\"\n      },\n      \"source\": [\n        \"For voice cloning, I suggest you to probably have a monotone input to feed the voice cloning. Of course you can always try input that have tons of tone variety, but I find that as per April 11 Update, it's much more easy to replicate in monotone rather than audio that have laugh, scream, crying inside.\\n\",\n        \"\\n\",\n        \"The inference speed is much stable. With sample text, T4 (Free Tier Colab GPU) can do 6-15s on 6s-8s of `prompt end time`.\"\n      ]\n    },\n    {\n      \"cell_type\": \"code\",\n      \"execution_count\": null,\n      \"metadata\": {\n        \"id\": \"NDt4r4DiXAwG\"\n      },\n      \"outputs\": [],\n      \"source\": [\n        \"!python /content/VoiceCraft/gradio_app.py --demo-path=/content/VoiceCraft/demo --tmp-path=/content/VoiceCraft/demo/temp --models-path=/content/VoiceCraft/pretrained_models --share\"\n      ]\n    }\n  ],\n  \"metadata\": {\n    \"accelerator\": \"GPU\",\n    \"colab\": {\n      \"authorship_tag\": \"ABX9TyPsqFhtOeQ18CXHnRkWAQSk\",\n      \"gpuType\": \"T4\",\n      \"include_colab_link\": true,\n      \"provenance\": []\n    },\n    \"kernelspec\": {\n      \"display_name\": \"Python 3\",\n      \"name\": \"python3\"\n    },\n    \"language_info\": {\n      \"name\": \"python\"\n    }\n  },\n  \"nbformat\": 4,\n  \"nbformat_minor\": 0\n}\n"
  },
  {
    "path": "z_scripts/e830M.sh",
    "content": "#!/bin/bash\nsource ~/miniconda3/etc/profile.d/conda.sh\nconda activate voicecraft\nexport CUDA_VISIBLE_DEVICES=0,1,2,3\nexport WORLD_SIZE=4\n\ndataset=gigaspeech\nmkdir -p ./logs/${dataset}\n\nexp_root=\"path/to/store/exp_results\"\nexp_name=e830M\ndataset_dir=\"path/to/stored_extracted_codes_and_phonemes/xl\" # xs if you only extracted xs in previous step\nencodec_codes_folder_name=\"encodec_16khz_4codebooks\"\n\n# export CUDA_LAUNCH_BLOCKING=1 # for debugging\n\ntorchrun --nnodes=1 --rdzv-backend=c10d --rdzv-endpoint=localhost:41977 --nproc_per_node=${WORLD_SIZE} \\\n../main.py \\\n--reduced_eog 1 \\\n--drop_long 1 \\\n--eos 2051 \\\n--n_special 4 \\\n--pad_x 0 \\\n--codebook_weight \"[5,1,0.5,0.1]\" \\\n--encodec_sr 50 \\\n--num_steps 50000 \\\n--lr 0.05 \\\n--warmup_fraction 0.01 \\\n--optimizer_name \"ScaledAdam\" \\\n--pseudo_epoch_size 3000 \\\n--reduce_lr_start_step 3000 \\\n--reduce_lr_start_epoch 4 \\\n--clipping_update_period 1000 \\\n--d_model 2048 \\\n--audio_embedding_dim 2048 \\\n--nhead 16 \\\n--num_decoder_layers 16 \\\n--max_num_tokens 100000 \\\n--gradient_accumulation_steps 26 \\\n--val_max_num_tokens 6000 \\\n--num_buckets 6 \\\n--audio_max_length 20 \\\n--audio_min_length 2 \\\n--text_max_length 400 \\\n--text_min_length 10 \\\n--mask_len_min 1 \\\n--mask_len_max 600 \\\n--tb_write_every_n_steps 10 \\\n--print_every_n_steps 400 \\\n--val_every_n_steps 1600 \\\n--text_vocab_size 100 \\\n--text_pad_token 100 \\\n--phn_folder_name \"phonemes\" \\\n--manifest_name \"manifest\" \\\n--encodec_folder_name ${encodec_codes_folder_name} \\\n--audio_vocab_size 2048 \\\n--empty_token 2048 \\\n--eog 2049 \\\n--audio_pad_token 2050 \\\n--n_codebooks 4 \\\n--max_n_spans 3 \\\n--shuffle_mask_embedding 0 \\\n--mask_sample_dist poisson1 \\\n--max_mask_portion 0.9 \\\n--min_gap 5 \\\n--num_workers 8 \\\n--dynamic_batching 1 \\\n--dataset $dataset \\\n--exp_dir \"${exp_root}/${dataset}/${exp_name}\" \\\n--dataset_dir ${dataset_dir}\n#  >> ./logs/${dataset}/${exp_name}.log 2>&1"
  },
  {
    "path": "z_scripts/e830M_ft.sh",
    "content": "#!/bin/bash\nsource ~/miniconda3/etc/profile.d/conda.sh\nconda activate voicecraft\nexport CUDA_VISIBLE_DEVICES=0,1,2,3\nexport WORLD_SIZE=4\n\ndataset=gigaspeech\nmkdir -p ./logs/${dataset}\n\nexp_root=\"path/to/store/exp_results\"\nexp_name=e830M_ft\ndataset_dir=\"path/to/stored_extracted_codes_and_phonemes/xl\" # xs if you only extracted xs in previous step\nencodec_codes_folder_name=\"encodec_16khz_4codebooks\"\nload_model_from=\"./pretrained_models/giga830M.pth\"\n\n# export CUDA_LAUNCH_BLOCKING=1 # for debugging\n\ntorchrun --nnodes=1 --rdzv-backend=c10d --rdzv-endpoint=localhost:41977 --nproc_per_node=${WORLD_SIZE} \\\n../main.py \\\n--load_model_from ${load_model_from} \\\n--reduced_eog 1 \\\n--drop_long 1 \\\n--eos 2051 \\\n--n_special 4 \\\n--pad_x 0 \\\n--codebook_weight \"[3,1,1,1]\" \\\n--encodec_sr 50 \\\n--num_steps 500000 \\\n--lr 0.00001 \\\n--warmup_fraction 0.1 \\\n--optimizer_name \"AdamW\" \\\n--d_model 2048 \\\n--audio_embedding_dim 2048 \\\n--nhead 16 \\\n--num_decoder_layers 16 \\\n--max_num_tokens 20000 \\\n--gradient_accumulation_steps 12 \\\n--val_max_num_tokens 6000 \\\n--num_buckets 6 \\\n--audio_max_length 20 \\\n--audio_min_length 2 \\\n--text_max_length 400 \\\n--text_min_length 10 \\\n--mask_len_min 1 \\\n--mask_len_max 600 \\\n--tb_write_every_n_steps 10 \\\n--print_every_n_steps 400 \\\n--val_every_n_steps 1600 \\\n--text_vocab_size 100 \\\n--text_pad_token 100 \\\n--phn_folder_name \"phonemes\" \\\n--manifest_name \"manifest\" \\\n--encodec_folder_name ${encodec_codes_folder_name} \\\n--audio_vocab_size 2048 \\\n--empty_token 2048 \\\n--eog 2049 \\\n--audio_pad_token 2050 \\\n--n_codebooks 4 \\\n--max_n_spans 3 \\\n--shuffle_mask_embedding 0 \\\n--mask_sample_dist poisson1 \\\n--max_mask_portion 0.9 \\\n--min_gap 5 \\\n--num_workers 8 \\\n--dynamic_batching 1 \\\n--dataset $dataset \\\n--exp_dir \"${exp_root}/${dataset}/${exp_name}\" \\\n--dataset_dir ${dataset_dir}\n#  >> ./logs/${dataset}/${exp_name}.log 2>&1"
  }
]