[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n./idea\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.cxx\nlocal.properties\n/.idea/kotlinc.xml\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": " ```\nGoogle has announced that, starting in 2026/2027, all apps on certified Android devices\nwill require the developer to submit personal identity details directly to Google.\nSince the developers of this app do not agree to this requirement, this app will no longer \nwork on certified Android devices after that time.\n```\n\n## Donate\n<pre>Send a coffee to \nwoheller69@t-online.de \n<a href= \"https://www.paypal.com/signin\"><img  align=\"left\" src=\"https://www.paypalobjects.com/webstatic/de_DE/i/de-pp-logo-150px.png\"></a>\n\n  \nOr via this link (with fees)\n<a href=\"https://www.paypal.com/donate?hosted_button_id=XVXQ54LBLZ4AA\"><img  align=\"left\" src=\"https://img.shields.io/badge/Donate%20with%20Debit%20or%20Credit%20Card-002991?style=plastic\"></a></pre>\n# SherpaTTS\n\nSherpaTTS is an Android Text-to-Speech engine based on Next-gen Kaldi. It uses voices from [Piper Voices](https://rhasspy.github.io/piper-samples/) or [Coqui](https://github.com/coqui-ai/TTS/).\n\n<img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=\"150\"/> <img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=\"150\"/>\n\n[<img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on.png\" height=\"75\">](https://f-droid.org/de/packages/org.woheller69.ttsengine/) [<img src=\"https://www.openapk.net/images/openapk-badge.png\" height=\"75\">]( https://www.openapk.net/ttsengine/org.woheller69.ttsengine/)\n\n## Installing Voice Models\n\n### From Hugging Face\nThe app provides a built-in model downloader that lets you install Piper and Coqui voice models directly from the \"Manage Languages\" screen. Simply select a language and the app will download and install the model automatically.\nPlease note that this is the only instance where internet permission is required.\nOnce the model is downloaded, text-to-speech works entirely offline, ensuring your privacy and convenience.\nVoices can be tested [here](https://huggingface.co/spaces/k2-fsa/text-to-speech/).\n\n### From SD Card (Sideloading)\nYou can install custom Piper models directly from your device storage:\n\n1. Open the app and go to \"Manage Languages\"\n2. Tap \"Install from SD Card\"\n3. Enter a 3-letter language code (e.g., `eng`, `deu`, `fra`)\n4. Enter a model name (this will be displayed in the language list)\n5. Select your model file (`.onnx` format)\n6. Select your tokens file (`.txt` format)\n7. Tap \"OK\"\n\n**Requirements:**\n- The model file must be in `.onnx` format (make sure the model has been converted a described here: [Sherpa ONNX conversion](https://k2-fsa.github.io/sherpa/onnx/tts/piper.html))\n- The tokens file must contain the vocabulary mapping (typically `tokens.txt`)\n\n### Via ADB (Alternative Method)\nYou can also install models via ADB:\n1. Create a directory: `modelDir` in `sdcard/Android/data/org.woheller69.ttsengine/files`\n2. Place 3 files there:\n   - `model.onnx` - The converted model file\n   - `tokens.txt` - The vocabulary file\n   - `lang` - A text file with:\n     - Line 1: 3-letter language code (e.g., `eng`)\n     - Line 2: Model name\n\nAt next start, the app will migrate it to the new directory structure and add it to installed languages.\n\nMake sure the model has been converted a described here: [Sherpa ONNX conversion](https://k2-fsa.github.io/sherpa/onnx/tts/piper.html)\n\n## Contribute\nFor translations use https://toolate.othing.xyz/projects/sherpatts/\n\n# License\nThis work is licensed under GPLv3 license, © woheller69\n\n- This app is based on the [Sherpa ONNX Project](https://github.com/k2-fsa/sherpa-onnx), published under Apache-2.0 license\n- It uses data from [eSpeak NG](https://github.com/espeak-ng/espeak-ng), published under GPLv3 license\n- It uses [jsoup](https://github.com/jhy/jsoup), published under MIT license\n- At first start it downloads and installs a Piper or Coqui voice model from Hugging Face. \n\n# OTHER APPS\n\n| **RadarWeather** | **Gas Prices** | **Smart Eggtimer** |\n|:---:|:---:|:--:|\n| [<img src=\"https://github.com/woheller69/weather/blob/main/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.weather/) | [<img src=\"https://github.com/woheller69/spritpreise/blob/main/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.spritpreise/) | [<img src=\"https://github.com/woheller69/eggtimer/blob/main/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.eggtimer/) |\n| **Bubble** | **hEARtest** | **GPS Cockpit** |\n| [<img src=\"https://github.com/woheller69/Level/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.level/) | [<img src=\"https://github.com/woheller69/audiometry/blob/new/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.audiometry/) | [<img src=\"https://github.com/woheller69/gpscockpit/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.gpscockpit/) |\n| **Audio Analyzer** | **LavSeeker** | **TimeLapseCam** |\n| [<img src=\"https://github.com/woheller69/audio-analyzer-for-android/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.audio_analyzer_for_android/) |[<img src=\"https://github.com/woheller69/lavatories/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.lavatories/) | [<img src=\"https://github.com/woheller69/TimeLapseCamera/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.TimeLapseCam/) |\n| **Arity** | **Cirrus** | **solXpect** |\n| [<img src=\"https://github.com/woheller69/arity/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.arity/) | [<img src=\"https://github.com/woheller69/omweather/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.omweather/) | [<img src=\"https://github.com/woheller69/solXpect/blob/main/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.solxpect/) |\n| **gptAssist** | **dumpSeeker** | **huggingAssist** |\n| [<img src=\"https://github.com/woheller69/gptassist/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.gptassist/) | [<img src=\"https://github.com/woheller69/dumpseeker/blob/main/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.dumpseeker/) | [<img src=\"https://github.com/woheller69/huggingassist/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.hugassist/) |\n| **FREE Browser** | **whoBIRD** | **PeakOrama** |\n| [<img src=\"https://github.com/woheller69/browser/blob/newmaster/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.browser/) | [<img src=\"https://github.com/woheller69/whoBIRD/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.whobird/) | [<img src=\"https://github.com/woheller69/PeakOrama/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.PeakOrama/) |\n| **Whisper** | **Seamless** | **SherpaTTS** |\n| [<img src=\"https://github.com/woheller69/whisperIME/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.whisper/) | [<img src=\"https://github.com/woheller69/seamless/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.seemless/) | [<img src=\"https://github.com/woheller69/ttsengine/blob/master/fastlane/metadata/android/en-US/images/icon.png\" width=\"50\">](https://f-droid.org/packages/org.woheller69.ttsengine/) |\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n/release/output-metadata.json\n"
  },
  {
    "path": "app/build.gradle.kts",
    "content": "plugins {\n    id(\"com.android.application\")\n    id(\"org.jetbrains.kotlin.android\")\n}\n\nandroid {\n    namespace = \"com.k2fsa.sherpa.onnx.tts.engine\"\n    compileSdk = 35\n\n    defaultConfig {\n        applicationId = \"org.woheller69.ttsengine\"\n        minSdk = 29\n        targetSdk = 35\n        versionCode = 31\n        versionName = \"3.1\"\n\n        vectorDrawables {\n            useSupportLibrary = true\n        }\n\n        buildFeatures {\n            viewBinding = true\n            buildConfig = true\n            compose = true\n        }\n    }\n\n    buildTypes {\n        release {\n            isMinifyEnabled = false\n            proguardFiles(\n                getDefaultProguardFile(\"proguard-android-optimize.txt\"),\n                \"proguard-rules.pro\"\n            )\n            ndk {\n                abiFilters.addAll(listOf(\"armeabi-v7a\", \"arm64-v8a\"))\n            }\n        }\n    }\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_1_8\n        targetCompatibility = JavaVersion.VERSION_1_8\n    }\n    kotlinOptions {\n        jvmTarget = \"1.8\"\n    }\n    composeOptions {\n        kotlinCompilerExtensionVersion = \"1.5.1\"\n    }\n    packaging {\n        resources {\n            excludes += \"/META-INF/{AL2.0,LGPL2.1}\"\n        }\n    }\n    lint {\n        disable += \"MissingTranslation\"\n    }\n}\n\ndependencies {\n\n    implementation(\"androidx.core:core-ktx:1.12.0\")\n    implementation(\"androidx.lifecycle:lifecycle-runtime-ktx:2.6.2\")\n    implementation(\"androidx.activity:activity-compose:1.8.2\")\n    implementation(platform(\"androidx.compose:compose-bom:2023.08.00\"))\n    implementation(\"androidx.compose.ui:ui\")\n    implementation(\"androidx.compose.ui:ui-graphics\")\n    implementation(\"androidx.compose.ui:ui-tooling-preview\")\n    implementation(\"androidx.compose.material3:material3\")\n    implementation(\"androidx.appcompat:appcompat:1.6.1\")\n    implementation(\"com.google.android.material:material:1.9.0\")\n    implementation(\"com.github.k2-fsa:sherpa-onnx:v1.10.42\")\n    implementation(\"androidx.preference:preference:1.2.1\")\n    implementation(\"com.github.woheller69:FreeDroidWarn:+\")\n    implementation(\"org.jsoup:jsoup:1.22.1\")\n}"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n\n    <application\n        android:allowBackup=\"false\"\n        android:fullBackupContent=\"false\"\n        android:dataExtractionRules=\"@xml/data_extraction_rules\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/Theme.SherpaOnnxTtsEngine\">\n        <activity\n            android:name=\".GetSampleText\"\n            android:exported=\"true\"\n            android:theme=\"@style/Theme.SherpaOnnxTtsEngine\">\n            <intent-filter>\n                <action android:name=\"android.speech.tts.engine.GET_SAMPLE_TEXT\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".CheckVoiceData\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.speech.tts.engine.CHECK_TTS_DATA\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".InstallVoiceData\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.speech.tts.engine.INSTALL_TTS_DATA\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n\n        <service\n            android:name=\".TtsService\"\n            android:enabled=\"true\"\n            android:exported=\"true\"\n            android:label=\"@string/app_name\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.TTS_SERVICE\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.speech.tts\"\n                android:resource=\"@xml/tts_engine\" />\n        </service>\n\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\"\n            android:label=\"@string/app_name\"\n            android:theme=\"@style/Theme.SherpaOnnxTtsEngine\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.speech.tts.engine.CONFIGURE_ENGINE\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ManageLanguagesActivity\"\n            android:theme=\"@style/Theme.SherpaOnnxTtsEngine\"\n            android:screenOrientation=\"portrait\"\n            android:exported=\"true\">\n        </activity>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "app/src/main/assets/.gitkeep",
    "content": ""
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/aav/vi",
    "content": "name Vietnamese (Northern)\nlanguage vi\n\nwords 1 2\npitch 95 175\n\n\ntone 100 225 800 100 2000 50 5400 75 8000 200\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/aav/vi-VN-x-central",
    "content": "name Vietnamese (Central)\nlanguage vi-vn-x-central\nphonemes vi-hue\ndictrules 1\n\nwords 1\npitch 82 118   //80 118\n voicing 90  //18\n flutter  20\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/aav/vi-VN-x-south",
    "content": "name Vietnamese (Southern)\nlanguage vi-vn-x-south\nphonemes vi-sgn\ndictrules 2\n\nwords 1\npitch 82 118   //80 118\n voicing 90  //18\n flutter  20\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/art/eo",
    "content": "name Esperanto\nlanguage eo\n\napostrophe 2\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/art/ia",
    "content": "name Interlingua\nlanguage ia\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/art/io",
    "content": "name Ido\nlanguage io\nphonemes eo\nstatus testing\n \n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/art/jbo",
    "content": "name Lojban\nlanguage jbo\n\nspeed 80   // speed adjustment, percentage\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/art/lfn",
    "content": "name Lingua Franca Nova\nlanguage lfn\n\nphonemes base2\nl_unpronouncable 0\nnumbers 2 3\n\nstressLength  150 140 180 180 0 0 200 200\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/art/piqd",
    "content": "name Klingon\nlanguage piqd\nstatus testing\nstressRule 3\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/art/py",
    "content": "name Pyash\nlanguage py\nmaintainer Logan Streondj <logan@liberit.ca>\nstatus testing\n\nspeed 80   // speed adjustment, percentage\nstressRule 0\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/art/qdb",
    "content": "name Lang Belta\nlanguage qdb\n\nnumbers 4 3\n\nreplace 1 t ?\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/art/qya",
    "content": "name Quenya\nlanguage qya\nstressRule 2\n// rule=penultimate, with qya_rules for light penultimate syllables to move primary stress to the preceding (antepenultimate) syllable\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/art/sjn",
    "content": "name Sindarin\nlanguage sjn\nstressRule 2\n// rule=penultimate, with sjn_rules for light penultimate syllables to move primary stress to the preceding (antepenultimate) syllable\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/azc/nci",
    "content": "name Nahuatl (Classical)\nlanguage nci\n\nintonation 3\nstressRule 2\nstressLength  190  190  200  200  0  0  220  240\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/bat/lt",
    "content": "name Lithuanian\nlanguage lt\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/bat/ltg",
    "content": "name Latgalian\nlanguage ltg\nmaintainer Valdis Vitolins <valdis.vitolins@odo.lv>\nstatus testing\nphonemes lv\ndictionary lv\ndictrules 2   // Setting for Latgalian pronunciation\nwords 0 2\npitch 64 118\ntone 60 150 204 100 400 255 700 10 3000 255\nstressAmp 12 10 8 8 0 0 15 16\nstressLength 160 140 200 140 0 0 240 160\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/bat/lv",
    "content": "name Latvian\nlanguage lv\nmaintainer Valdis Vitolins <valdis.vitolins@odo.lv>\nstatus mature\nwords 0 2\npitch 67 123\ntone 60 150 204 100 400 255 700 10 3000 255\nstressAmp 11 8 11 9 0 0 14 12\nstressLength 160 120 200 130 0 0 230 180\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/bnt/sw",
    "content": "name Swahili\nlanguage sw\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/bnt/tn",
    "content": "name Setswana\nlanguage tn\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/ccs/ka",
    "content": "name Georgian\nlanguage ka\nlowercaseSentence\t// A period followed by a lowercase letter is considered a sentence (mkhedruli)\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/cel/cy",
    "content": "name Welsh\nlanguage cy\n\nintonation 4\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/cel/ga",
    "content": "name Gaelic (Irish)\nlanguage ga\n\ndictrules 1  // fix for eclipsis\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/cel/gd",
    "content": "name Gaelic (Scottish)\nlanguage gd\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/cus/om",
    "content": "name Oromo\nlanguage om\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/dra/kn",
    "content": "name Kannada\nlanguage kn\n\nintonation 2\n//consonants 80\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/dra/ml",
    "content": "name Malayalam\nlanguage ml\n\nintonation 2\n//consonants 80\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/dra/ta",
    "content": "name Tamil\nlanguage ta\n\nintonation 2\nconsonants 80\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/dra/te",
    "content": "name Telugu\nlanguage te\n\nstatus testing\n\nintonation 2\n//consonants 80\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/esx/kl",
    "content": "name Greenlandic\nlanguage kl\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/eu",
    "content": "name Basque\nlanguage eu\n\nstatus testing\nstressRule 15\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmq/da",
    "content": "name Danish\nlanguage da\n\ntunes s2 c2 q2 e2\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmq/is",
    "content": "name Icelandic\nlanguage is\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmq/nb",
    "content": "name Norwegian Bokmål\nlanguage nb\nlanguage no\nphonemes no\ndictionary no\n\nintonation 4\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmq/sv",
    "content": "name Swedish\nlanguage sv\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/af",
    "content": "name Afrikaans\nlanguage af\n\nmaintainer Christo de Klerk <christodeklerk@gmail.com>\nstatus mature\n\nroughness 0\npitch 63 120\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/de",
    "content": "name German\nlanguage de\ntunes s4 c1 q4 e1\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/en",
    "content": "name English (Great Britain)\nlanguage en-gb  2\nlanguage en 2\n\nmaintainer Reece H. Dunn <msclrhd@gmail.com>\nstatus mature\n\ntunes s1 c1 q1 e1\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/en-029",
    "content": "name English (Caribbean)\nlanguage en-029\nlanguage en 10\n\nmaintainer Reece H. Dunn <msclrhd@gmail.com>\nstatus mature\n\nphonemes en-wi\ndictrules 8\nstressLength 175 175  175 175  220 220  250 290\n\nreplace 00 D d\nreplace 00 T t[\nreplace 00 U@ o@\nreplace 03 @ a#\nreplace 03 3 a#\nreplace 03 N n\n\nformant 1  98  100 100\nformant 2  98  100 100\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/en-GB-scotland",
    "content": "name English (Scotland)\nlanguage en-gb-scotland\nlanguage en 4\n\nmaintainer Reece H. Dunn <msclrhd@gmail.com>\nstatus mature\n\nphonemes en-sc\ndictrules 2 5 6 7\nstressLength  180 130 200 200 0 0 250 270\n\nreplace 03 @ V\nreplace 03 I i\nreplace 03 I2 i\nreplace 01 aI aI2\nreplace 02 a a/\nreplace 02 u: U\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/en-GB-x-gbclan",
    "content": "name English (Lancaster)\nlanguage en-gb-x-gbclan\nlanguage en-gb  3\nlanguage en 5\n\nmaintainer Reece H. Dunn <msclrhd@gmail.com>\nstatus mature\n\nphonemes en-n\n\nstressLength 160 150  180 180  220 220  290 290\n\nreplace 03 N n\nreplace 03 i  I2\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/en-GB-x-gbcwmd",
    "content": "name English (West Midlands)\nlanguage en-gb-x-gbcwmd\nlanguage en-gb 9\nlanguage en 9\n\nphonemes en-wm\n\nreplace 00 h NULL\nreplace 00 o@ O@\ndictrules 6\nintonation 4\nstressAdd 0 0 0 0 0 0 0 20\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/en-GB-x-rp",
    "content": "name English (Received Pronunciation)\nlanguage en-gb-x-rp\nlanguage en-gb  4\nlanguage en 5\n\nmaintainer Reece H. Dunn <msclrhd@gmail.com>\nstatus mature\n\nphonemes en-rp\n\nreplace 00  o@  O@\nreplace 03 I i\nreplace 03 I2 i\nreplace 03 @ a#\nreplace 03 3 a#\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/en-US",
    "content": "name English (America)\nlanguage en-us 2\nlanguage en 3\n\nmaintainer Reece H. Dunn <msclrhd@gmail.com>\nstatus mature\n\nphonemes en-us\ndictrules 3 6\n\nstressLength 140 120 190 170 0 0 255 300\nstressAmp  17 16  19 19  19 19  21 19\n\nreplace 03 I  i\nreplace 03 I2 i\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/en-US-nyc",
    "content": "name English (America, New York City)\nlanguage en-us-nyc\n\nmaintainer Richard Calvi <richard.calvi@gmail.com>\nstatus testing\n\nphonemes en-us-nyc\ndictrules 3 6\n\nstressLength 140 120 190 170 0 0 255 300\nstressAmp  17 16  19 19  19 19  21 19\n\nreplace 03 I  i\nreplace 03 I2 i\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/lb",
    "content": "name Luxembourgish\nlanguage lb\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/gmw/nl",
    "content": "name Dutch\nlanguage nl\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/grk/el",
    "content": "name Greek\nlanguage el\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/grk/grc",
    "content": "name Greek (Ancient)\nlanguage grc\n\nstressLength 170 170  190 190  0 0  230 240\ndictrules 1\nwords 3\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/as",
    "content": "name Assamese\nlanguage as\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/bn",
    "content": "name Bengali\nlanguage bn\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/bpy",
    "content": "name Bishnupriya Manipuri\nlanguage bpy\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/gu",
    "content": "name Gujarati\nlanguage gu\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/hi",
    "content": "name Hindi\nlanguage hi\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/kok",
    "content": "name Konkani\nlanguage kok\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/mr",
    "content": "name Marathi\nlanguage mr\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/ne",
    "content": "name Nepali\nlanguage ne\n\ndictrules 1\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/or",
    "content": "name Oriya\nlanguage or\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/pa",
    "content": "name Punjabi\nlanguage pa\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/sd",
    "content": "name Sindhi\nlanguage sd\nmaintainer Ejaz Shah <eashah67@gmail.com>\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/si",
    "content": "name Sinhala\nlanguage si\n\nstatus testing\n\nintonation 2\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/inc/ur",
    "content": "name Urdu\nlanguage ur\nmaintainer Ejaz Shah <eashah67@gmail.com>\nstatus testing\n\nstressRule 6\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/ine/hy",
    "content": "name Armenian (East Armenia)\nlanguage hy\nlanguage hy-arevela\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/ine/hyw",
    "content": "name Armenian (West Armenia)\nlanguage hyw\nlanguage hy-arevmda\nlanguage hy  8\n\ndictionary hy\ndictrules 1\n\nphonemes hy\n\n// change consonants for West Armenian pronunciation\nreplace 00 b  p#\nreplace 00 d  t#\nreplace 00 dz ts#\nreplace 00 dZ tS#\nreplace 00 g  k#\n\nreplace 00 p  b\nreplace 00 t  d\nreplace 00 ts dz\nreplace 00 tS dZ\nreplace 00 k  g\n\nreplace 00 R2 R  // ??\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/ine/sq",
    "content": "name Albanian\nlanguage sq\n\n// add this line to remove 'ë' at the end of words\n// replace 00  @/  NULL\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/ira/fa",
    "content": "name Persian\nlanguage fa\nmaintainer Shadyar Khodayari <shadyar81@gmail.com>\nstatus mature\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/ira/fa-Latn",
    "content": "name Persian (Pinglish)\n// Sometimes, Farsi speakers write Farsi words using English characters, particularly in Chat and SMS (texte messages).), called Pinglish\nlanguage fa-latn\nmaintainer Shadyar Khodayari <shadyar81@gmail.com>\nstatus mature\ndictrules 1\nphonemes fa\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/ira/ku",
    "content": "name Kurdish\nlanguage ku\n\n//words 1 48\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/iro/chr",
    "content": "name Cherokee //https://github.com/espeak-ng/espeak-ng/blob/master/docs/voices.md\nlanguage chr-US-Qaaa-x-west 5\n\nmaintainer Michael Conrad <m.conrad.202@gmail.com>\nstatus testing\n\npitch 90 160\n\nvoicing 100\n\nconsonants 100 100\n\nspeed 100\n\nwords 2 1\n\nphonemes chr\n\n//stress on all syllables to simulate stress on no syllables\nstressRule 9 \nstressLength 175 175 175 175 175 175 175 175 //all vowels the same length regardless of stress\nstressAmp 10 10 10 10 10 10 10 10  //all vowels the same strength regardless of marked stress\n\nintonation 1\n\ntunes\tchrs chrc chrq chre\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/itc/la",
    "content": "name Latin\nlanguage la\nstressRule 2 0 2\n// rule=penultimate\n// unstressed_wd1=0\n// unstressed_wd2=2\nstressOpt 0 5 // flags=0100001 (no automatic secondary stress + don't stres monosyllables)\n\n// short gap between words\nwords 2\n\n// Note: The Latin voice needs long vowels to be marked with macrons\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/jpx/ja",
    "content": "name Japanese\nlanguage ja\nphonemes ja\n\nintonation 4\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/ko",
    "content": "name Korean\nlanguage ko\npitch 80 118\nintonation 2\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/map/haw",
    "content": "name Hawaiian\nlanguage haw\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/miz/mto",
    "content": "name Totontepec Mixe\nlanguage mto\n\nmaintainer Bill Dengler <codeofdusk@gmail.com> and Elizabeth Resendiz <e.r.resendiz7@gmail.com>\nstatus testing\n\nlowercaseSentence\ntunes s6 c6 q6 e6\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/myn/quc",
    "content": "name K'iche'\nlanguage quc\nstatus testing\nstressRule 3 // stress on final syllable\nstressAmp 8 8 20 15 0 0 25 25  // reduce unstressed vowels\nstressLength 120 120 200 150 0 0 250 250 // reduce unstressed vowels\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/poz/id",
    "content": "name Indonesian\nlanguage id\n\nstressLength 160 200  180 180  0 0  220 240\nstressAmp    16  18   18  18   0 0  22  21\n\nconsonants 80 80\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/poz/mi",
    "content": "name Māori\nlanguage mi\nstatus testing\n\n// https://github.com/espeak-ng/espeak-ng/blob/master/docs/voices.md#words\nwords 1 2\n\n// taken from Jacky\npitch  115 130\n\nformant 0 150 155 100\nformant 1 90 155 70\nformant 2 95 70 64\nformant 3 15 20 30\nformant 4 20 30 40\nformant 5 65 20 65\nformant 6 70 80 100\nformant 7 20 80 100\nformant 8 100 95 80\nvoicing 135\nconsonants 110\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/poz/ms",
    "content": "// Last updated: 14 October 2010, Jason Ong (jason@portalgroove.com)\nname Malay\nlanguage ms\nphonemes id\n\nstressLength 160 200  180 180  0 0  220 240\nstressAmp    16  18   18  18   0 0  22  21\nintonation\t3\t// Less intonation, and comma does not raise the pitch.\n\n// Nuance - Peninsula Malaysia\n// replace\t3 a\t@\t// change 'saya' to 'saye'\n\t\t\t\t// (only the last phoneme of a word, only in unstressed syllables)\n\t\t\t\t\nconsonants 80 80\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/qu",
    "content": "name Quechua\nlanguage qu\nstressRule 2 // stress on penultimate syllable\nstatus testing\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/an",
    "content": "name Aragonese\nlanguage an\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/ca",
    "content": "name Catalan\nlanguage ca\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/es",
    "content": "name Spanish (Spain)\nlanguage es\ndictrules 1\ntunes s6 c6 q6 e6\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/es-419",
    "content": "name Spanish (Latin America)\nlanguage es-419\nlanguage es-mx 6\n\nphonemes es-la\ndictrules 2\nintonation 2\nstressLength 170 200  230 180  0 0  250 280\n\ntunes s6 c6 q6 e6\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/fr",
    "content": "name French (France)\nlanguage fr-fr\nlanguage fr\n\ndictrules 1\ntunes s3 c3 q3 e3\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/fr-BE",
    "content": "name French (Belgium)\nlanguage fr-be\nlanguage fr 8\n\ndictrules 2\ntunes s3 c3 q3 e3\n\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/fr-CH",
    "content": "name French (Switzerland)\nlanguage fr-ch\nlanguage fr 8\n\ndictrules 3\ntunes s3 c3 q3 e3\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/ht",
    "content": "name Haitian Creole\nlanguage ht\nstatus testing\nmaintainer  // TODO somebody should take responsibility for this\n\nphonemes ht\ndictionary ht\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/it",
    "content": "name Italian\nlanguage it\n\nmaintainer Christian Leo M <llajta2012@gmail.com>\nstatus mature\n\ntunes s4 c4 q4 e4\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/pap",
    "content": "name Papiamento\nlanguage pap\n\nstatus testing\n\nphonemes base2\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/pt",
    "content": "name Portuguese (Portugal)\nlanguage pt\nlanguage pt-pt\nphonemes pt-pt\n\ndictrules 1\nintonation 2\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/pt-BR",
    "content": "name Portuguese (Brazil)\nlanguage pt-br\nlanguage pt 6\n\ndictrules 2\nstressLength 200 115 230 230 0 0 250 270\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/roa/ro",
    "content": "name Romanian\nlanguage ro\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sai/gn",
    "content": "name Guarani\nlanguage gn\ndictrules 1\nwords 0 1\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sem/am",
    "content": "name Amharic\nlanguage am\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sem/ar",
    "content": "name Arabic\nlanguage ar\nphonemes ar\n\nstressRule 4\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sem/he",
    "content": "name Hebrew\nlanguage he\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sem/mt",
    "content": "name Maltese\nlanguage mt\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sit/cmn",
    "content": "name Chinese (Mandarin, latin as English)\nlanguage cmn\nlanguage zh-cmn\nlanguage zh\n\nphonemes cmn\ndictionary cmn\nwords 1\npitch 80 118\n\ndict_min 100000\n\n//for some dialects\n\n//[en]: replace ng with n\n//[zh]: �޺�������ng���n\n//replace 0 N n\n\n//[en]: replace rfx consonants\n//[zh]: �޾�������r���l��z��er���e\n//replace 0 ts.h tsh\n//replace 0 ts. ts\n//replace 0 s. s\n//replace 0 i. i[\n//replace 0 z. l\n//replace 0 z. z\n//replace 0 @r @\n\n//[en]: replace beginning n or l\n//[zh]: ����nl��n���l��l���n\n//replace 2 n l\n//replace 2 l n\n\n//[en]: replace beginning w with v\n//[zh]: w���v\n//replace 0 w  v\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sit/cmn-Latn-pinyin",
    "content": "name Chinese (Mandarin, latin as Pinyin)\nlanguage cmn-latn-pinyin\nlanguage zh-cmn\nlanguage zh\n\nphonemes cmn\ndictionary cmn\nwords 1\npitch 80 118\n\ndict_min 100000\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sit/hak",
    "content": "name Hakka Chinese\nlanguage hak\nmaintainer Chen Chien-ting <yoxem.tem98@nctu.edu.tw>\nstatus testing\nphonemes hak\ndictionary hak\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sit/my",
    "content": "name Myanmar (Burmese)\nmaintainer Min Maung\nlanguage my\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sit/yue",
    "content": "name Chinese (Cantonese)\nlanguage yue\nlanguage zh-yue\nlanguage zh 8\n\nphonemes yue\ndictionary yue\n\n// interpret English letters as 1=English words, 2=jyutping\ndictrules 1\n\nwords 1\ndict_min 10000\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/sit/yue-Latn-jyutping",
    "content": "name Chinese (Cantonese, latin as Jyutping)\nlanguage yue\nlanguage zh-yue\nlanguage zh 8\n\nphonemes yue\ndictionary yue\n\n// interpret English letters as 1=English words, 2=jyutping\ndictrules 2\n\nwords 1\ndict_min 10000\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/tai/shn",
    "content": "name Shan (Tai Yai)\nlanguage shn\nmaintainer ronaldaug <contact@ronaldaug.ml>\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/tai/th",
    "content": "name Thai\nlanguage th\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/az",
    "content": "name Azerbaijani\nlanguage az\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/ba",
    "content": "name Bashkir\nlanguage ba\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/cv",
    "content": "name Chuvash\nlanguage cv\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/kk",
    "content": "name Kazakh\nlanguage kk\nstatus testing\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/ky",
    "content": "name Kyrgyz\nlanguage ky\n\ntunes s3 c3 q3 e3\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/nog",
    "content": "name Nogai\nlanguage nog\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/tk",
    "content": "name Turkmen\nlanguage tk\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/tr",
    "content": "name Turkish\nlanguage tr\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/tt",
    "content": "name Tatar\nlanguage tt\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/ug",
    "content": "name Uyghur\nlanguage ug\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/trk/uz",
    "content": "name Uzbek\nlanguage uz\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/urj/et",
    "content": "name Estonian\nlanguage et\n\nstressAmp 18 16 22 22 20 22 22 22\nstressLength 150 180 200 200 0 0 210 250\nstressOpt 1 2 4 6 // (S_NO_DIM + S_FINAL_DIM = S_FINAL_DIM_ONLY), S_FINAL_NO_2, S_2_TO_HEAVY\nstressRule 0\n\nintonation 3\nspellingStress\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/urj/fi",
    "content": "name Finnish\nlanguage fi\n\n\nstressAmp 18 16 22 22 20 22 22 22\nstressLength 150 180 200 200 0 0 210 250\nstressOpt 1 2 4 6 // (S_NO_DIM + S_FINAL_DIM = S_FINAL_DIM_ONLY), S_FINAL_NO_2, S_2_TO_HEAVY\nstressRule 0\n\nintonation 3\nspellingStress\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/urj/hu",
    "content": "name Hungarian\nlanguage hu\nbrackets 0\nbracketsAnnounced 0\npitch 81 117\n\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/urj/smj",
    "content": "name Lule Saami\nlanguage smj\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zle/be",
    "content": "name Belarusian\nlanguage be\ndict_min  2000\nspeed 95\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zle/ru",
    "content": "name Russian\nlanguage ru\nreplace 03 a a#\ndict_min  20000\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zle/ru-LV",
    "content": "name Russian (Latvia)\nlanguage ru-lv 2\n\nmaintainer Valdis Vitolins <valdis.vitolins@odo.lv>\nstatus testing\n\nphonemes ru-lv\ndictrules 2\ndict_min  20000\nspeed 95\n\nwords 0 2\ntone 150 220 450 255 750 20 3500 255\nstressAmp 12 10 8 8 0 0 16 17\nstressLength 160 140 200 140 0 0 240 160\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zle/ru-cl",
    "content": "name Russian (Classic)\nlanguage ru-cl\nreplace 03 a a#\ndict_min  20000\nspeed 95\ndictrules 3\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zle/uk",
    "content": "name Ukrainian\nlanguage uk\n\nmaintainer Andrij Mizyk <andm1zyk@proton.me>\nstatus testing\n\nspeed 80"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zls/bg",
    "content": "name Bulgarian\nlanguage bg\n\nstressAmp 13 12 17 17 20 22 22 21 \nstressLength 180 170  200 200  200 200  210 220\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zls/bs",
    "content": "name Bosnian\nlanguage bs\nphonemes hr\n\npitch 81 120\nformant 0 100 100 100\nformant 1  97  97 100\nformant 2  97  97 100\nformant 3  97 102 100\nformant 4  97 102 100\nformant 5  97 102 100\n\nstressAdd 10 10 0 0 0 0 -30 -30\ndictrules 3 4\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zls/hr",
    "content": "name Croatian\nlanguage hr\nlanguage hbs\n\n// attributes towards !variant3\npitch 81 120\nformant 0 100 100 100\nformant 1  97  97 100\nformant 2  97  97 100\nformant 3  97 102 100\nformant 4  97 102 100\nformant 5  97 102 100\n\nstressAdd 10 10 0 0 0 0 -30 -30\ndictrules 1\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zls/mk",
    "content": "name Macedonian\nlanguage mk\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zls/sl",
    "content": "name Slovenian\nlanguage sl\n\nstatus testing\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zls/sr",
    "content": "name Serbian\nlanguage sr\n\n// attributes towards !variant3 pitch 80 120\nformant 0 100 100 100\nformant 1  97  97 100\nformant 2  97  97 100\nformant 3  97 102 100\nformant 4  97 102 100\nformant 5  97 102 100\n\nstressAdd 10 10 0 0 0 0 -30 -30\ndictrules 2 4\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zlw/cs",
    "content": "name Czech\nlanguage cs\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zlw/pl",
    "content": "name Polish\nlanguage pl\n\nintonation 2\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/lang/zlw/sk",
    "content": "name Slovak\nlanguage sk\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/phondata-manifest",
    "content": "# This file lists the type of data that has been compiled into the\n# phondata file\n#\n# The first character of a line indicates the type of data:\n#   S - A SPECT_SEQ structure\n#   W - A wavefile segment\n#   E - An envelope\n#\n# Address is the displacement within phondata of this item\n#\n#  Address  Data file\n#  -------  ---------\nW  0x00008  ustop/null\nS  0x00158  vowel/@\nS  0x0021c  vowel/@-\nS  0x002e0  vowel/a\nS  0x003e4  vowel/e\nS  0x004e8  vowel/i\nS  0x005ec  vowel/oo\nS  0x006f0  vowel/u\nS  0x007f4  klatt/m-syl\nS  0x008f8  m/m-syl\nS  0x009bc  klatt/n-syl\nS  0x00ac0  n/n-syl\nS  0x00b84  nn/nn-syl\nW  0x00cc8  ustop/percus10\nS  0x00ed4  vowelr/r-voc\nS  0x01018  vwl_hi/l-voc\nS  0x0111c  r/r@\nS  0x011e0  r/ra\nS  0x012a4  r/re\nS  0x01368  r/ri\nS  0x0142c  r/ro\nS  0x014f0  r/ru\nS  0x015b4  r/xr\nS  0x01638  r/_r\nS  0x016fc  r/tr\nS  0x01780  r/r\nS  0x01844  r3/r_n\nW  0x018c8  r3/rx\nS  0x02c20  r/trr\nS  0x02ce4  r/rr\nS  0x02da8  r3/r_\nS  0x02e2c  r3/r_trill2\nW  0x02ef0  r3/r_trill2.wav\nS  0x035fc  r3/r_trill\nW  0x03700  r3/r_trill.wav\nW  0x0416c  r3/r_trill3.wav\nS  0x045b0  r3/r_uvl\nW  0x046b4  r3/r_uvl.wav\nS  0x055bc  l/l@\nS  0x05680  l/la\nS  0x05704  l/le\nS  0x05788  l/li\nS  0x0584c  l/lo\nS  0x05950  l/lu\nS  0x05a14  l/L1_@L\nS  0x05b18  l/L1_aL\nS  0x05c1c  l/L1_eL\nS  0x05ce0  l/L1_iL\nS  0x05de4  l/L1_oL\nS  0x05f28  l/L1_uL\nS  0x0602c  l/l_\nS  0x060b0  l/xl\nS  0x06134  l/_l\nS  0x061f8  l/tl\nS  0x0627c  l/l_long\nS  0x06300  l/l\nS  0x06384  l/L2_eL\nS  0x06448  l/L2_uL\nS  0x0654c  l/L2_@L\nS  0x06650  l/L2_aL\nS  0x06754  l/L2_iL\nS  0x06858  l/L2_oL\nS  0x0699c  l/l_@\nS  0x06a20  l/l_a\nS  0x06aa4  l/l_e\nS  0x06b28  l/l_i\nS  0x06bec  l/l_o\nS  0x06cb0  l/l_u\nS  0x06d34  l^/j2@\nS  0x06df8  l^/j2a\nS  0x06ebc  l^/j2e\nS  0x06f80  l^/j2i\nS  0x07044  l^/j2o\nS  0x07148  l^/j2u\nS  0x0724c  l^/_l^\nS  0x07350  l^/l^\nS  0x07454  l^/l_rfx\nS  0x07518  ll/xll\nS  0x075dc  ll/_ll\nS  0x076e0  ll/ll\nS  0x077a4  w/w@\nS  0x07868  w/wa\nS  0x0792c  w/we\nS  0x079f0  w/wi\nS  0x07ab4  w/wo\nS  0x07b78  w/wu\nS  0x07c3c  w/xw\nS  0x07cc0  w/w\nS  0x07d44  w/_w\nS  0x07e08  w/iw_\nS  0x07f0c  w/w_\nS  0x07fd0  j/j@\nS  0x080d4  j/ja\nS  0x081d8  j/je\nS  0x082dc  j/ji\nS  0x083a0  j/jo\nS  0x084e4  j/ju\nS  0x085a8  j/xj\nS  0x0862c  j/_j\nS  0x086b0  j/j_\nS  0x08774  j2/j2@\nS  0x08838  j2/j2a\nS  0x088fc  j2/j2e\nS  0x089c0  j2/j2i\nS  0x08a84  j2/j2o\nS  0x08b88  j2/j2u\nS  0x08c4c  j2/xj2\nS  0x08cd0  j2/_j2\nS  0x08d54  klatt/m_\nS  0x08e58  klatt/m\nS  0x08f5c  m/m@\nS  0x09060  m/ma\nS  0x09164  m/me\nS  0x09268  m/mi\nS  0x093ac  m/mo\nS  0x094b0  m/mu\nS  0x095b4  m/mj\nS  0x09678  m/_m\nS  0x096fc  m/m_\nS  0x097c0  klatt/n\nS  0x098c4  n/n@\nS  0x099c8  n/na\nS  0x09acc  n/ne\nS  0x09bd0  n/ni\nS  0x09cd4  n/no\nS  0x09dd8  n/nu\nS  0x09edc  n/nj\nS  0x09fa0  n/_n\nS  0x0a024  n/n_\nS  0x0a0e8  klatt/nr\nS  0x0a1ec  n/nr@\nS  0x0a2f0  n/nra\nS  0x0a3f4  n/nre\nS  0x0a4f8  n/nri\nS  0x0a5fc  n/nro\nS  0x0a700  n/nru\nS  0x0a804  n/_nr\nS  0x0a888  n/nr_\nS  0x0a94c  klatt/n^@\nS  0x0a9d0  klatt/n^\nS  0x0aad4  n^/n^@\nS  0x0ac58  n^/n^a\nS  0x0ad9c  n^/n^e\nS  0x0af20  n^/n^i\nS  0x0b0a4  n^/n^o\nS  0x0b268  n^/n^u\nS  0x0b3ec  n^/_n^\nS  0x0b470  n^/n^_\nS  0x0b5b4  klatt/nn_\nS  0x0b6b8  klatt/nn\nS  0x0b7bc  nn/nn@\nS  0x0b880  nn/nna\nS  0x0b944  nn/nne\nS  0x0ba08  nn/nni\nS  0x0bacc  nn/nno\nS  0x0bb90  nn/nnu\nS  0x0bc54  nn/inn\nS  0x0bd18  nn/nnj\nS  0x0bd9c  nn/_nn\nS  0x0be20  nn/nn_\nS  0x0bee4  r3/@tap2\nS  0x0c028  r3/@tap\nS  0x0c16c  d/tap1\nS  0x0c230  d/tap3\nS  0x0c334  d/dr\nS  0x0c3b8  r3/@tap_rfx_\nS  0x0c4fc  r3/@tap_rfx\nS  0x0c640  b/xb\nS  0x0c704  klatt/b\nW  0x0c7c8  x/b_\nW  0x0cbe0  x/b\nS  0x0cd44  b/b_\nS  0x0ce08  b/b@2\nS  0x0cf0c  b/b@\nS  0x0d010  b/ba\nS  0x0d114  b/be\nS  0x0d218  b/bi\nS  0x0d31c  b/bo\nS  0x0d420  b/bu\nS  0x0d524  b/b\nS  0x0d628  d/xd\nS  0x0d6ec  d/d_\nW  0x0d7b0  x/d_\nS  0x0dbd8  d/d\nW  0x0dc9c  x/d\nW  0x0deb8  x/d_dnt\nS  0x0e19c  dzh/xdzh\nS  0x0e260  dzh/dzh_\nW  0x0e324  x/dzh_\nS  0x0ed5c  dzh/dzh\nW  0x0ee20  x/dzh\nW  0x0f22c  x/dz_pzd\nS  0x0f68c  dzh/xdz_pzd\nS  0x0f750  klatt/dz_pzd_\nS  0x0f814  klatt/dz_pzd\nS  0x0f8d8  dzh/dz_pzd_\nS  0x0f99c  dzh/dz_pzd\nS  0x0fa60  g/xg\nS  0x0fb24  g/g_\nW  0x0fbe8  x/g_\nS  0x0ffa8  g/g\nW  0x1006c  x/g2\nS  0x102f4  klatt/v_\nW  0x103b8  vocw/v\nS  0x10cb8  klatt/bh\nS  0x10d7c  voc/v_\nS  0x10e40  voc/bh\nS  0x10f04  klatt/v\nS  0x10fc8  voc/v\nS  0x110cc  voc/v#_\nS  0x11190  voc/v#\nS  0x11294  voc/dh_\nW  0x11358  vocw/dh\nS  0x11c60  voc/dh\nS  0x11d24  voc/z_\nW  0x11de8  ufric/s_\nS  0x1289c  voc/z\nS  0x12960  klatt/zh_\nW  0x12a24  vocw/zh\nS  0x1338c  klatt/zh\nS  0x13450  voc/zh_\nS  0x13514  voc/zh\nW  0x135d8  vocw/zh_rfx\nS  0x13e68  voc/z_pzd_\nW  0x13f2c  ufric/s_pzd_\nS  0x14a30  voc/z_pzd\nW  0x14af4  ufric/s_pzd\nW  0x1542c  ufric/sh_pzd_\nW  0x15ef4  ufric/sh_pzd\nS  0x16828  voc/j\nW  0x1692c  ufric/ch\nS  0x17044  klatt/qqh_\nW  0x17108  vocw/Q_\nS  0x17914  klatt/qqh\nW  0x179d8  vocw/Q\nS  0x181e4  voc/Q_\nS  0x182a8  voc/Q\nS  0x1836c  voc/Q_ulv\nW  0x18470  ufric/xx\nW  0x18f6c  ustop/p_\nW  0x1977c  ustop/pr\nW  0x19bc4  ustop/p_unasp\nW  0x19ef0  ustop/pl\nW  0x1a2e8  ustop/p\nW  0x1a658  ustop/t_\nW  0x1ab18  ustop/tr\nW  0x1b278  ustop/t_dnt\nW  0x1b688  ustop/t\nW  0x1babc  ustop/t_hi\nW  0x1bd88  ustop/tsh_\nW  0x1c6c8  ustop/tsh\nW  0x1cd08  ustop/ts_pzd\nW  0x1d40c  ustop/t_pzd\nW  0x1d858  ustop/c\nW  0x1db08  ustop/k_\nW  0x1dfc4  ustop/kr\nW  0x1e604  ustop/ki\nW  0x1ebcc  ustop/kl\nW  0x1f1fc  ustop/k_unasp\nW  0x1f6d0  ustop/k\nW  0x1fba4  ustop/q\nW  0x1fd10  ustop/q_u\nW  0x1fe30  ufric/f_\nW  0x20900  ufric/f\nW  0x210f0  ufric/th_\nW  0x21970  ufric/th\nW  0x22208  ufric/s!\nW  0x22ab8  ufric/s\nW  0x23258  ufric/sh_\nW  0x23d08  ufric/sh\nW  0x246b8  ufric/sh_rfx\nW  0x25054  ufric/l#\nW  0x25a98  ufric/ch_\nW  0x263c0  ufric/x_\nW  0x26f1c  ufric/x_hr\nW  0x27830  h/h@\nW  0x27d84  h/ha\nW  0x28400  h/he\nW  0x28a94  h/hi\nW  0x2902c  h/ho\nW  0x296e8  h/hu\nW  0x29e0c  h/h_\nW  0x2a4b8  ustop/ts_\nW  0x2ae18  ustop/ts\nS  0x2b874  d/xdz\nW  0x2b938  ustop/p_unasp_\nW  0x2ba74  ustop/p_asp\nW  0x2bf78  ustop/t_short\nW  0x2c1bc  ustop/ts_pzd_\nW  0x2c680  ustop/ts_pzd2\nW  0x2c9b4  ustop/k_asp\nW  0x2d0b8  ustop/k_asp_e\nW  0x2d820  ustop/k_asp_a\nW  0x2e0a4  ufric/s_continue\nS  0x2e854  vowel/a#\nS  0x2e958  vowel/a_2\nS  0x2ea5c  vowel/ee_1\nS  0x2eba0  vowel/o\nS  0x2ece4  vowel/oo_4\nS  0x2ede8  vowel/u_bck\nS  0x2eeec  vowel/uu_2\nS  0x2eff0  vowel/y\nS  0x2f134  vowel/y#\nS  0x2f238  vdiph/au_4\nS  0x2f3bc  vdiph/eu\nS  0x2f500  vdiph2/iu\nS  0x2f684  vdiph/ai\nS  0x2f7c8  vdiph/ei\nS  0x2f90c  vdiph/eei\nS  0x2fa90  vdiph/oi\nS  0x2fc54  vdiph/ui\nS  0x2fd98  w/w2\nW  0x2fe5c  ustop/t_dnt2\nS  0x300b4  vowel/ii_5\nS  0x301b8  vowel/e_mid2\nS  0x302bc  vowel/ii#_2\nS  0x303c0  vdiph/ai_5\nS  0x30504  vowel/a_6\nS  0x30608  vdiph/@i_2\nS  0x3074c  vowel/@_3\nS  0x30810  vowel/o-_4\nS  0x30914  vowel/u_2\nW  0x30a18  ustop/tsh_unasp\nW  0x30ed8  ustop/k_ejc\nW  0x31688  vwl_ar/hah\nW  0x325ec  vwl_ar/dhad\nW  0x3364c  vwl_ar/shin\nS  0x34428  vowel/aa_7\nS  0x3452c  vowel/u_7\nS  0x34630  vowel/ii#\nS  0x34734  vowel/oe\nS  0x34838  vowel/o_mid\nS  0x3493c  vowel/@_2\nS  0x34a40  vowel/ee\nS  0x34b44  vowel/aa_8\nS  0x34c48  vowel/0_3\nS  0x34d4c  vowel/e_6\nS  0x34e50  vowel/ii\nE  0x34f54  envelope/i_risefall\nE  0x34fd4  envelope/p_fall\nE  0x35054  envelope/p_214\nE  0x350d4  envelope/p_rise\nE  0x35154  envelope/p_level\nS  0x351d4  n/n_long_\nS  0x35298  nn/nn2_\nW  0x3535c  ustop/t_unasp2\nW  0x35468  ustop/k_unasp_\nW  0x35724  ustop/tsh_pzd_unasp\nW  0x35f74  ustop/tsh_pzd\nW  0x36ab4  ufric/sh_pzd2\nW  0x37604  ustop/ts_unasp\nW  0x37e7c  ustop/ts_rfx_unasp\nW  0x38a68  ustop/ts_rfx\nS  0x39748  vwl_zh/a_n\nS  0x3984c  vowel/aa_2\nS  0x399d0  vowel/a_3\nS  0x39ad4  vdiph/ai_6\nS  0x39c98  vwl_zh/aau\nS  0x39ddc  vowel/@_bck\nS  0x39ee0  vowel/3_2\nS  0x3a024  vowelr/V3_r\nS  0x3a168  vowel/ee_2\nS  0x3a26c  vdiph2/ei_4\nS  0x3a3b0  vowel/ii_2\nS  0x3a4b4  vowel/i#_7\nS  0x3a5b8  vowel/i#_6\nS  0x3a6bc  vwl_zh/iaa\nS  0x3a800  vwl_zh/iaau\nS  0x3a984  vwl_zh/ie\nS  0x3aac8  vdiph2/iioo\nS  0x3ac0c  vwl_zh/iou\nS  0x3ad90  vnasal/oo_n2\nS  0x3aed4  vdiph2/o_oo\nS  0x3b018  vowel/8\nS  0x3b11c  vdiph/8u\nS  0x3b260  vwl_zh/ong\nS  0x3b3e4  vnasal/u_n\nS  0x3b4e8  vwl_zh/uaa\nS  0x3b62c  vdiph2/oa\nS  0x3b770  vwl_zh/uai\nS  0x3b8f4  vdiph2/o@\nS  0x3ba78  vwl_zh/uei\nS  0x3bbfc  vwl_zh/uo\nS  0x3bd80  vowel/uu_3\nS  0x3be44  vowel/y_2\nS  0x3bf88  vdiph2/yu\nS  0x3c10c  vwl_zh/y&\nS  0x3c250  vwl_zh/yee\nS  0x3c394  vdiph2/y@\nS  0x3c4d8  vdiph/yi\nS  0x3c61c  vowel/ii_3\nS  0x3c720  vowel/oo_2\nS  0x3c824  vowel/i#\nS  0x3c928  vowel/o_2\nS  0x3ca6c  vdiph/aai_2\nS  0x3cc30  vdiph/ai_2\nS  0x3cdf4  vdiph2/iu_4\nS  0x3cf38  vdiph/ooi\nS  0x3d0fc  vdiph/ui_3\nS  0x3d280  vowel/a#_3\nS  0x3d384  r/a_\nS  0x3d448  vowel/i_4\nS  0x3d54c  vowel/&\nS  0x3d650  vowel/a_8\nS  0x3d754  vowel/o_5\nS  0x3d858  vowel/V_4\nS  0x3d95c  vowel/yy\nS  0x3da60  vowel/V\nS  0x3db64  r/aa\nS  0x3dc68  r2/r2@\nS  0x3dd2c  r2/r2a\nS  0x3ddf0  r2/r2e\nS  0x3def4  r2/r2i\nS  0x3dfb8  r2/r2o\nS  0x3e07c  r2/r2u\nS  0x3e140  vowel/@_6\nS  0x3e244  vwl_en/@L\nS  0x3e308  vowel/ee_5\nS  0x3e40c  vowel/ii#_3\nS  0x3e510  vowel/ii_4\nS  0x3e614  vowel/ii_7\nS  0x3e718  vowel/0\nS  0x3e81c  vowel/V_2\nS  0x3e920  vowel/8_2\nS  0x3ea24  vowel/uu\nS  0x3eb28  vowel/3_en\nS  0x3ec6c  w/wi2\nS  0x3ed70  vowel/i_en\nS  0x3eeb4  vowel/oo_en\nS  0x3eff8  vwl_en/u_L\nS  0x3f13c  vdiph2/uw_2\nS  0x3f280  vdiph/au\nS  0x3f404  vdiph/@u_en\nS  0x3f588  vdiph2/ii@\nS  0x3f70c  vdiph2/8@\nS  0x3f850  vdiph2/uu@\nS  0x3f9d4  vwl_en/aI@\nS  0x3fb98  vwl_en/aU@\nS  0x3fd1c  vowelr/V_r\nS  0x3fe60  vnasal/aa_n2\nS  0x3ffa4  vowel/oo_1\nS  0x400e8  vdiph/eei_2\nS  0x4022c  vdiph/ooi_2\nS  0x403f0  vowel/aa_9\nS  0x404f4  vowel/aa\nS  0x405f8  vowel/e#\nS  0x406fc  vowel/e_7\nS  0x40800  vowel/ee#_2\nS  0x40904  vowel/i_8\nS  0x40a08  vowel/i_7\nS  0x40b0c  vowel/u_bck2\nS  0x40c10  vowel/u_bck3\nS  0x40d14  vowel/u_5\nS  0x40e18  vowel/8_7\nS  0x40f1c  vowel/8_4\nS  0x41020  vdiph/&i\nS  0x41164  vdiph/@i\nW  0x412a8  ufric/s_pal\nS  0x41b5c  d/xd_pzd\nW  0x41c20  x/d_pzd\nS  0x42034  vdiph/ou_2\nS  0x42178  vowel/aa#\nS  0x4227c  vowel/uu_4\nS  0x42380  vdiph/aai_3\nS  0x42504  vdiph/y#i\nS  0x42648  vdiph/ui_4\nS  0x4278c  vdiph/aau\nS  0x42910  vdiph/ou\nS  0x42a54  vdiph/eu_2\nS  0x42b98  vdiph2/iu_2\nS  0x42d1c  vdiph/&y\nS  0x42e60  vdiph/eey\nS  0x42fa4  vdiph/y#y\nS  0x430e8  vdiph2/iy\nS  0x4322c  vdiph2/uo\nS  0x43370  vdiph2/ie\nS  0x434b4  vdiph2/y-y#\nS  0x435f8  r3/r_trill_short\nW  0x436fc  h/hu_fi\nS  0x43fec  vowel/@_4\nS  0x440b0  vowel/ee_4\nS  0x441b4  vowel/u#_2\nS  0x442b8  vowel/oe_2\nS  0x443bc  vwl_fr/y2r\nS  0x44440  vwl_fr/e_2r\nS  0x444c4  vwl_fr/aa2r\nS  0x44548  vwl_fr/ee2r\nS  0x4460c  vwl_fr/oo2r\nS  0x446d0  vwl_fr/@2r\nS  0x44754  vwl_fr/a2r\nS  0x447d8  vwl_fr/e2r\nS  0x4485c  vwl_fr/i2r\nS  0x448e0  vwl_fr/o2r\nS  0x44964  vwl_fr/u2r\nS  0x449e8  vwl_fr/re2\nS  0x44a6c  vwl_fr/r@2\nS  0x44af0  vwl_fr/raa\nS  0x44b74  vwl_fr/ree\nS  0x44bf8  vwl_fr/ry\nS  0x44c7c  vwl_fr/rw\nS  0x44d00  vwl_fr/roo\nS  0x44d84  vwl_fr/rj\nS  0x44e08  vwl_fr/r@\nS  0x44e8c  vwl_fr/ra\nS  0x44f10  vwl_fr/re\nS  0x44f94  vwl_fr/ri\nS  0x45018  vwl_fr/ro\nS  0x4509c  vwl_fr/ru\nS  0x45120  vwl_fr/r\nS  0x451a4  vwl_fr/trr\nS  0x45268  vwl_fr/rr\nS  0x452ec  vwl_fr/r_@\nS  0x45370  vwl_fr/r_a\nS  0x453f4  vwl_fr/r_e\nS  0x45478  vwl_fr/r_i\nS  0x454fc  vwl_fr/r_o\nS  0x45580  vwl_fr/r_u\nS  0x45604  vwl_fr/r_y\nS  0x45688  vwl_fr/r_n\nS  0x4574c  vwl_fr/r_\nS  0x457d0  vwl_fr/tr\nS  0x458d4  vwl_fr/br\nS  0x459d8  vwl_fr/lo\nS  0x45a5c  l/l_y\nS  0x45ae0  vowel/@_hgh\nS  0x45ba4  vowel/a_7\nS  0x45ca8  vowel/e_8\nS  0x45dac  vowel/e_mid\nS  0x45eb0  vwl_fr/j\nS  0x45fb4  vowel/o_8\nS  0x460f8  vowel/o_mid2\nS  0x461fc  vwl_fr/wa\nS  0x462c0  vnasal/aa_n4\nS  0x46404  vnasal/W_n\nS  0x46548  vnasal/o_n5\nS  0x4668c  b/xbr\nS  0x46750  b/br\nS  0x467d4  d/xdr\nS  0x46898  g/xgr\nS  0x4695c  g/gr\nW  0x46a20  x/g\nW  0x46ce0  ustop/t_short_\nS  0x46f6c  vwl_af/r@\nS  0x47030  vwl_af/@\nS  0x470f4  vowel/a_4\nS  0x471f8  vdiph/@u_3\nS  0x4737c  vdiph2/i@\nS  0x47540  vdiph2/u@\nS  0x476c4  vnasal/a#_n2\nS  0x477c8  vnasal/a_n\nS  0x4790c  vnasal/e_n\nS  0x47a10  vnasal/i_n\nS  0x47b14  vnasal/o_n\nS  0x47c58  vowel/yy_4\nS  0x47d5c  vowel/o-\nS  0x47e60  vwl_lv/a\nS  0x47f64  vwl_lv/aa\nS  0x48028  vwl_lv/e\nS  0x480ec  vwl_lv/ee\nS  0x481b0  vwl_lv/i\nS  0x48274  vwl_lv/ii\nS  0x48338  vwl_lv/o\nS  0x483fc  vwl_lv/oo\nS  0x484c0  vwl_lv/u\nS  0x48584  vwl_lv/uu\nS  0x48648  vdiph/aai\nS  0x487cc  vdiph2/ie_2\nS  0x48910  vdiph2/ua\nS  0x48a14  vowel/@_low\nS  0x48ad8  vowel/V_3\nS  0x48bdc  vowel/i_fnt\nS  0x48ce0  vowel/ii_6\nS  0x48da4  vowel/e_2\nS  0x48ea8  vdiph/ee-e\nS  0x48fec  vowel/a_5\nS  0x490f0  vowel/uu_bck\nS  0x491f4  vnasal/i_n2\nS  0x492f8  vnasal/ii_n\nS  0x493fc  vnasal/ee_n2\nS  0x49540  vnasal/V_n\nS  0x49644  vdiph/aau_3\nS  0x497c8  d/xd3\nW  0x4988c  ustop/th_rfx2\nS  0x49e90  g2/xg\nW  0x49f54  ustop/percus02\nW  0x4a284  ustop/ts2\nS  0x4a754  vowel/y#_2\nS  0x4a858  vowel/e_3\nS  0x4a95c  vowel/e_e\nS  0x4aa60  vowel/a#_2\nS  0x4ab64  vowel/oo_5\nS  0x4ac68  vowel/y##\nS  0x4ad6c  vowel/y#_3\nS  0x4ae70  vdiph/ai_7\nS  0x4aff4  vdiph/ou_3\nS  0x4b0f8  vdiph/y#i_2\nS  0x4b23c  m/m#_\nS  0x4b340  n/n#_\nS  0x4b444  n^/n^#_\nS  0x4b548  nn/nn#_\nW  0x4b64c  ufric/tl#\nS  0x4bfb4  r3/r#_\nS  0x4c038  vowel/oo_3\nW  0x4c0fc  ustop/k_asp_u\nW  0x4c92c  ufric/x2\nS  0x4d284  vowel/aa_6\nS  0x4d3c8  vowel/u#_7\nS  0x4d4cc  vowel/V_6\nW  0x4d5d0  ustop/t_unasp\nW  0x4d708  ustop/ts_pzd3\nS  0x4dd88  vowel/i_2\nS  0x4de8c  vdiph/aau_2\nS  0x4dfd0  vdiph/ae\nS  0x4e114  vdiph/eeu_2\nS  0x4e258  vdiph/ae_2\nS  0x4e3dc  vdiph/eei_5\nS  0x4e520  vwl_ru/ee\nS  0x4e664  vdiph2/ea\nS  0x4e7a8  vowel/i_3\nS  0x4e8ac  vowel/i_6\nS  0x4e9b0  vdiph2/uaa\nS  0x4eb34  vdiph/eei_3\nS  0x4ec78  vwl_lv/e2\nS  0x4ed3c  vwl_lv/ee2\nS  0x4ee00  vwl_lv/y\nS  0x4ef04  vwl_lv/yy\nS  0x4f008  vwl_lv/ai\nS  0x4f18c  vwl_lv/au\nS  0x4f310  vwl_lv/ei\nS  0x4f454  vwl_lv/ie\nS  0x4f598  vwl_lv/iu\nS  0x4f71c  vwl_lv/ui\nS  0x4f860  vwl_lv/ua\nS  0x4f964  vwl_lv/oi\nW  0x4fb28  h/h-lv\nS  0x504a8  l^/l^_\nW  0x505ac  myanmar/k\nW  0x5149c  myanmar/kh\nW  0x520b4  myanmar/g.wav\nS  0x52ef8  myanmar/ny\nW  0x530bc  myanmar/s\nW  0x54258  myanmar/hs\nW  0x553f4  myanmar/z\nW  0x564dc  myanmar/t_short\nW  0x5662c  myanmar/ht\nW  0x571b4  myanmar/d\nW  0x57d28  myanmar/p\nW  0x58c54  myanmar/t_hi\nW  0x58f20  myanmar/h\nS  0x5a228  myanmar/yy\nS  0x5a42c  myanmar/a\nS  0x5a4b0  myanmar/ky\nW  0x5a6f4  myanmar/by.wav\nW  0x5ac00  myanmar/ch.wav\nW  0x5b454  myanmar/gya.wav\nW  0x5c7d8  myanmar/htya.wav\nW  0x5db1c  myanmar/phya.wav\nW  0x5e7d4  myanmar/pya.wav\nW  0x5fc58  myanmar/ty.wav\nW  0x60f18  myanmar/sh.wav\nS  0x61b2c  myanmar/a01\nS  0x61c30  myanmar/a02\nS  0x61db4  myanmar/a03\nS  0x62038  myanmar/a04\nS  0x620fc  myanmar/a05\nS  0x62200  myanmar/a06\nS  0x62584  myanmar/a07\nS  0x626c8  myanmar/a08\nS  0x6284c  myanmar/a09\nS  0x62b50  myanmar/a11\nS  0x62cd4  myanmar/a12\nS  0x62f98  myanmar/a14\nS  0x6315c  myanmar/a13\nS  0x633e0  myanmar/a17\nS  0x636a4  myanmar/a16\nS  0x639a8  myanmar/a20\nS  0x63b2c  myanmar/a19\nS  0x63d70  myanmar/a21\nS  0x64034  myanmar/a23\nS  0x64138  myanmar/a22\nS  0x642bc  myanmar/a24\nS  0x64600  myanmar/a29\nS  0x64744  myanmar/a28\nS  0x64988  myanmar/a30\nS  0x64d0c  myanmar/a32\nS  0x64f50  myanmar/a31\nS  0x65214  myanmar/a33\nS  0x65318  myanmar/a35\nS  0x655dc  myanmar/a34\nS  0x658a0  myanmar/a36\nS  0x65ba4  myanmar/a43\nS  0x65de8  myanmar/a42\nS  0x6602c  myanmar/a44\nS  0x66430  myanmar/a49\nS  0x665b4  myanmar/a50\nS  0x66838  myanmar/a46\nS  0x66a3c  myanmar/a45\nS  0x66c40  myanmar/a47\nS  0x66f44  myanmar/a25\nS  0x67088  myanmar/a26\nS  0x672cc  myanmar/a27\nS  0x67490  myanmar/a37\nS  0x67654  myanmar/a38\nS  0x67798  myanmar/a39\nS  0x679dc  myanmar/a40\nS  0x67b60  myanmar/a41\nS  0x67ce4  vowel/y_4\nS  0x67de8  vwl_no/y#\nS  0x67eec  vwl_no/&\nS  0x67ff0  vwl_no/u#\nS  0x680f4  vwl_no/u#2\nS  0x68238  vdiph/0i_2\nS  0x683bc  vdiph/ai_3\nS  0x68500  vwl_no/y#y\nS  0x68644  vwl_no/au-\nS  0x68808  vowel/ee#\nS  0x6890c  vnasal/ee_u_n\nS  0x68a90  vnasal/oo_n3\nS  0x68c14  vowel/aa_3\nW  0x68d18  vocw/Q2\nW  0x695e4  ustop/tsh_asp\nW  0x6a24c  x/g3\nS  0x6a434  vwl_ro/mi\nS  0x6a578  vwl_ru/ii-\nS  0x6a63c  vwl_ru/ii\nS  0x6a740  vwl_ru/ii#\nS  0x6a804  vwl_ru/i#\nS  0x6a908  vwl_ru/e\nS  0x6aa0c  vwl_ru/E#\nS  0x6ab10  vwl_ru/E@\nS  0x6ac14  vwl_ru/o\nS  0x6ad18  vwl_ru/oo\nS  0x6addc  vwl_ru/u\nS  0x6aee0  vwl_ru/u#\nS  0x6b024  vwl_ru/u#u\nS  0x6b168  vwl_ru/8\nS  0x6b22c  vwl_ru/ju\nS  0x6b330  vwl_ru/ja\nS  0x6b4b4  vwl_ru/a\nS  0x6b5b8  vwl_ru/aa\nS  0x6b6bc  r3/r_ru2\nW  0x6b7c0  r3/r_ru\nS  0x6bac4  vwl_it/o_open\nS  0x6bbc8  vdiph/eeu\nS  0x6bd0c  vdiph/au_2\nS  0x6be90  vdiph/ooi_3\nS  0x6c014  vdiph/aau_4\nS  0x6c198  vowel/8_6\nS  0x6c29c  vdiph/ooi_4\nS  0x6c3e0  vdiph2/ye\nS  0x6c524  l/l_front_\nS  0x6c668  l/l_front\nS  0x6c76c  l/l_4\nS  0x6c830  vowel/ee_6\nS  0x6c8f4  vowel/y_5\nS  0x6ca38  vowel/yy_3\nS  0x6cb3c  vowel/oe_4\nS  0x6cc00  vowel/aa_4\nW  0x6cd04  ufric/sx_sv\nS  0x6d54c  vowel/o_4\nW  0x6d650  ustop/t_hard\nW  0x6d890  ufric/sh3\nS  0x6e224  vwl_tn/r@\nS  0x6e2e8  vwl_tn/@\nS  0x6e3ac  vwl_tn/I\nS  0x6e470  vdiph/i@_2\nS  0x6e5f4  vowel/0_2\nW  0x6e6f8  ufric/tlh\nE  0x6fc14  envelope/p_fallrise\nE  0x6fc94  envelope/vi_5amp\nE  0x6fd14  envelope/p_512\nE  0x6fd94  envelope/vi_6amp\nS  0x6fe14  vietnam/a_2\nS  0x6ff58  vietnam/aa\nS  0x7005c  vietnam/e_e_2\nS  0x70160  vietnam/e\nS  0x70264  vietnam/e_short_1\nS  0x703e8  vietnam/i\nS  0x704ec  vietnam/i_2\nS  0x705f0  vietnam/oo\nS  0x70734  vietnam/o_2\nS  0x70878  vietnam/u\nS  0x7097c  vietnam/y_2\nS  0x70a80  vietnam/V_2\nS  0x70b84  vietnam/@_2\nS  0x70c88  vdiph/&i_2\nS  0x70dcc  vdiph/u-i\nS  0x70f10  vdiph/@u\nS  0x71054  vdiph2/ii@_3\nS  0x711d8  vietnam/y@\nS  0x7131c  vietnam/u@\nS  0x714a0  vietnam/o#\nS  0x715e4  vietnam/O_short_2\nS  0x71728  vietnam/oe\nS  0x7186c  vietnam/ie\nS  0x719b0  vnasal/oi_n\nS  0x71b74  vdiph/@i_3\nS  0x71cb8  vowel/u_3\nW  0x71dbc  vietnam/c_2\nW  0x722f8  vietnam/c\nS  0x72834  n/nm\nS  0x728f8  l/l_vi\nW  0x729fc  vietnam/th\nW  0x72fec  vietnam/tr\nW  0x732dc  vietnam/dda_2\nW  0x737a8  vietnam/ch\nW  0x73d04  vietnam/w\nS  0x73f5c  vietnam/_w\nS  0x74020  vietnam/w_\nS  0x740e4  vietnam/n^_\nW  0x74228  vietnam/hi\nW  0x74594  vietnam/hu\nS  0x74c18  vwl_zh/ang\nS  0x74e1c  vwl_zh/aang\nS  0x75060  vwl_zh/eng\nS  0x75264  vwl_zh/ing\nS  0x754a8  vwl_zh/ng\nS  0x755ec  vwl_zh/oeng\nS  0x757b0  vwl_zh/ung\nS  0x75934  vowel/8_3\nS  0x75a38  vdiph/y#y_2\nW  0x75bbc  ustop/tsh_sr\nE  0x764d4  envelope/chr_fall21\nE  0x76554  envelope/chr_level2\nE  0x765d4  envelope/chr_rise23\nE  0x76654  envelope/chr_fall32\nE  0x766d4  envelope/chr_level3\nE  0x76754  envelope/chr_rise4\nE  0x767d4  envelope/chr_fall43\nS  0x76854  vnasal/a#_n\nW  0x76958  x/dz_pzd_\nS  0x77048  vwl_es/oo_\nS  0x7710c  vwl_es/ooi_\nS  0x77290  vwl_es/ooi\nS  0x77414  voc/v2\nW  0x774d8  ufric/z_eu\nW  0x77ee0  ufric/ts_eu\nW  0x78888  ufric/tz_eu\nS  0x792f4  vdiph/0i\nS  0x794b8  vdiph/oou\nS  0x795fc  vwl_it/a\nS  0x79700  vwl_it/e_open\nS  0x79804  vwl_it/i\nS  0x79908  vwl_it/o\nS  0x79a4c  vwl_it/u\nS  0x79b50  vowel/8_5\nS  0x79c54  vowel/o_7\nS  0x79d58  vdiph/eeu_3\nS  0x79e9c  vnasal/a#u_n\nS  0x79fe0  vowel/ee_3\nS  0x7a0a4  d/x_tap\nS  0x7a168  d/tap2\nS  0x7a22c  vwl_ro/li\nS  0x7a330  vwl_ro/ni\nS  0x7a434  vwl_ro/ii-\nS  0x7a4f8  vowel/i#_5\nS  0x7a5fc  vdiph/ii\nS  0x7a7c0  vdiph/i#i\nS  0x7a904  vdiph2/uw_3\nS  0x7aa48  vdiph2/eo\nS  0x7abcc  vdiph2/e_u\nS  0x7ad10  d/tap_i\nS  0x7add4  d/tap\nS  0x7ae98  vowel/u#\nS  0x7af9c  vowel/@_fr\nS  0x7b060  vowel/o-_2\nS  0x7b164  vowel/aa_5\nS  0x7b2a8  vwl_en_n/O@\nS  0x7b3ac  vdiph2/uw_4\nS  0x7b4f0  vdiph2/ee@\nS  0x7b634  vowel/ii_final\nS  0x7b738  vowel/o-_3\nS  0x7b83c  vwl_en_rp/aa\nS  0x7b980  vowel/3_3\nS  0x7bac4  vowel/uu#_2\nS  0x7bbc8  vdiph/au_3\nS  0x7bd4c  vdiph/@u_2\nS  0x7be90  vdiph2/ei_2\nS  0x7bfd4  vdiph2/ee@_2\nS  0x7c118  vwl_en_rp/i@\nS  0x7c29c  vwl_en_rp/aU@\nS  0x7c420  vowel/e_5\nS  0x7c524  vowel/u#_4\nS  0x7c628  vowelr/aa_r\nS  0x7c7ec  vowelr/e_r\nS  0x7c970  vowel/i_5\nS  0x7ca74  vwl_en_us/or\nS  0x7cbb8  vowelr/oo_r\nS  0x7ccbc  vdiph/au#\nS  0x7ce00  vowel/o_3\nS  0x7cf44  vwl_en/aI@_2\nS  0x7d0c8  vdiph2/e@\nS  0x7d20c  vowelr/i_r\nS  0x7d350  vdiph2/u#@\nS  0x7d494  vwl_en/@L_2\nS  0x7d598  vwl_en_us/3_us\nS  0x7d69c  vowel/@_low2\nS  0x7d760  vwl_en_us/ar\nS  0x7d8a4  vwl_en_us/a\nS  0x7d9a8  vwl_en_us/ee\nS  0x7daac  vwl_en_us/aar\nS  0x7dc30  vwl_en_us/3_us2\nS  0x7dd74  vwl_en_us/oor\nS  0x7def8  vdiph2/uw_6\nS  0x7e03c  vdiph/aoo\nS  0x7e180  vwl_en_us/ai\nS  0x7e304  vwl_en_us/er\nS  0x7e488  vwl_en_us/ir\nS  0x7e60c  vwl_en_us/ur\nS  0x7e750  vwl_en_us/ai@\nS  0x7e8d4  vwl_en_us/ai3\nS  0x7ead8  vwl_en_us/aU@\nS  0x7ec9c  klatt/x_tap\nS  0x7ed60  klatt/tap2\nS  0x7ee24  vwl_en_us_nyc/a_raised\nS  0x7ef28  vwl_en_us_nyc/a\nS  0x7f02c  vwl_en_us_nyc/0_3\nS  0x7f130  vwl_en_us_nyc/aa_8\nS  0x7f234  vwl_en_us_nyc/@i\nS  0x7f3f8  vowel/@_fnt\nS  0x7f4fc  vdiph2/ei_3\nS  0x7f640  vdiph/Vu_2\nS  0x7f7c4  vdiph2/i@_2\nS  0x7f948  vwl_en/ooi@\nS  0x7fb0c  vwl_af/I\nS  0x7fbd0  l/L_eL_af\nS  0x7fc94  vowel/y_3\nS  0x7fd98  vdiph2/iu_3\nS  0x7ff5c  vdiph/Vu\nS  0x800e0  vdiph/ai_4\nS  0x80264  vdiph/oi_2\nS  0x80428  vdiph/ui_2\nS  0x805ac  vdiph2/y#@\nS  0x806f0  vnasal/aa_n3\nS  0x80834  vnasal/o_n2\nS  0x80978  vdiph/aau_6\nS  0x80afc  vwl_de/y#\nS  0x80c00  l/l_3\nS  0x80c84  j/_j_short\nS  0x80d08  vdiph2/i@_3\nS  0x80e8c  vwl_de/uu_@\nS  0x80fd0  vdiph2/ii@_2\nS  0x81154  vowel/ii_8\nS  0x81258  vowel/y#_4\nS  0x8135c  vowel/o_6\nS  0x81460  vowel/a#_4\nS  0x81564  vdiph/y#y_3\nS  0x81668  vdiph/ou_4\nS  0x817ac  voc/Q_less\nS  0x81870  vnasal/&_n\nW  0x81974  ustop/ki_ejc\nS  0x81d80  vdiph/Vi\nS  0x81f04  vowel/u_6\nS  0x82008  vowel/u#_3\nS  0x8210c  vdiph/ai_8\nS  0x82290  voc/murmur1\nS  0x823d4  vdiph/@i_4\nS  0x82558  vnasal/ai_n\nS  0x8269c  vdiph/a#u\nS  0x82820  vnasal/au_n\nS  0x82964  d/dr2\nS  0x82a28  vowel/&_2\nW  0x82b2c  ustop/tsh_unasp2\nW  0x82f74  r3/rz_cs\nS  0x83a20  voc/zh_2\nW  0x83ae4  ustop/tsh2\nS  0x841f0  dzh/dzh2\nW  0x842b4  ustop/t_sr\nS  0x845ec  d/d_dnt\nW  0x846b0  ufric/ch_sr\nW  0x85290  ufric/x_sr\nW  0x85b10  ustop/ts_sr\nS  0x862cc  vowel/&_3\nS  0x863d0  vwl_fr/@R\nS  0x864d4  vietnam/a\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Alex",
    "content": "language variant\nname Alex\n\nvoicing 70\npitch 105 115\nflutter 0\n\nformant 1 110 115 100\nformant 2 100 110 100\nformant 3 100 80 75\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Alicia",
    "content": "language variant\nname Alicia\ngender female\npitch 180 275\necho 40 50\nformant 0 115 115 110\nformant 1 130 160 120\nformant 2 150 110 150\nformant 3 135 150 100\nformant 4 120 120 120\nformant 5 120 120 120\nformant 6 100 110 105\nformant 7 100 110 160\nformant 8 200 120 100\nintonation 2\nvoicing 38\nconsonants 100 20\nroughness 1\nstressAdd 1 64 64 50 50 100 100 200\nstressAmp 12 12 20 20 12 12 20 20\nbreathw 150 150 200 200 400 400 600 600\nbreath 0 4 5 2 3 13 3 2"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Andrea",
    "content": "language variant \nname Andrea\ngender female \n\npitch 200 265\nroughness 0\n\nformant 0 100  100 100\nformant 1 110  100 80\nformant 2 110  80 80\nformant 3 115  110 80\nformant 4 115  80 100\nformant 5 95  50 100\nformant 6 0 0 0\nformant 7 120  100 100\nformant 8 110  100 100\nintonation 3\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\nvoicing 150"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Andy",
    "content": "language variant\nname Andy\ngender Male\n\npitch 85 110\n\nflutter 0\nformant 0 80 80 80 80\nformant 1 100 100 100 120\nformant 2 100 88 100\nformant 3 0 0 0\nformant 4 80 80 80\nformant 5 80 80 80\nformant 6 0 0 0\nformant 7 0 0 0\nformant 8 0 0 0\nstressAdd 0 0 0 0 0 0 0 200\nstressAmp 35 35 35 35 35 35 35 35 35\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Annie",
    "content": "language variant\nname Annie\ngender female\npitch 120 280\n\nformant 0 105 125 120\nformant 1 120 140 120\nformant 2 120 150 140\nformant 3 130 150 130\nformant 4 120 120 110\nformant 5 120 120 110\nformant 6 120 140 130\nformant 7 120 140 130\nformant 8 120 140 130\nintonation 1\nvoicing 30\nconsonants 110 120\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/AnxiousAndy",
    "content": "language variant\nname anxiousAndy\ngender Male\n\npitch 115 110\n\nflutter 0\nformant 0 80 80 80 80\nformant 1 100 100 100 120\nformant 2 100 100 100\nformant 3 0 0 0\nformant 4 0 0 0\nformant 5 100 100 100\nformant 6 100 100 100\nformant 7 100 100 100\nformant 8 100 100 100\nstressAdd 100 100 100 100 100 100 100 300\nstressAmp 35 35 35 35 35 35 35 35 35\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Demonic",
    "content": "##Ten en cuenta que los 2 signos de número en este archivo tienen explicaciones de las comfiguraciones que puede aplicar y cómo comfigurarlas\n## Language Establece el idioma de la voz. Esta opción es necesaria para cualquier comfiguración que realices\n##La siguiente línea es una configuración que puede cambiar. Sin embargo, si no conoce los códigos de idioma, puede ser mejor dejar la configuración tal y como está.\nlanguage variant\n\n## La configuración de nombre es el nombre que aparecerá en la configuración de voz en el cuadro combinado de variante.\n##La siguiente línea es una opción que puede cambiar\nname Demonic\n##La siguiente línea establece el género de la voz. Male or Female (hombre o mujer)\n##La siguiente línea es una opción que puede cambiar\ngender male\n\nflutter 5\nstressAmp 20 18  20 20  20 22  22 22\n##Las opciones de formantes\n##  Formant 0 es usado para dar una baja frecuencia a los sonnidos\n## Los tres números son frecuencia, fuerza y ancho, en orden. Ten en cuenta que los números están separados por espacios\n##La siguiente línea es una opción que puede cambiar\nformant 0 100 100 100\n\n# Formant 1, 2, y 3 son las 3 formantes estándar para definir las vocales.\n##Las siguientes 3 líneas son opciones que puedes cambiar\nformant 1 70 100 100\nformant 2 80 100 90\nformant 3 80 160 90\n\n# Formants 4 y 5 afectan a f3. Esto afectará la calidad de la voz.\n##Las siguientes 2 líneas son comfiguraciones que puede cambiar.\nformant 4 80 85\nformant 5 100 100 80\n\n## Formantes 6, 7 y 8 son opciones que te ofrecen un sonido más claro de las vocales\n##Las siguientes 3 líneas son opciones que puedes cambiar\nformant 6 80 80 100\nformant 7 130 130 110\nformant 8 120 120 150\n\n##Intonation afecta el ascenso y la caída de la voz\n## Las opciones son: 1 predeterminado, 2 entonación media, 3 entonación media y no afecta a las comas, 4 al final de la oración o punto aumenta el tono de la voz.\n##La siguiente línea es una opción que puedes cambiar.\nintonation 10\n\n# Establecer el rango de tono. El primer número le da un tono base a la voz (valor en hz). El segundo número controla el rango de tonos usado por la voz. Poniéndolo igual\n# si los 2 números son iguales, la voz será monótona. Por defecto los ajustes son 82 y 118 \npitch 43 120\n## La configuración del tono. El primer número en la línea de configuración, 600, es la configuración de frecuencia para la cantidad de graves en la voz.\n## El segundo número en la línea de tono es el volumen de la frecuencia de graves. Puede configurarlo de 0 a 255, siendo 0 la menor cantidad, 255 la mayor.\n##El tercer número en la línea de tono, 1200, es la frecuencia de rango medio. El cuarto número en la línea es la configuración para cambiar el volumen de la frecuencia de rango medio.\n##0 es la menor cantidad y 255 es la mayor.\n## El quinto número en la línea de tono, 2000, es la frecuencia de agudos. El sexto número es el volumen de la frecuencia de agudos. 0 es el mínimo y 255 es el máximo.\n##  Notará que las 3 frecuencias están configuradas en 255.\n###La siguiente línea es una opción que puedes cambiar.\ntone 100 255 1200 255 1500 255\necho 8 10000\nroughness 3\nbreath 20 5 2 10 5 0 27 100\nbreathw 255 255 60 180 160 255 255 255\nconsonants 194 255\nvoicing 65\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 250 350 700 500 450 290 100 225\nstressAmp 16 16 24 24 16 16 20 24\n##Este archivo no incluye todas las configuraciones que se pueden usar para modificar una voz E Speak. Su objetivo es familiarizarlo con lo que hace la configuración.\n##Sin envargo puedes visitar la página http://espeak.sourceforge.net/voices.html y consultar más información acerca de cómo agregar o cambiar otras configuraciones.\n## Espero que te haya servido esta ayuda, y que te hayas divertido.\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Denis",
    "content": "language variant\nname Denis\ngender male 35\npitch  80 115\nflutter 0\nroughness 0\n\n\nformant 0 100 160 160\nformant 1 95 95 95\nformant 2 100 100 100\nformant 3 90 90 90\nformant 4 40 40 40\nformant 5 80 80 80\nformant 6 10 10 10\nformant 7 10 10 10\nformant 8 10 10 10\nvoicing 40\nconsonants 80 80\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Diogo",
    "content": "language variant\nname Diogo\ngender male 25\npitch  82 122\necho 0 0\nflutter 0\nroughness 0\nstressAmp 20 18  20 20  20 22  22 22\n\n\nformant 0 105 200 140\nformant 1 95 150 120\nformant 2 100 120 140\nformant 3 95 95 140\nformant 4 30 30 30 -100\nformant 5 90 90 90\nformant 6 110 60 65\nformant 7 100 0 100\nformant 8 100 0 100\nvoicing 35\nconsonants 60 40\ntone 60 250 140 100 1000 50 3500 35\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Gene",
    "content": "language variant\nname Gene\n\npitch  80 110\n\nformant 0 120 120 120\nformant 1 90 100 110\nformant 2 100 100 95\nformant 3 90 100 100\nformant 4 90 100 110\nformant 5 90 110 110\nformant 6 100 70 100\nformant 7 100 70 100\nformant 8 100 80 100\nvoicing 120\nconsonants 50 110\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Gene2",
    "content": "language variant\nname Gene2\n\npitch  100 130\n\nformant 0 120 120 120\nformant 1 90 100 110\nformant 2 100 100 95\nformant 3 90 100 100\nformant 4 90 100 110\nformant 5 90 110 110\nformant 6 100 70 100\nformant 7 100 70 100\nformant 8 100 80 100\nvoicing 120\nconsonants 50 110\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Henrique",
    "content": "language variant\nname Henrique\ngender male 25\npitch  70 130\necho 0 0\nflutter 0\nroughness 0\nstressAmp 20 18  20 20  20 22  22 22\n\n\nformant 0 105 200 140\nformant 1 95 150 120\nformant 2 100 120 140\nformant 3 95 95 140\nformant 4 30 30 30 -100\nformant 5 90 90 90\nformant 6 110 60 65\nformant 7 100 0 100\nformant 8 100 0 100\nvoicing 35\nconsonants 60 40\ntone 70 250 230 80 1100 30 3500 40\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Hugo",
    "content": "language variant\nname Hugo\ngender male 25\npitch  70 130\necho 0 0\nflutter 0\nroughness 0\nstressAmp 20 18  20 20  20 22  22 22\n\n\nformant 0 105 200 140\nformant 1 95 150 120\nformant 2 100 120 140\nformant 3 95 95 140\nformant 4 30 30 30 -100\nformant 5 90 90 90\nformant 6 110 60 65\nformant 7 100 0 100\nformant 8 100 0 100\nvoicing 35\nconsonants 60 40\ntone 400 160 1100 90 3500 90 150 35\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Jacky",
    "content": "language variant\nname Jacky\n\npitch  85 130\n\nformant 0 150 155 100\nformant 1 90 155 70\nformant 2 95 70 64\nformant 3 15 20 30\nformant 4 20 30 40\nformant 5 65 20 65\nformant 6 70 80 100\nformant 7 20 80 100\nformant 8 100 95 80\nvoicing 135\nconsonants 110\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Lee",
    "content": "language variant\nname Lee\ngender Male\n\n#echo 230 30\npitch 85 110\n\nflutter 0\nformant 0 80 80 80 80\nformant 1 80 80 100 100\nformant 2 80 80 80\nformant 3 9 9 9\nformant 4 290 290\nformant 5 130 0 0\nformant 6 90 90 90\nformant 7 90 90 90\nformant 8 90 90 90\nstressAdd 0 0 0 200 0 0 0 100\nstressAmp 30 30 30 30 30 30 30 30 30\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Marco",
    "content": "language variant\nname Marco\ngender male 30\nintonation 1\npitch  100 152\necho 50 80\nflutter 2\nroughness 0\nstressAmp 25 25  24 20  38 31  39 27\nstressAdd 250 125 250 250 225 145 50 256\n\nformant 0 100 120 130\nformant 1 75 180 170\nformant 2 92 120 110\nformant 3 140 120 110\nformant 4 10 20 20 -50\nformant 5 110 70 20\nformant 6 140 100 98\nformant 7 130 120 115\nformant 8 105 120 108\nvoicing 38\nconsonants 90 140\ntone 420 150 1200 135 3000 70 4700 40\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Mario",
    "content": "language variant\nname Mario\n\npitch  75 125\n\nformant 0 100 111 95\nformant 1 100 111 60\nformant 2 95 90 55\nformant 3 100 50 65\nformant 4 69 65 65\nformant 5 79 60 75\nformant 6 89 60 75\nformant 7 99 0 100\nformant 8 109 0 100\nvoicing 135\nconsonants 115 120\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Michael",
    "content": "language variant\nname Michael\n\npitch  75 125\n\nformant 0 105 111 95\nformant 1 85 111 60\nformant 2 95 90 55\nformant 3 59 50 65\nformant 4 69 65 65\nformant 5 79 60 75\nformant 6 89 60 75\nformant 7 99 0 100\nformant 8 109 0 100\nvoicing 135\nconsonants 115 120\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Mike",
    "content": "language variant\nname Mike\nvoicing 70\nformant 1 96 97 100\nformant 2 96 97 100\nformant 5 95 103 100\npitch 67 107\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Mr serious",
    "content": "##Please note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.  \n## Language sets the language of your voice.  This setting is required for every voice that you make.\n##The next line is a setting you can change.  However if you don't know the language codes it may be best to leave the setting as it is.\nlanguage variant\n\n## The name setting is the name that will show up in the voice settings in the variant combo box.\n##The next line is a setting you can change\nname Mr_Serious\n\n##The formant settings\n##  Formant 0 is used to give a low frequency component to the sounds.\n## The three numbers are frequency, strength, and Width, in that order.  Please note, the numbers are seperated by a space.\n##The next line is a setting you can change\nformant 0 100 100 100\n\n# Formants 1,2, and 3 are the standard three formants which define vowels. \n##The next 3 lines are settings you can change\nformant 1 100 100 100\nformant 2 100 100 100\nformant 3 87 100 100\n\n# Formants 4,5 are higher than F3. They affect the quality of the voice. \n##The next 2 lines are settings that you can change.\nformant 4 100 100 100\nformant 5 100 100 100\n\n## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound. \n##The next 3 lines are settings that you can change.\nformant 6 100 100 100\nformant 7 100 100 100\nformant 8 100 100 100\n\n##Intonation affects the rise and fall of the voice\t\n## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.\n##The next line is a setting you can change.\nintonation 1\n\n# Setting the pitch range.  The first number gives a base pitch to the voice (value in Hertz).  The second number controls the range of pitches used by the voice. Setting it equal\n# to the first number will give a monotone sounding voice.  The default values are 82 and 118. \npitch 82 118\n## The tone setting.  The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice. \n## The second number on the tone line is the volume of the bass frequency.  You can set it from 0 to 255, 0 being the least amount, 255 being the most.\n##The third number on the tone line, 1200, is the mid range frequency.  The fourth number on the line is the setting to change the volume of the mid range frequency.\n##0 being the least amount and 255 being the maximum.\n## The fifth number on the tone line, 2000, is the treble frequency.  The sixth number is the volume of the treble frequency.  0 is the minimum and 255 is the maximum.\n##  You will notice that all 3 frequencies are set to 255.\n##The next line is a setting that you can change.\ntone 600 255 1200 255 2000 255\n##This file does not include all of the settings that can be used to modify an E Speak voice.  It is intended to get you familiar with what the settings do.\n##However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed.  I hope this helps, and Have fun.\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Nguyen",
    "content": "language variant\nname Nguyen\n\npitch 95 175\n\nformant 0 100 125 100\nformant 1 96 90 80\nformant 2 97 70 90\nformant 3 97 60 90\nformant 4 97 60 90\nformant 5  75 50 90\nformant 6  90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\n\ntone 100 200 600 150 800 100 2400 80 3600 95 5400 100\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Reed",
    "content": "language variant\nname Reed\nklatt 6\nconsonants 85 85\nvoicing 130\nbreath 45\n\npitch 85 135\n\nformant 1 72 100 90 90\nformant 2 83 100 75 180\nformant 3 98 100 100 90\nformant 4 98 100 90\nformant 5 100 100 90\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/RicishayMax",
    "content": "language variant\nname RicishayMax\necho 100 10000\n\nformant 0 90 120 100\nformant 1 100 100 75\nformant 2 100 100 75\nformant 3 100 80 75\nformant 4 100 80 75\nformant 5 100 80 75\nformant 6 100 0 75\nformant 7 100 0 75\nformant 8 100 0 75\n\n\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/RicishayMax2",
    "content": "language variant\nname RicishayMax2\necho 150 500\n\nformant 0 90 120 100\nformant 1 100 100 75\nformant 2 100 100 75\nformant 3 100 80 75\nformant 4 100 80 75\nformant 5 100 80 75\nformant 6 100 0 75\nformant 7 100 0 75\nformant 8 100 0 75\n\n\nroughness 5\n\nintonation 10\nvoicing 150\nconsonants 110 120\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\nstressAmp 16 16 24 24 16 16 20 24\n\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/RicishayMax3",
    "content": "language variant\nname RicishayMax3\necho 200 500\n\nformant 0 90 120 100\nformant 1 100 100 75\nformant 2 100 100 75\nformant 3 100 80 75\nformant 4 100 80 75\nformant 5 100 80 75\nformant 6 100 0 75\nformant 7 100 0 75\nformant 8 100 0 75\n\n\nroughness 5\n\nintonation 10\nvoicing 150\nconsonants 110 120\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\nstressAmp 16 16 24 24 16 16 20 24\n\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Storm",
    "content": "language variant\nlanguage en-us\nname Storm\ngender male\nformant 0 100 100 100\nformant 1 95 95 95\nformant 2 95 95 95\nformant 3 95 95 95\nformant 4 70 70 70\nformant 5 70 70 70\nformant 6 25 25 25\nformant 7 25 25 25\nformant 8 25 25 25\nbreath 0 0 0 0 0 0 0 0\nconsonants 100\necho 0 0\nflutter 0\nintonation 3\npitch 60 100\nroughness 0\nstressAdd 5 5 3 3 0 0 -15 -15\ntone 500 255 1500 255 2500 255\nvoicing 100\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/Tweaky",
    "content": "##Please note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.  \n## Language sets the language of your voice.  This setting is required for every voice that you make.\n##The next line is a setting you can change.  However if you don't know the language codes it may be best to leave the setting as it is.\nlanguage variant\n\n## The name setting is the name that will show up in the voice settings in the variant combo box.\n##The next line is a setting you can change\nname Tweaky\n\n##The formant settings\n##  Formant 0 is used to give a low frequency component to the sounds.\n## The three numbers are frequency, strength, and Width, in that order.  Please note, the numbers are seperated by a space.\n##The next line is a setting you can change\nformant 0 100 100 100\n\n# Formants 1,2, and 3 are the standard three formants which define vowels. \n##The next 3 lines are settings you can change\nformant 1 100 100 100\nformant 2 100 100 100\nformant 3 200 100 100\n\n# Formants 4,5 are higher than F3. They affect the quality of the voice. \n##The next 2 lines are settings that you can change.\nformant 4 100 100 100\nformant 5 100 100 100\n\n## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound. \n##The next 3 lines are settings that you can change.\nformant 6 100 100 100\nformant 7 100 100 100\nformant 8 100 100 100\n\n##Intonation affects the rise and fall of the voice\t\n## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.\n##The next line is a setting you can change.\nintonation 1\n\n# Setting the pitch range.  The first number gives a base pitch to the voice (value in Hertz).  The second number controls the range of pitches used by the voice. Setting it equal\n# to the first number will give a monotone sounding voice.  The default values are 82 and 118. \npitch 82 118\n## The tone setting.  The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.\n## The second number on the tone line is the volume of the bass frequency.  You can set it from 0 to 255, 0 being the least amount, 255 being the most.\n##The third number on the tone line, 1200, is the mid range frequency.  The fourth number on the line is the setting to change the volume of the mid range frequency.\n##0 being the least amount and 255 being the maximum.\n## The fifth number on the tone line, 2000, is the treble frequency.  The sixth number is the volume of the treble frequency.  0 is the minimum and 255 is the maximum.\n##  You will notice that all 3 frequencies are set to 255.\n##The next line is a setting that you can change.\ntone 600 255 1200 255 2000 255\n##This file does not include all of the settings that can be used to modify an E Speak voice.  It is intended to get you familiar with what the settings do.\n##However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed.  I hope this helps, and Have fun.\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/UniRobot",
    "content": "language variant\nname UniversalRobot\ngender male\nklatt 4\npitch  100 160\necho 10 10000\nformant 1 75 120 135\nformant 2 90 50 140\nformant 3 70 85 95\nformant 4 150 60 80\nformant 5 100 85 80\nformant 6 112 100 80\nformant 7 110 95 100\nformant 8 105 110 100\nconsonants 125 100\ntone 530 250 770 100 215 225\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 120 130 130 90 0 0 120 120\nstressAmp 16 16 24 24 16 16 20 24\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/adam",
    "content": "language variant\nname Adam\nklatt 6\nconsonants 85 85\n\nformant 1 100 100 130\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/anika",
    "content": "language variant\nname anika\ngender female\npitch 200 300\nflutter 6\nstressAmp 20 18  20 20  20 22  22 22\n\nroughness 0\n\nformant 0 105 200 140\nformant 1 95 150 120\nformant 2 100 120 140\nformant 3 95 95 140\nformant 4 120 120 110\nformant 5 120 120 110\nformant 6 110 60 65\nformant 7 100 0 100\nformant 8 100 0 100\nintonation 10\nvoicing 30\nconsonants 60 40\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\nstressAmp 16 16 24 24 16 16 20 24\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/anikaRobot",
    "content": "language variant\nname anikaRobot\ngender female\npitch 200 300\nflutter 1\nstressAmp 20 18  20 20  20 22  22 22\necho 10 10000\n\nroughness 0\n\nformant 0 105 200 140\nformant 1 95 150 120\nformant 2 100 120 140\nformant 3 95 95 140\nformant 4 120 120 110\nformant 5 120 120 110\nformant 6 110 60 65\nformant 7 100 0 100\nformant 8 100 0 100\nintonation 10\nvoicing 30\nconsonants 60 40\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\nstressAmp 16 16 24 24 16 16 20 24\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/announcer",
    "content": "name Half-LifeAnnouncementSystem\nlanguage variant\npitch 37 83\nklatt 4\n\nformant 1 88 100 100 0\nformant 2 96 100 100 0\nformant 3 98 100 100 0\nformant 4 96 100 100 0\nformant 5 100 100 100 0\nformant 6 100 100 100 0\nformant 7 100 100 100 0\nformant 8 100 100 100 0\n\nvoicing 70\nconsonants 70 70\necho 154 26\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/antonio",
    "content": "language variant \nname Antonio\ngender male\n\npitch 82 128\nroughness 0\n\nformant 0 100  150 90\nformant 1 90  130 90\nformant 2 95  120 80\nformant 3 100  50 80\nformant 4 100  40 80\nformant 5 90  70 80\nformant 6 0  0 0\nformant 7 100  100 100\nformant 8 100  100 100\nvoicing 150\ntone 600 255 1200 255 2000 80\nintonation 3\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/aunty",
    "content": "language variant\nname Auntie\ngender female\npitch 204 176\nflutter 12\n\nformant 0 88 85 154\nformant 1 115 80 160 -20\nformant 2 130 75 150 -200\nformant 3 123 75 150\nformant 4 125 80 150\nformant 5 125 80 150\nformant 6 110 80 150\nformant 7 110 75 150\nformant 8 110 75 150\n\nstressAdd -20 -20 -20 -20 0 0 20 120\nstressAmp 18 16 20 20 20 20 20 20\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/belinda",
    "content": "language variant\nname Belinda\ngender female\n\npitch 200 247  \nflutter 3\n\nformant 0 88 85 154\nformant 1 135 58 169 -30\nformant 2 120 70 150 -260\nformant 3 120 39 150\nformant 4 125 57 80\nformant 5 125 80 150\nformant 6 110 80 150\nformant 7 110 75 150\nformant 8 110 75 150\n\nstressAdd -20 -20 -20 -20 0 3 20 12\nstressAmp 18 16 20 20 10 20 27 20\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/benjamin",
    "content": "language variant\nname Benjamin\nklatt 6\nconsonants 70 70\n\nformant 1 101 100 130\nformant 2 102 100 100\nformant 3 100 100 100\nformant 4 100 100 100 470\nformant 5 100 100 100 350\nformant 6 100 100 100 100\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/boris",
    "content": "language variant\nname Boris\n\nformant 0 47 120 100\nformant 1 100 90 75\nformant 2 104 100 75\nformant 3 57 80 75\nformant 4 104 80 75\nformant 5 107 80 75\nformant 6 68 0 75\nformant 7 105 0 75\nformant 8 105 0 75\n\n\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/caleb",
    "content": "language variant\nname Caleb\nklatt 6\nbreath 100\nvoicing 0\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/croak",
    "content": "language variant\nname croak\ngender male 70\n\npitch 85 117\nflutter 20\n\nformant 0 100 80 110\n\n\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/david",
    "content": "language variant\nname David\nklatt 6\npitch 62 89\n\nformant 1 75 100 100\nformant 2 85 100 100\nformant 3 85 100 100\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/ed",
    "content": "language variant\nname Ed\n\npitch 90 145\n\nformant 0 110 120 200 5\nformant 1 102 100 80\nformant 2 101 120 100\nformant 3 100 80 75\nformant 4 150 30 80\nformant 5 95 95 155\nformant 6 167 100 75\nformant 7 100 200 75\nformant 8 60 200 95\nconsonants 55 80\nvoicing 100\ntone 650 250 1000 130 240 255"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/edward",
    "content": "language variant\nname Edward\nklatt 5\nvoicing 100\nconsonants 70 80\n\nformant 1 92 100 130\nformant 2 103 100 80\nformant 3 103 100 70\nformant 4 114 100 60\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/edward2",
    "content": "language variant\nname Edward2\nklatt 6\nvoicing 100\nconsonants 70 80\n\nformant 1 92 100 130\nformant 2 103 100 80\nformant 3 103 100 70\nformant 4 114 100 60\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/f1",
    "content": "language variant\nname female1\ngender female 70\n\npitch 140 200\nflutter 8\nroughness 4\nformant 0 115  80 150\nformant 1 120  80 180\nformant 2 100  70 150  150\nformant 3 115  70 150\nformant 4 110  80 150\nformant 5 110  90 150\nformant 6 105  80 150\nformant 7 110  70 150\nformant 8 110  70 150\n\nstressAdd -10 -10 -20 -20 0 0 40 60\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/f2",
    "content": "language variant\nname female2\ngender female\n\npitch 142 220\nroughness 3\n\nformant 0 105  80 150\nformant 1 110  80 160\nformant 2 110  70 150\nformant 3 110  70 150\nformant 4 115  80 150\nformant 5 115  80 150\nformant 6 110  70 150\nformant 7 110  70 150\nformant 8 110  70 150\n\nstressAdd 0 0 -10 -10 0 0 10 40\nbreath 0 2 3 3 3 3 3 2\necho 140 10\nconsonants 125 125\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/f3",
    "content": "language variant\nname female3\ngender female\n\npitch 140 240\nformant 0 105  80 150\nformant 1 120  75 150 -50\nformant 2 135  70 150 -250\nformant 3 125  80 150\nformant 4 125  80 150\nformant 5 125  80 150\nformant 6 120  70 150\nformant 7 110  70 150\nformant 8 110  70 150\n\nstressAmp 18 18 20 20 20 20 20 20\n//breath 0 2 4 4 4 4 4 4\nbreath 0 2 3 3 3 3 3 2\necho 120 10\nroughness 4\n\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/f4",
    "content": "language variant\nname female4\ngender female\n\necho 130 15\npitch 142 200\nformant 0 120  80 150\nformant 1 115  80 160 -20\nformant 2 130  75 150 -200\nformant 3 123  75 150\nformant 4 125  80 150\nformant 5 125  80 150\nformant 6 110  80 150\nformant 7 110  75 150\nformant 8 110  75 150\n\nstressAdd -20 -20 -20 -20 0 0 20 120\nstressAmp 18 16 20 20 20 20 20 20\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/f5",
    "content": "language variant \nname female5\ngender female \n\npitch 160 228\nroughness 0\n\nformant 0 105  80 150 \nformant 1 110  80 160 \nformant 2 110  70 150 \nformant 3 110  70 150 \nformant 4 115  80 200 \nformant 5 115  80 100 \nformant 6 110  70 150 \nformant 7 110  70 100 \nformant 8 110  70 150 \n\nstressAdd 0 0 -10 -10 0 0 10 40 \nbreath 0 4  6   6   6   6  0 10 \necho 140 10 \nvoicing 75 \nconsonants 150 150\nbreathw 150 150 200 200 400 400 600 600\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/fast",
    "content": "language variant\nname fast_test\n\n// Try decreasing these values to make eSpeak's fastest speed faster.\n// This is currently unstable.\n\nfast_test2 15\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/grandma",
    "content": "language variant\n\nname grandma\ngender female 90\npitch 120 230\n\nflutter 20\nformant 0 105 150 150\nformant 1 100 80 100\nformant 2 105 105 105\nformant 3 80 80 80\nformant 4 60 60 60\nformant 5 90 90 90\nformant 6 10 10 10\nformant 7 10 10 10\nformant 8 20 20 20\nvoicing 50"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/grandpa",
    "content": "language variant\nname grandpa\npitch 80 120\nflutter 20\nformant 0 100 100 100\nformant 1 100 100 100\nformant 2 100 100 100\nformant 3 100 100 100\nformant 4 100 100 100\nformant 5 100 100 100\nformant 6 10 10 10\nformant 7 10 10 10\nformant 8 10 10 10\nintonation 1\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/gustave",
    "content": "language variant\nname Gustave\n\npitch  80 123\n\nformant 0 85 141 135\nformant 1 77 131 45\nformant 2 92 70 55\nformant 3 59 50 65\nformant 4 69 65 65\nformant 5 79 60 75\nformant 6 89 60 75\nformant 7 99 0 100\nformant 8 109 0 100\nvoicing 135\nconsonants 115 120\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/ian",
    "content": "##Please note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.  \n## Language sets the language of your voice.  This setting is required for every voice that you make.\n##The next line is a setting you can change.  However if you don't know the language codes it may be best to leave the setting as it is.\nlanguage variant\n\n## The name setting is the name that will show up in the voice settings in the variant combo box.\n##The next line is a setting you can change\nname Ian\n\n##The formant settings\n##  Formant 0 is used to give a low frequency component to the sounds.\n## The three numbers are frequency, strength, and Width, in that order.  Please note, the numbers are seperated by a space.\n##The next line is a setting you can change\nformant 0 20 120 50\n\n# Formants 1,2, and 3 are the standard three formants which define vowels. \n##The next 3 lines are settings you can change\nformant 1 80 80 80\nformant 2 80 80 80\nformant 3 80 80 80\n\n# Formants 4,5 are higher than F3. They affect the quality of the voice. \n##The next 2 lines are settings that you can change.\nformant 4 50 50 50\nformant 5 50 50 50\n\n## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound. \n##The next 3 lines are settings that you can change.\nformant 6 100 100 100\nformant 7 200 50 200\nformant 8 200 50 200\n\n##Intonation affects the rise and fall of the voice\t\n## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.\n##The next line is a setting you can change.\nintonation 2\n\n# Setting the pitch range.  The first number gives a base pitch to the voice (value in Hertz).  The second number controls the range of pitches used by the voice.\n# Setting it equal to the first number will give a monotone sounding voice.  The default values are 82 and 118. \npitch 69 96\n\n## The tone setting.  The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.\n##The second number on the tone line is the volume of the bass frequency.  You can set it from 0 to 255, 0 being the least amount, 255 being the most.\n##The third number on the tone line, 1200, is the mid range frequency.  The fourth number on the line is the setting to change the volume of the mid range frequency.\n##0 being the least amount and 255 being the maximum.\n## The fifth number on the tone line, 2000, is the treble frequency.  The sixth number is the volume of the treble frequency.  0 is the minimum and 255 is the maximum.\n##  You will notice that all 3 frequencies are set to 255.\n##The next line is a setting that you can change.\ntone 1000 127 1200 127 2000 127\n##This file does not include all of the settings that can be used to modify an E Speak voice.  It is intended to get you familiar with what the settings do.\n##However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed.  I hope this helps, and Have fun.\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/iven",
    "content": "language variant\nname Iven\npitch  74 118\nformant 0 52 133 88\nformant 1 87 82 76\nformant 2 94 56 42\nformant 3 93 52 130\nformant 4 110 76 65\nformant 5  102 45 20\nformant 6  40 50 50\nformant 7 60 50 60\nformant 8 100 50 40\nvoicing 530\ntone 600 255 1200 255 2000 160"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/iven2",
    "content": "language variant\nname Iven2\npitch  74 118\nformant 0 52 133 88\nformant 1 87 82 76\nformant 2 94 56 42\nformant 3 93 52 130\nformant 4 110 76 65\nformant 5  102 45 20\nformant 6  40 50 50\nformant 7 60 50 60\nformant 8 100 50 40\nvoicing 220\nconsonants 28 42\ntone 600 255 1200 255 2000 150"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/iven3",
    "content": "language variant\nname Iven3\npitch  74 118\nformant 0 52 133 88\nformant 1 87 82 76\nformant 2 94 56 42\nformant 3 93 52 130\nformant 4 110 76 65\nformant 5  102 45 20\nformant 6  40 50 50\nformant 7 60 50 60\nformant 8 100 50 40\nvoicing 165\ntone 600 255 1200 255 2000 160"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/iven4",
    "content": "language variant\nname Iven4\npitch  74 118\nformant 0 52 133 88\nformant 1 87 82 76\nformant 2 94 56 42\nformant 3 93 52 130\nformant 4 110 76 65\nformant 5  102 45 20\nformant 6  40 50 50\nformant 7 60 50 60\nformant 8 100 50 40\nvoicing 165\ntone 600 170 1200 100 2000 40"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/john",
    "content": "##Please note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.  \n## Language sets the language of your voice.  This setting is required for every voice that you make.\n##The next line is a setting you can change.  However if you don't know the language codes it may be best to leave the setting as it is.\nlanguage variant\n\n## The name setting is the name that will show up in the voice settings in the variant combo box.\n##The next line is a setting you can change\nname John\n\n##The formant settings\n##  Formant 0 is used to give a low frequency component to the sounds.\n## The three numbers are frequency, strength, and Width, in that order.  Please note, the numbers are seperated by a space.\n##The next line is a setting you can change\nformant 0 100 100 100\n\n# Formants 1,2, and 3 are the standard three formants which define vowels. \n##The next 3 lines are settings you can change\nformant 1 100 100 100\nformant 2 100 100 100\nformant 3 100 100 100\n\n# Formants 4,5 are higher than F3. They affect the quality of the voice. \n##The next 2 lines are settings that you can change.\nformant 4 100 100 100\nformant 5 100 100 100\n\n## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound. \n##The next 3 lines are settings that you can change.\nformant 6 100 100 100\nformant 7 100 100 100\nformant 8 100 100 100\n\n##Intonation affects the rise and fall of the voice\t\n## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.\n##The next line is a setting you can change.\nintonation 1\n\n# Setting the pitch range.  The first number gives a base pitch to the voice (value in Hertz).  The second number controls the range of pitches used by the voice.\n# Setting it equal to the first number will give a monotone sounding voice.  The default values are 82 and 118. \npitch 82 118\n## The tone setting.  The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.\n##The second number on the tone line is the volume of the bass frequency.  You can set it from 0 to 255, 0 being the least amount, 255 being the most.\n##The third number on the tone line, 1200, is the mid range frequency.  The fourth number on the line is the setting to change the volume of the mid range frequency.\n##0 being the least amount and 255 being the maximum.\n## The fifth number on the tone line, 2000, is the treble frequency.  The sixth number is the volume of the treble frequency.  0 is the minimum and 255 is the maximum.\n##  You will notice that all 3 frequencies are set to 255.\n##The next line is a setting that you can change.\ntone 600 255 1200 255 2000 255\n##This file does not include all of the settings that can be used to modify an E Speak voice.  It is intended to get you familiar with what the settings do.\n##However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed.  I hope this helps, and Have fun.\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/kaukovalta",
    "content": "language variant \nname Kaukovalta\nformant 0 80    80 100   \nformant 1 40 80 100     \nformant 2 70 100  130      \nformant 3 80    100 60    \nformant 4 70 90 100 \nformant 5 70  90  100  \nformant 6 70  100  90 \n   formant 7 100   90 110   \nformant 8 100   95 100 \npitch 70 120 \ntone 100 130  800  130 2000  130 \nconsonants 70 70      \nroughness 4\n  "
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/klatt",
    "content": "language variant\nname klatt\nklatt 1\n \n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/klatt2",
    "content": "language variant\nname klatt2\nklatt 2\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/klatt3",
    "content": "language variant\nname klatt3\nklatt 3\n \n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/klatt4",
    "content": "language variant\nname klatt4\nklatt 4\n \n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/klatt5",
    "content": "language variant\nname klatt5\nklatt 5\n \n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/klatt6",
    "content": "language variant\nname klatt6\nklatt 6\n \n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/linda",
    "content": "language variant\nname Linda\ngender female\n\n#echo 130 15\npitch 200 247\nflutter 3\nformant 0 88 85 154\nformant 1 135 58 169 -30\nformant 2 131 75 152 -260\nformant 3 123 75 150\nformant 4 125 80 150\nformant 5 125 80 150\nformant 6 110 80 150\nformant 7 110 75 150\nformant 8 110 75 150\n\nstressAdd -20 -20 -20 -20 0 3 20 120\nstressAmp 18 16 20 20 20 20 27 20\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/m1",
    "content": "language variant\nname male1\ngender male 70\n\npitch 75 109\nflutter 5\nroughness 4\nconsonants 80 100\n\nformant 0  98 100 100\nformant 1  97 100 100\nformant 2  97  95 100\nformant 3  97  95 100\nformant 4  97  85 100\nformant 5 105  80 100\nformant 6  95  80 100\nformant 7 100 100 100\nformant 8 100 100 100\n\n//stressAdd -10 -10 -20 -20 0 0 40 70\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/m2",
    "content": "language variant\nname male2\ngender male\n\npitch 88 115\necho 130 15\nformant 0 100  80 120\nformant 1  90  85 120\nformant 2 110  85 120\nformant 3 105  90 120\nformant 4 100  90 120\nformant 5 100  90 120\nformant 6 100  90 120\nformant 7 100  90 120\nformant 8 100  90 120\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/m3",
    "content": "language variant\nname male3\ngender male\n\npitch 80 122\nformant 0 100 100 100\nformant 1  96  97 100\nformant 2  96  97 100\nformant 3  96 103 100\nformant 4  95 103 100\nformant 5  95 103 100\nformant 6 100 100 100\nformant 7 100 100 100\nformant 8 100 100 100\n\nconsonants 100\nstressAdd 10 10 0 0 0 0 -30 -30\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/m4",
    "content": "language variant\nname male4\ngender male\n\npitch 70 110\n\nformant 0 103 100 100\nformant 1 103 100 100\nformant 2 103 100 100\nformant 3 103 100 100\nformant 4 106 100 100\nformant 5 106 100 100\nformant 6 106 100 100\nformant 7 103 100 100\nformant 8 103 100 100\n\nstressAdd -10 -10 -30 -30 0 0 60 90\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/m5",
    "content": "language variant\nname male5\ngender male\n\nformant 0 100  85 130\nformant 1  90  85 130  40\nformant 2  80  85 130  310\nformant 3 105  85 130\nformant 4 105  85 130\nformant 5 105  85 130\nformant 6 105  85 150\nformant 7 105  85 150\nformant 8 105  85 150\n\nintonation 2\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/m6",
    "content": "language variant\nname male6\ngender male\n\npitch 82 117\n\nformant 0 100  90 120\nformant 1 100  90 140\nformant 2 100  70 140\nformant 3 100  75 140\nformant 4 100  80 140\nformant 5 100  80 140\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/m7",
    "content": "language variant\nname male7\ngender male\n\npitch  75 125\n\nformant 0 100 125 100\nformant 1 100 90 80\nformant 2 100 70 90\nformant 3 100 60 90\nformant 4 100 60 90\nformant 5  75 50 90\nformant 6  90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\nvoicing 155\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/m8",
    "content": "language variant\nname male8\ngender male 50\n\npitch 65 102\nformant 0 100 125 100\nformant 1 96 90 80\nformant 2 97 70 90\nformant 3 97 60 90\nformant 4 97 60 90\nformant 5  100 50 90\nformant 6  90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\n\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/marcelo",
    "content": "language variant\nname Marcelo\n\npitch  65 115\n\nformant 0 65 161 35\nformant 1 75 131 65\nformant 2 90 60 40\nformant 3 59 50 55\nformant 4 69 65 35\nformant 5 69 60 25\nformant 6 59 60 35\nformant 7 149 0 10\nformant 8 199 0 90\nvoicing 135\nconsonants 115 120\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/max",
    "content": "language variant\nname Max\n\nformant 0 90 120 100\nformant 1 100 100 75\nformant 2 100 100 75\nformant 3 100 80 75\nformant 4 100 80 75\nformant 5 100 80 75\nformant 6 100 0 75\nformant 7 100 0 75\nformant 8 100 0 75\n\n\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/michel",
    "content": "language variant\nname Michel\ngender male 25\npitch  82 122\necho 0 0\nflutter 0\nroughness 0\nstressAmp 20 18  20 20  20 22  22 22\n\n\nformant 0 105 200 140\nformant 1 95 150 120\nformant 2 100 120 140\nformant 3 95 95 140\nformant 4 30 30 30 -100\nformant 5 90 90 90\nformant 6 110 60 65\nformant 7 100 0 100\nformant 8 100 0 100\nvoicing 35\nconsonants 60 40\ntone 400 160 1500 100 3000 70 4500 40\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/miguel",
    "content": "language variant\nname Miguel\ngender male 25\npitch  80 130\necho 0 0\nflutter 0\nroughness 0\nstressAmp 20 18  20 20  20 22  22 22\n\n\nformant 0 105 200 140\nformant 1 95 150 120\nformant 2 100 120 140\nformant 3 95 95 140\nformant 4 30 30 30 -100\nformant 5 90 90 90\nformant 6 110 60 65\nformant 7 100 0 100\nformant 8 100 0 100\nvoicing 35\nconsonants 60 40\ntone 300 240 400 160 1500 100 3000 70\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/mike2",
    "content": "language variant\nname Mike2\nklatt 6\nvoicing 170\npitch 67 107\nformant 1 95 100 100\nformant 2 95 100 100\nformant 3 105 100 100\nformant 4 115 100 100\nformant 5 115 100 100\n\nconsonants 70 150\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/norbert",
    "content": "##Please note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.  \n## Language sets the language of your voice.  This setting is required for every voice that you make.\n##The next line is a setting you can change.  However if you don't know the language codes it may be best to leave the setting as it is.\nlanguage variant\n\n## The name setting is the name that will show up in the voice settings in the variant combo box.\n##The next line is a setting you can change\nname norbert\n\n##The formant settings\n##  Formant 0 is used to give a low frequency component to the sounds.\n## The three numbers are frequency, strength, and Width, in that order.  Please note, the numbers are seperated by a space.\n##The next line is a setting you can change\nformant 0 100 100 100\n\n# Formants 1,2, and 3 are the standard three formants which define vowels. \n##The next 3 lines are settings you can change\nformant 1 100 100 100\nformant 2 75  50 100\nformant 3 100 100 100\n\n# Formants 4,5 are higher than F3. They affect the quality of the voice. \n##The next 2 lines are settings that you can change.\nformant 4 100 100 100\nformant 5 100 100 100\n\n## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound. \n##The next 3 lines are settings that you can change.\nformant 6 100 100 100\nformant 7 100 100 100\nformant 8 100 100 100\n\n##Intonation affects the rise and fall of the voice\t\n## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.\n##The next line is a setting you can change.\nintonation 1\n\n# Setting the pitch range.  The first number gives a base pitch to the voice (value in Hertz).  The second number controls the range of pitches used by the voice. Setting it equal\n# to the first number will give a monotone sounding voice.  The default values are 82 and 118. \npitch 82 118\n## The tone setting.  The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.\n## The second number on the tone line is the volume of the bass frequency.  You can set it from 0 to 255, 0 being the least amount, 255 being the most.\n##The third number on the tone line, 1200, is the mid range frequency.  The fourth number on the line is the setting to change the volume of the mid range frequency.\n##0 being the least amount and 255 being the maximum.\n## The fifth number on the tone line, 2000, is the treble frequency.  The sixth number is the volume of the treble frequency.  0 is the minimum and 255 is the maximum.\n##  You will notice that all 3 frequencies are set to 255.\n##The next line is a setting that you can change.\ntone 600 255 1000 100 5000 255\n##This file does not include all of the settings that can be used to modify an E Speak voice.  It is intended to get you familiar with what the settings do.\n##However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed.  I hope this helps, and Have fun.\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/pablo",
    "content": "##Pleas note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.  \n## Language sets the language of your voice.  This setting is required for every voice that you make.\n##The next line is a setting you can change.  However if you don't know the language codes it may be best to leave the setting as it is.\nlanguage variant\n\n## The name setting is the name that will show up in the voice settings in the variant combo box.\n##The next line is a setting you can change\nname Pablo\n\n##The formant settings\n##  Formant 0 is used to give a low frequency component to the sounds.\n## The three numbers are frequency, strength, and Width, in that order.  Please note, the numbers are seperated by a space.\n##The next line is a setting you can change\nformant 0 90 100 90\n\n# Formants 1,2, and 3 are the standard three formants which define vowels. \n##The next 3 lines are settings you can change\nformant 1 95 100 80\nformant 2 97 100 80\nformant 3 98 90 80\n\n# Formants 4,5 are higher than F3. They affect the quality of the voice. \n##The next 2 lines are settings that you can change.\nformant 4 110 100 100\nformant 5 110 100 100\n\n## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound. \n##The next 3 lines are settings that you can change.\nformant 6 100 100 100\nformant 7 100 100 100\nformant 8 100 100 100\n\n##Intonation affects the rise and fall of the voice\t\n## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.\n##The next line is a setting you can change.\nintonation 3\necho 30 30\n# Setting the pitch range.  The first number gives a base pitch to the voice (value in Hertz).  The second number controls the range of pitches used by the voice. Setting it equal\n# to the first number will give a monotone sounding voice.  The default values are 82 and 118. \npitch 82 130\n## The tone setting.  The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.\n## The second number on the tone line is the volume of the bass frequency.  You can set it from 0 to 255, 0 being the least amount, 255 being the most.\n##The third number on the tone line, 1200, is the mid range frequency.  The fourth number on the line is the setting to change the volume of the mid range frequency.\n## 0 being the least amount and 255 being the maximum.\n## The fifth number on the tone line, 2000, is the treble frequency.  The sixth number is the volume of the treble frequency.  0 is the minimum and 255 is the maximum.\n##  You will notice that all 3 frequencies are set to 255.\n##The next line is a setting that you can change.\ntone 600 255 1200 200 2000 255\n\n##This file does not include all of the settings that can be used to modify an E Speak voice.  It is intended to get you familiar with what the settings do.  \n#However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed.  I hope this helps, and Have fun.\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/paul",
    "content": "language variant\nname Paul\n\npitch 70 100\n\nformant 0 90 120 100\nformant 1 103 100 75\nformant 2 98 100 75\nformant 3 100 80 75\nformant 4 102 30 100\nformant 5 100 80 100\nformant 6 100 80 75\nformant 7 100 0 75\nformant 8 100 60 75\nconsonants 90 60\nvoicing 230\ntone 420 255 1300 130 4000 100"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/pedro",
    "content": "language variant\n\nname Pedro\n\nformant 0 100 150 100\n\nformant 1 95 100 80\nformant 2 95 100 80\nformant 3 100 100 90\n\nformant 4 100 100 100\nformant 5 100 100 100\n\nformant 6 100 100 100\nformant 7 100 100 100\nformant 8 100 100 100\n\nintonation 3\n\npitch 82 118\ntone 600 255 1200 255 2000 255\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/quincy",
    "content": "language variant\nname Quincy\n\npitch  67 100\n\nformant 0 85 108 106 3\nformant 1 97 110 56\nformant 2 96 80 60\nformant 3 101 50 50\nformant 4 110 33 55\nformant 5 110 22 65\nformant 6 77 60 60 65\nformant 7 66 0 100\nformant 8 100 0 100\nvoicing 99\nconsonants 66 90\n\nroughness 0\ntone 600 170 1200 100 2000 70\nstressAmp 16 16 24 20 20 16 28 24 \n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/rob",
    "content": "language variant\nname Rob\n\npitch  50 130\nformant 0 100 100 100\nformant 1 95 100 60\nformant 2 97 90 50\nformant 3 101 70 50\nformant 4 110 65 55 \nformant 5 110 70 65\nformant 6 110 70 65\nformant 7 0 0 0\nformant 8 0 0 0\n\nvoicing 115\nconsonants 110 120\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/robert",
    "content": "language variant\nname Robert\n\npitch  65 115\n\nformant 0 85 108 100\nformant 1 95 110 60\nformant 2 97 90 50\nformant 3 101 50 50\nformant 4 110 65 55\nformant 5 110 60 65\nformant 6 110 60 65\nformant 7 100 0 100\nformant 8 100 0 100\nvoicing 115\nconsonants 110 120\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/robosoft",
    "content": "language variant\nname Robosoft\necho 30 1000\nklatt 5\n\npitch 60 90\nformant 0 100 125 100\nformant 1 96 90 80\nformant 2 97 70 90\nformant 3 97 60 90\nformant 4 97 60 90\nformant 5  100 50 90\nformant 6  90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\n\nroughness 50\n\nintonation 0\nvoicing 80\nconsonants 110 120\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\nstressAmp 16 16 24 24 16 16 20 24\n\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/robosoft2",
    "content": "language variant\nname Robosoft2\necho 10 600\nklatt 4\n\npitch 70 100\nformant 0 100 125 100\nformant 1 96 90 80\nformant 2 97 70 90\nformant 3 97 60 90\nformant 4 97 60 90\nformant 5  100 50 90\nformant 6  90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\n\nroughness 75\n\nintonation -25\nvoicing 80\nconsonants 110 120\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\nstressAmp 16 16 24 24 16 16 20 24\n\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/robosoft3",
    "content": "language variant\nname Robosoft3\necho 10 10000\nklatt 4\n\npitch 75 115\nformant 0 100 125 100\nformant 1 96 90 80\nformant 2 97 70 90\nformant 3 97 60 90\nformant 4 97 60 90\nformant 5  100 50 90\nformant 6  90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\n\nroughness 5\n\nintonation 10\nvoicing 150\nconsonants 110 120\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\nstressAmp 16 16 24 24 16 16 20 24\n\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/robosoft4",
    "content": "language variant\nname Robosoft4\necho 10 10000\n\npitch 75 115\nformant 0 100 125 100\nformant 1 96 90 80\nformant 2 97 70 90\nformant 3 97 60 90\nformant 4 97 60 90\nformant 5  100 50 90\nformant 6  90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\n\nroughness 5\n\nintonation 10\nvoicing 150\nconsonants 110 120\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\nstressAmp 16 16 24 24 16 16 20 24\n\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/robosoft5",
    "content": "language variant\nname Robosoft5\necho 10 10000\n\npitch 75 115\nformant 0 100 125 100\nformant 1 96 90 80\nformant 2 97 70 90\nformant 3 97 60 90\nformant 4 97 60 90\nformant 5  100 50 90\nformant 6  90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\n\nroughness 0\n\nintonation 10\nvoicing 150\nconsonants 60 40\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\nstressAmp 16 16 24 24 16 16 20 24\n\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/robosoft6",
    "content": "language variant\nname Robosoft6\necho 40 10000\npitch 150 150\nformant 0 100 125 100\nformant 1 96 90 80\nformant 2 97 70 90\nformant 3 97 60 90\nformant 4 97 60 90\nformant 5  100 50 90\nformant 6  90 50 100\nformant 7 100 50 100\nformant 8 100 50 100\n\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/robosoft7",
    "content": "language variant\nname Robosoft7\necho 10 10000\n\npitch 75 115\n\nformant 0 90 120 100\nformant 1 100 100 75\nformant 2 100 100 75\nformant 3 100 80 75\nformant 4 100 80 75\nformant 5 100 80 75\nformant 6 100 0 75\nformant 7 100 0 75\nformant 8 100 0 75\n\nroughness 0\n\nintonation 10\nvoicing 150\nconsonants 60 40\nstressLength 0 1 2 3 4 5 6 7\nstressAdd 130 140 140 100 0 0 130 160\n\ntone 100 255 600 70 1200 22 2000 66 3000 12\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/robosoft8",
    "content": "language variant\nname Robosoft8\necho 40 10000\npitch 150 150\nformant 0 90 120 100\nformant 1 100 100 75\nformant 2 100 100 75\nformant 3 100 80 75\nformant 4 100 80 75\nformant 5 100 80 75\nformant 6 100 0 75\nformant 7 100 0 75\nformant 8 100 0 75\n\n\n\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/sandro",
    "content": "// This file is UTF-8 encoded\n// Variant sandro (ver.25-3) for eSpeak-ng Copyright (C)2019 by Lolo vmanolo301@gmail.com\n\nlanguage variant\nname sandro\ngender male\n\nformant 0 95 146 100\nformant 1 98 90 100 \nformant 2 103 98 100\nformant 3 100 90 100\nformant 4 100 101 100\nformant 5 110 120 100 2123\nformant 6 100 100 100 1200\nformant 7 32 125 80 600\nformant 8 34 95 30 49\n\nvoicing 165\nconsonants 194 255\npitch 78 115\nroughness 3\nbreath 20 5 2 10 5 0 27 100\nbreathw 255 255 60 180 160 255 255 255\n\ntone 500 210 470 70 160 155 2985 32\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/shelby",
    "content": "language variant\nname shelby\nflutter 0\nroughness 0\n\nformant 0 100 160 190\nformant 1 90 90 90\nformant 2 140 140 140\nformant 3 130 150 130\nformant 4 110 110 110\nformant 5 120 120 110\nformant 6 10 10 10\nformant 7 10 10 10\nformant 8 10 10 10\n\npitch 100 210\nvoicing 40\nconsonants 90 70"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/steph",
    "content": "language variant\nname Steph\ngender female\n\npitch 166 200\nflutter 1\nroughness 0\ntone 100 255 600 70 1200 22 2000 66 3000 12\n\nformant 0 99  80 150\nformant 1 120 60 160\nformant 2 99 70 110 150\nformant 3 116 77 150\nformant 4 9 59 110\nformant 5 100 50 2\nformant 6 104 80 150\nformant 7 110 70 150\nformant 8 110 70 150\n\nstressAmp 16 16 24 24 16 16 20 24\nconsonants 55 90\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/steph2",
    "content": "language variant\nname Steph2\ngender female\n\npitch 166 200\nflutter 1\nroughness 0\ntone 100 255 600 70 1200 22 2000 66 3000 12\n\nformant 0 99  100 150\nformant 1 120 80 160\nformant 2 99 90 110 150\nformant 3 116 97 150\nformant 4 9 73 116\nformant 5 100 70 2\nformant 6 104 100 150\nformant 7 110 90 150\nformant 8 110 90 150\n\nstressAmp 16 16 24 24 16 16 20 24\nconsonants 55 90\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/steph3",
    "content": "language variant\nname Steph3\ngender female\n\npitch 166 200\nflutter 1\nroughness 0\nvoicing 200\ntone 100 255 600 70 1200 22 2000 66 3000 12\n\nformant 0 99  80 150\nformant 1 120 60 160\nformant 2 99 70 110 150\nformant 3 116 77 150\nformant 4 9 59 110\nformant 5 100 50 2\nformant 6 104 80 150\nformant 7 110 70 150\nformant 8 110 70 150\n\nstressAmp 16 16 24 24 16 16 20 24\nconsonants 70 90\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/travis",
    "content": "language variant\nname travis\ngender male 30\n\npitch 75 120\n\nformant 0 90 90 90 90 \nformant 1 50 100 80 95\nformant 2 90 60 90 100\nformant 3 80 80 90 100\nformant 4 50 90 100 100\nformant 5 100 95 100 55\nformant 6 80 50 100 85\nformant 7 60 60 60 120\nformant 8 80 80 140 100\n\ntone 600 100 1000 200 1500 50 \nflutter 1 \n\nroughness 3 \n\nvoicing 200 \nconsonants 120 190 \n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/victor",
    "content": "language variant\nname victor\ngender male 25\n\nformant 0 100 100 100\nformant 1 95 95 95\nformant 2 90 90 90\nformant 3 90 90 90\nformant 4 40 40 40\nformant 5 80 80 80\nformant 6 20 20 20\nformant 7 20 20 20\nformant 8 20 20 20\npitch 80 110\nvoicing 60\nbreath 2 4"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/whisper",
    "content": "language variant\nname whisper\ngender male\n\npitch 82 117\nflutter 20\n\nformant 0 100  0 100\nformant 1 100 80 100\n\nvoicing 17\nbreath   75  75  50  40  15  10\nbreathw 150 150 200 200 400 400\n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/whisperf",
    "content": "language variant\nname female_whisper\ngender female\n\npitch 160 220\nroughness 3\n\nformant 0 105   0 150\nformant 1 110  40 160\nformant 2 110  70 150\nformant 3 110  70 150\nformant 4 115  80 150\nformant 5 115  80 150\nformant 6 110  70 150\nformant 7 110  70 150\nformant 8 110  70 150\n\nstressAdd 0 0 -10 -10 0 0 10 40\n\n// whisper\nvoicing 20\nbreath 75 75 50 40 15 10\nbreathw 150 150 200 200 400 400\n \n"
  },
  {
    "path": "app/src/main/assets/espeak-ng-data/voices/!v/zac",
    "content": "language variant\nname Zac\nflutter 5\n\npitch 240 390\nformant 0 145 100 145\nformant 1 145 100 145\nformant 2 145 100 145\nformant 3 145 100 145\nformant 4 145 100 145\nformant 5 145 120 145\nformant 6 145 120 145\nformant 7 145 120 145\nformant 8 145 120 145\nvoicing 80\n"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/CheckVoiceData.kt",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.speech.tts.TextToSpeech\nimport androidx.appcompat.app.AppCompatActivity\n\nclass CheckVoiceData : AppCompatActivity() {\n    lateinit var mContext: Context\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        mContext = this\n        val intent = Intent().apply {\n            putStringArrayListExtra(\n                TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,\n                TtsEngine.getAvailableLanguages(mContext)\n            )\n            putStringArrayListExtra(TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES, arrayListOf())\n        }\n        setResult(TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, intent)\n        finish()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/Downloader.java",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine;\n\nimport android.app.Activity;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.Toast;\n\nimport java.io.BufferedInputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URL;\nimport java.net.URLConnection;\n\nimport com.k2fsa.sherpa.onnx.tts.engine.databinding.ActivityManageLanguagesBinding;\n\n\n@SuppressWarnings(\"ResultOfMethodCallIgnored\")\npublic class Downloader {\n    static final String onnxModel = \"model.onnx\";\n    static final String tokens = \"tokens.txt\";\n    static long onnxModelDownloadSize = 0L;\n    static long tokensDownloadSize = 0L;\n    static boolean onnxModelFinished = false;\n    static boolean tokensFinished = false;\n    static int onnxModelSize = 0;\n    static int tokensSize = 0;\n\n    public static void downloadModels(final Activity activity, ActivityManageLanguagesBinding binding, String model, String lang, String country, String type) {\n        String modelName=\"\";\n        if (type.equals(\"vits-piper\")) modelName = model + \".onnx\";\n        else if (type.equals(\"vits-coqui\")) modelName = \"model.onnx\";\n\n        String onnxModelUrl = \"https://huggingface.co/csukuangfj/\"+ type + \"-\" + model + \"/resolve/main/\" + modelName;\n        String tokensUrl = \"https://huggingface.co/csukuangfj/\" + type + \"-\" + model + \"/resolve/main/tokens.txt\";\n\n        File directory = new File(activity.getExternalFilesDir(null)+ \"/\" + lang + country + \"/\");\n        if (!directory.exists() && !directory.mkdirs()) {\n            Log.e(\"TTS Engine\", \"Failed to make directory: \" + directory);\n            return;\n        }\n\n        activity.runOnUiThread(() -> binding.downloadSize.setVisibility(View.VISIBLE));\n\n        File onnxModelFile = new File(activity.getExternalFilesDir(null)+ \"/\" + lang + country + \"/\" + onnxModel);\n        if (onnxModelFile.exists()) onnxModelFile.delete();\n        if (!onnxModelFile.exists()) {\n            onnxModelFinished = false;\n            Log.d(\"TTS Engine\", \"onnx model file does not exist\");\n            Thread thread = new Thread(() -> {\n                try {\n                    URL url;\n\n                    url = new URL(onnxModelUrl);\n\n                    Log.d(\"TTS Engine\", \"Download model\");\n\n                    URLConnection ucon = url.openConnection();\n                    ucon.setReadTimeout(5000);\n                    ucon.setConnectTimeout(10000);\n                    onnxModelSize = ucon.getContentLength();\n\n                    InputStream is = ucon.getInputStream();\n                    BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);\n\n                    File tempOnnxFile = new File(activity.getExternalFilesDir(null)+ \"/\" + lang + country + \"/\" + \"model.tmp\");\n                    if (tempOnnxFile.exists()) tempOnnxFile.delete();\n\n                    FileOutputStream outStream = new FileOutputStream(tempOnnxFile);\n                    byte[] buff = new byte[5 * 1024];\n\n                    int len;\n                    while ((len = inStream.read(buff)) != -1) {\n                        outStream.write(buff, 0, len);\n                        if (tempOnnxFile.exists()) onnxModelDownloadSize = tempOnnxFile.length();\n                        activity.runOnUiThread(() -> {\n                            binding.downloadSize.setText((tokensDownloadSize + onnxModelDownloadSize)/1024/1024 + \" MB / \" + (onnxModelSize + tokensSize)/1024/1024 + \" MB\");\n                        });\n                    }\n                    outStream.flush();\n                    outStream.close();\n                    inStream.close();\n\n                    if (!tempOnnxFile.exists()) {\n                        throw new IOException();\n                    }\n\n                    tempOnnxFile.renameTo(onnxModelFile);\n                    onnxModelFinished = true;\n                    activity.runOnUiThread(() -> {\n                        if (tokensFinished && onnxModelFinished && binding.buttonStart.getVisibility()==View.GONE){\n                            binding.buttonStart.setVisibility(View.VISIBLE);\n                            PreferenceHelper preferenceHelper = new PreferenceHelper(activity);\n                            preferenceHelper.setCurrentLanguage(lang);\n                            LangDB langDB = LangDB.getInstance(activity);\n                            langDB.addLanguage(model, lang, country, 0, 1.0f, 1.0f, type);\n                        }\n                    });\n                } catch (IOException i) {\n                    activity.runOnUiThread(() -> Toast.makeText(activity, activity.getResources().getString(R.string.error_download), Toast.LENGTH_SHORT).show());\n                    onnxModelFile.delete();\n                    Log.w(\"TTS Engine\", activity.getResources().getString(R.string.error_download), i);\n                }\n            });\n            thread.start();\n        }\n\n        File tokensFile = new File(activity.getExternalFilesDir(null) + \"/\" + lang + country + \"/\" + tokens);\n        if (tokensFile.exists()) tokensFile.delete();\n        if (!tokensFile.exists()) {\n            tokensFinished = false;\n            Log.d(\"TTS Engine\", \"tokens file does not exist\");\n            Thread thread = new Thread(() -> {\n                try {\n                    URL url = new URL(tokensUrl);\n                    Log.d(\"TTS Engine\", \"Download tokens file\");\n\n                    URLConnection ucon = url.openConnection();\n                    ucon.setReadTimeout(5000);\n                    ucon.setConnectTimeout(10000);\n                    tokensSize = ucon.getContentLength();\n\n                    InputStream is = ucon.getInputStream();\n                    BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);\n\n                    File tempTokensFile = new File(activity.getExternalFilesDir(null)+ \"/\" + lang + country + \"/\" + \"tokens.tmp\");\n                    if (tempTokensFile.exists()) tempTokensFile.delete();\n\n                    FileOutputStream outStream = new FileOutputStream(tempTokensFile);\n                    byte[] buff = new byte[5 * 1024];\n\n                    int len;\n                    while ((len = inStream.read(buff)) != -1) {\n                        outStream.write(buff, 0, len);\n                        if (tempTokensFile.exists()) tokensDownloadSize = tempTokensFile.length();\n                        activity.runOnUiThread(() -> {\n                            binding.downloadSize.setText((tokensDownloadSize + onnxModelDownloadSize)/1024/1024 + \" MB / \" + (onnxModelSize + tokensSize)/1024/1024 + \" MB\");\n                        });\n                    }\n                    outStream.flush();\n                    outStream.close();\n                    inStream.close();\n\n                    if (!tempTokensFile.exists()) {\n                        throw new IOException();\n                    }\n\n                    tempTokensFile.renameTo(tokensFile);\n                    tokensFinished = true;\n                    activity.runOnUiThread(() -> {\n                        if (tokensFinished && onnxModelFinished && binding.buttonStart.getVisibility()==View.GONE){\n                            binding.buttonStart.setVisibility(View.VISIBLE);\n                            PreferenceHelper preferenceHelper = new PreferenceHelper(activity);\n                            preferenceHelper.setCurrentLanguage(lang);\n                            LangDB langDB = LangDB.getInstance(activity);\n                            langDB.addLanguage(model, lang, country, 0, 1.0f, 1.0f, type);\n                        }\n                    });\n\n                } catch (IOException i) {\n                    activity.runOnUiThread(() -> Toast.makeText(activity, activity.getResources().getString(R.string.error_download), Toast.LENGTH_SHORT).show());\n                    tokensFile.delete();\n                    Log.w(\"TTS Engine\", activity.getResources().getString(R.string.error_download), i);\n                }\n            });\n            thread.start();\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/GetSampleText.kt",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport android.speech.tts.TextToSpeech\n\nfun getSampleText(lang: String): String {\n    var text = \"\"\n    when (lang) {\n        \"ara\" -> {\n            text = \"هذا هو محرك تحويل النص إلى كلام باستخدام الجيل القادم من كالدي\"\n        }\n\n        \"ben\" -> {\n            text = \"এটি একটি টেক্সট-টু-স্পীচ ইঞ্জিন যা পরবর্তী প্রজন্মের কালডি ব্যবহার করে\"\n        }\n\n        \"bul\" -> {\n            text =\n                \"Това е машина за преобразуване на текст в реч, използваща Kaldi от следващо поколение\"\n        }\n\n        \"cat\" -> {\n            text = \"Aquest és un motor de text a veu que utilitza Kaldi de nova generació\"\n        }\n\n        \"cym\" -> {\n            text = \"Peiriant testun-i-lais yw hwn sy'n defnyddio Kaldi'r genhedlaeth nesaf\"\n        }\n\n        \"ces\" -> {\n            text = \"Toto je převodník textu na řeč využívající novou generaci kaldi\"\n        }\n\n        \"dan\" -> {\n            text = \"Dette er en tekst til tale-motor, der bruger næste generation af kaldi\"\n        }\n\n        \"deu\" -> {\n            text =\n                \"Dies ist eine Sprachausgabe, die Kaldi der nächsten Generation verwendet\"\n        }\n\n        \"ell\" -> {\n            text = \"Αυτή είναι μια μηχανή κειμένου σε ομιλία που χρησιμοποιεί kaldi επόμενης γενιάς\"\n        }\n\n        \"eng\" -> {\n            text = \"This is a text-to-speech engine using next generation Kaldi\"\n        }\n\n        \"est\" -> {\n            text = \"See on teksti kõneks muutmise mootor, mis kasutab järgmise põlvkonna Kaldi\"\n        }\n\n        \"fin\" -> {\n            text = \"Tämä on tekstistä puheeksi -moottori, joka käyttää seuraavan sukupolven kaldia\"\n        }\n\n        \"fra\" -> {\n            text = \"Il s'agit d'un moteur de synthèse vocale utilisant Kaldi de nouvelle génération\"\n        }\n\n        \"gle\" -> {\n            text = \"Is inneall téacs-go-hurlabhra é seo a úsáideann Kaldi den chéad ghlúin eile\"\n        }\n\n        \"hrv\" -> {\n            text =\n                \"Ovo je mehanizam za pretvaranje teksta u govor koji koristi Kaldi sljedeće generacije\"\n        }\n\n        \"hin\" -> {\n            text = \"यह एक अगली पीढ़ी के काल्डी एप्लिकेशन है, जो लिखित शब्दों और वाक्यांशों को बोली मे परिवर्तित करता है\"\n        }\n\n        \"hun\" -> {\n            text = \"Ez egy szövegfelolvasó motor a következő generációs kaldi használatával\"\n        }\n\n        \"isl\" -> {\n            text = \"Þetta er texta í tal vél sem notar næstu kynslóð kaldi\"\n        }\n\n        \"ita\" -> {\n            text = \"Questo è un motore di sintesi vocale che utilizza kaldi di nuova generazione\"\n        }\n\n        \"kat\" -> {\n            text = \"ეს არის ტექსტიდან მეტყველების ძრავა შემდეგი თაობის კალდის გამოყენებით\"\n        }\n\n        \"kaz\" -> {\n            text = \"Бұл келесі буын kaldi көмегімен мәтіннен сөйлеуге арналған қозғалтқыш\"\n        }\n\n        \"mlt\" -> {\n            text = \"Din hija magna text-to-speech li tuża Kaldi tal-ġenerazzjoni li jmiss\"\n        }\n\n        \"lav\" -> {\n            text = \"Šis ir teksta pārvēršanas runā dzinējs, kas izmanto nākamās paaudzes Kaldi\"\n        }\n\n        \"lit\" -> {\n            text = \"Tai teksto į kalbą variklis, kuriame naudojamas naujos kartos Kaldi\"\n        }\n\n        \"ltz\" -> {\n            text = \"Dëst ass en Text-zu-Speech-Motor mat der nächster Generatioun Kaldi\"\n        }\n\n        \"nep\" -> {\n            text = \"यो अर्को पुस्ता काल्डी प्रयोग गरेर स्पीच इन्जिनको पाठ हो\"\n        }\n\n        \"nld\" -> {\n            text =\n                \"Dit is een tekst-naar-spraak-engine die gebruik maakt van Kaldi van de volgende generatie\"\n        }\n\n        \"nor\" -> {\n            text = \"Dette er en tekst til tale-motor som bruker neste generasjons kaldi\"\n        }\n\n        \"pol\" -> {\n            text = \"Jest to silnik syntezatora mowy wykorzystujący Kaldi nowej generacji\"\n        }\n\n        \"por\" -> {\n            text =\n                \"Este é um mecanismo de conversão de texto em fala usando Kaldi de próxima geração\"\n        }\n\n        \"ron\" -> {\n            text = \"Acesta este un motor text to speech care folosește generația următoare de kadi\"\n        }\n\n        \"rus\" -> {\n            text =\n                \"Это движок преобразования текста в речь, использующий Kaldi следующего поколения.\"\n        }\n\n        \"slk\" -> {\n            text = \"Toto je nástroj na prevod textu na reč využívajúci kaldi novej generácie\"\n        }\n\n        \"slv\" -> {\n            text =\n                \"To je mehanizem za pretvorbo besedila v govor, ki uporablja Kaldi naslednje generacije\"\n        }\n\n        \"spa\" -> {\n            text = \"Este es un motor de texto a voz que utiliza kaldi de próxima generación.\"\n        }\n\n        \"srp\" -> {\n            text =\n                \"Ово је механизам за претварање текста у говор који користи калди следеће генерације\"\n        }\n\n        \"swa\" -> {\n            text = \"Haya ni maandishi kwa injini ya hotuba kwa kutumia kizazi kijacho kaldi\"\n        }\n\n        \"swe\" -> {\n            text = \"Detta är en text till tal-motor som använder nästa generations kaldi\"\n        }\n\n        \"tur\" -> {\n            text = \"Bu, yeni nesil kaldi'yi kullanan bir metinden konuşmaya motorudur\"\n        }\n\n        \"ukr\" -> {\n            text =\n                \"Це механізм перетворення тексту на мовлення, який використовує kaldi нового покоління\"\n        }\n\n        \"vie\" -> {\n            text = \"Đây là công cụ chuyển văn bản thành giọng nói sử dụng kaldi thế hệ tiếp theo\"\n        }\n\n        \"zho\", \"cmn\" -> {\n            text = \"使用新一代卡尔迪的语音合成引擎\"\n        }\n    }\n    return text\n}\n\nclass GetSampleText : Activity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        var result = TextToSpeech.LANG_AVAILABLE\n        val text: String = getSampleText(TtsEngine.lang ?: \"\")\n        if (text.isEmpty()) {\n            result = TextToSpeech.LANG_NOT_SUPPORTED\n        }\n\n        val intent = Intent().apply {\n            if (result == TextToSpeech.LANG_AVAILABLE) {\n                putExtra(TextToSpeech.Engine.EXTRA_SAMPLE_TEXT, text)\n            } else {\n                putExtra(\"sampleText\", text)\n            }\n        }\n\n        setResult(result, intent)\n        finish()\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/GithubStar.java",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine;\n\nimport android.app.AlertDialog;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.net.Uri;\nimport androidx.preference.PreferenceManager;\n\npublic class GithubStar {\n    public static void setAskForStar(boolean askForStar, Context context) {\n        SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(context);\n        SharedPreferences.Editor editor = prefManager.edit();\n        editor.putBoolean(\"askForStar\", askForStar);\n        editor.apply();\n    }\n\n    public static boolean shouldShowStarDialog(Context context) {\n        SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(context);\n        int versionCode = prefManager.getInt(\"versionCode\", 0);\n        boolean askForStar = prefManager.getBoolean(\"askForStar\", true);\n\n        if (prefManager.contains(\"versionCode\") && BuildConfig.VERSION_CODE > versionCode && askForStar) { //not at first start, only after upgrade and only if use has not yet given a star or has declined\n            SharedPreferences.Editor editor = prefManager.edit();\n            editor.putInt(\"versionCode\", BuildConfig.VERSION_CODE);\n            editor.apply();\n            return true;\n        } else {\n            SharedPreferences.Editor editor = prefManager.edit();\n            editor.putInt(\"versionCode\", BuildConfig.VERSION_CODE);\n            editor.apply();\n            return false;\n        }\n    }\n\n    public static void starDialog(Context context, String url) {\n        SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(context);\n        if (prefManager.getBoolean(\"askForStar\", true)) {\n            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);\n            alertDialogBuilder.setMessage(R.string.dialog_StarOnGitHub);\n            alertDialogBuilder.setPositiveButton(context.getString(android.R.string.ok), new DialogInterface.OnClickListener() {\n                @Override\n                public void onClick(DialogInterface dialog, int which) {\n                    context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));\n                    setAskForStar(false, context);\n                }\n            });\n            alertDialogBuilder.setNegativeButton(context.getString(android.R.string.no), new DialogInterface.OnClickListener() {\n                @Override\n                public void onClick(DialogInterface dialog, int which) {\n                    setAskForStar(false, context);\n                }\n            });\n            alertDialogBuilder.setNeutralButton(context.getString(R.string.dialog_Later_button), null);\n\n            AlertDialog alertDialog = alertDialogBuilder.create();\n            alertDialog.show();\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/InstallVoiceData.kt",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine\n\nimport android.app.Activity\nimport android.os.Bundle\nimport android.view.Window\n\nclass InstallVoiceData : Activity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        requestWindowFeature(Window.FEATURE_NO_TITLE)\n        super.onCreate(savedInstanceState)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/LangDB.java",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine;\n\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteOpenHelper;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class LangDB extends SQLiteOpenHelper {\n\n    // Database name and table columns\n    private static final String DB_NAME = \"Languages.db\";\n    private static final int DATABASE_VERSION = 2;\n    public static final String TABLE_NAME = \"Languages\";\n    private static final String COLUMN_ID = \"ID\";\n    private static final String COLUMN_NAME = \"ModelName\";\n    private static final String COLUMN_LANG = \"Language\";\n    private static final String COLUMN_COUNTRY = \"Country\";\n    private static final String COLUMN_SID = \"SpeakerID\";\n    private static final String COLUMN_SPEED = \"Speed\";\n    private static final String COLUMN_TYPE = \"ModelType\";\n    private static final String COLUMN_VOLUME = \"Volume\";\n    private static LangDB instance = null;\n    private final Context mContext;\n\n    public LangDB(Context context) {\n        super(context, DB_NAME, null, DATABASE_VERSION);\n        mContext = context.getApplicationContext();  //mContext = context creates memory leak\n    }\n    \n    @Override\n    public void onCreate(SQLiteDatabase db) {\n        // Create the table for bird observations with all columns and their data types.\n        String CREATE_TABLE = \"CREATE TABLE IF NOT EXISTS \"+TABLE_NAME+\" (\" +\n                COLUMN_ID + \" INTEGER PRIMARY KEY AUTOINCREMENT,\" +\n                COLUMN_NAME + \" TEXT,\" +\n                COLUMN_LANG + \" TEXT,\" +\n                COLUMN_COUNTRY + \" TEXT,\" +\n                COLUMN_SID + \" INTEGER,\" +\n                COLUMN_SPEED + \" FLOAT,\" +\n                COLUMN_TYPE + \" TEXT,\" +\n                COLUMN_VOLUME + \" FLOAT);\";\n        db.execSQL(CREATE_TABLE);\n    }\n    \n    @Override\n    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n        PreferenceHelper preferenceHelper = new PreferenceHelper(mContext);\n        switch(oldVersion) {\n            case 1:\n                db.execSQL(\"ALTER TABLE \"+TABLE_NAME+\" ADD COLUMN \"+ COLUMN_VOLUME +\" REAL DEFAULT \" + preferenceHelper.getVolume());\n                // we want both updates, so no break statement here...\n        }\n    }\n    \n    public synchronized void addLanguage(String name, String lang, String country, int sid, float speed, float volume, String type) {\n        // Insert a new row into the table with all columns and their values from parameters.\n        SQLiteDatabase db = getWritableDatabase();\n        ContentValues cv = new ContentValues();\n        cv.put(COLUMN_NAME, name);\n        cv.put(COLUMN_LANG, lang);\n        cv.put(COLUMN_COUNTRY, country);\n        cv.put(COLUMN_SID, sid);\n        cv.put(COLUMN_SPEED, speed);\n        cv.put(COLUMN_TYPE, type);\n        cv.put(COLUMN_VOLUME, volume);\n        \n        db.insert(TABLE_NAME, null, cv); // Insert the row into the table with all columns and their values from parameters.\n    }\n    \n    public synchronized void clearAllEntries() {\n        SQLiteDatabase db = getWritableDatabase();\n        String CLEAR_TABLE = \"DELETE FROM \"+ TABLE_NAME;\n        \n        db.execSQL(CLEAR_TABLE); // Delete all rows in the table, effectively clearing it out.\n    }\n    \n    public synchronized List<Language> getAllInstalledLanguages() {\n        SQLiteDatabase db = this.getReadableDatabase();\n        String SELECT_ALL = \"SELECT * FROM \"+ TABLE_NAME;\n        Cursor cursor = db.rawQuery(SELECT_ALL, null); // Execute the query to select all rows from the table and store them in a cursor object for further processing.\n\n        List<Language> languages = new ArrayList<>();\n        if (cursor.moveToFirst()) {\n            do {\n                Language language = new Language();\n                language.setId(cursor.getInt(0));\n                language.setName(cursor.getString(1));\n                language.setLang(cursor.getString(2));\n                language.setCountry(cursor.getString(3));\n                language.setSid(cursor.getInt(4));\n                language.setSpeed(cursor.getFloat(5));\n                language.setType(cursor.getString(6));\n                language.setVolume(cursor.getFloat(7));\n                languages.add(language);\n\n            } while (cursor.moveToNext());\n        }\n        cursor.close();\n        return languages;\n    }\n\n    public synchronized void updateLang(String lang, int sid, float speed, float volume) {\n        SQLiteDatabase database = this.getWritableDatabase();\n\n        ContentValues values = new ContentValues();\n        values.put(COLUMN_SID, sid);\n        values.put(COLUMN_SPEED, speed);\n        values.put(COLUMN_VOLUME, volume);\n        database.update(TABLE_NAME, values, COLUMN_LANG + \" = ?\", new String[]{lang});\n        database.close();\n    }\n\n    public static LangDB getInstance(Context context) {\n        if (instance == null && context != null) {\n            instance = new LangDB(context.getApplicationContext());\n        }\n        return instance;\n    }\n\n    public void removeLang(String language) {\n        SQLiteDatabase db = this.getWritableDatabase();\n        db.delete(TABLE_NAME, COLUMN_LANG + \" = ?\",\n                new String[]{language});\n        db.close();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/Language.java",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine;\n\npublic class Language {\n    private int id;\n    private String name;\n    private String lang;\n    private String country;\n    private int sid;\n    private float speed;\n    private float volume;\n    private String type;\n\n    public Language() {}\n\n    public int getId() {\n        return id;\n    }\n\n    public void setId(int id) {\n        this.id = id;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public void setLang(String lang) {this.lang = lang;}\n\n    public String getLang() {return lang;}\n\n    public void setCountry(String country) {this.country = country;}\n\n    public String getCountry() {return country;}\n\n    public void setSid(int sid) {this.sid = sid;}\n\n    public int getSid() {return sid;}\n\n    public void setSpeed(float speed) {this.speed = speed;}\n\n    public float getSpeed() {return speed;}\n\n    public void setType(String type) {this.type = type;}\n\n    public String getType() {return type;}\n\n    public void setVolume(float volume) {this.volume = volume;}\n\n    public float getVolume() {return this.volume;}\n}"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/MainActivity.kt",
    "content": "@file:OptIn(ExperimentalMaterial3Api::class)\n\npackage com.k2fsa.sherpa.onnx.tts.engine\n\nimport android.content.Intent\nimport android.media.AudioAttributes\nimport android.media.AudioFormat\nimport android.media.AudioManager\nimport android.media.AudioTrack\nimport android.net.Uri\nimport android.os.Bundle\nimport android.util.Log\nimport android.widget.Toast\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.wrapContentHeight\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowDropDown\nimport androidx.compose.material.icons.filled.Info\nimport androidx.compose.material.icons.filled.Settings\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.ButtonDefaults\nimport androidx.compose.material3.Checkbox\nimport androidx.compose.material3.CheckboxDefaults\nimport androidx.compose.material3.DropdownMenuItem\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.ExposedDropdownMenuBox\nimport androidx.compose.material3.FloatingActionButton\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.IconButtonDefaults\nimport androidx.compose.material3.OutlinedTextField\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Slider\nimport androidx.compose.material3.SliderDefaults\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.focus.onFocusChanged\nimport androidx.compose.ui.platform.LocalSoftwareKeyboardController\nimport androidx.compose.ui.res.colorResource\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.Channel\nimport kotlinx.coroutines.launch\nimport org.woheller69.freeDroidWarn.FreeDroidWarn\nimport java.io.File\n\nconst val TAG = \"sherpa-onnx-tts-engine\"\n\nclass MainActivity : ComponentActivity() {\n\n    private lateinit var track: AudioTrack\n\n    private var stopped: Boolean = false\n\n    private var samplesChannel = Channel<FloatArray>()\n    private lateinit var preferenceHelper: PreferenceHelper\n    private lateinit var langDB: LangDB\n\n    override fun onPause() {\n        super.onPause()\n        samplesChannel.close()\n    }\n\n    override fun onResume() {\n        //Reset speed in case it has been changed by TtsService\n        val db = LangDB.getInstance(this)\n        val allLanguages = db.allInstalledLanguages\n        val currentLanguage = allLanguages.first { it.lang == TtsEngine.lang }\n        TtsEngine.speed.value = currentLanguage.speed\n        super.onResume()\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        preferenceHelper = PreferenceHelper(this)\n        langDB = LangDB.getInstance(this)\n        Migrate.renameModelFolder(this)   //Rename model folder if \"old\" structure\n        if (!preferenceHelper.getCurrentLanguage().equals(\"\")) {\n            TtsEngine.createTts(this, preferenceHelper.getCurrentLanguage()!!)\n            initAudioTrack()\n            setupDisplay(langDB, preferenceHelper)\n            ThemeUtil.setStatusBarAppearance(this)\n            FreeDroidWarn.showWarningOnUpgrade(this, BuildConfig.VERSION_CODE)\n            if (GithubStar.shouldShowStarDialog(this)) GithubStar.starDialog(\n                this,\n                \"https://github.com/woheller69/ttsengine\"\n            )\n        } else {\n            val intent = Intent(this, ManageLanguagesActivity::class.java)\n            startActivity(intent)\n            finish()\n        }\n    }\n\n    private fun restart() {\n        val intent = Intent(this, MainActivity::class.java)\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)\n        startActivity(intent)\n        finish()\n    }\n\n    @OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)\n    private fun setupDisplay(\n        langDB: LangDB,\n        preferenceHelper: PreferenceHelper\n    ) {\n        setContent {\n            Surface(\n                modifier = Modifier.fillMaxSize(),\n            ) {\n                Scaffold(\n                    topBar = {\n                        TopAppBar(title = { Text(\"SherpaTTS\") },\n                            actions = {\n                                IconButton(\n                                    onClick = {\n                                        startActivity(\n                                            Intent(\n                                                Intent.ACTION_VIEW,\n                                                Uri.parse(\"https://github.com/woheller69/ttsengine\")\n                                            )\n                                        )\n                                    },\n                                    colors = IconButtonDefaults.iconButtonColors(\n                                        contentColor = colorResource(\n                                            R.color.primaryDark\n                                        )\n                                    )\n                                ) {\n                                    Icon(Icons.Filled.Info, contentDescription = \"Info\")\n                                }\n                            }\n                        )\n                    },\n                    floatingActionButton = {\n                        FloatingActionButton(\n                            onClick = {\n                                intent = Intent()\n                                intent.setAction(\"com.android.settings.TTS_SETTINGS\")\n                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)\n                                this.startActivity(intent)\n                                finish()\n                            }\n                        ) {\n                            Icon(Icons.Filled.Settings, contentDescription = \"TTS Settings\")\n                        }\n                    }) {\n                    Box(modifier = Modifier.padding(it)) {\n                        var sampleText by remember { mutableStateOf(getSampleText(TtsEngine.lang ?: \"\")) }\n                        val numLanguages = langDB.allInstalledLanguages.size\n                        val allLanguages = langDB.allInstalledLanguages\n                        var currentLanguage = allLanguages.indexOfFirst { it.lang == preferenceHelper.getCurrentLanguage()!! }\n                        val numSpeakers = TtsEngine.tts!!.numSpeakers()\n\n                        LazyColumn( // ✅ LazyColumn replaces Column\n                            modifier = Modifier\n                                .fillMaxSize()\n                                .padding(16.dp)\n                        ) {\n                            item {\n                                Text(\n                                    getString(R.string.speed) + \" \" + String.format(\n                                        \"%.1f\",\n                                        TtsEngine.speed.value\n                                    )\n                                )\n                            }\n                            item {\n                                Slider(\n                                    value = TtsEngine.speed.value,\n                                    onValueChange = {\n                                        TtsEngine.speed.value = it\n                                    },\n                                    onValueChangeFinished = {\n                                        langDB.updateLang(\n                                            TtsEngine.lang,\n                                            TtsEngine.speakerId.value,\n                                            TtsEngine.speed.value,\n                                            TtsEngine.volume.value\n                                        )\n                                    },\n                                    valueRange = 0.2F..3.0F,\n                                    modifier = Modifier.fillMaxWidth(),\n                                    colors = SliderDefaults.colors(\n                                        thumbColor = colorResource(R.color.primaryDark),\n                                        activeTrackColor = colorResource(R.color.primaryDark)\n                                    )\n                                )\n                            }\n\n                            item {\n                                Row(\n                                    verticalAlignment = Alignment.CenterVertically,\n                                ) {\n                                    var applySystemSpeed by remember {\n                                        mutableStateOf(\n                                            preferenceHelper.applySystemSpeed()\n                                        )\n                                    }\n                                    Checkbox(\n                                        checked = applySystemSpeed,\n                                        onCheckedChange = { isChecked ->\n                                            preferenceHelper.setApplySystemSpeed(isChecked)\n                                            applySystemSpeed = isChecked\n                                        },\n                                        colors = CheckboxDefaults.colors(\n                                            checkedColor = colorResource(R.color.primaryDark)\n                                        )\n                                    )\n                                    Text(\n                                        getString(R.string.apply_system_speed)\n                                    )\n                                }\n                            }\n\n                            item { Spacer(modifier = Modifier.height(10.dp)) }\n\n                            item {\n                                Row(\n                                    verticalAlignment = Alignment.CenterVertically,\n                                ) {\n                                    var stripSSML by remember {\n                                        mutableStateOf(\n                                            preferenceHelper.getStripSSML()\n                                        )\n                                    }\n                                    Checkbox(\n                                        checked = stripSSML,\n                                        onCheckedChange = { isChecked ->\n                                            preferenceHelper.setStripSSML(isChecked)\n                                            stripSSML = isChecked\n                                        },\n                                        colors = CheckboxDefaults.colors(\n                                            checkedColor = colorResource(R.color.primaryDark)\n                                        )\n                                    )\n                                    Text(\n                                        getString(R.string.strip_ssml)\n                                    )\n                                }\n                            }\n\n                            item { Spacer(modifier = Modifier.height(10.dp)) }\n\n                            item {\n                                Box(modifier = Modifier.fillMaxWidth()) {\n                                    var expanded by remember { mutableStateOf(false) }\n                                    ExposedDropdownMenuBox(\n                                        expanded = expanded,\n                                        onExpandedChange = { expanded = it }\n                                    ) {\n                                        val keyboardController =\n                                            LocalSoftwareKeyboardController.current\n                                        var displayText = allLanguages[currentLanguage].lang\n                                        if (allLanguages[currentLanguage].name.isNotEmpty()) displayText =\n                                            \"$displayText (${allLanguages[currentLanguage].name})\"\n                                        OutlinedTextField(\n                                            value = displayText,\n                                            onValueChange = {},\n                                            readOnly = true,\n                                            label = { Text(getString(R.string.language_id)) },\n                                            modifier = Modifier\n                                                .fillMaxWidth()\n                                                .menuAnchor()\n                                                .onFocusChanged { focusState ->\n                                                    if (focusState.isFocused) {\n                                                        expanded = true\n                                                        keyboardController?.hide()\n                                                    }\n                                                },\n                                            trailingIcon = {\n                                                Icon(\n                                                    Icons.Default.ArrowDropDown,\n                                                    contentDescription = \"Dropdown\"\n                                                )\n                                            }\n                                        )\n                                        ExposedDropdownMenu(\n                                            expanded = expanded,\n                                            onDismissRequest = { expanded = false }\n                                        ) {\n                                            val langList = (0 until numLanguages).toList()\n                                            langList.forEach { langId ->\n                                                var dropdownText = allLanguages[langId].lang\n                                                if (allLanguages[langId].name.isNotEmpty()) dropdownText =\n                                                    \"$dropdownText (${allLanguages[langId].name})\"\n                                                DropdownMenuItem(\n                                                    text = { Text(dropdownText) },\n                                                    onClick = {\n                                                        currentLanguage = langId\n                                                        preferenceHelper.setCurrentLanguage(\n                                                            allLanguages[langId].lang\n                                                        )\n                                                        expanded = false\n                                                        restart()\n                                                    }\n                                                )\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n\n                            if (numSpeakers > 1) {\n                                item {\n                                    Box(modifier = Modifier.fillMaxWidth()) {\n                                        var expanded by remember { mutableStateOf(false) }\n                                        val speakerList = (0 until numSpeakers).toList()\n                                        var selectedSpeaker by remember { mutableStateOf(TtsEngine.speakerId) }\n                                        val keyboardController =\n                                            LocalSoftwareKeyboardController.current\n\n                                        ExposedDropdownMenuBox(\n                                            expanded = expanded,\n                                            onExpandedChange = { expanded = it }\n                                        ) {\n                                            OutlinedTextField(\n                                                value = selectedSpeaker.toString(),\n                                                onValueChange = {},\n                                                readOnly = true,\n                                                label = { Text(getString(R.string.speaker_id) + \" \" + \"(0-${numSpeakers - 1})\") },\n                                                modifier = Modifier\n                                                    .fillMaxWidth()\n                                                    .menuAnchor()\n                                                    .onFocusChanged { focusState ->\n                                                        if (focusState.isFocused) {\n                                                            expanded = true\n                                                            keyboardController?.hide()\n                                                        }\n                                                    },\n                                                trailingIcon = {\n                                                    Icon(\n                                                        Icons.Default.ArrowDropDown,\n                                                        contentDescription = \"Dropdown\"\n                                                    )\n                                                }\n                                            )\n                                            ExposedDropdownMenu(\n                                                expanded = expanded,\n                                                onDismissRequest = { expanded = false }\n                                            ) {\n                                                speakerList.forEach { speakerId ->\n                                                    DropdownMenuItem(\n                                                        text = { Text(speakerId.toString()) },\n                                                        onClick = {\n                                                            selectedSpeaker.value = speakerId\n                                                            TtsEngine.speakerId.value = speakerId\n                                                            langDB.updateLang(\n                                                                TtsEngine.lang,\n                                                                TtsEngine.speakerId.value,\n                                                                TtsEngine.speed.value,\n                                                                TtsEngine.volume.value\n                                                            )\n                                                            expanded = false\n                                                            stopped = true\n                                                        }\n                                                    )\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n\n                            item {\n                                Row {\n                                    Button(\n                                        modifier = Modifier.padding(5.dp),\n                                        colors = ButtonDefaults.buttonColors(\n                                            containerColor = colorResource(R.color.primaryDark),\n                                            contentColor = colorResource(R.color.white)\n                                        ),\n                                        onClick = {\n                                            val intent = Intent(\n                                                applicationContext,\n                                                ManageLanguagesActivity::class.java\n                                            )\n                                            startActivity(intent)\n                                        }) {\n                                        Image(\n                                            painter = painterResource(id = R.drawable.ic_add_24dp),\n                                            contentDescription = stringResource(id = R.string.add_language)\n                                        )\n                                    }\n\n                                    Button(\n                                        modifier = Modifier.padding(5.dp),\n                                        colors = ButtonDefaults.buttonColors(\n                                            containerColor = colorResource(R.color.primaryDark),\n                                            contentColor = colorResource(R.color.white)\n                                        ),\n                                        onClick = {\n                                            deleteLang(preferenceHelper.getCurrentLanguage())\n                                        }) {\n                                        Image(\n                                            painter = painterResource(id = R.drawable.ic_delete_24dp),\n                                            contentDescription = stringResource(id = R.string.delete_language)\n                                        )\n                                    }\n                                }\n                            }\n\n                            item {\n                                OutlinedTextField(\n                                    value = sampleText,\n                                    onValueChange = { sampleText = it },\n                                    label = { Text(getString(R.string.input)) },\n                                    maxLines = 10,\n                                    modifier = Modifier\n                                        .fillMaxWidth()\n                                        .padding(bottom = 16.dp)\n                                        .wrapContentHeight(),\n                                    singleLine = false\n                                )\n                            }\n\n\n                            item {\n                                Text(\n                                    getString(R.string.volume) + \" \" + String.format(\n                                        \"%.1f\",\n                                        TtsEngine.volume.value\n                                    )\n                                )\n                            }\n\n                            item {\n                                Slider(\n                                    value = TtsEngine.volume.value,\n                                    onValueChange = {\n                                        TtsEngine.volume.value = it\n                                    },\n                                    onValueChangeFinished = {\n                                        langDB.updateLang(\n                                            TtsEngine.lang,\n                                            TtsEngine.speakerId.value,\n                                            TtsEngine.speed.value,\n                                            TtsEngine.volume.value\n                                        )\n                                    },\n                                    valueRange = 0.2F..5.0F,\n                                    modifier = Modifier.fillMaxWidth(),\n                                    colors = SliderDefaults.colors(\n                                        thumbColor = colorResource(R.color.primaryDark),\n                                        activeTrackColor = colorResource(R.color.primaryDark)\n                                    )\n                                )\n                            }\n\n                            item {\n                                Row {\n                                    Button(\n                                        enabled = true,\n                                        modifier = Modifier.padding(5.dp),\n                                        colors = ButtonDefaults.buttonColors(\n                                            containerColor = colorResource(R.color.primaryDark),\n                                            contentColor = colorResource(R.color.white)\n                                        ),\n                                        onClick = {\n                                            if (sampleText.isBlank() || sampleText.isEmpty()) {\n                                                Toast.makeText(\n                                                    applicationContext,\n                                                    getString(R.string.input),\n                                                    Toast.LENGTH_SHORT\n                                                ).show()\n                                            } else {\n                                                stopped = false\n\n                                                track.pause()\n                                                track.flush()\n                                                track.play()\n\n                                                samplesChannel = Channel<FloatArray>()\n\n                                                CoroutineScope(Dispatchers.IO).launch {\n                                                    for (samples in samplesChannel) {\n                                                        for (i in samples.indices) {\n                                                            samples[i] *= TtsEngine.volume.value\n                                                        }\n                                                        track.write(\n                                                            samples,\n                                                            0,\n                                                            samples.size,\n                                                            AudioTrack.WRITE_BLOCKING\n                                                        )\n                                                    }\n                                                }\n\n                                                if (preferenceHelper.getStripSSML()) sampleText = TtsEngine.stripSsmlTags(sampleText)\n\n                                                CoroutineScope(Dispatchers.Default).launch {\n                                                    TtsEngine.tts!!.generateWithCallback(\n                                                        text = sampleText,\n                                                        sid = TtsEngine.speakerId.value,\n                                                        speed = TtsEngine.speed.value,\n                                                        callback = ::callback,\n                                                    )\n                                                }.start()\n                                            }\n                                        }) {\n                                        Image(\n                                            painter = painterResource(id = R.drawable.ic_play_24dp),\n                                            contentDescription = stringResource(id = R.string.play)\n                                        )\n                                    }\n\n                                    Button(\n                                        modifier = Modifier.padding(5.dp),\n                                        colors = ButtonDefaults.buttonColors(\n                                            containerColor = colorResource(R.color.primaryDark),\n                                            contentColor = colorResource(R.color.white)\n                                        ),\n                                        onClick = {\n                                            stopped = true\n                                            track.pause()\n                                            track.flush()\n                                        }) {\n                                        Image(\n                                            painter = painterResource(id = R.drawable.ic_stop_24dp),\n                                            contentDescription = stringResource(id = R.string.stop)\n                                        )\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun deleteLang(currentLanguage: String?) {\n\n        // Clear current TTS instance\n        TtsEngine.tts = null\n        // Remove from internal cache\n        TtsEngine.removeLanguageFromCache(currentLanguage!!)\n\n        val country: String\n        val allLanguages = langDB.allInstalledLanguages\n        country = allLanguages.first { it.lang == currentLanguage }.country\n\n        val subdirectoryName = currentLanguage + country\n        val subdirectory = File(getExternalFilesDir(null), subdirectoryName)\n\n        if (subdirectory.exists() && subdirectory.isDirectory) {\n            val files = subdirectory.listFiles()\n\n            files?.forEach { file ->\n                if (file.isFile) {\n                    file.delete()\n                }\n            }\n\n            subdirectory.delete()\n            langDB.removeLang(currentLanguage)\n            if (langDB.allInstalledLanguages.isEmpty()) preferenceHelper.setCurrentLanguage(\"\")\n            else preferenceHelper.setCurrentLanguage(langDB.allInstalledLanguages[0].lang)\n        }\n        restart()\n    }\n\n    override fun onDestroy() {\n        if (this::track.isInitialized) track.release()\n        super.onDestroy()\n    }\n\n    // this function is called from C++\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private fun callback(samples: FloatArray): Int {\n        if (!stopped) {\n            val samplesCopy = samples.copyOf()\n            CoroutineScope(Dispatchers.IO).launch {\n                if (!samplesChannel.isClosedForSend) samplesChannel.send(samplesCopy)\n            }\n            return 1\n        } else {\n            track.stop()\n            Log.i(TAG, \" return 0\")\n            return 0\n        }\n    }\n\n    private fun initAudioTrack() {\n        val sampleRate = TtsEngine.tts!!.sampleRate()\n        val bufLength = AudioTrack.getMinBufferSize(\n            sampleRate,\n            AudioFormat.CHANNEL_OUT_MONO,\n            AudioFormat.ENCODING_PCM_FLOAT\n        )\n        Log.i(TAG, \"sampleRate: $sampleRate, buffLength: $bufLength\")\n\n        val attr = AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)\n            .setUsage(AudioAttributes.USAGE_MEDIA)\n            .build()\n\n        val format = AudioFormat.Builder()\n            .setEncoding(AudioFormat.ENCODING_PCM_FLOAT)\n            .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)\n            .setSampleRate(sampleRate)\n            .build()\n\n        track = AudioTrack(\n            attr, format, bufLength, AudioTrack.MODE_STREAM,\n            AudioManager.AUDIO_SESSION_ID_GENERATE\n        )\n        track.play()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/ManageLanguagesActivity.kt",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.ArrayAdapter\nimport android.widget.Button\nimport android.widget.EditText\nimport android.widget.Toast\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatActivity\nimport com.k2fsa.sherpa.onnx.tts.engine.databinding.ActivityManageLanguagesBinding\nimport java.io.File\nimport java.io.FileOutputStream\nimport java.util.Locale\n\nclass ManageLanguagesActivity  : AppCompatActivity() {\n    private var binding: ActivityManageLanguagesBinding? = null\n\n    // URIs for selected files\n    private var modelFileUri: Uri? = null\n    private var tokensFileUri: Uri? = null\n    \n    // Store lang_code for later use\n    private var langCodeForInstallation: String = \"\"\n\n    private var langCode: String = \"\"\n    private var modelName: String = \"\"\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        binding = ActivityManageLanguagesBinding.inflate(layoutInflater)\n        setContentView(binding!!.root)\n        ThemeUtil.setStatusBarAppearance(this)\n        val allPiperModels: Array<String> = resources.getStringArray(R.array.piper_models)\n        val allCoquiModels: Array<String> = resources.getStringArray(R.array.coqui_models)\n\n        val db = LangDB.getInstance(this)\n        val installedLanguages = db.allInstalledLanguages\n        val installedLangCodes = installedLanguages.map { it.lang }\n\n        val showPiperModels = mutableListOf<String>()\n        for(model in allPiperModels){\n            val twoLetterCode: String = model.split(\"_\").get(0)\n            val lang = Locale(twoLetterCode).isO3Language\n            if (!installedLangCodes.contains(lang)) showPiperModels.add(model)\n        }\n\n        val showCoquiModels = mutableListOf<String>()\n        for(model in allCoquiModels){\n            val twoLetterCode: String = model.split(\"_\").get(0)\n            val lang = Locale(twoLetterCode).isO3Language\n            if (!installedLangCodes.contains(lang)) showCoquiModels.add(model)\n        }\n\n        val piperAdapter = ArrayAdapter(this, R.layout.list_item, R.id.text_view, showPiperModels)\n        val coquiAdapter = ArrayAdapter(this, R.layout.list_item, R.id.text_view, showCoquiModels)\n\n        binding!!.piperModelList.adapter = piperAdapter\n        binding!!.piperModelList.setOnItemClickListener { parent, view, position, id ->\n            val model = showPiperModels.get(position)\n            val twoLetterCode = model.substring(0, 2)\n            val country = model.substring(3, 5)\n            val lang = Locale(twoLetterCode).isO3Language\n            val type = \"vits-piper\"\n            binding!!.piperModelList.visibility = View.GONE\n            binding!!.coquiModelList.visibility = View.GONE\n            binding!!.buttonTestVoices.visibility = View.GONE\n            binding!!.piperHeader.visibility = View.GONE\n            binding!!.coquiHeader.visibility = View.GONE\n            binding!!.downloadSize.setText(\"\")\n            Downloader.downloadModels(this, binding, model, lang, country, type)\n        }\n\n        binding!!.coquiModelList.adapter = coquiAdapter\n        binding!!.coquiModelList.setOnItemClickListener { parent, view, position, id ->\n            val model = showCoquiModels.get(position)\n            val twoLetterCode = model.substring(0, 2)\n            val country = \"\"\n            val lang = Locale(twoLetterCode).isO3Language\n            val type = \"vits-coqui\"\n            binding!!.piperModelList.visibility = View.GONE\n            binding!!.coquiModelList.visibility = View.GONE\n            binding!!.buttonTestVoices.visibility = View.GONE\n            binding!!.piperHeader.visibility = View.GONE\n            binding!!.coquiHeader.visibility = View.GONE\n            binding!!.downloadSize.setText(\"\")\n            Downloader.downloadModels(this, binding, model, lang, country, type)\n        }\n\n    }\n\n    fun startMain(view: View) {\n        val intent = Intent(this, MainActivity::class.java)\n        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)\n        startActivity(intent)\n        finishAffinity()\n    }\n\n    fun testVoices(view: View) {startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(\"https://huggingface.co/spaces/k2-fsa/text-to-speech/\")))}\n    \n    fun installFromSD(view: View) {\n        sdInstall()\n    }\n    fun sdInstall() {\n        val dialogView = layoutInflater.inflate(R.layout.dialog_install_custom_model, null)\n\n        val langInput = dialogView.findViewById<EditText>(R.id.editTextLangCode)\n        val modelInput = dialogView.findViewById<EditText>(R.id.editTextModelName)\n        val selectModelBtn = dialogView.findViewById<Button>(R.id.buttonSelectModel)\n        val selectTokensBtn = dialogView.findViewById<Button>(R.id.buttonSelectTokens)\n        val installBtn = dialogView.findViewById<Button>(R.id.buttonInstall)\n\n        // Initialize button text/visibility \n        selectModelBtn.setOnClickListener {\n            modelPickerLauncher.launch(arrayOf(\"application/octet-stream\"))\n        }\n\n        selectTokensBtn.setOnClickListener {\n            tokensPickerLauncher.launch(arrayOf(\"text/plain\"))\n        }\n\n        installBtn.setOnClickListener {\n            langCode = langInput.text.toString().trim()\n            modelName = modelInput.text.toString().trim()\n\n            // Validate\n            if (langCode.length != 3) {\n                Toast.makeText(this, R.string.language_code_error, Toast.LENGTH_SHORT).show()\n                return@setOnClickListener\n            }\n\n            if (modelName.isEmpty()) {\n                Toast.makeText(this, getString(R.string.enter_model_name), Toast.LENGTH_SHORT).show()\n                return@setOnClickListener\n            }\n\n            if (modelFileUri == null) {\n                Toast.makeText(this, getString(R.string.select_model_file), Toast.LENGTH_SHORT).show()\n                return@setOnClickListener\n            }\n\n            if (tokensFileUri == null) {\n                Toast.makeText(this, getString(R.string.select_tokens_file), Toast.LENGTH_SHORT).show()\n                return@setOnClickListener\n            }\n\n            // Check duplicates\n            val db = LangDB.getInstance(this)\n            if (db.allInstalledLanguages.any { it.lang == langCode }) {\n                Toast.makeText(this, R.string.language_already_installed, Toast.LENGTH_SHORT).show()\n                return@setOnClickListener\n            }\n\n            // Proceed with install\n            installCustomModel(langCode, modelFileUri!!, tokensFileUri!!)\n        }\n\n        val dialog = AlertDialog.Builder(this)\n            .setTitle(getString(R.string.install_from_sd))\n            .setView(dialogView)\n            .setNegativeButton(getString(android.R.string.cancel)) { dialogInterface, _ -> dialogInterface.dismiss() }\n            .create()\n\n        dialog.show()\n    }\n\n    private fun installCustomModel(langCode: String, modelUri: Uri, tokensUri: Uri) {\n        // Create directory for the language (country code is empty as requested)\n        val directory = File(this.getExternalFilesDir(null), \"/$langCode/\")\n        if (!directory.exists() && !directory.mkdirs()) {\n            Toast.makeText(this, R.string.error_copying_files, Toast.LENGTH_SHORT).show()\n            return\n        }\n        \n        // Copy model.onnx file\n        val modelDest = File(directory, Downloader.onnxModel)\n        try {\n            copyFile(modelUri, modelDest)\n        } catch (e: Exception) {\n            Toast.makeText(this, R.string.error_copying_files, Toast.LENGTH_SHORT).show()\n            return\n        }\n        \n        // Copy tokens.txt file\n        val tokensDest = File(directory, Downloader.tokens)\n        try {\n            copyFile(tokensUri, tokensDest)\n        } catch (e: Exception) {\n            Toast.makeText(this, R.string.error_copying_files, Toast.LENGTH_SHORT).show()\n            return\n        }\n        \n        // Add to database as vits-piper model with empty country code\n        val db = LangDB.getInstance(this)\n        db.addLanguage(modelName, langCode, \"\", 0, 1.0f, 1.0f, \"vits-piper\")\n        \n        // Show success message\n        Toast.makeText(this, \"+ \\\"$langCode\\\" = \\\"$modelName\\\" \", Toast.LENGTH_SHORT).show()\n        val preferenceHelper = PreferenceHelper(this)\n        preferenceHelper.setCurrentLanguage(langCode)\n        // Reset file URIs and lang code for next use\n        modelFileUri = null\n        tokensFileUri = null\n        langCodeForInstallation = \"\"\n        val intent = Intent(this, MainActivity::class.java)\n        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)\n        startActivity(intent)\n        finishAffinity()\n    }\n    \n    private fun copyFile(sourceUri: Uri, destFile: File) {\n        this.contentResolver.openInputStream(sourceUri)?.use { input ->\n            FileOutputStream(destFile).use { output ->\n                input.copyTo(output)\n            }\n        }\n    }\n\n    // Register for file pickers \n    private val modelPickerLauncher = registerForActivityResult(\n        ActivityResultContracts.OpenDocument()\n    ) { uri ->\n        if (uri != null) {\n            modelFileUri = uri\n        }\n    }\n\n    private val tokensPickerLauncher = registerForActivityResult(\n        ActivityResultContracts.OpenDocument()\n    ) { uri ->\n        if (uri != null) {\n            tokensFileUri = uri\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/Migrate.java",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine;\n\nimport android.content.Context;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileReader;\nimport java.io.IOException;\n\n//This class can be removed in future if migration from old structure is no longer needed, e.g. in 2026\npublic class Migrate {\n\n    //Move model from old modelDir to new language based folder structure\n    public static void renameModelFolder(Context context){\n        File sdcardDataFolder = context.getExternalFilesDir(null);\n        File lang = new File(sdcardDataFolder.getAbsolutePath(), \"modelDir/lang\");\n        if (lang.exists()) { //move to new directory structure\n            String[] model = readLanguageFromFile(context);\n            File modelDirFolder = new File(sdcardDataFolder.getAbsolutePath(),\"modelDir\");\n            File langFolder = new File(sdcardDataFolder.getAbsolutePath(),model[0]);\n            modelDirFolder.renameTo(langFolder);\n            PreferenceHelper preferenceHelper = new PreferenceHelper(context);\n            preferenceHelper.setCurrentLanguage(model[0]);\n            LangDB langDB = LangDB.getInstance(context);\n            langDB.addLanguage(model[1], model[0], \"\", 0, 1.0f, 1.0f, \"vits-piper\");\n        }\n    }\n\n    public static String[] readLanguageFromFile(Context context) {\n        File sdcardDataFolder = context.getExternalFilesDir(null);\n        File langFile = new File(sdcardDataFolder.getAbsolutePath(), \"modelDir/lang\");\n\n        // Default fallback values\n        String languageCode = \"eng\";\n        String languageName = \"???\";\n\n        try (BufferedReader br = new BufferedReader(new FileReader(langFile))) {\n            String line1 = br.readLine(); // language code\n            String line2 = br.readLine(); // language name\n\n            if (line1 != null) {\n                languageCode = line1.trim();\n            }\n            if (line2 != null) {\n                languageName = line2.trim();\n            }\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        }\n        return new String[]{languageCode, languageName};\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/PreferenceHelper.kt",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine\nimport android.content.Context\nimport android.content.SharedPreferences\n\nclass PreferenceHelper(context: Context) {\n\n    private val PREFS_NAME = \"com.k2fsa.sherpa.onnx.tts.engine\"\n    private val SPEED_KEY = \"speed\"\n    private val SID_KEY = \"speaker_id\"\n    private val INIT_KEY = \"init_espeak\"\n    private val USE_SYSTEM_SPEED = \"apply_system_speed\"\n    private val STRIP_SSML = \"strip_ssml\"\n    private val CURRENT_LANGUAGE = \"current_language\"\n    private val VOLUME = \"volume\"\n\n    private val sharedPreferences: SharedPreferences =\n        context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)\n\n    fun setInitFinished() {\n        val editor = sharedPreferences.edit()\n        editor.putBoolean(INIT_KEY, true)\n        editor.apply()\n    }\n\n    fun isInitFinished(): Boolean {\n        return sharedPreferences.getBoolean(INIT_KEY, false)\n    }\n\n    fun setCurrentLanguage(language: String){\n        val editor = sharedPreferences.edit()\n        editor.putString(CURRENT_LANGUAGE, language)\n        editor.apply()\n    }\n\n    fun getCurrentLanguage(): String? {\n        return sharedPreferences.getString(CURRENT_LANGUAGE, \"\")\n    }\n\n    fun setApplySystemSpeed(useSystem: Boolean){\n        val editor = sharedPreferences.edit()\n        editor.putBoolean(USE_SYSTEM_SPEED, useSystem)\n        editor.apply()\n    }\n\n    fun applySystemSpeed(): Boolean {\n        return sharedPreferences.getBoolean(USE_SYSTEM_SPEED, false)\n    }\n\n    fun setStripSSML(stripSSML: Boolean){\n        val editor = sharedPreferences.edit()\n        editor.putBoolean(STRIP_SSML, stripSSML)\n        editor.apply()\n    }\n\n    fun getStripSSML(): Boolean {\n        return sharedPreferences.getBoolean(STRIP_SSML, false)\n    }\n\n    fun getVolume(): Float{\n        return sharedPreferences.getFloat(VOLUME,1.0f)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/ThemeUtil.java",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine;\n\nimport android.app.Activity;\nimport android.os.Build;\nimport android.view.WindowInsetsController;\n\npublic class ThemeUtil {\n    public static void setStatusBarAppearance(Activity activity){\n        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {\n            WindowInsetsController insetsController = activity.getWindow().getInsetsController();\n            if (insetsController != null) {\n                insetsController.setSystemBarsAppearance(\n                        WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,\n                        WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS\n                );\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/TtsEngine.kt",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine\n\nimport android.content.Context\nimport android.content.res.AssetManager\nimport android.util.Log\nimport androidx.compose.runtime.MutableState\nimport androidx.compose.runtime.mutableFloatStateOf\nimport androidx.compose.runtime.mutableIntStateOf\nimport com.k2fsa.sherpa.onnx.OfflineTts\nimport com.k2fsa.sherpa.onnx.getOfflineTtsConfig\nimport org.jsoup.Jsoup\nimport java.io.File\nimport java.io.FileOutputStream\nimport java.io.IOException\n\nobject TtsEngine {\n    private val ttsCache = mutableMapOf<String, OfflineTts>()\n    var tts: OfflineTts? = null\n\n    // https://en.wikipedia.org/wiki/ISO_639-3\n    var lang: String? = \"\"\n    var country: String? = \"\"\n\n    var volume: MutableState<Float> = mutableFloatStateOf(1.0F)\n    var speed: MutableState<Float> = mutableFloatStateOf(1.0F)\n    var speakerId: MutableState<Int> = mutableIntStateOf(0)\n\n    private var modelName: String = \"model.onnx\"\n    private var acousticModelName: String? = null // for matcha tts\n    private var vocoder: String? = null // for matcha tts\n    private var voices: String? = null // for kokoro\n    private var ruleFsts: String? = null\n    private var ruleFars: String? = null\n    private var lexicon: String? = null\n    private var dataDir: String = \"espeak-ng-data\"\n    private var dictDir: String? = null\n\n    fun getAvailableLanguages(context: Context): ArrayList<String> {\n        val langCodes = java.util.ArrayList<String>()\n        val db = LangDB.getInstance(context)\n        val allLanguages = db.allInstalledLanguages\n        for (language in allLanguages) {\n            langCodes.add(language.lang)\n        }\n        return langCodes\n    }\n\n    fun stripSsmlTags(text: String): String {\n        return Jsoup.parse(text).text().trim()\n    }\n\n    fun createTts(context: Context, language: String) {\n        if (tts == null || lang != language) {\n            if (ttsCache.containsKey(language)) {\n                Log.i(TAG, \"From TTS cache: \" + language)\n                tts = ttsCache[language]\n                loadLanguageSettings(context, language)\n            } else {\n                initTts(context, language)\n            }\n        }\n    }\n\n    private fun loadLanguageSettings(context: Context, language: String) {\n        val db = LangDB.getInstance(context)\n        val currentLanguage = db.allInstalledLanguages.first { it.lang == language }\n        this.lang = language\n        this.country = currentLanguage.country\n        this.speed.value = currentLanguage.speed\n        this.speakerId.value = currentLanguage.sid\n        this.volume.value = currentLanguage.volume\n        PreferenceHelper(context).setCurrentLanguage(language)\n    }\n\n    fun removeLanguageFromCache(language: String) {\n        ttsCache.remove(language)\n        Log.i(TAG, \"Removed TTS cache for: $language\")\n        Log.i(TAG, \"TTS cache size:\"+ ttsCache.size)\n    }\n\n    private fun initTts(context: Context, lang: String) {\n        Log.i(TAG, \"Add to TTS cache: \" + lang)\n\n        loadLanguageSettings(context, lang)\n\n        val externalFilesDir = context.getExternalFilesDir(null)!!.absolutePath\n\n        val modelDir = \"$externalFilesDir/$lang$country\"\n\n        var newDataDir = \"\"\n        if (dataDir != null) {\n            newDataDir = copyDataDir(context, dataDir!!)\n        }\n\n        if (dictDir != null) {\n            val newDir = copyDataDir(context, dictDir!!)\n            dictDir = \"$newDir/$dictDir\"\n            ruleFsts = \"$modelDir/phone.fst,$modelDir/date.fst,$modelDir/number.fst\"\n        }\n\n        val config = getOfflineTtsConfig(\n            modelDir = modelDir!!,\n            modelName = modelName ?: \"\",\n            acousticModelName = acousticModelName ?: \"\",\n            vocoder = vocoder ?: \"\",\n            voices = voices ?: \"\",\n            lexicon = lexicon ?: \"\",\n            dataDir = newDataDir ?: \"\",\n            dictDir = dictDir ?: \"\",\n            ruleFsts = ruleFsts ?: \"\",\n            ruleFars = ruleFars ?: \"\"\n        )\n\n        val configDebugOff = config.copy(  // create a new instance with debug switched off\n            model = config.model.copy(debug = false)\n        )\n\n        tts = OfflineTts(assetManager = null, config = configDebugOff)\n        ttsCache[lang] = tts!!\n        Log.i(TAG, \"TTS cache size:\"+ ttsCache.size)\n    }\n\n    private fun copyDataDir(context: Context, dataDir: String): String {\n        Log.i(TAG, \"data dir is $dataDir\")\n        if (!PreferenceHelper(context).isInitFinished()){  //only copy at first startup\n            copyAssets(context, dataDir)\n            PreferenceHelper(context).setInitFinished()\n        }\n        val newDataDir = context.getExternalFilesDir(null)!!.absolutePath + \"/\" + dataDir\n        Log.i(TAG, \"newDataDir: $newDataDir\")\n        return newDataDir\n    }\n\n    private fun copyAssets(context: Context, path: String) {\n        val assets: Array<String>?\n        try {\n            assets = context.assets.list(path)\n            if (assets!!.isEmpty()) {\n                copyFile(context, path)\n            } else {\n                val fullPath = \"${context.getExternalFilesDir(null)}/$path\"\n                val dir = File(fullPath)\n                dir.mkdirs()\n                for (asset in assets.iterator()) {\n                    val p: String = if (path == \"\") \"\" else \"$path/\"\n                    copyAssets(context, p + asset)\n                }\n            }\n        } catch (ex: IOException) {\n            Log.e(TAG, \"Failed to copy $path. $ex\")\n        }\n    }\n\n    private fun copyFile(context: Context, filename: String) {\n        try {\n            val istream = context.assets.open(filename)\n            val newFilename = context.getExternalFilesDir(null)!!.absolutePath + \"/\" + filename\n            val file = File(newFilename)\n            if (!file.exists()) {\n                val ostream = FileOutputStream(newFilename)\n                val buffer = ByteArray(1024)\n                var read = 0\n                while (read != -1) {\n                    ostream.write(buffer, 0, read)\n                    read = istream.read(buffer)\n                }\n                istream.close()\n                ostream.flush()\n                ostream.close()\n            }\n        } catch (ex: Exception) {\n            Log.e(TAG, \"Failed to copy $filename, $ex\")\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/TtsService.kt",
    "content": "package com.k2fsa.sherpa.onnx.tts.engine\n\nimport android.content.Intent\nimport android.content.Intent.FLAG_ACTIVITY_NEW_TASK\nimport android.media.AudioFormat\nimport android.speech.tts.SynthesisCallback\nimport android.speech.tts.SynthesisRequest\nimport android.speech.tts.TextToSpeech\nimport android.speech.tts.TextToSpeechService\nimport android.util.Log\n\n\nclass TtsService : TextToSpeechService() {\n    override fun onCreate() {\n        Log.i(TAG, \"onCreate tts service\")\n        super.onCreate()\n\n        // see https://github.com/Miserlou/Android-SDK-Samples/blob/master/TtsEngine/src/com/example/android/ttsengine/RobotSpeakTtsService.java#L68\n        onLoadLanguage(TtsEngine.lang, \"\", \"\")\n    }\n\n    override fun onDestroy() {\n        Log.i(TAG, \"onDestroy tts service\")\n        super.onDestroy()\n    }\n\n    // https://developer.android.com/reference/kotlin/android/speech/tts/TextToSpeechService#onislanguageavailable\n    override fun onIsLanguageAvailable(_lang: String?, _country: String?, _variant: String?): Int {\n        val lang = _lang ?: \"\"\n\n        if (TtsEngine.getAvailableLanguages(this).contains(lang)) {\n            return TextToSpeech.LANG_AVAILABLE\n        }\n\n        return TextToSpeech.LANG_NOT_SUPPORTED\n    }\n\n    override fun onGetLanguage(): Array<String> {  //returns language currently being used\n        return arrayOf(TtsEngine.lang!!, \"\", \"\")\n    }\n\n    // https://developer.android.com/reference/kotlin/android/speech/tts/TextToSpeechService#onLoadLanguage(kotlin.String,%20kotlin.String,%20kotlin.String)\n    override fun onLoadLanguage(_lang: String?, _country: String?, _variant: String?): Int {\n        Log.i(TAG, \"onLoadLanguage: $_lang, $_country\")\n        val lang = _lang ?: \"\"\n        Migrate.renameModelFolder(this)   //Rename model folder if \"old\" structure\n        val preferenceHelper = PreferenceHelper(this)\n        return if (preferenceHelper.getCurrentLanguage().equals(\"\")){  //Download model first if no model is installed\n            val intent = Intent(this, MainActivity::class.java)\n            intent.addFlags(FLAG_ACTIVITY_NEW_TASK)\n            startActivity(intent)\n            TextToSpeech.LANG_MISSING_DATA\n        } else {\n            if (TtsEngine.getAvailableLanguages(this).contains(lang)) {\n                Log.i(TAG, \"creating tts, lang :$lang\")\n                TtsEngine.createTts(application, lang)\n                TextToSpeech.LANG_AVAILABLE\n            } else {\n                Log.i(TAG, \"lang $lang not supported, tts engine lang: ${TtsEngine.lang}\")\n                TextToSpeech.LANG_NOT_SUPPORTED\n            }\n        }\n    }\n\n    override fun onStop() {}\n\n    override fun onSynthesizeText(request: SynthesisRequest?, callback: SynthesisCallback?) {\n        if (TtsEngine.tts == null || request == null || callback == null) {\n            return\n        }\n        val language = request.language\n        val country = request.country\n        val variant = request.variant\n        var pitch = 100f\n\n        val preferenceHelper = PreferenceHelper(this)\n\n        if (preferenceHelper.applySystemSpeed()){\n            pitch = request.pitch * 1.0f\n            TtsEngine.speed.value = request.speechRate / pitch  //divide by pitch to compensate for pitch adjustment performed in ttsCallback\n        }         // request.speechRate: System does not memorize different speeds for different languages\n\n        var text = request.charSequenceText.toString()\n\n        if (preferenceHelper.getStripSSML()) text = TtsEngine.stripSsmlTags(text)\n\n        val ret = onIsLanguageAvailable(language, country, variant)\n        if (ret == TextToSpeech.LANG_NOT_SUPPORTED) {\n            callback.error()\n            return\n        }\n\n        val tts = TtsEngine.tts!!\n\n        callback.start(tts.sampleRate(), AudioFormat.ENCODING_PCM_16BIT, 1)\n\n        if (text.isBlank() || text.isEmpty()) {\n            callback.done()\n            return\n        }\n\n        val ttsCallback: (FloatArray) -> Int = fun(floatSamples): Int {\n            val samples: ByteArray\n\n            if (pitch != 100f){  //if not default pitch, play samples faster or slower. Speed has already been compensated before generation, see above\n                val speedFactor = pitch / 100f\n                val newSampleCount = (floatSamples.size / speedFactor).toInt()\n                val newSamples = FloatArray(newSampleCount)\n\n                for (i in 0 until newSampleCount) {\n                    newSamples[i] = floatSamples[(i * speedFactor).toInt()] * TtsEngine.volume.value\n                }\n                // Convert the modified FloatArray to ByteArray\n                samples = floatArrayToByteArray(newSamples)\n            } else {\n                // Convert FloatArray to ByteArray\n                for (i in floatSamples.indices) {\n                    floatSamples[i] *= TtsEngine.volume.value\n                }\n                samples = floatArrayToByteArray(floatSamples)\n            }\n\n            val maxBufferSize: Int = callback.maxBufferSize\n            var offset = 0\n            while (offset < samples.size) {\n                val bytesToWrite = Math.min(maxBufferSize, samples.size - offset)\n                callback.audioAvailable(samples, offset, bytesToWrite)\n                offset += bytesToWrite\n            }\n\n            // 1 means to continue\n            // 0 means to stop\n            return 1\n        }\n\n        //Log.i(TAG, \"text: $text\")\n        tts.generateWithCallback(\n            text = text,\n            sid = TtsEngine.speakerId.value,\n            speed = TtsEngine.speed.value,\n            callback = ttsCallback,\n        )\n\n        callback.done()\n    }\n\n    private fun floatArrayToByteArray(audio: FloatArray): ByteArray {\n        // byteArray is actually a ShortArray\n        val byteArray = ByteArray(audio.size * 2)\n        for (i in audio.indices) {\n            val sample = (audio[i] * 32767).toInt()\n            byteArray[2 * i] = sample.toByte()\n            byteArray[2 * i + 1] = (sample shr 8).toByte()\n        }\n        return byteArray\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_add_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n  <path\n      android:pathData=\"M440,520L200,520v-80h240v-240h80v240h240v80L520,520v240h-80v-240Z\"\n      android:fillColor=\"#FFFFFF\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_delete_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n  <path\n      android:fillColor=\"#FFFFFF\"\n      android:pathData=\"M280,840q-33,0 -56.5,-23.5T200,760v-520h-40v-80h200v-40h240v40h200v80h-40v520q0,33 -23.5,56.5T680,840L280,840ZM680,240L280,240v520h400v-520ZM360,680h80v-360h-80v360ZM520,680h80v-360h-80v360ZM280,240v520,-520Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_foreground.xml",
    "content": "<vector android:height=\"108dp\" android:viewportHeight=\"2500\"\n    android:viewportWidth=\"2500\" android:width=\"108dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\"\n        android:pathData=\"m749.2,1862.4c0,-25.9 0.7,-51.6 0.5,-77.3 -0.5,-6.4 -3.7,-13.6 -9.7,-16.3 -2.7,-3.5 -8.5,-1.7 -5.4,3 2.4,11.9 4.9,23.7 7.3,35.3 1.5,5.4 1.9,10.9 3.4,16 0.2,3.2 3.4,8.6 0.7,10.4 -4.6,0 -9.7,-4.2 -13.6,-1.7 -1,4.2 1.2,8.6 1.9,12.8 1.9,6.9 4.1,14.1 3.7,21.5 -0.2,3.7 -0.7,8.1 -3.2,11.1 -3.4,-1.2 -4.1,-6.2 -7.8,-7.4 -5.1,-1.7 -9.5,3 -14.6,3 -4.1,0.7 -7.5,3 -11.7,3.5 -4.6,2.7 -4.9,-4 -6.1,-6.9 -1.9,-5.2 -4.1,-10.6 -5.6,-16 -0.5,-5.9 -6.8,-7.7 -11.4,-9.1 -6.8,-2.7 -13.9,-5.2 -20.7,-7.9 -5.1,0.2 -7.5,-5.2 -4.1,-8.9 4.4,-12.6 9,-25.2 13.4,-37.8 1.2,-6.2 -2.4,-12.1 -7.1,-15.3 -19.5,-17.8 -38.2,-36.5 -57,-55.1 0.7,-4.9 6.6,-6.7 9.2,-10.6 9.7,-8.6 21.7,-14.8 29.2,-25.7 5.1,-7.2 7.8,-16 8.5,-24.7 0.7,-6.4 6.8,-9.6 11,-13.6 14.8,-12.3 29.7,-24.9 46,-35.3 4.4,-3 8.5,-7.2 8.3,-12.8 0.5,-5.4 -4.4,-7.7 -8.3,-9.6 -6.3,-4.9 -9.2,-13.1 -9.7,-20.7 -1.5,-6.4 -5.1,2.2 -8.3,0.7 -1.2,-4.7 -0.2,-9.9 -0.5,-14.8 0,-4.9 1.5,-11.6 0.5,-15.6 -4.6,2 -8.8,4.4 -13.1,6.9 -2.4,-2.2 1.5,-6.7 1.5,-9.6 11.4,-41 22.6,-82.2 34.1,-123.2 -4.1,3.5 -6.8,8.4 -10.2,12.6 -5.6,7.7 -12.2,15.1 -13.4,24.9 -1.2,6.7 -1,13.3 -1.5,20 -3.7,1.2 -6.6,-4.7 -8.5,-7.7 -4.1,-8.1 -3.9,-18.3 0.5,-26.4 5.1,-10.4 10.7,-20.2 16.3,-30.4 -3.9,-4.4 -10.7,0.2 -14.6,-4.4 -1.9,-5.2 5.4,-7.7 7.5,-11.6 5.6,-6.2 11.9,-11.9 19,-16.3 4.9,-3.2 5.6,-9.4 4.9,-14.8 -0.7,-9.4 -1.2,-18.8 -1.9,-28.1 -0.7,-9.4 -1.7,-18.8 -3.2,-27.9 -2.4,4 -2.7,8.6 -4.4,12.8 -3.4,11.1 -6.6,22 -10.2,33.1 -6.1,1.5 -1.9,-7.7 -4.9,-10.4 -1.9,2 -4.9,4.4 -7.1,1.2 -3.4,-3.7 -2.9,-9.1 -5.1,-13.3 -3.4,-10.4 -6.1,-21.5 -4.4,-32.3 1,-8.6 3.9,-17 4.9,-25.4 -4.9,-2.5 -10.7,-2.7 -15.6,-5.4 -7.5,-3.2 -15.8,-8.6 -17.5,-17.5 -1,-5.4 1,-11.1 3.7,-15.6 4.4,-8.4 13.4,-14.1 14.4,-24.2 1.5,-8.1 -2.4,-16 -1.9,-23.9 0.2,-17.5 6.8,-34.8 18.3,-47.7 4.9,-5.2 10.7,-8.9 17,-12.3 6.1,-4 11.2,-10.6 10.7,-18.3 0,-4.4 -1.2,-8.6 -2.4,-12.8 -4.9,-2.7 -10.5,0 -15.6,-1 -6.3,0 -12.9,0 -19.2,0.5 -8.8,-11.1 -22.1,-18.3 -29,-31.1 -3.7,-7.4 -3.4,-15.8 -4.6,-23.7 -1.9,-16 -3.9,-32.1 -4.1,-48.4 -0.2,-10.1 4.6,-19.5 7.5,-28.9 -0.5,-5.2 -6.8,-6.9 -9.5,-10.6 -4.4,-4 -8.8,-9.9 -6.8,-16.3 1.9,-6.9 8.3,-11.4 13.1,-16.3 10.5,-9.4 23.9,-14.6 36,-21.2 29.5,-15.3 58.7,-30.9 88.8,-44.7 9.2,-3.2 19.5,-2 29,-0.5 13.4,2.7 25.6,8.6 38.2,13.3 3.9,-3 7.5,-8.6 13.1,-7.4 7.1,0.7 12.7,5.9 19.5,7.4 3.2,-4.4 5.4,-9.9 10.5,-12.6 8.5,-5.4 18.7,-4.7 28.2,-5.7 6.3,-0.2 12.4,-1.7 18.3,-3.7 26.3,-6.7 53.1,-12.1 79.6,-17.8 5.1,-1.5 10,1.7 9.2,7.2 12.9,59.8 20,121 37.7,179.7 1.9,6.4 4.1,12.8 6.3,19.3 0.5,-5.4 -1.7,-10.9 -2.2,-16.3 -4.9,-26.2 -9.5,-52.6 -14.4,-78.8 2.9,-5.2 5.4,4 5.8,6.4 11.4,31.6 22.6,63.5 34.3,95.1 1.7,4.4 6.3,-1.2 3.9,-4.2 -4.1,-13.3 -7.8,-26.7 -11.7,-40.2 -9.7,-33.6 -19.2,-67.2 -29,-100.5 3.2,-2.5 5.6,4.2 8.8,5.2 39.2,32.6 78.4,65.2 117.6,97.5 4.1,-2 2.2,-8.1 4.4,-11.9 4.6,-18 9.7,-36.3 17.5,-53.1 3.2,-4.7 9.5,-5.2 14.6,-4.7 5.8,2.5 6.8,-4.9 7.1,-8.9 1.7,-8.4 3.4,-16.5 4.6,-24.9 -5.1,-3.2 -11.4,-2 -16.8,-3 -6.3,-0.5 -6.1,-7.7 -5.8,-12.3 0.5,-3.7 1.2,-12.6 -4.6,-11.6 -3.9,1.2 -4.4,-4 -6.6,-6.2 -3.4,-5.9 -10.5,-7.9 -16.8,-8.6 -5.8,-0.7 -11.7,-0.2 -17.3,-1 -1.9,-1.7 -1,-8.4 -4.9,-4.7 -2.9,1.5 -7.3,7.2 -10,4.9 0,-2.7 3.7,-10.1 -1.7,-7.4 -5.8,1 -7.5,-5.9 -10,-9.6 -4.1,-6.7 -8.8,-14.6 -6.6,-22.7 1.2,-4.9 3.9,-9.9 2.4,-15.1 -2.7,-5.4 3.9,-8.4 7.5,-10.6 3.9,-3.7 -7.8,-10.9 -0.2,-11.1 4.9,0.5 9.5,-1.2 12.9,-4.9 4.9,-5.2 7.3,-12.1 12.7,-17 3.4,-3.7 7.1,-7.2 10.7,-10.6 2.9,0.5 3.4,8.4 6.1,2.7 2.9,-3.2 4.1,-8.1 8.5,-9.9 -0.2,4 3.7,7.2 6.6,3.7 13.9,-5.4 27.7,-11.1 41.6,-17 7.5,-3 15.6,-4.4 23.6,-4 10,0.2 19,-5.2 26,-12.1 8.8,-8.6 14.8,-20.2 16.3,-32.3 2.2,-14.8 7.3,-29.1 12.4,-43.2 5.4,-14.8 13.1,-28.6 20,-43 2.7,-4.9 6.8,-8.9 10.5,-13.1 4.4,-4 10.7,-4.2 16.1,-6.2 17.3,-5.2 34.6,-9.6 52.6,-11.1 11.7,-1.2 23.4,-2 35,-3.2 5.1,1.2 -2.2,6.4 -3.7,8.4 -1.9,4.2 4.4,-0.2 6.1,-0.5 9.2,-3.7 18.7,-7.9 28.7,-7.7 12.4,-0.2 25.1,0.2 37.5,-0.5 8.3,-2.2 16.8,-6.9 25.6,-4 8.5,3.5 12.7,12.3 17.8,19.5l11,17c1,5.4 -6.1,4.2 -9.2,3 -8.5,-2.5 -17,-4.4 -25.6,-6.7 2.4,3.7 7.5,4.2 10.7,6.9 13.9,8.1 27.3,17.8 37.5,30.6 3.7,2.5 0,4.2 -2.7,3.2 -8.8,0 -17.3,-1.5 -26,-2 -3.9,-1.2 -1.9,4 1,3.2 18.5,6.9 36.8,13.8 55.3,21 1.9,-4.4 7.3,-6.2 11.4,-3.7 5.6,1.2 11.9,4.4 13.4,10.6 -0.2,3 1.9,7.7 4.1,3 1.2,-3.5 1.5,-11.4 7.1,-8.1 14.6,4 29.5,7.7 44.1,11.6 3.9,4 8.3,8.1 13.9,8.9 6.6,1.2 13.4,-0.5 19.2,-3.5 4.6,0.7 6.1,7.2 7.3,10.4 -0.7,2.7 -7.5,3.2 -5.8,5.7 5.4,1.2 11,1.2 16.6,2 4.1,0.5 8,1 12.2,1.7 -0.2,2.7 -6.8,8.9 -0.2,7.7 3.4,-0.7 8,-4 10.5,-0.2 2.4,4.9 2.7,11.6 8,14.6 4.9,2.7 7.5,8.4 6.3,13.8 -1.5,3 -3.4,8.4 1.7,8.1 4.9,0.7 5.1,6.2 1.7,8.9 -3.2,5.4 2.7,8.9 5.4,12.6 1.7,4.4 1,9.6 2.4,14.3 1,5.4 1.2,11.9 -2.9,16 -2.7,3.2 -11.2,4.4 -6.8,10.1 1.7,2.2 1.9,7.7 -2.2,4.7 -4.9,-3 -7.3,3 -8.8,6.7 -4.1,7.4 -8,15.1 -11.9,22.5 -3.4,4.2 -9.2,4.2 -13.9,6.4 -9.2,3.5 -18.5,6.4 -27.5,9.9 -1.5,2.2 2.4,7.4 -2.7,6.2 -7.5,0 -14.8,0.2 -22.4,0.2 -3.4,0.2 -7.1,0 -10.2,0.7 -10.2,6.2 -23.1,5.4 -34.1,2 -8.8,-2.5 -18,-3 -27,-2 -6.8,2.5 -9,10.4 -10.5,16.8 -1.7,10.4 0,20.7 -1,30.9 -0.5,7.7 -0.5,15.3 0.2,23 0,7.2 -4.4,14.8 -11.7,16 -5.8,1.2 -12.2,-0.5 -17.3,-3.2 -5.4,0.5 -5.4,7.2 -6.3,11.4 -2.2,15.3 -12.2,27.4 -22.4,38.3 -3.4,3.5 -7.1,7.2 -7.5,12.3 -0.7,5.7 -1.7,11.9 -5.6,16.5 -7.3,9.4 -18.7,15.1 -30.4,16.3 -6.1,0.7 -11.4,-2.5 -17,-4.2 -11.9,-4.7 -23.4,-10.4 -35,-15.6 -4.6,2.2 -7.1,7.2 -10.5,10.6 2.2,5.2 8.3,6.9 11.4,11.4 4.6,4.7 9.7,9.9 11.7,16.5 0.7,6.9 0,14.6 4.1,20.5 5.4,9.4 12.7,17.5 18.5,26.7 19.5,26.7 38.9,53.6 58.2,80.2 2.7,4.2 6.1,8.4 7.5,13.1 -1.7,5.2 -8,5.9 -11.2,9.6 -8.8,6.7 -18,12.6 -26.8,19.3 -3.7,3.5 -4.9,9.1 -2.7,13.8 3.7,9.6 7.8,19 11.7,28.6 18.3,43.5 36.8,86.9 48.2,133.1 10.5,41.2 17.3,83.2 25.6,124.7 1.5,4.9 1.2,10.4 4.4,14.6 1.9,-1 0.2,-6.9 0.7,-9.9 0,-24.4 -0.5,-49.1 -5.6,-73.3 0,-4 -2.9,-8.1 -1,-12.1 9.2,9.1 15.8,21 18.3,33.8 3.9,19.5 0.5,39.8 -4.4,58.8 -1.5,5.7 -3.2,11.4 -4.9,17 -4.9,2 -7.3,-4.7 -11.4,-6.2 -10.2,-7.9 -21.2,-15.3 -33.8,-18.5 -6.8,-2 -13.9,-3.5 -20.4,-5.9 -2.7,-5.2 -2.9,-11.4 -7.1,-15.8 -7.8,-10.9 -20,-16.8 -31.6,-22.5 -5.1,-3.5 -5.4,-10.6 -9,-15.3 -7.1,-10.9 -18.5,-17.3 -29.5,-23.2 -9.2,-5.7 -16.8,-14.8 -18,-25.9 -1.5,-9.9 -2.2,-20 -5.1,-29.6 -3.9,-14.8 -10.7,-28.4 -18,-41.5 -4.6,-10.6 -5.4,-22.5 -2.9,-33.6 5.6,-36.3 8.3,-73.1 7.8,-109.9 0,-21.5 -0.7,-43 -2.9,-64.4 -1,-7.2 -3.4,-13.8 -6.1,-20.5 -1.2,5.7 0.5,11.4 0.5,17.3 0.7,7.9 1.2,16 1.7,23.9 -3.2,4.9 -6.6,-3 -7.3,-5.9 -2.7,-5.9 -5.6,-11.6 -8,-17.5 -5.4,-0.5 0,7.2 0.2,10.1 5.4,16.3 10.2,32.8 13.4,49.9 2.7,13.1 4.1,26.7 3.7,40 0,16.5 -1.7,33.1 -4.9,49.4 -1.9,8.9 -4.4,17.8 -7.8,26.2 -4.1,-2 -2.9,-8.4 -5.4,-12.1 -3.7,-10.1 -8.5,-19.5 -12.9,-29.1 -4.1,-8.6 -9.5,-17 -16.8,-23.5 -21.2,-21 -44.3,-40.2 -67.4,-59.3 -2.9,-0.7 1.7,5.2 1.9,6.9 18.5,40 45.8,74.8 71.6,110.4 9.2,12.6 18.3,25.4 26.8,38.3 0,4 -4.9,-1.7 -6.8,-1.7 -18.7,-10.4 -37.5,-21 -56.2,-31.4 -4.9,3.7 2.4,7.7 4.9,10.1 31.2,27.7 55.7,62 81.8,94.6 -1.5,6.2 -8.8,2.7 -11.2,-0.5 -11,-7.7 -21.9,-15.6 -32.9,-23.2 -1.9,2.7 1.2,9.4 -4.9,8.1 -2.9,1 -10,0.5 -10.2,2.7 20.4,13.3 41.4,25.9 62.1,39.3 5.4,3.5 11,6.9 16.6,10.1 2.9,4.7 -4.6,7.4 -6.1,11.4 -2.9,4.9 5.4,3.7 8,4.9 10.2,2.5 20.4,4.9 30.7,7.2 1,4.4 -3.4,7.4 -7.1,4.9 -15.8,-3 -31.4,-5.7 -47.2,-8.4 -2.7,5.4 6.1,5.4 9.2,7.7 25.3,10.4 50.4,20.5 75.9,30.1 4.4,2 7.5,7.7 4.9,12.3 -2.9,7.2 -8,13.1 -11.9,19.8 -4.1,6.7 -8.5,13.1 -12.4,19.8 5.1,-0.7 9.5,-4 14.4,-5.4 15.1,-5.9 30.4,-12.1 45.5,-18.3 4.9,1.5 1.7,7.4 -0.2,10.1 -2.2,4.2 -4.4,8.1 -6.1,12.6 7.5,-0.2 14.8,-2 22.1,-2.7 6.1,-0.7 12.4,-1.7 18.5,-2.2 2.9,4.4 -5.6,5.9 -7.5,8.9 -1.9,1.7 -7.8,4.4 -7.1,6.7 3.4,-0.7 10.5,0 6.3,4.9 -0.7,2.7 -5.6,8.4 -2.2,9.6 6.8,-1.2 13.6,-3.2 20.4,-4.4 4.9,0.5 0.5,7.2 0.5,10.4 -0.2,5.7 6.1,-0.2 8.5,-1 2.9,-3 10.5,-2.5 7.5,3 -2.9,3.5 -5.1,7.7 -7.8,11.4 -1,2 -6.1,7.7 -1.2,5.4 3.4,-1.5 8,-5.9 11.2,-1.5 4.4,4.7 8.3,10.6 14.4,13.3 4.6,0 8,-5.7 12.9,-2.2 7.5,2 15.1,3.2 22.6,5.2 1.7,3.2 1.9,10.6 7.1,6.7 4.1,-1.5 10.2,-0.2 11.2,4.4 1.5,3 -0.7,9.4 2.4,10.1 4.6,-2.2 7.8,-6.7 12.7,-7.9 5.8,0.2 6.1,8.4 11,10.1 4.9,0.7 10,-5.7 14.6,-1.5 5.1,5.2 2.2,14.3 8,19 1.7,1.5 9.7,1.5 5.1,4.7 -5.1,1.7 -6.6,7.9 -2.4,11.6 2.4,2.7 3.2,8.9 6.6,9.6 2.9,-3 2.9,-7.7 5.1,-11.1 1.7,-4.2 3.4,-8.4 4.9,-12.8 -1.5,-1 -8,-4 -2.9,-4 14.8,-0.2 27,-10.1 40.6,-14.6 13.1,-4.2 27,-2.7 40.4,-1.2 5.1,0.2 10.7,0.7 13.4,5.9 3.2,4 -0.7,5.4 -4.1,4.9 -5.4,0.5 -11,0.2 -16.3,1 -5.8,2 1.2,6.2 4.4,5.9 16.1,4.4 32.4,8.9 48.7,12.8 4.6,1.5 11.2,3 11.2,8.9 0,5.9 -5.6,9.4 -10.5,11.4 -10,3.5 -20.2,-0.2 -29.9,-2 -2.9,0 -9.7,-3.7 -7.5,1.5 1.7,4.4 1.5,10.9 6.8,12.6 4.9,1.5 9.7,-1.2 14.8,-1.2 7.5,-0.2 14.8,1.2 22.1,3.2 3.9,0.7 9,3.5 7.5,8.4 -1.7,6.2 -4.6,12.6 -10,16.5 -2.4,4.4 4.6,8.6 2.9,13.8 -0.2,5.7 -4.6,9.9 -9.2,12.1 -4.9,4.2 -4.1,11.1 -5.8,16.8 -1.2,5.2 -2.7,10.4 -4.6,15.3 2.4,6.2 2.2,14.6 -3.4,18.8 -5.1,4.4 -11.9,6.4 -18,9.1v85.2c-9.7,0 -19.5,0.2 -29,-0.2 -1.7,-25.9 -3.4,-51.8 -5.8,-77.8 0.7,-4.7 -4.6,-5.9 -8.3,-6.2 -4.4,-1.7 -11.2,-2.2 -12.7,3.5 -0.5,10.4 0.7,21 1.2,31.4 0.5,7.4 1,15.1 1.2,22.5 0.7,6.4 0.7,12.6 1.5,19 -0.7,2.5 2.2,8.6 -1.7,8.1h-34.3c-1.2,-9.9 -1.7,-19.8 -2.7,-29.6 -1,-13.8 -1.9,-27.4 -3.7,-41.2 -1.7,-4 -2.7,-13.1 -8.5,-10.6 -8,3 -15.6,7.4 -22.1,13.1 -4.1,3.2 -9,5.4 -13.6,8.1 -4.1,2.2 -8.3,4.7 -12.4,6.7 -5.1,0 -6.1,-7.7 -11.4,-7.2 -4.1,-0.7 -11.2,4 -13.6,-0.5 -2.9,-4.9 -11.7,-1.5 -13.1,-7.7 -0.2,-6.4 -7.1,-6.9 -11.4,-9.4 -39.2,-19 -78.4,-38.5 -117.6,-57.8 -9.2,-4.4 -19.5,-7.4 -29.7,-8.1 -7.5,-0.2 -15.1,-0.5 -22.4,1.2 1.5,3.2 6.8,1.5 9.7,3.2 11.4,3 22.9,6.9 33.8,11.4 5.6,2.7 11.4,5.2 17.3,7.9 11,5.2 21.4,11.4 32.1,17.3 11.4,6.7 22.6,13.8 34.1,21 10.2,6.2 21.4,10.9 29.5,20 4.1,4.4 7.5,9.9 10,15.6 3.9,9.6 6.6,20 8.3,30.1 0.5,4.9 1.2,9.9 0.2,14.8 -1.5,3.5 -4.1,-0.5 -6.3,0.7 -4.6,-2 -5.8,-7.7 -8.8,-11.4 -6.1,-10.4 -11.9,-20.7 -18,-31.1 -0.7,-3.5 -5.4,-2.7 -3.7,1 1.7,4.4 2.4,9.1 4.1,13.8 1,3.7 -1.2,2.7 -2.9,0.5 -13.4,-10.4 -26.5,-21 -39.9,-31.4 -1.9,-1 -5.1,-5.2 -6.6,-4 1.2,3.7 4.1,6.7 5.6,10.1 10.2,16.5 23.6,30.9 36,45.7 1,2.2 7.5,6.4 4.1,7.7 -122.2,0.5 -244.4,0.2 -366.6,0.2 -75.5,0 -151.2,0 -226.6,-0.2 -3.9,-0.7 1,-5.9 1,-8.4 11.9,-33.6 25.6,-66.9 44.8,-97 1,-2.2 7.5,-8.1 1.7,-7.7 -13.6,0.5 -27.5,1.7 -41.1,2.5 -3.9,0.2 -7.8,0.5 -11.9,0.5 -4.6,2.2 -3.4,8.9 -5.1,13.1 -2.4,11.1 -5.1,22.2 -7.5,33.3 0.5,2.7 -2.2,5.4 -2.7,1.5 -1.7,-2.7 -2.2,-9.6 -5.8,-9.1 -3.9,5.2 -7.3,11.1 -11,16.5 -1.2,2.2 -4.4,8.4 -4.9,3.2 -2.9,-3.2 -0.7,-8.4 -1.5,-12.3 -0.2,-14.3 0,-28.6 -0.5,-42.7 -2.7,-4 -8.3,0 -12.2,-0.7 -11.4,1 -23.1,2 -34.6,3.2 -3.7,3 0.5,8.1 -0.2,11.9l10.2,74.1c1,5.9 2.9,11.6 1.7,17.5 0.7,0.2 1.2,-2.7 0.7,0 -3.4,2.7 -8.8,0 -12.9,1 -3.9,1 -9.2,0 -8.3,-5.2 -2.7,-29.6 -4.9,-59.3 -7.8,-88.9 -1.2,-3.5 0.7,-11.4 -4.9,-9.4l-27,3c-3.2,4 -0.2,9.4 -1.5,14.1 0,22.7 -0.2,45.2 -1.2,67.9v18.8h-19.2c-0.5,-16.8 -1.7,-33.6 -2.2,-50.6 -0.7,-14.1 -1.2,-28.1 -1.9,-42.2 0.2,-3.2 0,-8.6 -4.6,-6.7 -17.3,1.2 -34.3,2 -51.6,3.5 -1.7,5.2 2.2,10.1 2.7,15.3 3.4,12.8 6.6,25.9 11,38.5 1.7,6.2 1.2,12.8 -1.5,18.8 -1.7,5.7 1,11.6 1.9,17.3 2.4,2.7 1.5,8.4 -2.9,6.4 -14.6,0.2 -29.2,0 -43.8,0 0,-9.9 0,-19.8 0.2,-29.6zM924.7,1887.4c-0.5,-2.7 -0.2,3.2 0,0zM1632.2,1872.1c-1,-1.5 0,1.5 0,0zM1485.7,1869.4c-13.4,-34.8 -36,-66.2 -65.2,-89.4 -15.3,-12.8 -33.1,-22.5 -51.1,-31.1 -8,-3.7 -16.1,-6.9 -24.3,-9.9 -1,2.5 5.4,5.2 7.1,7.4 10,8.6 20,17 29.9,25.7 5.8,3 0.5,-8.9 5.6,-7.9 3.4,2.5 6.3,5.4 9.5,8.4 3.9,4.9 6.6,10.9 10.5,15.8 11.2,16.3 25.1,30.4 39.2,43.9 8.5,8.1 17,16 25.3,24.2 4.9,4.2 8.8,9.1 13.9,12.8zM1630.8,1863.7c-0.7,-1.7 -0.5,1.5 0,0zM1574.6,1862.4c-1.5,0 1.2,1.7 0,0zM1600.1,1862.2c-0.7,0 0.7,1.5 0,0zM1572.1,1860.2c-1,-1.2 0.5,1.5 0,0zM1510.1,1817.5c1.7,-5.4 -6.6,-6.2 -9,-9.9 -8.3,-6.4 -16.6,-12.6 -25.1,-18.8 -4.4,3.5 3.2,6.4 5.4,8.9 8,7.2 16.3,14.3 24.8,21.2 1.5,1 3.2,0.5 3.9,-1.2zM1564.3,1812.6c4.6,-4 -1.7,-7.9 -5.4,-9.4 -14.8,-9.4 -29.7,-18.5 -44.3,-27.9 -2.2,-4.2 -10.7,-2 -7.1,2.7 4.6,3.5 9.7,5.9 14.4,9.4 10,6.7 20.2,13.1 30.4,19.8 4.1,1.2 7.3,7.7 12.2,5.7zM1486.2,1401.2c-2.9,-30.9 -11.2,-62.2 -29,-87.7 -2.7,-3.7 -6.8,-9.6 -9.2,-11.1 2.2,7.7 5.6,14.8 8,22.2 9.7,25.4 19.2,50.9 29,76 0.2,0.7 1.7,2.5 1.2,0.5zM1527.6,1381.2c-2.4,-51.4 -11.9,-102.7 -32.4,-150.1 -9.5,-22 -20.9,-42.7 -34.6,-62.2 -2.9,-4 -0.5,3.7 0.2,5.2 10.7,35.1 21.4,69.9 32.4,104.9 1.2,3.5 2.2,6.9 3.2,10.4 2.7,-4 0.7,-11.4 5.8,-13.1 5.4,0.5 3.4,7.4 4.9,10.9 6.8,34.1 13.6,67.9 20.4,102 1.2,-2.7 0,-5.4 0.2,-8.4zM1491.1,1328.1c-6.1,-32.3 -17,-64.4 -36.3,-91.6 -7.1,-9.4 -15.1,-18.3 -24.8,-24.9 -3.9,-1.2 1,4 1.2,5.7 19.2,36 38.5,71.8 57.7,107.9 0.5,0.5 2.2,4.9 1.9,3zM693.7,1275.6c3.2,-8.6 5.4,-18.5 1.2,-27.2 -2.4,-4 -1.5,3.5 -1.7,4.9 0,7.7 0,15.3 0.2,23.2l0.2,-0.5zM1392,1234.3c-0.5,-29.4 -9.2,-58 -20,-84.9 -11.4,-27.4 -26.3,-53.8 -45.8,-76 -5.4,-5.9 -11,-11.4 -17.3,-16.3 -2.9,2.7 3.4,8.4 0.2,9.9 -4.6,-1.7 -8.5,-5.2 -12.9,-6.9 -1.7,-1 -6.1,-4.2 -6.8,-2.2 27,35.8 57.2,69.6 77.9,109.9 11.7,22.2 20.2,46.4 23.6,71.4 1.9,5.9 0.7,-3.2 1,-4.7zM703.7,1200.7c0,-5.2 0.2,-10.6 -0.2,-15.8 -6.3,4.2 -10.7,11.4 -12.4,19 -1.9,10.6 2.7,21.5 8.8,29.9 0.7,2 4.4,5.4 3.4,1.2 0.2,-11.4 0.2,-22.7 0.5,-34.3zM1450.2,1209.9c-8.3,-20.5 -16.6,-41.2 -24.8,-61.7 -1.2,-4.4 -2.2,-0.2 -1.7,2 0,17.8 7.3,34.8 17.5,49.1 2.9,4.2 5.6,8.4 9.2,11.9 0.2,-0.5 0,-1 -0.2,-1.2zM1340.9,1178.3c5.6,-1.7 1.5,-7.4 -1,-10.1 -13.4,-21.2 -26.5,-42.5 -39.9,-63.5 -4.6,0.7 -5.1,5.9 -1.5,8.1l40.9,65.2c0.2,0.5 1,0.7 1.2,0.2zM1048.1,1026.7c-1.2,-0.5 0.7,2.5 0,0zM1099.7,971.4c-3.9,-5.4 -9.5,-9.4 -13.9,-14.3 -8.8,-8.6 -17.5,-17.3 -26.5,-25.4 -1.5,4 1.9,8.1 2.7,12.1 2.7,7.2 5.4,15.1 11,20.5 7.3,6.7 17.5,8.6 27,7.4z\" android:strokeWidth=\"0.326862\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_foreground_monochrome.xml",
    "content": "<vector android:height=\"108dp\" android:viewportHeight=\"2500\"\n    android:viewportWidth=\"2500\" android:width=\"108dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#ffffff\"\n        android:pathData=\"m749.2,1862.4c0,-25.9 0.7,-51.6 0.5,-77.3 -0.5,-6.4 -3.7,-13.6 -9.7,-16.3 -2.7,-3.5 -8.5,-1.7 -5.4,3 2.4,11.9 4.9,23.7 7.3,35.3 1.5,5.4 1.9,10.9 3.4,16 0.2,3.2 3.4,8.6 0.7,10.4 -4.6,0 -9.7,-4.2 -13.6,-1.7 -1,4.2 1.2,8.6 1.9,12.8 1.9,6.9 4.1,14.1 3.7,21.5 -0.2,3.7 -0.7,8.1 -3.2,11.1 -3.4,-1.2 -4.1,-6.2 -7.8,-7.4 -5.1,-1.7 -9.5,3 -14.6,3 -4.1,0.7 -7.5,3 -11.7,3.5 -4.6,2.7 -4.9,-4 -6.1,-6.9 -1.9,-5.2 -4.1,-10.6 -5.6,-16 -0.5,-5.9 -6.8,-7.7 -11.4,-9.1 -6.8,-2.7 -13.9,-5.2 -20.7,-7.9 -5.1,0.2 -7.5,-5.2 -4.1,-8.9 4.4,-12.6 9,-25.2 13.4,-37.8 1.2,-6.2 -2.4,-12.1 -7.1,-15.3 -19.5,-17.8 -38.2,-36.5 -57,-55.1 0.7,-4.9 6.6,-6.7 9.2,-10.6 9.7,-8.6 21.7,-14.8 29.2,-25.7 5.1,-7.2 7.8,-16 8.5,-24.7 0.7,-6.4 6.8,-9.6 11,-13.6 14.8,-12.3 29.7,-24.9 46,-35.3 4.4,-3 8.5,-7.2 8.3,-12.8 0.5,-5.4 -4.4,-7.7 -8.3,-9.6 -6.3,-4.9 -9.2,-13.1 -9.7,-20.7 -1.5,-6.4 -5.1,2.2 -8.3,0.7 -1.2,-4.7 -0.2,-9.9 -0.5,-14.8 0,-4.9 1.5,-11.6 0.5,-15.6 -4.6,2 -8.8,4.4 -13.1,6.9 -2.4,-2.2 1.5,-6.7 1.5,-9.6 11.4,-41 22.6,-82.2 34.1,-123.2 -4.1,3.5 -6.8,8.4 -10.2,12.6 -5.6,7.7 -12.2,15.1 -13.4,24.9 -1.2,6.7 -1,13.3 -1.5,20 -3.7,1.2 -6.6,-4.7 -8.5,-7.7 -4.1,-8.1 -3.9,-18.3 0.5,-26.4 5.1,-10.4 10.7,-20.2 16.3,-30.4 -3.9,-4.4 -10.7,0.2 -14.6,-4.4 -1.9,-5.2 5.4,-7.7 7.5,-11.6 5.6,-6.2 11.9,-11.9 19,-16.3 4.9,-3.2 5.6,-9.4 4.9,-14.8 -0.7,-9.4 -1.2,-18.8 -1.9,-28.1 -0.7,-9.4 -1.7,-18.8 -3.2,-27.9 -2.4,4 -2.7,8.6 -4.4,12.8 -3.4,11.1 -6.6,22 -10.2,33.1 -6.1,1.5 -1.9,-7.7 -4.9,-10.4 -1.9,2 -4.9,4.4 -7.1,1.2 -3.4,-3.7 -2.9,-9.1 -5.1,-13.3 -3.4,-10.4 -6.1,-21.5 -4.4,-32.3 1,-8.6 3.9,-17 4.9,-25.4 -4.9,-2.5 -10.7,-2.7 -15.6,-5.4 -7.5,-3.2 -15.8,-8.6 -17.5,-17.5 -1,-5.4 1,-11.1 3.7,-15.6 4.4,-8.4 13.4,-14.1 14.4,-24.2 1.5,-8.1 -2.4,-16 -1.9,-23.9 0.2,-17.5 6.8,-34.8 18.3,-47.7 4.9,-5.2 10.7,-8.9 17,-12.3 6.1,-4 11.2,-10.6 10.7,-18.3 0,-4.4 -1.2,-8.6 -2.4,-12.8 -4.9,-2.7 -10.5,0 -15.6,-1 -6.3,0 -12.9,0 -19.2,0.5 -8.8,-11.1 -22.1,-18.3 -29,-31.1 -3.7,-7.4 -3.4,-15.8 -4.6,-23.7 -1.9,-16 -3.9,-32.1 -4.1,-48.4 -0.2,-10.1 4.6,-19.5 7.5,-28.9 -0.5,-5.2 -6.8,-6.9 -9.5,-10.6 -4.4,-4 -8.8,-9.9 -6.8,-16.3 1.9,-6.9 8.3,-11.4 13.1,-16.3 10.5,-9.4 23.9,-14.6 36,-21.2 29.5,-15.3 58.7,-30.9 88.8,-44.7 9.2,-3.2 19.5,-2 29,-0.5 13.4,2.7 25.6,8.6 38.2,13.3 3.9,-3 7.5,-8.6 13.1,-7.4 7.1,0.7 12.7,5.9 19.5,7.4 3.2,-4.4 5.4,-9.9 10.5,-12.6 8.5,-5.4 18.7,-4.7 28.2,-5.7 6.3,-0.2 12.4,-1.7 18.3,-3.7 26.3,-6.7 53.1,-12.1 79.6,-17.8 5.1,-1.5 10,1.7 9.2,7.2 12.9,59.8 20,121 37.7,179.7 1.9,6.4 4.1,12.8 6.3,19.3 0.5,-5.4 -1.7,-10.9 -2.2,-16.3 -4.9,-26.2 -9.5,-52.6 -14.4,-78.8 2.9,-5.2 5.4,4 5.8,6.4 11.4,31.6 22.6,63.5 34.3,95.1 1.7,4.4 6.3,-1.2 3.9,-4.2 -4.1,-13.3 -7.8,-26.7 -11.7,-40.2 -9.7,-33.6 -19.2,-67.2 -29,-100.5 3.2,-2.5 5.6,4.2 8.8,5.2 39.2,32.6 78.4,65.2 117.6,97.5 4.1,-2 2.2,-8.1 4.4,-11.9 4.6,-18 9.7,-36.3 17.5,-53.1 3.2,-4.7 9.5,-5.2 14.6,-4.7 5.8,2.5 6.8,-4.9 7.1,-8.9 1.7,-8.4 3.4,-16.5 4.6,-24.9 -5.1,-3.2 -11.4,-2 -16.8,-3 -6.3,-0.5 -6.1,-7.7 -5.8,-12.3 0.5,-3.7 1.2,-12.6 -4.6,-11.6 -3.9,1.2 -4.4,-4 -6.6,-6.2 -3.4,-5.9 -10.5,-7.9 -16.8,-8.6 -5.8,-0.7 -11.7,-0.2 -17.3,-1 -1.9,-1.7 -1,-8.4 -4.9,-4.7 -2.9,1.5 -7.3,7.2 -10,4.9 0,-2.7 3.7,-10.1 -1.7,-7.4 -5.8,1 -7.5,-5.9 -10,-9.6 -4.1,-6.7 -8.8,-14.6 -6.6,-22.7 1.2,-4.9 3.9,-9.9 2.4,-15.1 -2.7,-5.4 3.9,-8.4 7.5,-10.6 3.9,-3.7 -7.8,-10.9 -0.2,-11.1 4.9,0.5 9.5,-1.2 12.9,-4.9 4.9,-5.2 7.3,-12.1 12.7,-17 3.4,-3.7 7.1,-7.2 10.7,-10.6 2.9,0.5 3.4,8.4 6.1,2.7 2.9,-3.2 4.1,-8.1 8.5,-9.9 -0.2,4 3.7,7.2 6.6,3.7 13.9,-5.4 27.7,-11.1 41.6,-17 7.5,-3 15.6,-4.4 23.6,-4 10,0.2 19,-5.2 26,-12.1 8.8,-8.6 14.8,-20.2 16.3,-32.3 2.2,-14.8 7.3,-29.1 12.4,-43.2 5.4,-14.8 13.1,-28.6 20,-43 2.7,-4.9 6.8,-8.9 10.5,-13.1 4.4,-4 10.7,-4.2 16.1,-6.2 17.3,-5.2 34.6,-9.6 52.6,-11.1 11.7,-1.2 23.4,-2 35,-3.2 5.1,1.2 -2.2,6.4 -3.7,8.4 -1.9,4.2 4.4,-0.2 6.1,-0.5 9.2,-3.7 18.7,-7.9 28.7,-7.7 12.4,-0.2 25.1,0.2 37.5,-0.5 8.3,-2.2 16.8,-6.9 25.6,-4 8.5,3.5 12.7,12.3 17.8,19.5l11,17c1,5.4 -6.1,4.2 -9.2,3 -8.5,-2.5 -17,-4.4 -25.6,-6.7 2.4,3.7 7.5,4.2 10.7,6.9 13.9,8.1 27.3,17.8 37.5,30.6 3.7,2.5 0,4.2 -2.7,3.2 -8.8,0 -17.3,-1.5 -26,-2 -3.9,-1.2 -1.9,4 1,3.2 18.5,6.9 36.8,13.8 55.3,21 1.9,-4.4 7.3,-6.2 11.4,-3.7 5.6,1.2 11.9,4.4 13.4,10.6 -0.2,3 1.9,7.7 4.1,3 1.2,-3.5 1.5,-11.4 7.1,-8.1 14.6,4 29.5,7.7 44.1,11.6 3.9,4 8.3,8.1 13.9,8.9 6.6,1.2 13.4,-0.5 19.2,-3.5 4.6,0.7 6.1,7.2 7.3,10.4 -0.7,2.7 -7.5,3.2 -5.8,5.7 5.4,1.2 11,1.2 16.6,2 4.1,0.5 8,1 12.2,1.7 -0.2,2.7 -6.8,8.9 -0.2,7.7 3.4,-0.7 8,-4 10.5,-0.2 2.4,4.9 2.7,11.6 8,14.6 4.9,2.7 7.5,8.4 6.3,13.8 -1.5,3 -3.4,8.4 1.7,8.1 4.9,0.7 5.1,6.2 1.7,8.9 -3.2,5.4 2.7,8.9 5.4,12.6 1.7,4.4 1,9.6 2.4,14.3 1,5.4 1.2,11.9 -2.9,16 -2.7,3.2 -11.2,4.4 -6.8,10.1 1.7,2.2 1.9,7.7 -2.2,4.7 -4.9,-3 -7.3,3 -8.8,6.7 -4.1,7.4 -8,15.1 -11.9,22.5 -3.4,4.2 -9.2,4.2 -13.9,6.4 -9.2,3.5 -18.5,6.4 -27.5,9.9 -1.5,2.2 2.4,7.4 -2.7,6.2 -7.5,0 -14.8,0.2 -22.4,0.2 -3.4,0.2 -7.1,0 -10.2,0.7 -10.2,6.2 -23.1,5.4 -34.1,2 -8.8,-2.5 -18,-3 -27,-2 -6.8,2.5 -9,10.4 -10.5,16.8 -1.7,10.4 0,20.7 -1,30.9 -0.5,7.7 -0.5,15.3 0.2,23 0,7.2 -4.4,14.8 -11.7,16 -5.8,1.2 -12.2,-0.5 -17.3,-3.2 -5.4,0.5 -5.4,7.2 -6.3,11.4 -2.2,15.3 -12.2,27.4 -22.4,38.3 -3.4,3.5 -7.1,7.2 -7.5,12.3 -0.7,5.7 -1.7,11.9 -5.6,16.5 -7.3,9.4 -18.7,15.1 -30.4,16.3 -6.1,0.7 -11.4,-2.5 -17,-4.2 -11.9,-4.7 -23.4,-10.4 -35,-15.6 -4.6,2.2 -7.1,7.2 -10.5,10.6 2.2,5.2 8.3,6.9 11.4,11.4 4.6,4.7 9.7,9.9 11.7,16.5 0.7,6.9 0,14.6 4.1,20.5 5.4,9.4 12.7,17.5 18.5,26.7 19.5,26.7 38.9,53.6 58.2,80.2 2.7,4.2 6.1,8.4 7.5,13.1 -1.7,5.2 -8,5.9 -11.2,9.6 -8.8,6.7 -18,12.6 -26.8,19.3 -3.7,3.5 -4.9,9.1 -2.7,13.8 3.7,9.6 7.8,19 11.7,28.6 18.3,43.5 36.8,86.9 48.2,133.1 10.5,41.2 17.3,83.2 25.6,124.7 1.5,4.9 1.2,10.4 4.4,14.6 1.9,-1 0.2,-6.9 0.7,-9.9 0,-24.4 -0.5,-49.1 -5.6,-73.3 0,-4 -2.9,-8.1 -1,-12.1 9.2,9.1 15.8,21 18.3,33.8 3.9,19.5 0.5,39.8 -4.4,58.8 -1.5,5.7 -3.2,11.4 -4.9,17 -4.9,2 -7.3,-4.7 -11.4,-6.2 -10.2,-7.9 -21.2,-15.3 -33.8,-18.5 -6.8,-2 -13.9,-3.5 -20.4,-5.9 -2.7,-5.2 -2.9,-11.4 -7.1,-15.8 -7.8,-10.9 -20,-16.8 -31.6,-22.5 -5.1,-3.5 -5.4,-10.6 -9,-15.3 -7.1,-10.9 -18.5,-17.3 -29.5,-23.2 -9.2,-5.7 -16.8,-14.8 -18,-25.9 -1.5,-9.9 -2.2,-20 -5.1,-29.6 -3.9,-14.8 -10.7,-28.4 -18,-41.5 -4.6,-10.6 -5.4,-22.5 -2.9,-33.6 5.6,-36.3 8.3,-73.1 7.8,-109.9 0,-21.5 -0.7,-43 -2.9,-64.4 -1,-7.2 -3.4,-13.8 -6.1,-20.5 -1.2,5.7 0.5,11.4 0.5,17.3 0.7,7.9 1.2,16 1.7,23.9 -3.2,4.9 -6.6,-3 -7.3,-5.9 -2.7,-5.9 -5.6,-11.6 -8,-17.5 -5.4,-0.5 0,7.2 0.2,10.1 5.4,16.3 10.2,32.8 13.4,49.9 2.7,13.1 4.1,26.7 3.7,40 0,16.5 -1.7,33.1 -4.9,49.4 -1.9,8.9 -4.4,17.8 -7.8,26.2 -4.1,-2 -2.9,-8.4 -5.4,-12.1 -3.7,-10.1 -8.5,-19.5 -12.9,-29.1 -4.1,-8.6 -9.5,-17 -16.8,-23.5 -21.2,-21 -44.3,-40.2 -67.4,-59.3 -2.9,-0.7 1.7,5.2 1.9,6.9 18.5,40 45.8,74.8 71.6,110.4 9.2,12.6 18.3,25.4 26.8,38.3 0,4 -4.9,-1.7 -6.8,-1.7 -18.7,-10.4 -37.5,-21 -56.2,-31.4 -4.9,3.7 2.4,7.7 4.9,10.1 31.2,27.7 55.7,62 81.8,94.6 -1.5,6.2 -8.8,2.7 -11.2,-0.5 -11,-7.7 -21.9,-15.6 -32.9,-23.2 -1.9,2.7 1.2,9.4 -4.9,8.1 -2.9,1 -10,0.5 -10.2,2.7 20.4,13.3 41.4,25.9 62.1,39.3 5.4,3.5 11,6.9 16.6,10.1 2.9,4.7 -4.6,7.4 -6.1,11.4 -2.9,4.9 5.4,3.7 8,4.9 10.2,2.5 20.4,4.9 30.7,7.2 1,4.4 -3.4,7.4 -7.1,4.9 -15.8,-3 -31.4,-5.7 -47.2,-8.4 -2.7,5.4 6.1,5.4 9.2,7.7 25.3,10.4 50.4,20.5 75.9,30.1 4.4,2 7.5,7.7 4.9,12.3 -2.9,7.2 -8,13.1 -11.9,19.8 -4.1,6.7 -8.5,13.1 -12.4,19.8 5.1,-0.7 9.5,-4 14.4,-5.4 15.1,-5.9 30.4,-12.1 45.5,-18.3 4.9,1.5 1.7,7.4 -0.2,10.1 -2.2,4.2 -4.4,8.1 -6.1,12.6 7.5,-0.2 14.8,-2 22.1,-2.7 6.1,-0.7 12.4,-1.7 18.5,-2.2 2.9,4.4 -5.6,5.9 -7.5,8.9 -1.9,1.7 -7.8,4.4 -7.1,6.7 3.4,-0.7 10.5,0 6.3,4.9 -0.7,2.7 -5.6,8.4 -2.2,9.6 6.8,-1.2 13.6,-3.2 20.4,-4.4 4.9,0.5 0.5,7.2 0.5,10.4 -0.2,5.7 6.1,-0.2 8.5,-1 2.9,-3 10.5,-2.5 7.5,3 -2.9,3.5 -5.1,7.7 -7.8,11.4 -1,2 -6.1,7.7 -1.2,5.4 3.4,-1.5 8,-5.9 11.2,-1.5 4.4,4.7 8.3,10.6 14.4,13.3 4.6,0 8,-5.7 12.9,-2.2 7.5,2 15.1,3.2 22.6,5.2 1.7,3.2 1.9,10.6 7.1,6.7 4.1,-1.5 10.2,-0.2 11.2,4.4 1.5,3 -0.7,9.4 2.4,10.1 4.6,-2.2 7.8,-6.7 12.7,-7.9 5.8,0.2 6.1,8.4 11,10.1 4.9,0.7 10,-5.7 14.6,-1.5 5.1,5.2 2.2,14.3 8,19 1.7,1.5 9.7,1.5 5.1,4.7 -5.1,1.7 -6.6,7.9 -2.4,11.6 2.4,2.7 3.2,8.9 6.6,9.6 2.9,-3 2.9,-7.7 5.1,-11.1 1.7,-4.2 3.4,-8.4 4.9,-12.8 -1.5,-1 -8,-4 -2.9,-4 14.8,-0.2 27,-10.1 40.6,-14.6 13.1,-4.2 27,-2.7 40.4,-1.2 5.1,0.2 10.7,0.7 13.4,5.9 3.2,4 -0.7,5.4 -4.1,4.9 -5.4,0.5 -11,0.2 -16.3,1 -5.8,2 1.2,6.2 4.4,5.9 16.1,4.4 32.4,8.9 48.7,12.8 4.6,1.5 11.2,3 11.2,8.9 0,5.9 -5.6,9.4 -10.5,11.4 -10,3.5 -20.2,-0.2 -29.9,-2 -2.9,0 -9.7,-3.7 -7.5,1.5 1.7,4.4 1.5,10.9 6.8,12.6 4.9,1.5 9.7,-1.2 14.8,-1.2 7.5,-0.2 14.8,1.2 22.1,3.2 3.9,0.7 9,3.5 7.5,8.4 -1.7,6.2 -4.6,12.6 -10,16.5 -2.4,4.4 4.6,8.6 2.9,13.8 -0.2,5.7 -4.6,9.9 -9.2,12.1 -4.9,4.2 -4.1,11.1 -5.8,16.8 -1.2,5.2 -2.7,10.4 -4.6,15.3 2.4,6.2 2.2,14.6 -3.4,18.8 -5.1,4.4 -11.9,6.4 -18,9.1v85.2c-9.7,0 -19.5,0.2 -29,-0.2 -1.7,-25.9 -3.4,-51.8 -5.8,-77.8 0.7,-4.7 -4.6,-5.9 -8.3,-6.2 -4.4,-1.7 -11.2,-2.2 -12.7,3.5 -0.5,10.4 0.7,21 1.2,31.4 0.5,7.4 1,15.1 1.2,22.5 0.7,6.4 0.7,12.6 1.5,19 -0.7,2.5 2.2,8.6 -1.7,8.1h-34.3c-1.2,-9.9 -1.7,-19.8 -2.7,-29.6 -1,-13.8 -1.9,-27.4 -3.7,-41.2 -1.7,-4 -2.7,-13.1 -8.5,-10.6 -8,3 -15.6,7.4 -22.1,13.1 -4.1,3.2 -9,5.4 -13.6,8.1 -4.1,2.2 -8.3,4.7 -12.4,6.7 -5.1,0 -6.1,-7.7 -11.4,-7.2 -4.1,-0.7 -11.2,4 -13.6,-0.5 -2.9,-4.9 -11.7,-1.5 -13.1,-7.7 -0.2,-6.4 -7.1,-6.9 -11.4,-9.4 -39.2,-19 -78.4,-38.5 -117.6,-57.8 -9.2,-4.4 -19.5,-7.4 -29.7,-8.1 -7.5,-0.2 -15.1,-0.5 -22.4,1.2 1.5,3.2 6.8,1.5 9.7,3.2 11.4,3 22.9,6.9 33.8,11.4 5.6,2.7 11.4,5.2 17.3,7.9 11,5.2 21.4,11.4 32.1,17.3 11.4,6.7 22.6,13.8 34.1,21 10.2,6.2 21.4,10.9 29.5,20 4.1,4.4 7.5,9.9 10,15.6 3.9,9.6 6.6,20 8.3,30.1 0.5,4.9 1.2,9.9 0.2,14.8 -1.5,3.5 -4.1,-0.5 -6.3,0.7 -4.6,-2 -5.8,-7.7 -8.8,-11.4 -6.1,-10.4 -11.9,-20.7 -18,-31.1 -0.7,-3.5 -5.4,-2.7 -3.7,1 1.7,4.4 2.4,9.1 4.1,13.8 1,3.7 -1.2,2.7 -2.9,0.5 -13.4,-10.4 -26.5,-21 -39.9,-31.4 -1.9,-1 -5.1,-5.2 -6.6,-4 1.2,3.7 4.1,6.7 5.6,10.1 10.2,16.5 23.6,30.9 36,45.7 1,2.2 7.5,6.4 4.1,7.7 -122.2,0.5 -244.4,0.2 -366.6,0.2 -75.5,0 -151.2,0 -226.6,-0.2 -3.9,-0.7 1,-5.9 1,-8.4 11.9,-33.6 25.6,-66.9 44.8,-97 1,-2.2 7.5,-8.1 1.7,-7.7 -13.6,0.5 -27.5,1.7 -41.1,2.5 -3.9,0.2 -7.8,0.5 -11.9,0.5 -4.6,2.2 -3.4,8.9 -5.1,13.1 -2.4,11.1 -5.1,22.2 -7.5,33.3 0.5,2.7 -2.2,5.4 -2.7,1.5 -1.7,-2.7 -2.2,-9.6 -5.8,-9.1 -3.9,5.2 -7.3,11.1 -11,16.5 -1.2,2.2 -4.4,8.4 -4.9,3.2 -2.9,-3.2 -0.7,-8.4 -1.5,-12.3 -0.2,-14.3 0,-28.6 -0.5,-42.7 -2.7,-4 -8.3,0 -12.2,-0.7 -11.4,1 -23.1,2 -34.6,3.2 -3.7,3 0.5,8.1 -0.2,11.9l10.2,74.1c1,5.9 2.9,11.6 1.7,17.5 0.7,0.2 1.2,-2.7 0.7,0 -3.4,2.7 -8.8,0 -12.9,1 -3.9,1 -9.2,0 -8.3,-5.2 -2.7,-29.6 -4.9,-59.3 -7.8,-88.9 -1.2,-3.5 0.7,-11.4 -4.9,-9.4l-27,3c-3.2,4 -0.2,9.4 -1.5,14.1 0,22.7 -0.2,45.2 -1.2,67.9v18.8h-19.2c-0.5,-16.8 -1.7,-33.6 -2.2,-50.6 -0.7,-14.1 -1.2,-28.1 -1.9,-42.2 0.2,-3.2 0,-8.6 -4.6,-6.7 -17.3,1.2 -34.3,2 -51.6,3.5 -1.7,5.2 2.2,10.1 2.7,15.3 3.4,12.8 6.6,25.9 11,38.5 1.7,6.2 1.2,12.8 -1.5,18.8 -1.7,5.7 1,11.6 1.9,17.3 2.4,2.7 1.5,8.4 -2.9,6.4 -14.6,0.2 -29.2,0 -43.8,0 0,-9.9 0,-19.8 0.2,-29.6zM924.7,1887.4c-0.5,-2.7 -0.2,3.2 0,0zM1632.2,1872.1c-1,-1.5 0,1.5 0,0zM1485.7,1869.4c-13.4,-34.8 -36,-66.2 -65.2,-89.4 -15.3,-12.8 -33.1,-22.5 -51.1,-31.1 -8,-3.7 -16.1,-6.9 -24.3,-9.9 -1,2.5 5.4,5.2 7.1,7.4 10,8.6 20,17 29.9,25.7 5.8,3 0.5,-8.9 5.6,-7.9 3.4,2.5 6.3,5.4 9.5,8.4 3.9,4.9 6.6,10.9 10.5,15.8 11.2,16.3 25.1,30.4 39.2,43.9 8.5,8.1 17,16 25.3,24.2 4.9,4.2 8.8,9.1 13.9,12.8zM1630.8,1863.7c-0.7,-1.7 -0.5,1.5 0,0zM1574.6,1862.4c-1.5,0 1.2,1.7 0,0zM1600.1,1862.2c-0.7,0 0.7,1.5 0,0zM1572.1,1860.2c-1,-1.2 0.5,1.5 0,0zM1510.1,1817.5c1.7,-5.4 -6.6,-6.2 -9,-9.9 -8.3,-6.4 -16.6,-12.6 -25.1,-18.8 -4.4,3.5 3.2,6.4 5.4,8.9 8,7.2 16.3,14.3 24.8,21.2 1.5,1 3.2,0.5 3.9,-1.2zM1564.3,1812.6c4.6,-4 -1.7,-7.9 -5.4,-9.4 -14.8,-9.4 -29.7,-18.5 -44.3,-27.9 -2.2,-4.2 -10.7,-2 -7.1,2.7 4.6,3.5 9.7,5.9 14.4,9.4 10,6.7 20.2,13.1 30.4,19.8 4.1,1.2 7.3,7.7 12.2,5.7zM1486.2,1401.2c-2.9,-30.9 -11.2,-62.2 -29,-87.7 -2.7,-3.7 -6.8,-9.6 -9.2,-11.1 2.2,7.7 5.6,14.8 8,22.2 9.7,25.4 19.2,50.9 29,76 0.2,0.7 1.7,2.5 1.2,0.5zM1527.6,1381.2c-2.4,-51.4 -11.9,-102.7 -32.4,-150.1 -9.5,-22 -20.9,-42.7 -34.6,-62.2 -2.9,-4 -0.5,3.7 0.2,5.2 10.7,35.1 21.4,69.9 32.4,104.9 1.2,3.5 2.2,6.9 3.2,10.4 2.7,-4 0.7,-11.4 5.8,-13.1 5.4,0.5 3.4,7.4 4.9,10.9 6.8,34.1 13.6,67.9 20.4,102 1.2,-2.7 0,-5.4 0.2,-8.4zM1491.1,1328.1c-6.1,-32.3 -17,-64.4 -36.3,-91.6 -7.1,-9.4 -15.1,-18.3 -24.8,-24.9 -3.9,-1.2 1,4 1.2,5.7 19.2,36 38.5,71.8 57.7,107.9 0.5,0.5 2.2,4.9 1.9,3zM693.7,1275.6c3.2,-8.6 5.4,-18.5 1.2,-27.2 -2.4,-4 -1.5,3.5 -1.7,4.9 0,7.7 0,15.3 0.2,23.2l0.2,-0.5zM1392,1234.3c-0.5,-29.4 -9.2,-58 -20,-84.9 -11.4,-27.4 -26.3,-53.8 -45.8,-76 -5.4,-5.9 -11,-11.4 -17.3,-16.3 -2.9,2.7 3.4,8.4 0.2,9.9 -4.6,-1.7 -8.5,-5.2 -12.9,-6.9 -1.7,-1 -6.1,-4.2 -6.8,-2.2 27,35.8 57.2,69.6 77.9,109.9 11.7,22.2 20.2,46.4 23.6,71.4 1.9,5.9 0.7,-3.2 1,-4.7zM703.7,1200.7c0,-5.2 0.2,-10.6 -0.2,-15.8 -6.3,4.2 -10.7,11.4 -12.4,19 -1.9,10.6 2.7,21.5 8.8,29.9 0.7,2 4.4,5.4 3.4,1.2 0.2,-11.4 0.2,-22.7 0.5,-34.3zM1450.2,1209.9c-8.3,-20.5 -16.6,-41.2 -24.8,-61.7 -1.2,-4.4 -2.2,-0.2 -1.7,2 0,17.8 7.3,34.8 17.5,49.1 2.9,4.2 5.6,8.4 9.2,11.9 0.2,-0.5 0,-1 -0.2,-1.2zM1340.9,1178.3c5.6,-1.7 1.5,-7.4 -1,-10.1 -13.4,-21.2 -26.5,-42.5 -39.9,-63.5 -4.6,0.7 -5.1,5.9 -1.5,8.1l40.9,65.2c0.2,0.5 1,0.7 1.2,0.2zM1048.1,1026.7c-1.2,-0.5 0.7,2.5 0,0zM1099.7,971.4c-3.9,-5.4 -9.5,-9.4 -13.9,-14.3 -8.8,-8.6 -17.5,-17.3 -26.5,-25.4 -1.5,4 1.9,8.1 2.7,12.1 2.7,7.2 5.4,15.1 11,20.5 7.3,6.7 17.5,8.6 27,7.4z\" android:strokeWidth=\"0.326862\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_play_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n  <path\n      android:fillColor=\"#FFFFFF\"\n      android:pathData=\"M320,760v-560l440,280 -440,280ZM400,480ZM400,614 L610,480 400,346v268Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_stop_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n  <path\n      android:pathData=\"M320,320v320,-320ZM240,720v-480h480v480L240,720ZM320,640h320v-320L320,320v320Z\"\n      android:fillColor=\"#FFFFFF\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/rounded_frame_thin.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <stroke android:width=\"2dp\"/>\n    <stroke android:color=\"@color/primaryDark\" />\n    <corners android:radius=\"3dp\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/rounded_solid.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/primaryDark\"/>\n    <corners android:radius=\"5dp\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_manage_languages.xml",
    "content": "<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:keepScreenOn=\"true\"\n    android:fitsSystemWindows=\"true\"\n    tools:context=\".ManageLanguagesActivity\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:orientation=\"vertical\"\n            android:layout_weight=\"4\">\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"10dp\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginEnd=\"16dp\"\n                android:layout_marginBottom=\"10dp\"\n                android:orientation=\"vertical\"\n                android:gravity=\"center_horizontal\">\n\n                <TextView\n                    android:layout_marginTop=\"10dp\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center\"\n                    android:padding=\"10dp\"\n                    android:textStyle=\"bold\"\n                    android:textAllCaps=\"true\"\n                    android:background=\"@drawable/rounded_solid\"\n                    android:textColor=\"@color/white\"\n                    android:textSize=\"22dp\"\n                    android:text=\"@string/download_language\" />\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center\"\n                    android:padding=\"10dp\"\n                    android:textStyle=\"bold\"\n                    android:textAllCaps=\"true\"\n                    android:textColor=\"@android:color/holo_red_dark\"\n                    android:textSize=\"12dp\"\n                    android:text=\"@string/one_model_per_language\" />\n\n                <Button\n                    android:id=\"@+id/button_test_voices\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"10dp\"\n                    android:layout_gravity=\"center_horizontal\"\n                    android:text=\"@string/test_languages\"\n                    android:textAllCaps=\"true\"\n                    android:backgroundTint=\"@color/primaryDark\"\n                    android:textColor=\"@color/white\"\n                    android:onClick=\"testVoices\"/>\n\n                <TextView\n                    android:id=\"@+id/download_size\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginVertical=\"10dp\"\n                    android:layout_marginStart=\"10dp\"\n                    android:layout_marginEnd=\"10dp\"\n                    android:layout_gravity=\"center_horizontal\"\n                    android:textColor=\"@color/primaryDark\"\n                    android:visibility=\"gone\"\n                    android:textSize=\"18dp\"\n                    android:text=\"0 MB\" />\n\n                <Button\n                    android:id=\"@+id/button_start\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"10dp\"\n                    android:layout_gravity=\"center_horizontal\"\n                    android:text=\"@string/start_main\"\n                    android:visibility=\"gone\"\n                    android:backgroundTint=\"@color/primaryDark\"\n                    android:textColor=\"@color/white\"\n                    android:onClick=\"startMain\"/>\n\n                <Button\n                    android:id=\"@+id/button_install_from_sd\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"10dp\"\n                    android:layout_gravity=\"center_horizontal\"\n                    android:text=\"@string/install_from_sd\"\n                    android:visibility=\"visible\"\n                    android:backgroundTint=\"@color/primaryDark\"\n                    android:textColor=\"@color/white\"\n                    android:textStyle=\"bold\"\n                    android:textAllCaps=\"true\"\n                    android:onClick=\"installFromSD\"/>\n\n            </LinearLayout>\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginEnd=\"16dp\"\n                android:layout_marginBottom=\"10dp\"\n                android:orientation=\"vertical\"\n                android:gravity=\"center_horizontal\">\n\n                <TextView\n                    android:id=\"@+id/piper_header\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"10dp\"\n                    android:padding=\"10dp\"\n                    android:gravity=\"center_horizontal\"\n                    android:textColor=\"@color/white\"\n                    android:textStyle=\"bold\"\n                    android:textAllCaps=\"true\"\n                    android:background=\"@drawable/rounded_solid\"\n                    android:textSize=\"18dp\"\n                    android:text=\"@string/piper_models\"/>\n                <ListView\n                    android:id=\"@+id/piper_model_list\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"1\"\n                    android:layout_marginHorizontal=\"5dp\" />\n                <TextView\n                    android:id=\"@+id/coqui_header\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginVertical=\"10dp\"\n                    android:padding =\"10dp\"\n                    android:gravity=\"center_horizontal\"\n                    android:textColor=\"@color/white\"\n                    android:textStyle=\"bold\"\n                    android:textAllCaps=\"true\"\n                    android:background=\"@drawable/rounded_solid\"\n                    android:textSize=\"18dp\"\n                    android:text=\"@string/coqui_models\"/>\n                <ListView\n                    android:id=\"@+id/coqui_model_list\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_weight=\"1\"\n                    android:layout_marginHorizontal=\"5dp\" />\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n    </LinearLayout>\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_install_custom_model.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:padding=\"16dp\">\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/enter_language_code\"\n        android:textStyle=\"bold\" />\n\n    <EditText\n        android:id=\"@+id/editTextLangCode\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:hint=\"e.g. eng\"\n        android:inputType=\"text\"\n        android:maxLines=\"1\"\n        android:ems=\"10\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"8dp\" />\n\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Model Name\"\n        android:textStyle=\"bold\" />\n\n    <EditText\n        android:id=\"@+id/editTextModelName\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:hint=\"e.g., English Male Voice\"\n        android:inputType=\"text\"\n        android:maxLines=\"1\"\n        android:ems=\"10\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"8dp\" />\n\n    <Button\n        android:id=\"@+id/buttonSelectModel\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/select_model_file\"\n        android:backgroundTint=\"@color/primaryDark\"\n        android:layout_marginTop=\"8dp\" />\n\n    <Button\n        android:id=\"@+id/buttonSelectTokens\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/select_tokens_file\"\n        android:backgroundTint=\"@color/primaryDark\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"8dp\" />\n\n    <Button\n        android:id=\"@+id/buttonInstall\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:backgroundTint=\"@color/primaryDark\"\n        android:text=\"@android:string/ok\"\n        android:textStyle=\"bold\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/rounded_frame_thin\"\n    android:paddingVertical=\"10dp\">\n        <TextView\n            android:id=\"@+id/text_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center\"\n            android:textColor=\"@color/primaryDark\"\n            android:textSize=\"18sp\" />\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n    <monochrome android:drawable=\"@drawable/ic_launcher_foreground_monochrome\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/values/arrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string-array name=\"piper_models\">\n        <item>ar_JO-kareem-low</item>\n        <item>ar_JO-kareem-medium</item>\n        <item>ar_JO-SA_dii-high</item>\n        <item>ar_JO-SA_miro-high</item>\n        <item>ar_JO-SA_miro_V2-high</item>\n        <item>ca_ES-upc_ona-medium</item>\n        <item>ca_ES-upc_ona-x_low</item>\n        <item>ca_ES-upc_pau-x_low</item>\n        <item>ca_ES-upc_pau-x_low</item>\n        <item>cs_CZ-jirka-low</item>\n        <item>cs_CZ-jirka-medium</item>\n        <item>cy_GB-bu_tts-medium</item>\n        <item>cy_GB-gwryw_gogleddol-medium</item>\n        <item>da_DK-talesyntese-medium</item>\n        <item>de_DE-dii-high</item>\n        <item>de_DE-eva_k-x_low</item>\n        <item>de_DE-glados-low</item>\n        <item>de_DE-glados-medium</item>\n        <item>de_DE-glados-high</item>\n        <item>de_DE-glados_turret-low</item>\n        <item>de_DE-glados_turret-medium</item>\n        <item>de_DE-glados_turret-high</item>\n        <item>de_DE-karlsson-low</item>\n        <item>de_DE-kerstin-low</item>\n        <item>de_DE-miro-high</item>\n        <item>de_DE-pavoque-low</item>\n        <item>de_DE-ramona-low</item>\n        <item>de_DE-thorsten-high</item>\n        <item>de_DE-thorsten-low</item>\n        <item>de_DE-thorsten-medium</item>\n        <item>de_DE-thorsten_emotional-medium</item>\n        <item>el_GR-rapunzelina-low</item>\n        <item>en_GB-alan-low</item>\n        <item>en_GB-alan-medium</item>\n        <item>en_GB-alba-medium</item>\n        <item>en_GB-aru-medium</item>\n        <item>en_GB-cori-high</item>\n        <item>en_GB-cori-medium</item>\n        <item>en_GB-dii-high</item>\n        <item>en_GB-jenny_dioco-medium</item>\n        <item>en_GB-miro-high</item>\n        <item>en_GB-northern_english_male-medium</item>\n        <item>en_GB-semaine-medium</item>\n        <item>en_GB-southern_english_female-low</item>\n        <item>en_GB-southern_english_female-medium</item>\n        <item>en_GB-southern_english_male-medium</item>\n        <item>en_GB-sweetbbak-amy</item>\n        <item>en_GB-vctk-medium</item>\n        <item>en_US-amy-low</item>\n        <item>en_US-amy-medium</item>\n        <item>en_US-arctic-medium</item>\n        <item>en_US-bryce-medium</item>\n        <item>en_US-danny-low</item>\n        <item>en_US-glados</item>\n        <item>en_US-glados-high</item>\n        <item>en_US-hfc_female-medium</item>\n        <item>en_US-hfc_male-medium</item>\n        <item>en_US-joe-medium</item>\n        <item>en_US-john-medium</item>\n        <item>en_US-kathleen-low</item>\n        <item>en_US-kristin-medium</item>\n        <item>en_US-kusal-medium</item>\n        <item>en_US-l2arctic-medium</item>\n        <item>en_US-lessac-high</item>\n        <item>en_US-lessac-low</item>\n        <item>en_US-lessac-medium</item>\n        <item>en_US-libritts-high</item>\n        <item>en_US-libritts_r-medium</item>\n        <item>en_US-ljspeech-high</item>\n        <item>en_US-ljspeech-medium</item>\n        <item>en_US-miro-high</item>\n        <item>en_US-norman-medium</item>\n        <item>en_US-ryan-high</item>\n        <item>en_US-ryan-low</item>\n        <item>en_US-ryan-medium</item>\n        <item>es_AR-daniela-high</item>\n        <item>es_ES-carlfm-x_low</item>\n        <item>es_ES-davefx-medium</item>\n        <item>es_ES-glados-medium</item>\n        <item>es_ES-miro-high</item>\n        <item>es_ES-sharvard-medium</item>\n        <item>es_MX-ald-medium</item>\n        <item>es_MX-claude-high</item>\n        <item>fa_IR-amir-medium</item>\n        <item>fa_IR-ganji-medium</item>\n        <item>fa_IR-ganji_adabi-medium</item>\n        <item>fa_IR-gyro-medium</item>\n        <item>fa_IR-reza_ibrahim-medium</item>\n        <item>fa_en-rezahedayatfar-ibrahimwalk-medium</item>\n        <item>fi_FI-harri-low</item>\n        <item>fi_FI-harri-medium</item>\n        <item>fr_FR-gilles-low</item>\n        <item>fr_FR-miro-high</item>\n        <item>fr_FR-siwis-low</item>\n        <item>fr_FR-siwis-medium</item>\n        <item>fr_FR-tjiho-model1</item>\n        <item>fr_FR-tjiho-model2</item>\n        <item>fr_FR-tjiho-model3</item>\n        <item>fr_FR-tom-medium</item>\n        <item>fr_FR-upmc-medium</item>\n        <item>hi_IN-pratham-medium</item>\n        <item>hi_IN-priyamvada-medium</item>\n        <item>hi_IN-rohan-medium</item>\n        <item>hu_HU-anna-medium</item>\n        <item>hu_HU-berta-medium</item>\n        <item>hu_HU-imre-medium</item>\n        <item>id_ID-news_tts-medium</item>\n        <item>is_IS-bui-medium</item>\n        <item>is_IS-salka-medium</item>\n        <item>is_IS-steinn-medium</item>\n        <item>is_IS-ugla-medium</item>\n        <item>it_IT-dii-high</item>\n        <item>it_IT-miro-high</item>\n        <item>it_IT-paola-medium</item>\n        <item>it_IT-riccardo-x_low</item>\n        <item>ka_GE-natia-medium</item>\n        <item>kk_KZ-iseke-x_low</item>\n        <item>kk_KZ-issai-high</item>\n        <item>kk_KZ-raya-x_low</item>\n        <item>lv_LV-aivars-medium</item>\n        <item>lb_LU-marylux-medium</item>\n        <item>ne_NP-chitwan-medium</item>\n        <item>ne_NP-google-medium</item>\n        <item>ne_NP-google-x_low</item>\n        <item>nl_BE-nathalie-medium</item>\n        <item>nl_BE-nathalie-x_low</item>\n        <item>nl_BE-rdh-medium</item>\n        <item>nl_BE-rdh-x_low</item>\n        <item>nl_NL-dii-high</item>\n        <item>nl_NL-miro-high</item>\n        <item>no_NO-talesyntese-medium</item>\n        <item>pl_PL-darkman-medium</item>\n        <item>pl_PL-gosia-medium</item>\n        <item>pl_PL-jarvis_wg_glos-medium</item>\n        <item>pl_PL-justyna_wg_glos-medium</item>\n        <item>pl_PL-mc_speech-medium</item>\n        <item>pl_PL-meski_wg_glos-medium</item>\n        <item>pl_PL-zenski_wg_glos-medium</item>\n        <item>pt_BR-cadu-medium</item>\n        <item>pt_BR-edresson-low</item>\n        <item>pt_BR-dii-high</item>\n        <item>pt_BR-faber-medium</item>\n        <item>pt_BR-jeff-medium</item>\n        <item>pt_BR-miro-high</item>\n        <item>pt_PT-dii-high</item>\n        <item>pt_PT-miro-high</item>\n        <item>pt_PT-tugao-medium</item>\n        <item>ro_RO-mihai-medium</item>\n        <item>ru_RU-denis-medium</item>\n        <item>ru_RU-dmitri-medium</item>\n        <item>ru_RU-irina-medium</item>\n        <item>ru_RU-ruslan-medium</item>\n        <item>sk_SK-lili-medium</item>\n        <item>sl_SI-artur-medium</item>\n        <item>sr_RS-serbski_institut-medium</item>\n        <item>sv_SE-lisa-medium</item>\n        <item>sv_SE-nst-medium</item>\n        <item>sw_CD-lanfrica-medium</item>\n        <item>tr_TR-dfki-medium</item>\n        <item>tr_TR-fahrettin-medium</item>\n        <item>tr_TR-fettah-medium</item>\n        <item>uk_UA-lada-x_low</item>\n        <item>uk_UA-ukrainian_tts-medium</item>\n        <item>vi_VN-25hours_single-low</item>\n        <item>vi_VN-vais1000-medium</item>\n        <item>vi_VN-vivos-x_low</item>\n        <item>zh_CN-huayan-medium</item>\n    </string-array>\n\n    <string-array name=\"coqui_models\">\n        <item>bg-cv</item>\n        <item>bn-custom_female</item>\n        <item>cs-cv</item>\n        <item>da-cv</item>\n        <item>de-css10</item>\n        <item>en-ljspeech</item>\n        <item>en-ljspeech-neon</item>\n        <item>en-vctk</item>\n        <item>es-css10</item>\n        <item>et-cv</item>\n        <item>fi-css10</item>\n        <item>fr-css10</item>\n        <item>ga-cv</item>\n        <item>hr-cv</item>\n        <item>lt-cv</item>\n        <item>lv-cv</item>\n        <item>mt-cv</item>\n        <item>nl-css10</item>\n        <item>pl-mai_female</item>\n        <item>pt-cv</item>\n        <item>ro-cv</item>\n        <item>sk-cv</item>\n        <item>sl-cv</item>\n        <item>sv-cv</item>\n        <item>uk-mai</item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"primaryDark\">#0b62c2</color>\n    <color name=\"white\">#FFFFFFFF</color>\n    <color name=\"grey\">#888888</color>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">@color/primaryDark</color>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\" translatable=\"false\">SherpaTTS</string>\n    <string name=\"start_main\">START</string>\n    <string name=\"error_download\">Download error</string>\n    <string name=\"dialog_StarOnGitHub\">Do you like this app? Please give a star on GitHub or buy the developer a coffee via PayPal.</string>\n    <string name=\"dialog_Later_button\">Maybe later</string>\n    <string name=\"play\">Play</string>\n    <string name=\"stop\">Stop</string>\n    <string name=\"speed\">Speed</string>\n    <string name=\"speaker_id\">Speaker ID:</string>\n    <string name=\"language_id\">Language\\u2009</string>\n    <string name=\"input\">Text to generate</string>\n    <string name=\"download_language\">Download language</string>\n    <string name=\"test_languages\">Try models</string>\n    <string name=\"add_language\">Add language</string>\n    <string name=\"delete_language\">Delete language</string>\n    <string name=\"piper_models\">Piper models</string>\n    <string name=\"coqui_models\">Coqui models</string>\n    <string name=\"apply_system_speed\">Apply system settings (speed / pitch) for use as system-wide TTS engine</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"one_model_per_language\">Only 1 model per language!</string>\n    <string name=\"strip_ssml\">Strip SSML tags (beta)</string>\n    <string name=\"install_from_sd\">Install Piper Model from SD</string>\n    <string name=\"enter_language_code\">3-letter ISO 639-2 code</string>\n    <string name=\"enter_model_name\">Enter model name</string>\n    <string name=\"select_model_file\">Select model.onnx file</string>\n    <string name=\"select_tokens_file\">Select tokens.txt file</string>\n       <string name=\"cancel\">Cancel</string>\n    <string name=\"language_code_error\">Invalid language code. Please enter a 3-letter code.</string>\n    <string name=\"language_already_installed\">Language already installed</string>\n    <string name=\"error_copying_files\">Error copying files</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"Theme.SherpaOnnxTtsEngine\" parent=\"Theme.Material3.Light.NoActionBar\">\n        <item name=\"colorPrimaryDark\">@color/primaryDark</item>\n    </style>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-cs/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_StarOnGitHub\">Líbí se vám tato aplikace? Přidejte si ji do oblíbených na GitHubu nebo kupte vývojáři kafe pomocí PayPalu.</string>\n    <string name=\"download_language\">Stáhnout jazyk</string>\n    <string name=\"start_main\">SPUSTIT</string>\n    <string name=\"error_download\">Chyba při stahování</string>\n    <string name=\"dialog_Later_button\">Možná později</string>\n    <string name=\"play\">Přehrát</string>\n    <string name=\"stop\">Zastavit</string>\n    <string name=\"speed\">Rychlost</string>\n    <string name=\"speaker_id\">ID mluvčího:</string>\n    <string name=\"language_id\">Jazyk </string>\n    <string name=\"input\">Text k vytvoření</string>\n    <string name=\"test_languages\">Vyzkoušet modely</string>\n    <string name=\"add_language\">Přidat jazyk</string>\n    <string name=\"delete_language\">Odstranit jazyk</string>\n    <string name=\"piper_models\">Modely Piper</string>\n    <string name=\"coqui_models\">Modely Coqui</string>\n    <string name=\"apply_system_speed\">Použít systémová nastavení (rychlost / výška) pro použití jako systémový modul TTS</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-de/strings.xml",
    "content": "<resources>\n    <string name=\"start_main\">LOS GEHT\\'S</string>\n    <string name=\"error_download\">Fehler beim Herunterladen</string>\n    <string name=\"dialog_StarOnGitHub\">Mögen Sie diese App? Bitte vergeben Sie einen Stern auf GitHub oder spendieren Sie dem Entwickler einen Kaffee über PayPal.</string>\n    <string name=\"dialog_Later_button\">Vielleicht später</string>\n    <string name=\"play\">Abspielen</string>\n    <string name=\"stop\">Anhalten</string>\n    <string name=\"speed\">Geschwindigkeit</string>\n    <string name=\"speaker_id\">Sprecher ID:</string>\n    <string name=\"language_id\">Sprache\\u2009</string>\n    <string name=\"input\">Text für die Sprachausgabe</string>\n    <string name=\"download_language\">Sprache herunterladen</string>\n    <string name=\"test_languages\">Modelle testen</string>\n    <string name=\"add_language\">Sprache hinzufügen</string>\n    <string name=\"delete_language\">Sprache löschen</string>\n    <string name=\"piper_models\">Piper Modelle</string>\n    <string name=\"coqui_models\">Coqui Modelle</string>\n    <string name=\"apply_system_speed\">Einstellungen des Systems (Geschwindigkeit / Tonlage) bei Verwendung als systemweite Sprachausgabe anwenden</string>\n    <string name=\"volume\">Lautstärke</string>\n    <string name=\"one_model_per_language\">Nur 1 Modell je Sprache!</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-hu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"start_main\">INDÍTÁS</string>\n    <string name=\"error_download\">Letöltési hiba</string>\n    <string name=\"dialog_StarOnGitHub\">Tetszik ez az alkalmazás? Adjon egy csillagot a GitHub-on, vagy vegyen a fejlesztőnek egy kávét a PayPal-on keresztül.</string>\n    <string name=\"dialog_Later_button\">Talán később</string>\n    <string name=\"play\">Lejátszás</string>\n    <string name=\"stop\">Leállítás</string>\n    <string name=\"speed\">Sebesség</string>\n    <string name=\"language_id\">Nyelv </string>\n    <string name=\"input\">Létrehozandó szöveg</string>\n    <string name=\"download_language\">Nyelv letöltése</string>\n    <string name=\"test_languages\">Próbáljon ki modelleket</string>\n    <string name=\"add_language\">Nyelv hozzáadása</string>\n    <string name=\"delete_language\">Nyelv törlése</string>\n    <string name=\"piper_models\">Piper modellek</string>\n    <string name=\"coqui_models\">Coqui modellek</string>\n    <string name=\"apply_system_speed\">Rendszerbeállítások (sebesség / hangmagasság) alkalmazása a rendszer egészére kiterjedő TTS-motorként való használathoz</string>\n    <string name=\"speaker_id\">Hangszóró azonosító:</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-it/strings.xml",
    "content": "<resources>\n    <string name=\"start_main\">AVVIA</string>\n    <string name=\"error_download\">Errore durante lo scaricamento</string>\n    <string name=\"dialog_StarOnGitHub\">Ti piace questa app? Perfavore dai una stella su GitHub o offri un caffè allo sviluppatore tramite PayPal.</string>\n    <string name=\"dialog_Later_button\">Forse dopo</string>\n    <string name=\"play\">Play</string>\n    <string name=\"stop\">Stop</string>\n    <string name=\"speed\">Velocità</string>\n    <string name=\"speaker_id\">Speaker ID:</string>\n    <string name=\"language_id\">Lingua\\u2009</string>\n    <string name=\"input\">Testo per generare</string>\n    <string name=\"download_language\">Scarica lingua</string>\n    <string name=\"test_languages\">Prova i modelli</string>\n    <string name=\"add_language\">Aggiungi lingua</string>\n    <string name=\"delete_language\">Elimina lingua</string>\n    <string name=\"piper_models\">Modelli Piper</string>\n    <string name=\"coqui_models\">Modelli Coqui</string>\n    <string name=\"apply_system_speed\">Applicare le impostazioni di sistema (velocità/tono) per l\\'utilizzo come motore TTS a livello di sistema</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-pt-rBR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"start_main\">INICIAR</string>\n    <string name=\"error_download\">Erro ao baixar</string>\n    <string name=\"dialog_StarOnGitHub\">Você gosta desse app? Então por favor dê uma estrela no GitHub ou compre um café para o desenvolvedor pelo PayPal.</string>\n    <string name=\"dialog_Later_button\">Talvez depois</string>\n    <string name=\"play\">Reproduzir</string>\n    <string name=\"stop\">Parar</string>\n    <string name=\"speed\">Velocidade</string>\n    <string name=\"speaker_id\">ID de falante:</string>\n    <string name=\"language_id\">Idioma </string>\n    <string name=\"input\">Texto para gerar</string>\n    <string name=\"download_language\">Baixar idioma</string>\n    <string name=\"test_languages\">Testar modelos</string>\n    <string name=\"add_language\">Adicionar idioma</string>\n    <string name=\"delete_language\">Excluir idioma</string>\n    <string name=\"piper_models\">Modelos Piper</string>\n    <string name=\"coqui_models\">Modelos Coqui</string>\n    <string name=\"apply_system_speed\">Aplicar configurações do sistema (velocidade / timbre) para uso do motor de TTS no sistema inteiro</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ro/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"start_main\">PORNEȘTE</string>\n    <string name=\"error_download\">Eroare la descărcare</string>\n    <string name=\"dialog_StarOnGitHub\">Îți place această aplicație? Pune o stea pe Github sau cumpără dezvoltatorului o cafea prin PayPal.</string>\n    <string name=\"dialog_Later_button\">Poate mai târziu</string>\n    <string name=\"play\">Redă</string>\n    <string name=\"stop\">Oprește</string>\n    <string name=\"speed\">Ritmul vorbirii</string>\n    <string name=\"speaker_id\">ID vorbitor:</string>\n    <string name=\"language_id\">Limbă </string>\n    <string name=\"input\">Text pentru a genera</string>\n    <string name=\"download_language\">Descarcă limba</string>\n    <string name=\"test_languages\">Încearcă modele</string>\n    <string name=\"add_language\">Adaugă limba</string>\n    <string name=\"delete_language\">Șterge limba</string>\n    <string name=\"piper_models\">Modele ”Piper”</string>\n    <string name=\"coqui_models\">Modele ”Coqui”</string>\n    <string name=\"app_name\">Sintetizator vorbire SherpaTTS</string>\n    <string name=\"apply_system_speed\">Aplică setările sistemului (ritmul vorbirii/înălțime) pentru utilizarea ca motor TTS la nivel de sistem</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"dialog_StarOnGitHub\">Вам нравится это приложение? Пожалуйста, поставьте звездочку на GitHub или купите кофе разработчику через PayPal.</string>\n    <string name=\"download_language\">Скачать язык</string>\n    <string name=\"speaker_id\">ID говорящего:</string>\n    <string name=\"dialog_Later_button\">Может быть попозже</string>\n    <string name=\"play\">Воспроизвести</string>\n    <string name=\"stop\">Остановить</string>\n    <string name=\"speed\">Скорость</string>\n    <string name=\"language_id\">Язык </string>\n    <string name=\"input\">Текст для генерации</string>\n    <string name=\"test_languages\">Попробуйте модели</string>\n    <string name=\"delete_language\">Удалить язык</string>\n    <string name=\"piper_models\">Модели Piper</string>\n    <string name=\"coqui_models\">Модели Coqui</string>\n    <string name=\"start_main\">НАЧАТЬ</string>\n    <string name=\"add_language\">Добавить язык</string>\n    <string name=\"error_download\">Ошибка при скачивании</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-tr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"error_download\">İndirme hatası</string>\n    <string name=\"dialog_Later_button\">Belki daha sonra</string>\n    <string name=\"play\">Oynat</string>\n    <string name=\"stop\">Durdur</string>\n    <string name=\"speed\">Konuşma hızı</string>\n    <string name=\"speaker_id\">Konuşmacı Kimliği:</string>\n    <string name=\"language_id\">Dil </string>\n    <string name=\"input\">Oluşturulacak metin</string>\n    <string name=\"download_language\">Dil İndir</string>\n    <string name=\"test_languages\">Model örneklerine göz atın</string>\n    <string name=\"add_language\">Dil ekle</string>\n    <string name=\"delete_language\">Dili sil</string>\n    <string name=\"piper_models\">Piper modelleri</string>\n    <string name=\"coqui_models\">Coqui modelleri</string>\n    <string name=\"start_main\">BAŞLAT</string>\n    <string name=\"dialog_StarOnGitHub\">Bu uygulamayı beğendiniz mi? Lütfen GitHub\\'da bir yıldız verin veya geliştiriciye PayPal aracılığıyla bir kahve ısmarlayın.</string>\n    <string name=\"apply_system_speed\">Sistem genelinde sentezleyici motoru olarak kullanmak için sistem ayarlarını (hız / perde) uygula</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/xml/data_extraction_rules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample data extraction rules file; uncomment and customize as necessary.\n   See https://developer.android.com/about/versions/12/backup-restore#xml-changes\n   for details.\n-->\n<data-extraction-rules>\n    <cloud-backup>\n        <exclude domain=\"root\"/>\n        <exclude domain=\"file\"/>\n        <exclude domain=\"database\"/>\n        <exclude domain=\"sharedpref\"/>\n        <exclude domain=\"external\"/>\n    </cloud-backup>\n\n    <device-transfer>\n        <exclude domain=\"root\"/>\n        <exclude domain=\"file\"/>\n        <exclude domain=\"database\"/>\n        <exclude domain=\"sharedpref\"/>\n        <exclude domain=\"external\"/>\n    </device-transfer>\n</data-extraction-rules>"
  },
  {
    "path": "app/src/main/res/xml/tts_engine.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<tts-engine xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:settingsActivity=\"com.k2fsa.sherpa.onnx.tts.engine.MainActivity\"\n    >\n</tts-engine>"
  },
  {
    "path": "build.gradle.kts",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nplugins {\n    id(\"com.android.application\") version \"8.2.2\" apply false\n    id(\"org.jetbrains.kotlin.android\") version \"1.9.0\" apply false\n}"
  },
  {
    "path": "fastlane/metadata/android/cs-CZ/full_description.txt",
    "content": "SherpaTTS je převodník textu na řeč pro systém Android založený na hlasech nové generace Kaldi používajících hlasy Piper a Coqui.\nPo prvním spuštění aplikace si budete moci stáhnout váš upřednostňovaný jazyk ze služby Hugging Face.\nToto je jediná chvíle, kde je vyžadováno připojení k internetu.\nJakmile bude model stažen, bude převod textu na řeč fungovat kompletně offline, čímž bude zajištěno vaše soukromí a pohodlí.\n"
  },
  {
    "path": "fastlane/metadata/android/cs-CZ/short_description.txt",
    "content": "Převodník textu na řeč založený na Kaldi nové generace\n"
  },
  {
    "path": "fastlane/metadata/android/cs-CZ/title.txt",
    "content": "SherpaTTS\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/12.txt",
    "content": "Initial version for F-Droid"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/13.txt",
    "content": "Support for multiple languages\nBugfixes"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/14.txt",
    "content": "Delete languages"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/15.txt",
    "content": "Add Coqui models\nTranslation for Russian, Czech, Portuguese (Brazil), Romanian, Turkish"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/16.txt",
    "content": "Option speed/pitch from system settings\nTranslations"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/17.txt",
    "content": "Add option to adjust volume\nBugfixes"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/18.txt",
    "content": "Translations\nCode improvement"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/19.txt",
    "content": "Remove from system backup"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/20.txt",
    "content": "Hint in download activity"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/21.txt",
    "content": "New Piper models added"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/22.txt",
    "content": "New Piper models added"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/23.txt",
    "content": "Update for Android 15 (SDK 35)\nAdditional Piper models"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/24.txt",
    "content": "More Piper models"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/25.txt",
    "content": "Adjust volume for each language\nBugfix"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/26.txt",
    "content": "More Piper models\nDeprecation warning\nCode clean up"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/27.txt",
    "content": "TTS Engine caching\nAdditional German model"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/28.txt",
    "content": "More Arabic Piper models"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/29.txt",
    "content": "Improved sideloading of other models"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/30.txt",
    "content": "Add option to filter SSML"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/31.txt",
    "content": "Improved sideloading"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "content": "SherpaTTS is an Android Text-to-Speech engine based on Next-gen Kaldi using Piper or Coqui voices.\nUpon launching the app for the first time, it will download your preferred voice model from Hugging Face. \nPlease note that this is the only instance where internet permission is required. \nOnce the model is downloaded, text-to-speech works entirely offline, ensuring your privacy and convenience."
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "content": "Text-to-Speech engine based on Next-gen Kaldi"
  },
  {
    "path": "fastlane/metadata/android/en-US/title.txt",
    "content": "SherpaTTS"
  },
  {
    "path": "fastlane/metadata/android/hu-HU/full_description.txt",
    "content": "A SherpaTTS egy Androidos szövegfelolvasó motor, amely az újgenerációs Kaldin alapul, valamint a Piper vagy Coqui hangokat használja.\nAz alkalmazás első indításakor a program letölti a kívánt hangmodellt az Hugging Face-ről. \nFelhívjuk figyelmét, hogy ez az egyetlen eset, amikor internet-hozzáférésre van szükség. \nA modell letöltése után a szövegfelolvasó funkció teljesen offline működik, így biztosítva az Ön magánéletét és kényelmét.\n"
  },
  {
    "path": "fastlane/metadata/android/hu-HU/short_description.txt",
    "content": "Újgenerációs Kaldi alapú szövegfelolvasó\n"
  },
  {
    "path": "fastlane/metadata/android/hu-HU/title.txt",
    "content": "SherpaTTS\n"
  },
  {
    "path": "fastlane/metadata/android/it-IT/full_description.txt",
    "content": "SherpaTTS è un motore Text-to-Speech Android basato su Kaldi di nuova generazione che utilizza le voci Piper o Coqui.\nAl primo avvio dell'app, verrà scaricato il modello vocale preferito da Hugging Face.\nSi prega di notare che questa è l'unico momento in cui è richiesta l'autorizzazione Internet.\nUna volta scaricato il modello, il text-to-speech funziona completamente offline, garantendo la privacy e la comodità."
  },
  {
    "path": "fastlane/metadata/android/it-IT/short_description.txt",
    "content": "Motore di sintesi vocale basato su Kaldi di nuova generazione"
  },
  {
    "path": "fastlane/metadata/android/it-IT/title.txt",
    "content": "SherpaTTS"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/full_description.txt",
    "content": "O SherpaTTS é um motor de texto-para-fala para Android baseado no Kaldi de próxima geração, usando vozes Piper ou Coqui.\nAo abrir o app pela primeira vez, ele baixará seu modelo de voz preferido do Hugging Face.\nNote que essa é o único uso da permissão de internet.\nQuando o modelo for baixado, o texto-para-fala funcionará completamente off-line, garantindo sua privacidade e conveniência.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/short_description.txt",
    "content": "Motor de texto-para-fala baseado no Kaldi de próxima geração\n"
  },
  {
    "path": "fastlane/metadata/android/ro/full_description.txt",
    "content": "SherpaTTS este un motor Android text-în-vorbire bazat pe Kaldi de ultimă generație folosind vocile Piper sau Coqui.\nLa lansarea aplicației pentru prima dată, acesta va descărca modelul vocii preferate de la Hugging Face.\nReține că aceasta este singura instanță în care este necesară permisiunea de internet.\nOdată ce modelul este descărcat, text-în-vorbire funcționează complet offline, asigurându-ți confidențialitatea și comoditatea.\n"
  },
  {
    "path": "fastlane/metadata/android/ro/short_description.txt",
    "content": "Motorul Text-to-Speech bazat pe Next-gen Kaldi\n"
  },
  {
    "path": "fastlane/metadata/android/ro/title.txt",
    "content": "SherpaTTS\n"
  },
  {
    "path": "fastlane/metadata/android/ru-RU/full_description.txt",
    "content": "SherpaTTS — это преобразователь Текста в Речь (Text-to-Speech, TTS) основанный на Next-gen Kaldi, использующий голоса Piper или Coqui.\nПри первом запуске приложения оно загрузит выбранную вами голосовую модель из Hugging Face.\nОбратите внимание, что это единственный раз когда потребуется разрешение на пользование интернетом.\nПосле загрузки модели текстовые речи работают полностью автономно, обеспечивая конфиденциальность и удобство.\n"
  },
  {
    "path": "fastlane/metadata/android/ru-RU/short_description.txt",
    "content": "Преобразование текста в речь используя Next-gen Kaldi\n"
  },
  {
    "path": "fastlane/metadata/android/ru-RU/title.txt",
    "content": "SherpaTTS Синтез Речи\n"
  },
  {
    "path": "fastlane/metadata/android/tr-TR/full_description.txt",
    "content": "SherpaTTS, Piper veya Coqui seslerini kullanan Yeni Nesil Kaldi tabanlı bir Android Metinden Konuşmaya motorudur.\nUygulamayı ilk kez başlattığınızda, Hugging Face'ten tercih ettiğiniz ses modelini indirecektir.\nLütfen bunun internet izninin gerekli olduğu tek durum olduğunu unutmayın.\nModel indirildikten sonra, metinden konuşmaya tamamen çevrimdışı çalışır ve gizliliğinizi ve rahatlığınızı garanti eder.\n"
  },
  {
    "path": "fastlane/metadata/android/tr-TR/short_description.txt",
    "content": "Yeni nesil Kaldi tabanlı Metinden Konuşmaya motoru\n"
  },
  {
    "path": "fastlane/metadata/android/tr-TR/title.txt",
    "content": "SherpaTTS\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.6-bin.zip\ndistributionPath=wrapper/dists\nzipStorePath=wrapper/dists\ndistributionSha256Sum=9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c\nzipStoreBase=GRADLE_USER_HOME\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official\n# Enables namespacing of each library's R class so that its R class includes only the\n# resources declared in the library itself and none from the library's dependencies,\n# thereby reducing the size of the R class for that library\nandroid.nonTransitiveRClass=true"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or 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#      https://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\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=`expr $i + 1`\n    done\n    case $i in\n        0) set -- ;;\n        1) set -- \"$args0\" ;;\n        2) set -- \"$args0\" \"$args1\" ;;\n        3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=`save \"$@\"`\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto execute\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto execute\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "language.txt",
    "content": "def get_piper_models() -> List[TtsModel]:\n    models = [\n        #  TtsModel(model_dir=\"vits-piper-es_ES-mls_10246-low\"),\n        #  TtsModel(model_dir=\"vits-piper-es_ES-mls_9972-low\"),\n        #  TtsModel(model_dir=\"vits-piper-pl_PL-mls_6892-low\"),\n        TtsModel(model_dir=\"vits-piper-ar_JO-kareem-low\"),\n        TtsModel(model_dir=\"vits-piper-ar_JO-kareem-medium\"),\n        TtsModel(model_dir=\"vits-piper-ca_ES-upc_ona-medium\"),\n        TtsModel(model_dir=\"vits-piper-ca_ES-upc_ona-x_low\"),\n        TtsModel(model_dir=\"vits-piper-ca_ES-upc_pau-x_low\"),\n        TtsModel(model_dir=\"vits-piper-ca_ES-upc_pau-x_low\"),\n        TtsModel(model_dir=\"vits-piper-cs_CZ-jirka-medium\"),\n        TtsModel(model_dir=\"vits-piper-cy_GB-gwryw_gogleddol-medium\"),\n        TtsModel(model_dir=\"vits-piper-da_DK-talesyntese-medium\"),\n        TtsModel(model_dir=\"vits-piper-de_DE-eva_k-x_low\"),\n        TtsModel(model_dir=\"vits-piper-de_DE-karlsson-low\"),\n        TtsModel(model_dir=\"vits-piper-de_DE-kerstin-low\"),\n        #  TtsModel(model_dir=\"vits-piper-de_DE-mls-medium\"),\n        TtsModel(model_dir=\"vits-piper-de_DE-pavoque-low\"),\n        TtsModel(model_dir=\"vits-piper-de_DE-ramona-low\"),\n        TtsModel(model_dir=\"vits-piper-de_DE-thorsten-high\"),\n        TtsModel(model_dir=\"vits-piper-de_DE-thorsten-low\"),\n        TtsModel(model_dir=\"vits-piper-de_DE-thorsten-medium\"),\n        TtsModel(model_dir=\"vits-piper-de_DE-thorsten_emotional-medium\"),\n        TtsModel(model_dir=\"vits-piper-el_GR-rapunzelina-low\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-alan-low\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-alan-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-alba-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-aru-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-cori-high\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-cori-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-jenny_dioco-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-northern_english_male-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-semaine-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-southern_english_female-low\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-southern_english_female-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-southern_english_male-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-sweetbbak-amy\"),\n        TtsModel(model_dir=\"vits-piper-en_GB-vctk-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-amy-low\"),\n        TtsModel(model_dir=\"vits-piper-en_US-amy-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-arctic-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-bryce-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-danny-low\"),\n        TtsModel(model_dir=\"vits-piper-en_US-glados\"),\n        TtsModel(model_dir=\"vits-piper-en_US-hfc_female-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-hfc_male-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-joe-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-john-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-kathleen-low\"),\n        TtsModel(model_dir=\"vits-piper-en_US-kristin-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-kusal-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-l2arctic-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-lessac-high\"),\n        TtsModel(model_dir=\"vits-piper-en_US-lessac-low\"),\n        TtsModel(model_dir=\"vits-piper-en_US-lessac-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-libritts-high\"),\n        TtsModel(model_dir=\"vits-piper-en_US-libritts_r-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-ljspeech-high\"),\n        TtsModel(model_dir=\"vits-piper-en_US-ljspeech-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-norman-medium\"),\n        TtsModel(model_dir=\"vits-piper-en_US-ryan-high\"),\n        TtsModel(model_dir=\"vits-piper-en_US-ryan-low\"),\n        TtsModel(model_dir=\"vits-piper-en_US-ryan-medium\"),\n        TtsModel(model_dir=\"vits-piper-es-glados-medium\"),\n        TtsModel(model_dir=\"vits-piper-es_ES-carlfm-x_low\"),\n        TtsModel(model_dir=\"vits-piper-es_ES-davefx-medium\"),\n        TtsModel(model_dir=\"vits-piper-es_ES-sharvard-medium\"),\n        TtsModel(model_dir=\"vits-piper-es_MX-ald-medium\"),\n        TtsModel(model_dir=\"vits-piper-es_MX-claude-high\"),\n        TtsModel(model_dir=\"vits-piper-fa_IR-amir-medium\"),\n        TtsModel(model_dir=\"vits-piper-fa_IR-gyro-medium\"),\n        TtsModel(model_dir=\"vits-piper-fa_en-rezahedayatfar-ibrahimwalk-medium\"),\n        TtsModel(model_dir=\"vits-piper-fi_FI-harri-low\"),\n        TtsModel(model_dir=\"vits-piper-fi_FI-harri-medium\"),\n        #  TtsModel(model_dir=\"vits-piper-fr_FR-mls-medium\"),\n        TtsModel(model_dir=\"vits-piper-fr_FR-siwis-low\"),\n        TtsModel(model_dir=\"vits-piper-fr_FR-siwis-medium\"),\n        TtsModel(model_dir=\"vits-piper-fr_FR-tom-medium\"),\n        TtsModel(model_dir=\"vits-piper-fr_FR-upmc-medium\"),\n        TtsModel(model_dir=\"vits-piper-hu_HU-anna-medium\"),\n        TtsModel(model_dir=\"vits-piper-hu_HU-berta-medium\"),\n        TtsModel(model_dir=\"vits-piper-hu_HU-imre-medium\"),\n        TtsModel(model_dir=\"vits-piper-is_IS-bui-medium\"),\n        TtsModel(model_dir=\"vits-piper-is_IS-salka-medium\"),\n        TtsModel(model_dir=\"vits-piper-is_IS-steinn-medium\"),\n        TtsModel(model_dir=\"vits-piper-is_IS-ugla-medium\"),\n        TtsModel(model_dir=\"vits-piper-it_IT-paola-medium\"),\n        TtsModel(model_dir=\"vits-piper-it_IT-riccardo-x_low\"),\n        TtsModel(model_dir=\"vits-piper-ka_GE-natia-medium\"),\n        TtsModel(model_dir=\"vits-piper-kk_KZ-iseke-x_low\"),\n        TtsModel(model_dir=\"vits-piper-kk_KZ-issai-high\"),\n        TtsModel(model_dir=\"vits-piper-kk_KZ-raya-x_low\"),\n        TtsModel(model_dir=\"vits-piper-lv_LV-aivars-medium\"),\n        TtsModel(model_dir=\"vits-piper-lb_LU-marylux-medium\"),\n        TtsModel(model_dir=\"vits-piper-ne_NP-google-medium\"),\n        TtsModel(model_dir=\"vits-piper-ne_NP-google-x_low\"),\n        TtsModel(model_dir=\"vits-piper-nl_BE-nathalie-medium\"),\n        TtsModel(model_dir=\"vits-piper-nl_BE-nathalie-x_low\"),\n        TtsModel(model_dir=\"vits-piper-nl_BE-rdh-medium\"),\n        TtsModel(model_dir=\"vits-piper-nl_BE-rdh-x_low\"),\n        #  TtsModel(model_dir=\"vits-piper-nl_NL-mls-medium\"),\n        #  TtsModel(model_dir=\"vits-piper-nl_NL-mls_5809-low\"),\n        #  TtsModel(model_dir=\"vits-piper-nl_NL-mls_7432-low\"),\n        TtsModel(model_dir=\"vits-piper-no_NO-talesyntese-medium\"),\n        TtsModel(model_dir=\"vits-piper-pl_PL-darkman-medium\"),\n        TtsModel(model_dir=\"vits-piper-pl_PL-gosia-medium\"),\n        TtsModel(model_dir=\"vits-piper-pl_PL-mc_speech-medium\"),\n        TtsModel(model_dir=\"vits-piper-pt_BR-edresson-low\"),\n        TtsModel(model_dir=\"vits-piper-pt_BR-faber-medium\"),\n        TtsModel(model_dir=\"vits-piper-pt_PT-tugao-medium\"),\n        TtsModel(model_dir=\"vits-piper-ro_RO-mihai-medium\"),\n        TtsModel(model_dir=\"vits-piper-ru_RU-denis-medium\"),\n        TtsModel(model_dir=\"vits-piper-ru_RU-dmitri-medium\"),\n        TtsModel(model_dir=\"vits-piper-ru_RU-irina-medium\"),\n        TtsModel(model_dir=\"vits-piper-ru_RU-ruslan-medium\"),\n        TtsModel(model_dir=\"vits-piper-sk_SK-lili-medium\"),\n        TtsModel(model_dir=\"vits-piper-sl_SI-artur-medium\"),\n        TtsModel(model_dir=\"vits-piper-sr_RS-serbski_institut-medium\"),\n        TtsModel(model_dir=\"vits-piper-sv_SE-nst-medium\"),\n        TtsModel(model_dir=\"vits-piper-sw_CD-lanfrica-medium\"),\n        TtsModel(model_dir=\"vits-piper-tr_TR-dfki-medium\"),\n        TtsModel(model_dir=\"vits-piper-tr_TR-fahrettin-medium\"),\n        TtsModel(model_dir=\"vits-piper-tr_TR-fettah-medium\"),\n        TtsModel(model_dir=\"vits-piper-uk_UA-lada-x_low\"),\n        TtsModel(model_dir=\"vits-piper-uk_UA-ukrainian_tts-medium\"),\n        TtsModel(model_dir=\"vits-piper-vi_VN-25hours_single-low\"),\n        TtsModel(model_dir=\"vits-piper-vi_VN-vais1000-medium\"),\n        TtsModel(model_dir=\"vits-piper-vi_VN-vivos-x_low\"),\n        TtsModel(model_dir=\"vits-piper-zh_CN-huayan-medium\"),\n\n\n\ndef get_coqui_models() -> List[TtsModel]:\n    # English (coqui-ai/TTS)\n    models = [\n        TtsModel(model_dir=\"vits-coqui-en-ljspeech\"),\n        TtsModel(model_dir=\"vits-coqui-en-ljspeech-neon\"),\n        TtsModel(model_dir=\"vits-coqui-en-vctk\"),\n        #  TtsModel(model_dir=\"vits-coqui-en-jenny\"),\n    ]\n\n    for m in models:\n        m.data_dir = m.model_dir + \"/\" + \"espeak-ng-data\"\n        m.model_name = \"model.onnx\"\n        m.lang = \"en\"\n\n    character_models = [\n        TtsModel(model_dir=\"vits-coqui-bg-cv\", lang=\"bg\"),\n        TtsModel(model_dir=\"vits-coqui-bn-custom_female\", lang=\"bn\"),\n        TtsModel(model_dir=\"vits-coqui-cs-cv\", lang=\"cs\"),\n        TtsModel(model_dir=\"vits-coqui-da-cv\", lang=\"da\"),\n        TtsModel(model_dir=\"vits-coqui-de-css10\", lang=\"de\"),\n        TtsModel(model_dir=\"vits-coqui-es-css10\", lang=\"es\"),\n        TtsModel(model_dir=\"vits-coqui-et-cv\", lang=\"et\"),\n        TtsModel(model_dir=\"vits-coqui-fi-css10\", lang=\"fi\"),\n        TtsModel(model_dir=\"vits-coqui-fr-css10\", lang=\"fr\"),\n        TtsModel(model_dir=\"vits-coqui-ga-cv\", lang=\"ga\"),\n        TtsModel(model_dir=\"vits-coqui-hr-cv\", lang=\"hr\"),\n        TtsModel(model_dir=\"vits-coqui-lt-cv\", lang=\"lt\"),\n        TtsModel(model_dir=\"vits-coqui-lv-cv\", lang=\"lv\"),\n        TtsModel(model_dir=\"vits-coqui-mt-cv\", lang=\"mt\"),\n        TtsModel(model_dir=\"vits-coqui-nl-css10\", lang=\"nl\"),\n        TtsModel(model_dir=\"vits-coqui-pl-mai_female\", lang=\"pl\"),\n        TtsModel(model_dir=\"vits-coqui-pt-cv\", lang=\"pt\"),\n        TtsModel(model_dir=\"vits-coqui-ro-cv\", lang=\"ro\"),\n        TtsModel(model_dir=\"vits-coqui-sk-cv\", lang=\"sk\"),\n        TtsModel(model_dir=\"vits-coqui-sl-cv\", lang=\"sl\"),\n        TtsModel(model_dir=\"vits-coqui-sv-cv\", lang=\"sv\"),\n        TtsModel(model_dir=\"vits-coqui-uk-mai\", lang=\"uk\"),\n    ]\n    for m in character_models:\n        m.is_char = True\n        m.model_name = \"model.onnx\"\n\n    return models + character_models"
  },
  {
    "path": "settings.gradle.kts",
    "content": "pluginManagement {\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google()\n        mavenCentral()\n        maven {\n            setUrl(\"https://jitpack.io\")\n        }\n    }\n}\n\nrootProject.name = \"SherpaOnnxTtsEngine\"\ninclude(\":app\")\n"
  }
]