FAQ | This is a LIVE service | Changelog

Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • ssb22/gradint
  • st822/gradint
2 results
Show changes
Commits on Source (368)
Showing
with 1673 additions and 238 deletions
*~
__pycache__
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
# This file is part of the source code of
# gradint v0.9974 (c) 2002-2011 Silas S. Brown. GPL v3+.
# This file is part of the source code of Gradint
# (c) Silas S. Brown.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
......@@ -9,41 +9,44 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# Do NOT run with "make -j" or other parallelisations - some of these rules have conflicting tempfiles
# Stuff in Extra_Data does not have to be present,
# but if present will be included in all versions.
# Use this for bundling Gradint with partials-synths,
# preset-collections, encoders, whatever, into one
# installer for giving to someone.
# installer for giving to someone. Note that you can
# support both Windows and Linux using a single bundle
# with win2linux.sh (see comments at top of that script)
Extra_Data=partials *_disabled [^g]*.exe
All_Versions=gradint-build.7z gradint.exe gradint.tbz gradint.bgz gradint.zip gradintcab.zip gradint-S60.zip servertools.bgz
All_Versions=gradint-build.7z gradint.exe gradint.tbz gradint.bgz gradint.zip gradintcab.zip gradint-S60.zip gradint-android.zip servertools.bgz
# dropping gradint-noGUI.exe and GUI.exe for now - probably don't need that separation anymore
SHELL=/bin/bash
EData := $(shell for N in $(Extra_Data); do if test -e $$N; then echo $$N; fi; done)
SevenZip = `(export PATH="/other/downloads/7zip/bin/:$$HOME/bin/p7zip-for-gradint:$$PATH" ; which 7z || which 7za || which 7zr) 2>/dev/null` -y
EData := $(shell for N in $(Extra_Data); do if [ -e $$N ]; then echo $$N; fi; done)
Common_Files=vocab.txt settings.txt advanced.txt samples $(EData)
Most_Mac_Files=$(Common_Files) gradint.py
Mac_Files=$(Most_Mac_Files) mac/start-gradint.app
Linux_Files=$(Common_Files) gradint.py INSTALL.txt
Linux_Files=$(Common_Files) gradint.py install.sh
Riscos_Files=$(Common_Files) gradint.py
CODE=src/lessonplan.py src/sequence.py src/loop.py src/booktime.py src/play.py src/synth.py src/makeevent.py src/filescan.py src/recording.py src/users.py
SETUP=src/top.py src/defaults.py src/system.py
TOP=src/top.py
SETUP=src/defaults.py src/system.py
ENDING=src/frontend.py
SOURCES=$(SETUP) $(CODE) $(ENDING)
gradint.py: $(SOURCES) cleanup
chmod +w gradint.py 2>/dev/null || true
cat $(SOURCES) > gradint.py
(cat $(TOP);for N in $(SOURCES); do awk 'BEGIN {p=1} /^# This file is part of the source code of Gradint/ {p=0} /^$$/ {p=1} // {if(p) print}' < $$N; done) > gradint.py
chmod a-w gradint.py
chmod +x gradint.py
python -c "import gradint" && rm -f gradint.pyc # just to make sure it compiles
python2 -c "import gradint" && rm -f gradint.pyc # just to make sure it compiles in Python 2
python3 -c "import gradint" && rm -f gradint.pyc # just to make sure it compiles in Python 3 as well
# Do NOT run with "make -j" or other parallelisations - some of these rules have conflicting tempfiles
.NOTPARALLEL:
src/defaults.py: settings.txt advanced.txt Makefile
echo "# This is the start of defaults.py - configuration defaults, automatically extracted from default settings.txt and advanced.txt, so user customisations don't have to be complete (helps with upgrades)" > src/defaults.py
......@@ -51,23 +54,23 @@ src/defaults.py: settings.txt advanced.txt Makefile
gradint.exe: $(Common_Files) gradint.py
rm -rf windows0 ; cp -r windows windows0
cd windows0 && $(SevenZip) x gradint.7z && rm gradint.7z && cd ..
cd windows0/gradint && $(SevenZip) x ../espeak-windows.7z && rm ../espeak-windows.7z && cd ../.. # bundled copy of eSpeak that unpacks in espeak/
cd windows0 && $(SevenZip) x ../windowsGUI/gradint.7z && cd ..
cd windows0 && 7za x gradint.7z && rm gradint.7z && cd ..
cd windows0/gradint && 7za x ../espeak-windows.7z -aoa && rm ../espeak-windows.7z && cd ../.. # bundled copy of eSpeak that unpacks in espeak/
cd windows0 && 7za x ../windowsGUI/gradint.7z -aoa && cd ..
cp -r $(Common_Files) windows0/gradint/
mv windows0/gradint/samples/utils "windows0/gradint/samples/advanced utilities"
for N in hanzi-prompts/*.txt; do python -c "open('windows0/gradint/samples/prompts/$$(echo $$N|sed -e s,.*/,,)','w').write('\\xef\\xbb\\xbf'+open('$$N').read())"; done # overwriting the pinyin ones (as will bundle espeak so can translit.)
for N in hanzi-prompts/*.txt; do python2 -c "open('windows0/gradint/samples/prompts/$$(echo $$N|sed -e s,.*/,,)','w').write('\\xef\\xbb\\xbf'+open('$$N').read())"; done # overwriting the pinyin ones (as will bundle espeak so can translit.)
zip -0 windows0/gradint/library.zip gradint.py # (important to have no compression)
for N in windows0/gradint/*.txt windows0/gradint/*/*.txt windows0/gradint/*/*.txt windows0/*.bat windows0/*/*.bat windows0/7zip.conf; do python -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n $$N; done
for N in windows0/gradint/*.txt windows0/gradint/*/*.txt windows0/gradint/*/*.txt windows0/*.bat windows0/*/*.bat windows0/7zip.conf; do python2 -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n "$$N"; done
# add a utf-8 BOM to start of vocab.txt, to ensure Notepad saves it in utf-8
cd windows0/gradint && python -c 'open("v2","w").write("\xef\xbb\xbf"+open("vocab.txt").read())' && mv v2 vocab.txt && cd ../..
cd windows0/gradint && python -c 'open("v2","w").write("\xef\xbb\xbf"+open("advanced.txt").read())' && mv v2 advanced.txt && cd ../..
cd windows0/gradint && python2 -c 'open("v2","w").write("\xef\xbb\xbf"+open("vocab.txt").read())' && mv v2 vocab.txt && cd ../..
cd windows0/gradint && python2 -c 'open("v2","w").write("\xef\xbb\xbf"+open("advanced.txt").read())' && mv v2 advanced.txt && cd ../..
# can trim down the shortcuts, as the GUI now gives access to them
cd windows0/shortcuts; rm "advanced setup.bat" "advanced utilities.bat" "General setup.bat" "Prompts.bat" "Recorded words.bat" "Synthesized words.bat" ; mv "Main program.bat" Gradint.bat ; cd ../..
# shortcuts: Don't use .lnk files, they are far too horrible (even if you put %HOMEDRIVE%%HOMEPATH% in the shortcut, it still stores the original location, and you can't reliably create them on the client without delving rediculously deep into Windows programming). Perhaps could use .url files, but we just use small batch files. Prepend a common header to each one. (NB it won't work to try to force the sort order by calling things _uninstall, ~uninstall, etc, unless you want Z_uninstall, Z_advanced etc)
cd windows0/shortcuts ; mv header.bat bat_header ; for N in *.bat ../startup/*.bat; do if ! test "$$N" == uninstall.bat; then cat bat_header "$$N" > n ; mv n "$$N"; fi; done ; rm bat_header ; cd ../..
# now run 7zip (look in a few extra places for it, and give it its full path in argv[0])
cd windows0 ; $(SevenZip) a data.7z setup.bat gradint shortcuts startup ; cd ..
cd windows0 ; 7za a data.7z setup.bat gradint shortcuts startup ; cd ..
cat windows0/7zS.sfx windows0/7zip.conf windows0/data.7z > gradint.exe
rm -rf windows0
......@@ -77,21 +80,21 @@ RecorderL1=zh
RecorderL2=en
recorder.exe: $(Common_Files) gradint.py
rm -rf windows0 ; cp -r windows windows0
cd windows0 && $(SevenZip) x gradint.7z && rm gradint.7z && cd ..
cd windows0 && 7za x gradint.7z && rm gradint.7z && cd ..
rm windows0/espeak-windows.7z
cd windows0 && $(SevenZip) x ../windowsGUI/gradint.7z && cd ..
cd windows0 && 7za x ../windowsGUI/gradint.7z && cd ..
cp -r $(Common_Files) windows0/gradint/
rm -rf windows0/gradint/samples/utils windows0/gradint/samples/prompts windows0/gradint/samples/README.txt
rm -f windows0/gradint/madplay.exe windows0/gradint/sox.exe windows0/gradint/ptts.exe
zip -0 windows0/gradint/library.zip gradint.py
cp extras/lame.exe extras/zip.exe windows0/gradint/
cp extras/zip.exe windows0/gradint/ # 2017-05: moved lame.exe from extras/ to windows/gradint.7z as patents have expired
mv windows0/gradint windows0/recorder
echo $$'@echo off\ncd recorder\ngradint-wrapper.exe recorderMode=1\nif not exist ..\\recorder.bat copy runme.bat ..\\recorder.bat\nif exist ..\\recorder.exe del ..\\recorder.exe\nexit' > windows0/recorder/runme.bat
# (replace the .exe with a .bat in case they try to open it again from desktop and get confused by unzip's "overwrite" prompt)
# (NB must say 'start' below for the above del to work)
echo 'firstLanguage="$(RecorderL1)";secondLanguage="$(RecorderL2)"' > windows0/recorder/settings.txt
for N in windows0/recorder/*.bat windows0/recorder/*.txt; do python -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n $$N; done
cd windows0; zip -9r recorder.zip recorder/ ; cd ..
for N in windows0/recorder/*.bat windows0/recorder/*.txt; do python2 -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n "$$N"; done
cd windows0; 7za a recorder.zip recorder/ ; cd ..
echo '$$AUTORUN$$>start /min recorder\runme.bat' | zip -z windows0/recorder.zip
cat yali-voice/unzipsfx.exe windows0/recorder.zip > recorder.exe
zip -A recorder.exe
......@@ -99,37 +102,45 @@ recorder.exe: $(Common_Files) gradint.py
gradint.cab: $(Common_Files) gradint.py
rm -rf PocketPC0 ; cp -r PocketPC PocketPC0
cd PocketPC0 && $(SevenZip) x espeak.7z && $(SevenZip) x tkinter.7z && rm espeak.7z tkinter.7z pocketpc-cab && cd ..
cd PocketPC0 && 7za x espeak.7z && 7za x tkinter.7z && rm espeak.7z tkinter.7z pocketpc-cab && cd ..
cp -r $(Common_Files) PocketPC0/gradint
cd PocketPC0/gradint && python ../../thindown.py wince < ../../gradint.py > gradint.py && cd ../..
# if using partials, must combine them for CAB:
for Dir in PocketPC0/gradint/partials/*/*; do if cd $$Dir; then if wc -c *.raw | grep -v total$$ | sed -e 's/^ *//' > audiodata.dat ; then cat *.raw >> audiodata.dat ; rm *.raw; else rm -f audiodata.dat; fi; cd ../../../../..; else true; fi; done
chmod +w PocketPC0/gradint/gradint.py # saves problems with pocketpc-cab
rm -rf PocketPC0/gradint/samples/utils # no point having those on Windows Mobile
for N in PocketPC0/gradint/*.txt; do python -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n $$N; done
cd PocketPC0/gradint && python -c 'open("v2","w").write("\xef\xbb\xbf"+open("vocab.txt").read())' && mv v2 vocab.txt && cd ../..
cd PocketPC0/gradint && python -c 'open("v2","w").write("\xef\xbb\xbf"+open("advanced.txt").read())' && mv v2 advanced.txt && cd ../..
for N in PocketPC0/gradint/*.txt; do python2 -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n "$$N"; done
cd PocketPC0/gradint && python2 -c 'open("v2","w").write("\xef\xbb\xbf"+open("vocab.txt").read())' && mv v2 vocab.txt && cd ../..
cd PocketPC0/gradint && python2 -c 'open("v2","w").write("\xef\xbb\xbf"+open("advanced.txt").read())' && mv v2 advanced.txt && cd ../..
# PocketPC/espeak-data contains the altered phon* files in case the eSpeak version is slightly different, but we should be able to re-use the dictionaries etc
$(SevenZip) x windows/espeak-windows.7z && mv PocketPC0/espeak-data/* espeak/espeak-data && rmdir PocketPC0/espeak-data && mv espeak/espeak-data PocketPC0 && rm -rf espeak PocketPC0/espeak-data/mbrola*
7za x windows/espeak-windows.7z && mv PocketPC0/espeak-data/* espeak/espeak-data && rmdir PocketPC0/espeak-data && mv espeak/espeak-data PocketPC0 && rm -rf espeak PocketPC0/espeak-data/mbrola*
# Problem: we MUST have everything in ONE directory if it is to go on the storage card, otherwise it will go on the internal disk (which is a shame because the uninstall won't track where we really put things) (and no putting a file at top-level of device does not work)
cd PocketPC0 && mv bin Progra* espeak-data gradint && cd ..
# compile PocketPC espeak:
# (if compiling 1.04.03 remember the changes posted to espeak-general 2010-09-13)
# make speak CXX=arm-wince-pe-g++ USE_AUDIO="-DNEED_GETOPT -DNEED_WCHAR_FUNCTIONS -DWINCE" LIB_AUDIO=
# python -c 'd=open("speak","rb").read().replace("/temp/wcetrace.log","/notexist/tracelog") ; open("speak","wb").write(d)'
# python2 -c 'd=open("speak","rb").read().replace("/temp/wcetrace.log","/notexist/tracelog") ; open("speak","wb").write(d)'
# then add to PocketPC/espeak.7z in bin/
cd PocketPC0 && find . -type f | sort -f | grep -v /mb | grep -v /files.list | sed -e 's,./\(.*\)$$,\1 /\1,' -e 's,/\([^/]*\)/\([^/]*\)$$,/\1,' -e 's, /[^/]*.py$$, /,' -e 's/Program Files/Program~Files/g' > files.list && cd ..
cd PocketPC0 && export PATH="/other/downloads/7zip/bin/:$$HOME/bin/p7zip-for-gradint:$$PATH" && ../PocketPC/pocketpc-cab -p "" -a "Gradint $$(head gradint/gradint.py | grep program_name | sed -e 's/.*t v/v/' -e 's/(c).*//')" files.list ../gradint.cab && cd ..
# (need pocketpc-cab and lcab binaries for that to work)
test -e gradint.cab # pocketpc-cab can fail silently if we add too many files, so check the output exists
[ -e gradint.cab ] # pocketpc-cab can fail silently if we add too many files, so check the output exists
rm -rf PocketPC0
gradint-S60.zip: $(Common_Files) gradint.py
gradint-S60.zip: $(Common_Files) gradint.py README-S60.txt
cp S60.zip gradint-S60.zip
zip -9r gradint-S60.zip $(Common_Files)
7za a gradint-S60.zip $(Common_Files) README-S60.txt
zip -d gradint-S60.zip 'samples/utils*' # no point having those on S60
mkdir gradint
cd gradint && python ../thindown.py s60 < ../gradint.py > gradint.py && zip -9r ../gradint-S60.zip gradint.py && cd ..
cd gradint && python ../thindown.py s60 < ../gradint.py > gradint.py && 7za a ../gradint-S60.zip gradint.py && cd ..
rm -rf gradint
gradint-android.zip: $(Common_Files) gradint.py
7za a gradint-android.zip $(Common_Files)
zip -d gradint-android.zip 'samples/utils*'
mkdir gradint
echo 'import gradint0;gradint0.main()' > gradint/gradint.py # QPython tends to load faster if we have a simple wrapper script
cd gradint && python ../thindown.py android < ../gradint.py > gradint0.py && 7za a ../gradint-android.zip gradint*.py && cd ..
rm -rf gradint
gradintcab.zip: gradint.cab
......@@ -138,39 +149,39 @@ gradintcab.zip: gradint.cab
gradint-noGUI.exe: $(Common_Files) gradint.py
rm -rf windows0 ; cp -r windows windows0
cd windows0 && $(SevenZip) x gradint.7z && rm gradint.bgz && cd ..
cd windows0/gradint && $(SevenZip) x ../espeak-windows.bgz && rm ../espeak-windows.bgz && cd ../.. # bundled copy of eSpeak that unpacks in espeak/
cd windows0 && 7za x gradint.7z && rm gradint.bgz && cd ..
cd windows0/gradint && 7za x ../espeak-windows.bgz && rm ../espeak-windows.bgz && cd ../.. # bundled copy of eSpeak that unpacks in espeak/
cp -r $(Common_Files) windows0/gradint/
mv windows0/gradint/samples/utils "windows0/gradint/samples/advanced utilities"
zip -0 windows0/gradint/library.zip gradint.py # (important to have no compression)
for N in windows0/gradint/*.txt windows0/gradint/*/*.txt windows0/gradint/*/*.txt windows0/*.bat windows0/*/*.bat windows0/7zip.conf; do python -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n $$N; done
for N in windows0/gradint/*.txt windows0/gradint/*/*.txt windows0/gradint/*/*.txt windows0/*.bat windows0/*/*.bat windows0/7zip.conf; do python2 -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n "$$N"; done
# add a utf-8 BOM to start of vocab.txt, to ensure Notepad saves it in utf-8
cd windows0/gradint && python -c 'open("v2","w").write("\xef\xbb\xbf"+open("vocab.txt").read())' && mv v2 vocab.txt && cd ../..
cd windows0/gradint && python -c 'open("v2","w").write("\xef\xbb\xbf"+open("advanced.txt").read())' && mv v2 advanced.txt && cd ../..
cd windows0/gradint && python2 -c 'open("v2","w").write("\xef\xbb\xbf"+open("vocab.txt").read())' && mv v2 vocab.txt && cd ../..
cd windows0/gradint && python2 -c 'open("v2","w").write("\xef\xbb\xbf"+open("advanced.txt").read())' && mv v2 advanced.txt && cd ../..
# shortcuts: Don't use .lnk files, they are far too horrible (even if you put %HOMEDRIVE%%HOMEPATH% in the shortcut, it still stores the original location, and you can't reliably create them on the client without delving rediculously deep into Windows programming). Perhaps could use .url files, but we just use small batch files. Prepend a common header to each one. (NB it won't work to try to force the sort order by calling things _uninstall, ~uninstall, etc, unless you want Z_uninstall, Z_advanced etc)
cd windows0/shortcuts ; mv header.bat bat_header ; for N in *.bat ../startup/*.bat; do if ! test "$$N" == uninstall.bat; then cat bat_header "$$N" > n ; mv n "$$N"; fi; done ; rm bat_header ; cd ../..
# now run 7zip (look in a few extra places for it, and give it its full path in argv[0])
cd windows0 ; $(SevenZip) a data.7z setup.bat gradint shortcuts startup ; cd ..
cd windows0 ; 7za a data.7z setup.bat gradint shortcuts startup ; cd ..
cat windows0/7zS.sfx windows0/7zip.conf windows0/data.7z > gradint-noGUI.exe
rm -rf windows0
GUI.exe: gradint.py
rm -rf windows0 ; cp -r windowsGUI windows0
cd windows0 && $(SevenZip) x gradint.bgz && rm gradint.bgz && cd ..
for N in windows0/7zip.conf; do python -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n $$N; done
cd windows0 && 7za x gradint.bgz && rm gradint.bgz && cd ..
for N in windows0/7zip.conf; do python2 -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n "$$N"; done
zip -0 windows0/gradint/library.zip gradint.py # (important to have no compression)
cd windows0 ; $(SevenZip) a data.7z setup.bat gradint ; cd ..
cd windows0 ; 7za a data.7z setup.bat gradint ; cd ..
cat windows/7zS.sfx windows0/7zip.conf windows0/data.7z > GUI.exe
rm -rf windows0
gradint.tbz: $(Mac_Files)
mkdir gradint
cp -r $(Mac_Files) gradint
chmod +x gradint/start-gradint.app/sox gradint/start-gradint.app/qtplay # just in case it lost its x attribute
chmod +x gradint/start-gradint.app/sox gradint/start-gradint.app/sox-14.4.2 gradint/start-gradint.app/qtplay
mv gradint/samples/utils "gradint/samples/advanced utilities"
for N in hanzi-prompts/*.txt; do python -c "open('gradint/samples/prompts/$$(echo $$N|sed -e s,.*/,,)','w').write('\\xef\\xbb\\xbf'+open('$$N').read())"; done # overwriting the pinyin ones (as will bundle espeak so can translit.), and NB we *do* need the byte-order-mark on Mac OS 10.6 for TextEdit
cd gradint && python -c 'open("v2","w").write("\xef\xbb\xbf"+open("vocab.txt").read())' && mv v2 vocab.txt && cd ..
cd gradint && python -c 'open("v2","w").write("\xef\xbb\xbf"+open("advanced.txt").read())' && mv v2 advanced.txt && cd ..
for N in hanzi-prompts/*.txt; do python2 -c "open('gradint/samples/prompts/$$(echo $$N|sed -e s,.*/,,)','w').write('\\xef\\xbb\\xbf'+open('$$N').read())"; done # overwriting the pinyin ones (as will bundle espeak so can translit.), and NB we *do* need the byte-order-mark on Mac OS 10.6 for TextEdit
cd gradint && python2 -c 'open("v2","w").write("\xef\xbb\xbf"+open("vocab.txt").read())' && mv v2 vocab.txt && cd ..
cd gradint && python2 -c 'open("v2","w").write("\xef\xbb\xbf"+open("advanced.txt").read())' && mv v2 advanced.txt && cd ..
cd gradint ; mv $(Most_Mac_Files) start-gradint.app/ ; mv start-gradint.app Gradint.app ; cd Gradint.app/Contents/MacOS ; sed -e s/start-gradint/Gradint/g -e s,Gradint.app/Contents,Contents,g < start-gradint > Gradint ; cp Gradint "Gradint 2"; chmod +x Gradint "Gradint 2" ; rm start-gradint ; cd ../../../.. # hide it all inside the app (optional) ("Gradint 2" is for upgrades - see code for details)
# tar -c gradint/ | bzip2 -9 > gradint.tbz
# use this alternative version if hiding all inside the app:
......@@ -185,9 +196,9 @@ gradint-installer.command: gradint.tbz
cat mac/install.sh gradint.tbz > gradint-installer.command
chmod +x gradint-installer.command
gradint.dmg: gradint-installer.command
if test -d /Volumes/Gradint; then diskutil eject /Volumes/Gradint; fi
if test -e gradint.dmg; then rm gradint.dmg; fi
hdiutil create -megabytes $$(echo $$(du -h gradint-installer.command | sed -e 's/\..*//')+1|bc) -fs HFS+ -volname Gradint gradint
if [ -d /Volumes/Gradint ]; then diskutil eject /Volumes/Gradint; fi
if [ -e gradint.dmg ]; then rm gradint.dmg; fi
hdiutil create -megabytes $$[$$(du -h gradint-installer.command | sed -e 's/\..*//')+1] -fs HFS+ -volname Gradint gradint
open gradint.dmg
while ! cp gradint-installer.command /Volumes/Gradint/; do echo Retrying ; sleep 1 ; done # 'open' might delay
chmod +x /Volumes/Gradint/gradint-installer.command
......@@ -196,52 +207,47 @@ gradint.dmg: gradint-installer.command
gradint.bgz: $(Linux_Files)
mkdir gradint
cp -r $(Linux_Files) gradint
chmod +x gradint/install.sh
tar -c gradint/ | bzip2 -9 > gradint.bgz
rm -rf gradint
servertools.bgz: server
rm -f server/*~
rm -f server/*~ server/*.pyc
tar -c server/ | bzip2 -9 > servertools.bgz
gradint.zip: $(Riscos_Files) riscos.zip
mkdir \!gradint
cp -r $(Riscos_Files) \!gradint
cd \!gradint && for F in samples/README.txt samples/prompts/README.txt vocab.txt advanced.txt; do sed -e 's,\.wav,/wav,g' -e 's,\.mp3,/mp3,g' -e 's,\.txt,/txt,g' -e 's,\.py\.,/py.,g' -e 's,\.py$$,/py,g' -e 's,TRANS\.TBL,TRANS/TBL,g' -e 's,samples/utils/,samples.utils.,g' -e 's,samples/,samples.,g' < $$F > n && mv n $$F ; done && cd .. # TODO: even in the suggested bash command lines? and what of .cdr .au (but be cautious about 'overzealous' search/replace)
cp riscos.zip gradint.zip # the existing zip file has the right RISC OS filetype for the Obey file (difficult to do on non-RISCOS systems)
zip -9 -r gradint.zip \!gradint/* # update with gradint sources
rm -rf \!gradint
publish0: $(All_Versions) gradint.py
scp -C -i ~/.srcf/keyfile gradint.py wa.eguidedog.net:gradint/
mv $(All_Versions) ~/public_html/gradint/
cp vocab.txt advanced.txt ~/public_html/gradint/
cp samples/README.txt ~/public_html/gradint/samples-readme.txt
cp samples/prompts/README.txt ~/public_html/gradint/prompts-readme.txt
grep ^program_name < src/top.py|head -1|sed -e 's/.*radint v/v/' -e 's/ .*/./' > ~/public_html/gradint/latest-version.txt
publish: $(All_Versions) gradint.py
scp -C gradint.py srcf:gradint/
scp -C server/gradint.cgi srcf:public_html/
mv $(All_Versions) ~/homepage/public/gradint/
cp vocab.txt advanced.txt ~/homepage/public/gradint/
cp samples/README.txt ~/homepage/public/gradint/samples-readme.txt
cp samples/prompts/README.txt ~/homepage/public/gradint/prompts-readme.txt
grep ^program_name < src/top.py|head -1|sed -e 's/.*radint v/v/' -e 's/ .*/./' > ~/homepage/public/gradint/latest-version.txt
make clean
~/homepage/update
ssh -i ~/.srcf/keyfile st0rage.org "cd eGuidedog/ssb22/gradint; screen -d -m /bin/bash -c '. build-sync.sh'"
publish:
# do it from /tmp so as to avoid confusing HomeSync if ssh'ing in from a PWF Mac
rm -rf /tmp/ssb22/gradint0
mkdir -p /tmp/ssb22/gradint0
cp -r * /tmp/ssb22/gradint0
pushd /tmp/ssb22/gradint0 && make publish0 && popd
rm -rf /tmp/ssb22/gradint0
gradint-build.7z:
mkdir ../gradint-build00
cp -r * ../gradint-build00
mv ../gradint-build00 gradint
cd gradint; for N in *.py src/*.py Makefile; do if ! test $$N == src/top.py && ! test $$N == gradint.py; then (echo "# This file is part of the source code of";grep "^program_name" src/top.py|sed -e 's/[^"]*"//' -e 's/"//' -e 's/^/# /';grep "^# " src/top.py;cat $$N) > $$N-new; mv $$N-new $$N; fi; done; cd ..
cd gradint ; make clean ; rm -rf extras ; cd ..
$(SevenZip) a gradint-build.7z gradint/
mkdir /tmp/gradint-build00
cp -r * /tmp/gradint-build00
rm -r /tmp/gradint-build00/LICENSE /tmp/gradint-build00/README.md /tmp/gradint-build00/charlearn
mv /tmp/gradint-build00 gradint
make -C gradint clean
rm -rf gradint/extras
7za a gradint-build.7z gradint/
rm -rf gradint
# "make CD" to make a CD/ directory with all versions, for a live CD
CD: $(Mac_Files) gradint.zip
rm -rf CD ; mkdir CD
cd CD && $(SevenZip) x ../windows/gradint.7z && $(SevenZip) x ../windowsGUI/gradint.7z && cd ..
cd CD && 7za x ../windows/gradint.7z && 7za x ../windowsGUI/gradint.7z && cd ..
cp -r $(Mac_Files) CD/gradint
cp windows/setup.bat CD
cp -r windows/shortcuts windows/startup CD/gradint/
......@@ -251,9 +257,9 @@ CD: $(Mac_Files) gradint.zip
echo '#!/bin/bash'>CD/gradint/Linux-version.sh; echo python gradint.py>>CD/gradint/Linux-version.sh # don't rename gradint.py because it's used by Mac version also
mv gradint.zip CD/gradint/RiscOS-version.zip
zip -0 CD/gradint/library.zip gradint.py # (important to have no compression)
for N in CD/gradint/*.txt CD/gradint/*/*.txt CD/gradint/*/*/*.txt CD/setup.bat CD/gradint/*.bat CD/gradint/*/*.bat; do python -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n $$N; done
cd CD/gradint && python -c 'open("v2","w").write("\xef\xbb\xbf"+open("vocab.txt").read())' && mv v2 vocab.txt && cd ../..
cd CD/gradint && python -c 'open("v2","w").write("\xef\xbb\xbf"+open("advanced.txt").read())' && mv v2 advanced.txt && cd ../..
for N in CD/gradint/*.txt CD/gradint/*/*.txt CD/gradint/*/*/*.txt CD/setup.bat CD/gradint/*.bat CD/gradint/*/*.bat; do python2 -c "import sys; sys.stdout.write(sys.stdin.read().replace('\r','').replace('\n','\r\n'))" < "$$N" > n && mv n "$$N"; done
cd CD/gradint && python2 -c 'open("v2","w").write("\xef\xbb\xbf"+open("vocab.txt").read())' && mv v2 vocab.txt && cd ../..
cd CD/gradint && python2 -c 'open("v2","w").write("\xef\xbb\xbf"+open("advanced.txt").read())' && mv v2 advanced.txt && cd ../..
echo "<html><body><h1>Gradint Live CD" > CD/Read_Me.html
grep ^program_name < src/top.py|head -1|sed -e 's/.*radint v/v/' -e 's/ .*/./' >> CD/Read_Me.html
echo "</h1><h2>In the 'gradint' folder on this CD:</h2><ul><li>Recorded words are in <tt>samples</tt> folder<li>Synthesized words are in <tt>vocab.txt</tt> (and take priority over recorded words)<li>Run the program by choosing 'Windows-version', 'MacOS-version', 'Linux-version' or 'RiscOS-version' as appropriate<li>Don't worry about the many other files (they are supporting components)<li>Run it once per day if possible<li>You can change <tt>settings.txt</tt> and <tt>advanced.txt</tt> (e.g. set it to output to disk for listening later, or change the length of lesson), and you can manage the recorded and synthesized words, but you need to copy the 'gradint' folder to your hard disk (or use the 'setup' .bat file in Windows) before making changes, otherwise you can only run it the way it's set up at the moment because CDs are read-only.</ul></body></html>" >> CD/Read_Me.html
......@@ -261,6 +267,7 @@ CD: $(Mac_Files) gradint.zip
echo;echo;echo "Made CD directory. Can add gradint/samples, gradint/vocab.txt, gradint/espeak for Windows, gradint/espeak-.. for OSX, sox Win/Mac binaries, oggenc or whatever for Windows, etc."
cleanup:
rm -f `find . -type f -name '*~' -o -name '*.pyc' -o -name DEADJOE`
find . -type f '(' -name '*~' -o -name '*.pyc' -o -name DEADJOE ')' -exec rm -vf '{}' ';'
rm -rvf __pycache__ # must be separate from find, as some find implementations exec before trying to descend and then error
clean: cleanup
rm -f gradint.py $(All_Versions) src/defaults.py gradint-installer.command gradint.dmg
rm -rf gradint.py $(All_Versions) src/defaults.py gradint-installer.command gradint.dmg
File moved
......@@ -7,9 +7,8 @@ import os, py_compile, sys
# can take more RAM than doing it separately.
f=os.getcwd()+os.sep+"gradint.py"
a=0
try: a=open(f)
except: pass
except: a=0
if a:
print "Compiling gradint..."
del a
......@@ -44,7 +43,8 @@ def moveFiles(srcDir,destDir):
except:
if not destDir in fail:
fail[destDir]=1
raw_input("Failed to write to "+destDir)
raw_input("Problem writing to "+destDir)
raw_input("from "+srcDir)
raw_input("Please do it manually in Explorer")
raw_input("or remove Application Lock if on")
try: os.rmdir(srcDir)
......
# Script to load gradint's synthloop quickly without waiting for the GUI
import sys
sys.argv.append("useTk=0")
import gradint
gradint.primitive_synthloop()
File moved
If you want to make your samples quieter to match the lower
volume of PythonS60's audio.say() command, you can do this
on Unix (it doesn't matter if this command is repeated) :
find synth-cache samples -name '*.mp3' -exec mp3gain -a -m -12 '{}' ';'
and for any partials voices (Yali etc) using audiodata.dat
(see advanced.txt) you can do something like this (once only) :
grep -a '^[0-9]\+ .*\.raw$' audiodata.dat > /tmp/audiodata.dat &&
grep -av '^[0-9]\+ .*\.raw$' audiodata.dat | sox -t raw -r 44100 -c 1 -s -2 - -t raw - vol 0.2 >> /tmp/audiodata.dat
ls -l audiodata.dat /tmp/audiodata.dat # check they're the same length
cp /tmp/audiodata.dat .
S60's English synth isn't always clear. To help, the text
is also displayed on screen, but it's not very big. If you
need to run Gradint without looking, it might be better if
you can generate the lessons on another machine (with a
clearer English synth), or pre-cache the English.
......@@ -3,7 +3,8 @@ gradint build instructions
See Makefile for what you can do.
As a GPL program, gradint can include parts of other GPL programs.
See README-license.txt for licensing notes (and for a note on why the
Mac and Windows bundles cannot be upgraded to eSpeak-NG)
You will need 7-Zip for making the Windows version
(so you'll need to be running on x86 Linux or Cygwin).
......@@ -12,9 +13,9 @@ windows/7zS.sfx is the stub for 7-zip self-extracting files
updated versions still work with gradint's 7zip setup file). 7zip is LGPL.
windows/gradint contains quite a few files that were output by compiling an
earlier version of gradint on py2exe under python2.3 (both of which are GPL)
on a Windows box. Those files are: datetime.pyd _sre.pyd w9xpopen.exe
winsound.pyd library.zip gradint-wrapper.exe python23.dll. In order to
earlier version of gradint on py2exe under python2.3 on a Windows box.
Those files are: datetime.pyd _sre.pyd w9xpopen.exe winsound.pyd
ibrary.zip gradint-wrapper.exe python23.dll. In order to
avoid having to use a Windows box with py2exe every time (and note py2exe
with Python 2.5 requires Administrator access to the Windows system to
install, so it's no good running that in an average university login
......@@ -29,23 +30,20 @@ and using only the libraries provided in that library.zip file. (It can
attempt to import other libraries, but it must have a fall-back mechanism if
they're not there, as they almost certainly won't be there on Windows.)
windows/ also contains a copy of ptts.exe (extracted from Jampal from
jampal.sourceforge.net with is GPL) and madplay.exe (I can't remember how I
got this binary but I know madplay is GPL).
The Windows setup will install to Program Files\gradint on Windows 9x and
%HomePath%\gradint on later versions. The start menu and desktop
"shortcuts" are all batch-file hacks because I haven't made a "real" Windows
%installer, but it should be OK on most systems.
start-gradint.app contains the Mac files. It has a binary of qtplay which
is redistributable (see qtplay.copyright), and also a Finder script that
start-gradint.app contains the Mac files. It has a Finder script that
starts gradint.py in a Terminal.
(qtplay is compiled for PowerPC; Intel macs should automatically use the
emulator.)
riscos.zip contains a copy of !PlayIt (which is re-distributable) and a
riscos.zip contains a copy of !PlayIt, which is re-distributable on a
"no commercial use" license. If that were combined with Gradint then
) and a
compiled version of the Wenhua binary (which is GPL and related to gradint -
see vocab.txt). It's important not to re-create riscos.zip except by using
a RISCOS-aware zip program (such as on RISC OS itself) otherwise the RISC OS
......
Licensing notes
---------------
As a GPL program, Gradint can include parts of other GPL programs.
It is possible that many of these programs could be included anyway
even if Gradint were not GPL, since they are optional and are run as
system commands independently of the Gradint process: this seems to
fit the "mere aggregation" clause of the GPL. However, Gradint's use
of eSpeak may be a 'borderline' case, as may be the Windows version's
use of py2exe, so I feel the safest thing is to make Gradint GPL too.
I could make a more liberally licensed version of the Gradint core
code without the parts that drive eSpeak etc. This liberally-licensed
core code would then be includeable in the whole GPL version and also
in other non-GPL projects. To keep things simple, I have not made
such a division by default (the Gradint GUI displays "GPL" because
it's usually associated with eSpeak, and to save screen space I don't
want to change that to "whole thing's GPL but some parts are Apache"),
but contact me if you need me to make or approve a cut-down version of
the code containing just the parts that don't have to be GPL, probably
as a separate project.
The GPL allows commercial use, and it does not allow the removal of
any permissions it grants, including the permission for commercial
use. Therefore, it is NOT allowed to take a GPL program together with
a program that's distributed under a "non-commercial use only" license
and distribute the combined version, unless it falls under the GPL's
provision of "mere aggregation". (I could give special permission,
but my permission would not be valid if the above "borderline" cases
really do mean that Gradint must be GPL with no extra permissions.)
The Windows and Mac versions of Gradint include not only eSpeak but
also some customised dictionary files, one of which contains
pronunciation data derived from the OALD with a "non-commercial only"
license. Since eSpeak's dictionary is a user-customisable file loaded
at runtime, and does not make up part of eSpeak's code proper, it is
arguable that making a non-commercial download of eSpeak + OALD is
"mere aggregation" allowed by the GPL. However, there is also the
issue that this modified dictionary was derived not only from the OALD
but also from eSpeak's original data files, including en_rules which
is explicitly GPL, so I would need special permission to combine this
with OALD in a non-commercial binary (otherwise I would have to ship
the files separately and have eSpeak combine them at runtime).
Thankfully though, I do indeed have special permission, because I
collaborated with eSpeak's original author Jonathan Duddington (to
help improve eSpeak's English, Mandarin and Ancient Greek voices and
port it to Mac and PocketPC), and he was happy for my pre-compiled
"non-commercial only" combination to go into Gradint's downloads.
This does however mean these Mac and Windows bundles cannot be
upgraded to eSpeak-NG, since the special permission I received from
Jonathan to make a "non-commercial" OALD-integrated download applies
only to my use of his original eSpeak data: the eSpeak-NG contributors
were not informed. Anyway, my process for adding OALD entries to the
eSpeak data has not been as thoroughly tested on recent versions of
the eSpeak-NG data. Gradint can however work with eSpeak-NG if you
supply it separately, and it is possible that eSpeak-NG's improvements
in its default data have reduced the need for OALD data anyway,
although I'm still choosing to ship old-eSpeak plus OALD in my
Mac and Windows 'bundle' downloads.
windows/ contains a copy of ptts.exe extracted from Jampal from
jampal.sourceforge.net with is GPL, and madplay.exe (I can't remember
how I got this binary but I know madplay is GPL), and now LAME.
qtplay is used by Gradint on OS X 10.4, which lacks afplay.
We bundle qtplay with the Mac version, and it has a BSD-like license
(see qtplay.copyright for details).
Mac and Windows additionally ship SOX which is GPL.
To save on server space, I have not included the source code to the
third-party free software binaries I ship. This is possible because
I am performing an unmodified non-commercial distribution of binaries
whose source is widely available and can easily be found on the
Internet, which is something explicitly allowed by the GPL
(GPLv2 section 3c, GPLv3 section 6d). If anyone has difficulty
obtaining source code for any of these binaries then please let me know.
# gradint
Graduated Interval Recall program from http://ssb22.user.srcf.net/gradint
(also mirrored at http://ssb22.gitlab.io/gradint just in case)
Gradint is a program that can be used to make your own self-study audio tapes for learning foreign-language vocabulary. You can use it to help with a course, to prepare for speaking assignments, or just to keep track of the vocabulary you come across.
Gradint uses a variant of the “graduated-interval recall” method published by Pimsleur in 1967. It’s like audio flashcards that appear in a special pattern designed to help you remember. The Pimsleur accelerated language courses use several techniques (they say some are patented), and Gradint does not imitate all that, but this particular 1967 idea is now in the public domain so Gradint can use it to help you learn your own choice of vocabulary.
Gradint gives only audio, so you concentrate on pronunciation. (And so you can listen during daily routines e.g. washing etc, since you don’t have to look or press buttons during a lesson.) Gradint can write its lessons to MP3 or similar files for you to hear later, or it can play them itself and try to adapt to emergency interruptions. The words it uses can be taken from real sound recordings or they can be synthesized by computer. You can add words to your collection at any time, and Gradint can manage collections of thousands of words (and supports batch entry). It can also help you rehearse longer texts such as poems.
Gradint is Free/Libre and Open Source Software distributed under the GNU General Public License (GPL v3).
The Gradint home page (linked above) contains installers for various platforms and details of how to run them. This repository contains the Gradint build environment, including a `Makefile` that can create these installers by packaging up versions of the Python script for various environments (Windows, Mac, Linux, Windows Mobile, S60, Android, RISC OS) plus utilities for running Gradint on a server. Not all of Gradint's functions are available in all environments.
If you are learning Chinese, you might also want Yali Cheng’s Mandarin voice or Cameron Wong’s Cantonese voice. Installers for these may also be found on the Gradint home page, and source in my separate Git repositories `yali-voice`, `yali-lower` and `cameron-voice`. They are larger downloads but less "robotic" than the eSpeak voice.
Once you have installed Gradint, you must tell the program which language(s) you want to learn. On most systems, Gradint will show a GUI which lets you do this. You can also edit the file `settings.txt`.
Then you can give the program some words and phrases to teach. This can be any combination of real recordings and computer-synthesized words, and you can always add more later. You can use the graphical interface (on supported systems), or you can place real recordings in the samples directory and its subdirectories (see the file `README.txt` in the `samples` directory), and add words that you want synthesized by computer to vocab.txt (see the instructions in `vocab.txt`).
If possible, prepare some audio prompts such as “say again” and “do you remember how to say”. These can be real recordings or synthesized text. Some text for English and Chinese is already provided. For any other language you should ideally add your own; for details of how to do this, see the file README.txt in the prompts subdirectory of the samples directory.
You should then be able to run the program every time you want a lesson. For more advanced things, see the settings in the file advanced.txt.
Citation: Silas S. Brown and Peter Robinson. Addressing Print Disabilities in Adult Foreign-language Acquisition. In: Proceedings of the 10th International Conference on Human-Computer Interaction (HCII 2003, Crete, Greece), Vol.4: Universal Access in HCI, pp 38-42.
File moved
......@@ -47,7 +47,8 @@ otherLanguages = ["cant","ko","jp"]
# able to tell the difference between cant_en.wav and an
# ordinary English prompt and might use it wrongly.
possible_otherLanguages = ["cant","ko","jp","en","zh"]
possible_otherLanguages = ["cant","ko","jp","en","zh",
"zhy","zh-yue"]
# You can also fill in otherFirstLanguages below
# (using the same ["item","item"] format) to
......@@ -80,138 +81,71 @@ otherFirstLanguages = []
# where the 2nd column is the prompt phrase and the 1st
# column is the target word.
# ------- GUI "preset collections" buttons ---------
# ---- Speech synthesis options ------------
# If you are giving gradint to your students then you might
# want to bundle it with a pre-made vocabulary collection.
# If this collection is large then it might be good to let
# the student choose which sections to learn first.
# You can have them do that within the GUI:
# 1. Put each section in its own directory (as recorded words or .txt
# files). Name each directory with a name that ends with exclude_from_scan
# (default "_disabled"), e.g. unit1words_disabled, extraWords_disabled, etc.
# 2. If any words are to be added to vocab.txt by a section, then create
# a file add-to-vocab.txt in that directory, with the contents (you'd better
# include a SET LANGUAGE command). (You don't have to do this; you could
# just have sampled words and/or words in .txt files.)
# 3. If any files are to be added to the student's prompts directory, these
# can be placed in an add-to-prompts subdirectory of each section (useful if
# the student already has a gradint installation and you're adding more presets).
# Similarly, if any language abbreviations are to be added to the student's
# otherLanguages and possible_otherLanguages variables, these can be listed
# in a file called add-to-languages.txt (separated by spaces) in each section.
# 4. Create a file short-description.txt for each section. This should be
# very short because it will be displayed on a button in the GUI.
# 5. Optionally create long-description.txt for some sections. This will be
# displayed in a yes/no box asking the user to confirm their addition.
# 6. Put all those _disabled directories into the user's samplesDirectory (or
# drag into the recorded words folder and restart gradint). You can also
# put them in the directory above, to avoid confusing any users who open
# "recorded words".
# (If you're a developer and have downloaded the Gradint build environment,
# you can make a version of Gradint's installation files that bundles your
# presets, by placing the _disabled directories into Gradint's build
# directory before typing "make".)
# eSpeak (if available) will be preferred for the following languages
# (for other languages it's used only if there is no other voice)
# (set this to "" if you don't want to prefer eSpeak for any language)
max_extra_buttons = 12
# - this setting limits the number of "add pre-made collection" buttons that
# are displayed on the screen at one time. Set it to 0 to disable this feature.
prefer_espeak = "en"
# ---- Website options ---
# eSpeak is bundled with the Windows and Mac versions of Gradint
# and can be downloaded at http://espeak.sourceforge.net/
# Any of eSpeak's languages can be used as long as you use the
# same language abbreviations as eSpeak does, e.g. "en" for English,
# "zh" for Zhongwen (Mandarin).
# - You can improve eSpeak's English by installing
# Festival's dictionary and using lexconvert to convert
# it, see http://ssb22.user.srcf.net/lexconvert/
# (this has already been done in the bundled version).
# - eSpeak is not very natural-sounding, but it is very
# clear and accurate in English and some other languages
mp3web = ""
mp3webName = ""
# If you use a website like Forvo that lets you download
# MP3 or WAV pronunciations of words, you can use this from
# within the Gradint GUI by setting the above like this:
# mp3web = "http://www.forvo.com/search/$Word/$Lang"
# mp3webName = "Forvo"
# ($Word is replaced by the word to look for, and
# $Lang by the language code)
# This is not filled in by default because you must check the
# setting below: tell Gradint where to look for your browser's
# downloaded files. The following directories will be tried:
downloadsDirs = ["../Downloads","..\\Desktop"]
# If you then tell Gradint to use an MP3 file you have downloaded,
# Gradint will store it in the synth cache (see below).
# ---- Speech synthesis options ---
# If you have several speech programs on your system,
# you can set their relative priorities here. For example
# if you like one of your MacOS voices better than eSpeak then
# you can move MacOS to before eSpeak (in which case MacOS will be
# used for English and eSpeak for other languages).
# (Other synths, e.g. Festival, FLite, S60, old-RISCOS, will be
# automatically added to the end of the list.)
# (Note: the priority of eSpeak is automatically reduced for
# most non-English languages, so if you explicity install some
# other synth for those languages then it will be used instead)
synth_priorities = "eSpeak MacOS SAPI Ekho"
# SAPI is the name of the Windows speech synthesis system,
# so if you have a Windows voice then it is probably SAPI.
# More details are in vocab.txt. Ekho is Cameron Wong's
# Cantonese synth from eGuideDog and this setting lets Gradint
# use the Ekho program directly on non-Windows systems (on Windows
# it needs to be set as a SAPI voice); if you don't have Ekho on your
# system then Gradint can still use its data as partials (see below)
# but only if there is no English mixed in with the Cantonese phrases.
# You can also set extra_speech to a list of (language prefix,
# command), for example:
# extra_speech=[ ("la","say-latvian"),("de","say-german") ]
# This will take priority over other speech systems.
# The commands must be available and must take a text string
# on the command line. You will not be able to use these
# when the output is going to a sound file.
# YOU DO NOT NEED TO SET THIS if your speech synthesizer is
# supported by default.
extra_speech = []
# If you have speech software which can take a text string
# and output it to a file, you can list that here. Each
# element of the list should be of the form:
# ("la","command with %s for text","resulting filename")
# (generally best to use wav, but mp3 is also supported on
# some systems; see note at end of samples/README)
# The %s argument will already be quoted for the shell if applicable.
extra_speech_tofile = []
# WINDOWS VOICES: Gradint can use Microsoft SAPI 5, which is
# included with Windows XP+ and can be added to earlier versions.
# You can choose which SAPI voices to use here:
sapiVoices = {
# Here you can set extra SAPI 5 voices. The default voice
# will be used for English unless overridden here. If you
# have Neospeech Lily then that will be used for Chinese unless
# overridden here (although Lily is not always accurate).
# Add them in this format but without the # at the beginning:
# "language abbrev" : ("full voice name", rate),
# For example, if you have "ScanSoft Mei-Ling_Full_22kHz"
#
# For example, for Windows 10 voices (if both English and
# Chinese are installed) you can have:
# "en" : ("Microsoft Hazel Desktop", 16000),
# "zh" : ("Microsoft Huihui Desktop", 16000),
# "zhy" : ("Microsoft Tracy Desktop", 16000),
# "zhy-yue" : ("Microsoft Tracy Desktop", 16000),
# "cant" : ("Microsoft Tracy Desktop", 16000),
# (make sure to set prefer_espeak="" if you want the MS English voice)
#
# Or if you have "ScanSoft Mei-Ling_Full_22kHz"
# (which reads most Chinese hanzi quite well, but can't read
# pinyin and sometimes glitches so be careful), you can have
# "zh" : ("ScanSoft Mei-Ling_Full_22kHz", 22050),
# or if you have Loquendo Lisheng (which can pronounce pinyin
# and the June 2008 release is better than Neospeech Lily
# although still not perfect) you can have
#
# or if you have Loquendo Lisheng (which has prosody reminiscent
# of an Italian-Chinese bilingual, and can pronounce pinyin
# with tone numbers as long as you add punctuation at the end)
# you can have
# "zh" : ("Lisheng", 16000),
#
# or for Ekho Cantonese you can have:
# "zhy" : ("Ekho Cantonese", 8000), # or 16000 for v4.5+
# "zhy-yue" : ("Ekho Cantonese", 8000), # ditto
# "cant" : ("Ekho Cantonese", 8000), # ditto
#
# or if you have other voices in other languages, you can
# use them too. Note that FULL voice names must be used,
# exactly as they are shown in the Control Panel under Speech.
# (You may set 'rate' to 0 for the default of 44100.)
# All non-ASCII input to gradint MUST be in UTF-8.
# Note: if you set an "en" voice here, and eSpeak is also
# on the system, remember to reduce the priority of eSpeak
# in synth_priorities above.
# on the system, remember to remove 'en' from "prefer_espeak" above.
# If you don't set an "en" voice but "en" is not in prefer_espeak,
# then the voice set in Control Panel will be used for English.
# If you have Neospeech Lily then that will be used for Chinese ('zh') unless
# overridden here (although Lily is not always accurate).
# (can use pinyin with tone numbers, 5 for neutral tone, v or u: for u-umlaut
# and if possible put spaces between meaningful words; can also use hanzi)
}
sapiSpeeds = {
......@@ -221,11 +155,108 @@ sapiSpeeds = {
# "en": -5, "zh": +3 (but without the # at the beginning)
}
# You can also set the speed of the non-SAPI Ekho voice (if you have it)
# from -50 to +100 (percent, default 0) here:
# MAC OS X VOICES: you can set which voices to use here (if you set
# more than one voice for a language then the first available one is
# used; if you don't set a voice for a language then the first detected
# voice supporting that language is used, unless there's only English
# voices on the system in which case the one set in System Preferences
# is used). Non-English voices might not work on older OS X versions.
# Note: if you want the "en" voice to be used, and eSpeak is also
# on the system, remember to remove 'en' from "prefer_espeak" above.
macVoices = {
"en":"Emily Daniel Alex Vicki",
"zh":"Ting-Ting Tingting", # OS 10.7+, can read hanzi, pinyin+tone numbers (5 for neutral) and English
"cant":"Sin-Ji", # OS 10.7+
"jp":"Kyoko", # OS 10.7+ ("ja" will auto-detect, but we're adding the alias "jp")
"ind":"Damayanti", # OS 10.7+ ("id" will auto-detect: we're adding "ind")
}
# For Mandarin Chinese, you can also use Yali Cheng's syllables
# (see instructions on website) - recommended.
# Language abbreviation must be 'zh'; text should use Hanyu Pinyin with
# a tone number after each syllable and v or u: for u-umlaut
# (and if possible put spaces between meaningful words but
# not between syllables within a word). You can also include hanzi
# if eSpeak is present.
# There are also Cantonese syllables you can download similarly.
# For Cantonese you can also use Cameron Wong's Ekho program if installed
# (language abbreviation 'cant' or 'zh-yue' or 'zhy')
# You can set Ekho's speed from -50 to +100 (percent, default 0) here:
ekho_speed_delta = 0
# (Note: If this is not 0, Ekho will be preferred over partials.)
# ANDROID: set the language of your system's default voice
# (the SL4A module that Gradint uses can't find out for you)
# - normally "en", but some China-modified Android phones
# should set this to "zh" and avoid using pinyin (however I
# have not been able to actually test if SL4A can correctly
# pass a Unicode string to their synths, so perhaps it should
# be set to None and ensure you have recorded prompts)
systemVoice = "en"
# OTHER ENGLISH SYNTHESIZERS (language abbreviation must be "en"):
#
# - Festival Lite on Windows (if all else fails) :
# put flite.exe in the gradint folder
#
# - GNU/Linux: install Festival, or flite for US accent
#
# - S60: the phone's built-in speech can be used
#
# - RISC OS: if for some reason you can't install eSpeak
# as mentioned above, you can instead install an older
# version of Jonathan Duddington's !Speak, or the even
# older "Speech!" utility. These can be used only for
# playing in real-time, not for generating files.
# OTHER MULTI-LANGUAGE SYNTHESISERS:
#
# Piper voices are experimentally supported on GNU/Linux.
# Setup: Download binaries and voices from
# https://github.com/rhasspy/piper
# and put them in the gradint directory (or piper subdirectory)
#
# Coqui voices are experimentally supported on GNU/Linux.
# Setup: pip install coqui-tts[server,zh,ja,ko]
# Then download the voices you want, e.g.:
# from TTS.api import TTS;langs = {}
# for m in TTS().list_models(): langs.setdefault(m.split('/')[1].split('-')[0],[]).append(m)
#
# TTS(langs["zh"][0])
# TTS('tts_models/en/jenny/jenny')
# (If any model crashes during download, be sure to delete the
# result from ~/.local/share/tts before running Gradint. For
# example vocoder_models--ja--kokoro--hifigan_v1 may crash.
# I did say support for these voices is experimental.)
# Gradint detects voices that have been downloaded
# (but prefer_espeak overrides this). The Chinese
# voice does NOT support pinyin.
# You can also set extra_speech to a list of
# (language prefix, command), for example:
# extra_speech=[ ("la","say-latvian"),("de","say-german") ]
# This will take priority over other speech systems.
# The commands must be available and must take a text string
# on the command line. You will not be able to use these
# when the output is going to a sound file.
# YOU DO NOT NEED TO SET THIS if your speech synthesizer is
# supported by default.
extra_speech = []
# If you have speech software which can take a text string
# and output it to a file, you can list that here. Each
# element of the list should be of the form:
# ("la","command with %s for text","resulting filename")
# (generally best to use wav, but mp3 is also supported on
# some systems; see note at end of samples/README)
# The %s argument will already be quoted for the shell if applicable.
extra_speech_tofile = []
# Another thing you can do is to selectively override the
# speech synthesis of certain words. To do this, set
# synthCache (below) to a directory, and in that directory
......@@ -243,11 +274,9 @@ ekho_speed_delta = 0
# not allow in filenames, then you can make a TRANS.TBL file
# inside the synthCache directory (the first word of each
# line is the real filename and the rest of the line is the
# filename that you want gradint to see). On RISC OS this
# should be called TRANS/TBL, and remember to specify /wav
# rather than .wav in its contents. It is also advisable
# not to include spaces in any of the real filenames on RISC
# OS, because RISC OS Python can't always cope.
# filename that you want gradint to see).
# On RISC OS, try not to include spaces in any of the real
# filenames, because RISC OS Python can't always cope.
synthCache = ""
......@@ -345,7 +374,7 @@ lily_file = "C:\\Program Files\\NeoSpeech\\Lily16\\data-common\\userdict\\userdi
# somewhere under C:\Program Files\VW\VT\Lily\M16-SAPI5\lib\
# but I don't know exactly)
# If you want to use SAPI under WINE in Linux
# If you want to use SAPI under WINE in GNU/Linux
# then you can set ptts_program:
ptts_program = None
# (hint: run winecfg and set Windows version to Millenium (ME)
......@@ -431,13 +460,13 @@ partialsDirectory = "partials"
# the other voices (but still put a default header.wav in partials).
# If you don't like having so many *.raw files in a directory
# then you can also do (in a Unix evironment such as OSX or Cygwin) :
# wc -c *.raw | grep -v total$ | sed -e 's/^ *//' > audiodata.dat ; cat *.raw >> audiodata.dat ; rm *.raw
# wc -c *.raw | grep -v total$ | sed -e 's/^ *//' > audiodata.dat && cat *.raw >> audiodata.dat && rm *.raw
# You can also store syllables using UTF-8 filenames, but some systems may
# have difficulty storing all of these (especially for Korean); therefore
# you can use Unicode escaping in filenames, e.g. _ud79d for Unicode D79D
# (equivalent to UTF-8 sequence ED 9E 9D). Example conversion command:
# for N in *; do cp "$N" "/path/to/fat/$(python -c "print repr('$N'.decode('utf-8'))[2:-1].replace(r'\\u','_u')")";done
# for N in *; do cp "$N" "/path/to/fat/$(python2 -c "print repr('$N'.decode('utf-8'))[2:-1].replace(r'\\u','_u')")";done
# When using partials, you can change the length of pause
# between phrases by changing the following (in seconds) :
......@@ -460,6 +489,84 @@ partials_are_sporadic = 0
# set a default in voiceOption below (blank is normal, or set to "-low" etc)
voiceOption = ""
# On Unix-like systems (that support pipes) there is also an option
# to specify external programs to preprocess all input to espeak for
# a specified language. For example if you've used Annotator Generator
# to generate a Chinese-to-pinyin program that's better than espeak
# then you can use this.
espeak_preprocessors={
# for example:
# "zh":"./annotate --raw",
# "zhy":"./annotate --seg",
}
# ------- GUI "preset collections" buttons ---------
# If you are giving gradint to your students then you might
# want to bundle it with a pre-made vocabulary collection.
# If this collection is large then it might be good to let
# the student choose which sections to learn first.
# You can have them do that within the GUI:
# 1. Put each section in its own directory (as recorded words or .txt
# files). Name each directory with a name that ends with exclude_from_scan
# (default "_disabled"), e.g. unit1words_disabled, extraWords_disabled, etc.
# 2. If any words are to be added to vocab.txt by a section, then create
# a file add-to-vocab.txt in that directory, with the contents (you'd better
# include a SET LANGUAGE command). (You don't have to do this; you could
# just have sampled words and/or words in .txt files.)
# 3. If any files are to be added to the student's prompts directory, these
# can be placed in an add-to-prompts subdirectory of each section (useful if
# the student already has a gradint installation and you're adding more presets).
# Similarly, if any language abbreviations are to be added to the student's
# otherLanguages and possible_otherLanguages variables, these can be listed
# in a file called add-to-languages.txt (separated by spaces) in each section.
# 4. Create a file short-description.txt for each section. This should be
# very short because it will be displayed on a button in the GUI.
# 5. Optionally create long-description.txt for some sections. This will be
# displayed in a yes/no box asking the user to confirm their addition.
# 6. Put all those _disabled directories into the user's samplesDirectory (or
# drag into the recorded words folder and restart gradint). You can also
# put them in the directory above, to avoid confusing any users who open
# "recorded words".
# (If you're a developer and have downloaded the Gradint build environment,
# you can make a version of Gradint's installation files that bundles your
# presets, by placing the _disabled directories into Gradint's build
# directory before typing "make".)
# If you just want to disable one of your samples subdirectories, you
# may simply rename the directory to something ending with exclude_from_scan
# (default "_disabled") and DON'T add short-description.txt.
max_extra_buttons = 12
# - this setting limits the number of "add pre-made collection" buttons that
# are displayed on the screen at one time. Set it to 0 to disable this feature.
# ---- Website options ---
mp3web = ""
mp3webName = ""
# If you use a website that lets you download
# MP3 or WAV pronunciations of words, you can use this from
# within the Gradint GUI by setting the above like this:
# mp3web = "http://www.example.com/search/$Word/$Lang"
# mp3webName = "Example"
# ($Word is replaced by the word to look for, and
# $Lang by the language code)
# Also you need to tell Gradint where to look for your browser's
# downloaded files. The following directories will be tried:
downloadsDirs = ["../Downloads","..\\Desktop"]
# If you then tell Gradint to use an MP3 file you have downloaded,
# Gradint will store it in the synth cache (see below).
# If you set downloadsDirs = []
# then Gradint will not check for downloaded files, but will just
# point the browser to the site. This might be useful for situations
# when you just want to check if words are there or not.
# ---- Options for outputting lessons to sound files and adding comments ------
# Sometimes it is useful to get gradint to output a lesson
......@@ -472,8 +579,8 @@ outputFile = ""
# Depending on the extension you specify, you will need a
# copy of LAME (for MP3), TooLame (for MP2), oggenc (for
# OGG), faac (for AAC) or speexenc (for SPX). On Windows
# put the .exe in the gradint folder; on other systems you can
# OGG), neroAacEnc or faac (for AAC) or speexenc (for SPX).
# On Windows put the .exe in the gradint folder; on other systems
# put the binary in either the gradint folder or the PATH.
# You will also need "sox" (you may already have this).
......@@ -595,10 +702,10 @@ ask_teacherMode = 0
maxNewWords = 5
maxReviseBeforeNewWords = 3
newInitialNumToTry = 5
recentInitialNumToTry = 3
newWordsTryAtLeast = 3 # if introducing a new word and can't
# fit in this number of times, don't bother
newInitialNumToTry = 5 # try to repeat a new word 5x
recentInitialNumToTry = 3 # and recently-learned one 3x
newWordsTryAtLeast = 3 # if a new word won't fit 3x,
# exclude it (leave it till a future lesson)
knownThreshold = 5 # after which it won't repeat so much
reallyKnownThreshold = 10 # after which never added before new words
meaningTestThreshold = 20 # or 0; if >= this then 50% chance of "what meaning" test
......@@ -606,6 +713,9 @@ randomDropThreshold = 14 # after which drop some words even if they can fit
randomDropLevel = 0.67 # fraction of above that is dropped
randomDropThreshold2 = 35 # (or set to the same as above)
randomDropLevel2 = 0.97
seedless = 0 # set this to 1 to make all "random" choices
# reproducible (on the same installation), in case you
# need to reproduce the same Gradint run exactly
shuffleConstant = 2.0 # Used to control how much the number
# of repetitions matters when it is high. Higher values of
# this constant mean it doesn't matter so much and samples
......@@ -615,6 +725,7 @@ transitionPromptThreshold = 10 # after repeating a prompt
advancedPromptThreshold = 20 # ONLY use target-language prompt
transitionPromptThreshold2 = 2 # for 3rd, 4th etc languages
advancedPromptThreshold2 = 5
veryExperiencedThreshold = 1000 # total repetitions until fewer prompts are used
limit_words = max(1,int(maxNewWords * 0.4)) # num words to
# include from limited directories. Done separately for
# EACH limited directory, but limits deeper in the tree are
......@@ -672,7 +783,7 @@ gui_output_directory = "output"
# in which case the first directory that EXISTS will be used
# (or the last one on the list if all else fail).
# Useful if the directory to your MP3 player only appears when
# it's plugged in for example. With Linux automounters you can
# it's plugged in for example. With GNU/Linux automounters
# set "/media/*" as one of the directories, and it will expand to
# whatever removable device is mounted IF there is only one.
......@@ -699,7 +810,7 @@ import_recordings_from = [r"\My Documents", r"\Storage Card\My Documents", r"\Ra
# This can be useful to catch words with the Notes app on a PocketPC
# (which saves its recordings to \My Documents by default).
# ------- GUI translation dictionary ---------
# ------- GUI translation (localisation) dictionary --------
# The format of this is:
# {"en phrase A":{"laX":u"language X translation", "laY":"language Y translation", ...}, "en phrase B":{...}, ...}
......@@ -714,7 +825,8 @@ GUI_translations={
"Word in %s":{"zh":u"%s"},
"Meaning in %s":{"zh":u"%s意思"},
"en":{"zh":u"英文"},
"zh":{"zh":u"中文"},
"zh":{"zh":u"汉语","zh2":u"漢語"},
"cant":{"zh":u"粵語","zh2":u"廣東話"},
"Your first language":{"zh":u"母语","zh2":u"母語"},
"second":{"zh":u"学习的语言","zh2":u"學習的語言"},
"Change languages":{"zh":u"选择其他语言","zh2":u"選擇其他語言"},
......@@ -783,6 +895,11 @@ GUI_translations={
"More than 30 minutes is rarely more helpful. Reduce to 30?":{"zh":u"超过30分钟很少有帮助。我减少到30好吗?","zh2":"超過30分鐘很少有幫助。我減少到30好嗎?"},
"Less than 20 minutes can be a rush. Increase to 20?":{"zh":u"缺乏20分钟可以太赶紧了。我增长到20好吗?","zh2":"缺乏20分鐘可以太趕緊了。我增長到20好嗎?"},
"Proceed anyway?":{"zh":u"反正继续?","zh2":"反正繼續"},
"Just speak a word":{"zh":u"使用机器声音说一词","zh2":u"使用機器聲音說一詞"},
"Add word to my vocab":{"zh":u"把词加到词汇表","zh2":u"把詞加到詞彙表"},
"Make lesson from vocab":{"zh":u"做课","zh2":u"做課"},
"Make lesson":{"zh":u"做课","zh2":u"做課"},
"Record word(s) with mic":{"zh":u"从麦克风录音词语","zh2":u"從麥克風錄音詞語"},
}
# scriptVariants optionally maps language abbreviation to default script
......@@ -845,6 +962,21 @@ oss_sound_device = ""
soundVolume = 1
# If you want you can completely override the way Gradint
# tries to play sound on Unix systems by filling in these:
wavPlayer = ""
mp3Player = ""
# If left blank they will be detected automatically.
# For example if your PC has no speakers and you want to send
# all sound to a LAN-attached NSLU2 you can do something like
# wavPlayer = "nc nslu2 8124 -q 0 <"
# mp3Player = "nc nslu2 8125 -q 0 <"
# and set up entries in /etc/inetd.conf on the NSLU2 to run
# appropriate scripts (note that this method does not communicate
# play failures and delays back to Gradint, so it's up to your
# scripts to handle these)
# If soundVolume is not 1, only wavPlayer will be used.
# On non-Windows systems (or on Windows if you are running
# from the Python source) you can here specify a file to
# save the lesson to (in Python pickle format) and re-load
......@@ -884,6 +1016,7 @@ justSaveLesson = 0
# progressFile is large and is kept on a Flash storage
# device with slow write speed. (binary progress files and
# saved lessons are also compressed when this is set.)
# If using fusecompress then you might not need this.
compress_progress_file = 0
......@@ -894,7 +1027,8 @@ compress_progress_file = 0
# kind of mount then leave it at 0 (it just takes more time).
# (Note: curlftpfs reliability is worse if you use transform_symlinks
# and point gradint to 2 symlinks in the remote filesystem,
# e.g. samples and synth-cache: curlftpfs may confuse them!)
# e.g. samples and synth-cache: curlftpfs may confuse them!
# sshfs better, but best setup is sync before/after running)
paranoid_file_management = 0
......@@ -912,6 +1046,15 @@ paranoid_file_management = 0
once_per_day = 0
# If you set disable_once_per_day (below) to 1, the above
# once_per_day logic will be disabled even if it's on the command line,
# and Gradint will exit silently if once_per_day is 3 (i.e. run from
# startup). This can be used for a "disable running at startup" option.
# Set disable_once_per_day to 2 if you want the GUI to ask
# (this is done by the Windows installer).
disable_once_per_day = 0
# Besides altering this file, you can also put assignment
# statements on the command line of gradint.py. In that
# case runInBackground=0 is assumed and
......
#!/bin/bash
# Sync gradint build environment to SVN
wget -N http://people.pwf.cam.ac.uk/ssb22/gradint/gradint-build.7z || exit 1
rm -rf gradint
7z x gradint-build.7z || exit 1
diff -r gradint-build gradint|grep "^Only in gradint-build"|grep -v \\.svn|sed -e 's,Only in ,svn del ",' -e 's,: ,/,' -e 's/$/"/'|bash
cp -pur gradint/* gradint-build/
find gradint|grep -v \\.svn|sed -e 's/gradint/gradint-build/' -e 's/^/svn add "/' -e 's/$/"/'|bash
rm -rf gradint gradint-build.7z # if need to save space
if test "a$Msg" == a; then export Msg="Gradint update"; fi
svn commit -m "$Msg"
charset: gb2312
的 [de5] /(possessive particle)/of/
一 [yi1] /a(n)/one/single/
了 [le5] /(modal partical intenstifying preceding clause)/(past tense marker)/
是 [shi4] /am/are/is/to be/yes/
我 [wo3] /I/me/myself/
不 [bu4] /(negative prefix)/no/not/
在 [zai4] /(located) at/exist/in/
人 [ren2] /man/people/person/
们 [men5] /(plural marker for pronouns and a few animate nouns)/
有 [you3] /have/have; possess/there are/there is/to be/to exist/to have/
来 [lai2] /*/[surname]/approx.; over (numbers)/arrive/come/ever since/future/take place/to come/
他 [ta1] /he/him/
这 [zhe4] /these/this/
上 [shang4] /above/first (of two parts)/higher/on/on top/previous/previous or last (week, etc.)/to climb/to go into/to go up/upon/upper/
着 [zhe5] /-ing (indicates an action in progress)/part. indicates accompanying action/
个 [ge4] /(a measure word)/individual/
地 [di4] /background/distance/earth/field/ground/ground; floor/land/land; soil/place/place; locality/position; situation/the earth/
到 [dao4] /to (a place)/to arrive/to go/until (a time)/up to/
大 [da4] /big/deep/eldest/great/huge/large/major/oldest/wide/
里 [li3] /2 kilometer/Chinese mile/[surname]/furlong/in/inside/li, a Chinese unit of length = 1/miles/neighborhood/village/within/
说 [shuo1] /to say/to speak/
去 [qu4] /to go/to leave/to remove/
子 [zi3] /"son/11 p.m.-1 a.m./1st earthly branch/[surname]"/child/egg/midnight/person/seed/seed; egg/small thing/son/sth. small & hard/young (animal, veg.)/\n[zi5] /(noun suff.)/
得 [de2] /allow/contented/finished/gain/get/obtain/permit/proper/proud/ready/suitable/\n[de5] /a sentence particle used after a verb to show effect/degree or possiblility/
也 [ye3] /also/too/
和 [he2] /and/harmony/peace/together with/union/with/\n[he4] /cap (a poem)/respond in singing/
那 [na3] /how/which/\n[na4] /that/those/
要 [yao1] /ask/coerce/demand/request/\n[yao4] /important/must/to be going to/to want/vital/
下 [xia4] /below/down(wards)/latter/lower/next (week, etc.)/second (of two parts)/to decline/to go down/under/underneath/
看 [kan1] /to guard/to look after/to take care of/to watch/\n[kan4] /it depends/look/see/think/to look at/to see/watch/
天 [tian1] /day/heaven/sky/
时 [shi2] /O'clock/hour/period/season/time/when/
过 [guo4] /(past tense marker)/(surname)/to cross/to get along/to go over/to live/to pass (time)/
出 [chu1] /(a measure word for dramas, plays, or operas)/to come out/to go beyond/to go out/to happen/to occur/to produce/to put forth/to rise/
小 [xiao3] /few/small/tiny/young/
么 [me5] /(interrog. suff.)/
起 [qi3] /to get up/to raise/to rise/
你 [ni3] /you/
都 [dou1] /all/all (referring to causes)/all; also/all; both/already/both (if two things are involved)/entirely (due to)each/even/
把 [ba3] /(a measure word)/(marker for direct-object)/handle/to contain/to grasp/to hold/to take hold of/
好 [hao3] /fine/good/good(fine)/well/\n[hao4] /be fond of/
还 [hai2] /(not) yet/also/else/in addition/more/still/yet/
多 [duo1] /a lot of/many/much/multi-/numerous/
没 [mei2] /(negative prefix for verbs)/have not/not/
为 [wei2] /act as/take...to be/to be/to become/to do/to serve as/\n[wei4] /because of/for/to/
又 [you4] /(once) again/again/also/both... and.../
可 [ke3] /(particle used for emphasis)/able to/can/certain(ly)/may/to suit/
家 [jia1] /* (addressing senior)/* (profession)/-er/-ian/-ist/MW (families; enterprises)/[surname]/a person engaged in a certain art or profession/domestic; tamed/family/furniture/home/household; family/school of thought/tool/
学 [xue2] /-ology/branch of learning/imitate/knowledge/learn/learning/school/science/study/subject of study/
只 [zhi1] /(a measure word, for birds and some animals, etc.)/M for one of a pair/only/single/\n[zhi3] /but/just/merely/only/
以 [yi3] /according to/because/by/in order to/so as to/to use/with/
主 [zhu3] /Lord/[surname]/advocate/be in charge of/freedom from doubt/host/lord/main/master/primary/to host/to own/
会 [hui4] /association/be able to/be possible/can/group/to assemble/to gather/to meet/to see/union/
样 [yang4] /appearance/manner/pattern/shape/way/
年 [nian2] /[surname]/year/
想 [xiang3] /intend/think/to believe/to miss/to suppose/to think/to want/to wish/want to/
能 [neng2] /able/can/capable/energy/may/
生 [sheng1] /"birth, give"/[surname]/extremely/get/give birth to/grow/life/light (a fire)/livelihood/living/raw/stiff/student/to be born/to give birth/to grow/unfamiliar/unripe/
同 [tong2] /alike/like/same/similar/together/with/
老 [lao3] /(a prefix used before the surname of a person or a numeral indicating the order of birth of the children in a family to indicate affection or familiarity)/old (of people)/
中 [zhong1] /China/Chinese/among/center/during/in/middle/while (doing sth)/within/\n[zhong4] /hit (the mark)/
从 [cong1] /lax/unhurried/yielding/\n[cong2] /follow/from/obey/observe/
自 [zi4] /from/oneself/self/since/
面 [mian4] /"face/*/MW: flat & smooth"/aspect/face/fade/flour/noodles/personally/powder/scale, range/side/side, aspect/surface/surface, top/top/wheat flour/\n[mian3] /inundation/name of a river/
前 [qian2] /ago/before/earlier/former/front/in front/previous/
头 [tou2] /MW (bulb of garlic)/MW (domestic animals)/beginning or end/chief; head/first/hair style/head/leading/remnant/side; aspect/top; end/\n[tou5] /suff. for nouns/
到 [dao4] /to (a place)/to arrive/to go/until (a time)/up to/
它 [ta1] /it/
后 [hou4] /queen/
然 [ran2] /-ly/correct/like this/right/so/thus/
走 [zou3] /to go/to move/to walk/
很 [hen3] /extremely/very/
像 [xiang4] /(look) like/appearance/elephant/image/like/like; similar/look/picture/portrait/resemble/seem/similar (to)/to appear/to look/to seem/
见 [jian4] /to appear (to be sth)/to interview/to meet/to see/
两 [liang3] /a few/both/ounce/some/tael/two/
用 [yong4] /to use/use/
她 [ta1] /she/
国 [guo2] /country/nation/state/
动 [dong4] /to act/to change/to move/to use/
进 [jin4] /advance/enter/to come in/
成 [cheng2] /accomplish/become/complete/finish/one tenth/succeed/turn into/win/
回 [hui2] /(a measure word for matters or actions) a time/to answer/to circle/to go back/to return/to revolve/to turn around/
什 [shi2] /tenth/
边 [bian1] /border/boundary/edge/margin/side/
作 [zuo4] /to do/to make/to regard as/to take (somebody) for/
对 [dui4] /correct (answer)/couple/for/pair/right/to/to answer/to be opposite/to direct (towards sth)/to face/to oppose/to reply/
开 [kai1] /open/operate (vehicle)/start/
而 [er2] /(shows causal relation)/(shows change of state)/(shows contrast)/and/as well as/but (not)/yet (not)/
已 [yi3] /afterwards/already/then/to stop/
些 [xie1] /(a measure word)/few/several/some/
现 [xian4] /appear/current/existing/now/present/
山 [shan1] /"mount, mountain"/[surname]/hill/mountain/
民 [min2] /citizen/nationality/the people/
候 [hou4] /wait/
经 [jing1] /classics/pass through/sacred book/scripture/to undergo/
发 [fa1] /to develop/to issue/to send out/to show (one's feeling)/\n[fa4] /hair/
工 [gong1] /craft/labor/profession/skill/trade/work/worker/works/
向 [xiang4] /direction/guide/opposite to/part/side/to/towards/
事 [shi4] /affair/item/matter/thing/work/
命 [ming4] /fate/life/
给 [gei3] /(passive particle)/for/for the benefit of/to/to allow/to do sth (for sb)/to give/
长 [chang2] /always/constantly/forever/length/long/strong point; forte/
水 [shui3] /[surname]/river/water/
几 [ji1] /almost/small table/\n[ji3] /a few/how many/how much/several/
义 [yi4] /[surname]/justice/meaning/righteous(-ness)/\n[yi2] /to leave behind/to lose/
三 [san1] /three/
声 [sheng1] /(a measure word, used for sounds)/noise/sound/tone/voice/
于 [yu2] /(surname)/at/in/\n[yu4] /better/heal/to recover/
高 [gao1] /[surname]/height/high/superior/tall/
正 [zheng1] /Chinese 1st month of year/\n[zheng4] /correct/just (right)/main/principle/straight/upright/
妈 [ma1] /ma/mamma/
手 [shou3] /convienent/hand/
知 [zhi1] /to be aware/to know/
理 [li3] /inner principle or structure/logic/reason/science/
眼 [yan3] /eye/
志 [zhi4] /mark/sign/the will/to record/write a footnote/
点 [dian3] /(a measure word)/(decimal) point)/(downwards-right convex character stroke)/MW:\n[used to indicate time]/MW: a little; some/aspect; feature/check; check to see that the number is correct/dot/dot; spot; speck/drip/drop/hint; point out/hour/light; kindle/o'clock/point/put a dot/select; choose/touch on briefly/
心 [xin1] /heart/mind/
战 [zhan4] /battle/fight/to fight/war/
二 [er4] /two/
问 [wen4] /to ask/
但 [dan4] /[surname]/but/but; yet; nevertheless/however/merely/only/still/yet/
身 [shen1] /(a measure word used for clothes) suit/body/life/person/pregnancy/status/torso/
方 [fang1] /direction/just/quadrilateral/square/
实 [shi2] /honest/real/really/solid/true/
吃 [chi1] /absorb; soak up/destroy/eat/eat at/eat; take/eradicate/exhaust; be a strain/feed(to eat)/live on/receive/suffer; incur/wipe out/
做 [zuo4] /to do/to make/to produce/
叫 [jiao4] /to (be) call(ed)/
当 [dang1] /during/equal/just at/just at (a time or place)/manage/match equally/obstruct/on the spot/ought/right/same/should/to act as/to be/when/withstand/\n[dang4] /adequate/at or in the very same.../fitting/proper/replace/represent/suitable/to pawn/
住 [zhu4] /"reside/* (indicating a halt, standstill etc.)"/cease/live; dwell/to dwell/to live/to reside/to stop/
听 [ting1] /administer/allow; let/hear/heed; obey/listen/listen; hear/obey/tin; can/\n[ting4] /allow/let/
革 [ge2] /leather/remove/
打 [da2] /dozen/\n[da3] /[indic. certain body movements]/adopt; use/beat/beat up/break/break; smash/build/buy/calculate/catch; hunt/collect; reap/construct/dig/dispatch/draw/engage in/estimate/fetch/fight/fight; attack/forge/from/from; since/get rid of/issue/knit; weave/make/mix up/play/raise/shoot/since/slap/spray; spread/strike/strike; hit/tie up/work out/
呢 [ne5] /(question particle)/
真 [zhen1] /[surname]/clearly/genuine/genuine(-ly)/real/real(-ly)/true/true(-ly)/unmistakably/
党 [dang3] /[surname]/association/club/gang; clique; faction/party/political party/society/
全 [quan2] /[surname]/all/complete/entire/entire or whole/entirely/every/intact; perfect/whole/
才 [cai2] /[for emphasis]/[indicates condition stated in subordinate clause is a prerequisite]/[indicates that sth. has just happened or is rather late by general standards]/[number is small] only/[surname]/ability/ability; talent; gift/an expert/endowment/gift/just/not until/only (then)/only if/people of a certain type/talent/then; afterwards/
四 [si4] /four/
已 [yi3] /afterwards/already/then/to stop/
所 [suo3] /actually/place/
敌 [di2] /enemy/match/
之 [zhi1] /(literary equivalent of 的)/(subor. part.)/her/him/it/
最 [zui4] /(the) most/-est/
光 [guang1] /[surname]/bare/bright/glory/light/light; illumination/luminary(light)/only/ray/scenery/smooth/used up/
产 [chan3] /estate/give birth/produce/products/property/resources/to produce/to reproduce/
情 [qing2] /emotion/feeling/passion/situation/
路 [lu4] /(surname)/[surname]/path/road/way/
分 [fen1] /(a measure word)/(a unit of length = 0.33 centimeter)/MW/distribute/divide/minute/part/to divide/\n[fen4] /part/
总 [zong3] /always/chief/gather/general/head/in every case/overall/to assemble/total/
条 [tiao2] /(measure word for ribbon)/a strip/article/etc./item/river/
白 [bai2] /(made) clear/White (as a symbol of reaction)/[surname]/blank/bright/clear/empty/free of charge/gratuitous/in vain; to no effect/mispronounced/plain/pure/pure; plain; blank/snow-white/snowy/spoken part in opera/state; explain/white/wrongly written/
话 [hua4] /conversation/dialect/language/speech/spoken words/talk/utterance/what someone said/word/words/
东 [dong1] /east/
席 [xi2] /banquet/place/seat/woven mat/
次 [ci4] /(measure word)/next/nth/number (of times)/order/second(ary)/sequence/
亲 [qin1] /closely related/dear/intimate/parent/relation/
如 [ru2] /as (if)/such as/
被 [bei4] /blanket/by (marker for passive-voice sentences or clauses)/quilt/to cover/to wear/
花 [hua1] /blossom/fancy pattern/flower/to spend (money, time)/
口 [kou3] /(a measure word)/Great Wall gateway/MW/age of draft animal/hole; cut/knife edge/mouth/opening; entrance/
放 [fang4] /to free/to let go/to let out/to place/to put/to release/
儿 [er2] /son/\n[er5] /non-syllabic dimi. suff./
常 [chang2] /[surname]/always/common/constant/ever/frequently/frequently; often/general/invariable/often/often; frequent/ordinary; common; normal/
西 [xi1] /west/
气 [qi4] /air/anger/gas/smell/to be enraged/to get angry/to make sb. angry/vital breath/weather/
五 [wu3] /5/five/
第 [di4] /(prefix before a number, for ordering numbers, eg, "first", "number two", etc)/
使 [shi3] /cause/make(let)/messenger/to cause/to employ/to enable/to make/to use/
写 [xie3] /to write/write/
军 [jun1] /arms/army/military/
吧 [ba1] /(onomat.)/dumb/\n[ba5] /(modal particle indicating polite suggestion)/...OK?/...right?/
文 [wen2] /culture/formal/language/literary/writing/
运 [yun4] /fate/fortune/luck/to move/to transport/to user/
在 [zai4] /(located) at/exist/in/
果 [guo3] /fruit/result/
怎 [zen3] /how/
定 [ding4] /to decide/to determine/to fix/to order/to set/
许 [xu3] /(surname)/to allow/to permit/to praise/
快 [kuai4] /fast/quick/swift/
明 [ming2] /bright/clear/next/to understand/
行 [xing2] /OK/all right/capable/competent/okay/temporary/to do/to go/to travel/to walk/will do/\n[xing4] /behavior/conduct/
因 [yin1] /because/cause/reason/
别 [bie2] /another/classify/depart/distinguish/do not/leave/must not/other/seperate/to pin/\n[bie4] /awkward/contrary/difficult/
飞 [fei1] /flutter/fly/hover/swiftly/to fly/
外 [wai4] /external/foreign/in addition/outside/
树 [shu4] /[surname]/tree/
物 [wu4] /matter/object/thing/
活 [huo2] /alive/living/to live/work/workmanship/
部 [bu4] /(a measure word for works of literature, films, machines, etc.)/(a measure word)/board/department/division/ministry/part/section/troops/
门 [men2] /MW/[surname]/door/entrance/family/field of endeavor/gate/gate(door)/knack/school (of thought)/sect/valve; switch/
无 [wu2] /-less/no/none/not/not to have/to lack/un-/
往 [wang3] /past/previous/to go (in a direction)/towards/\n[wang4] /(of a train) bound for/toward/
船 [chuan2] /a boat/boat/boat; ship/ship/vessel/
望 [wang4] /expect/hope/look towards/to gaze (into the distance)/to visit/towards/
新 [xin1] /[surname]/meso- (chem.)/new/newly/
带 [dai4] /[suggesting doing sth. at an opportune moment]/and/area/band/bear; have; with/belt/belt; girdle; ribbon; band; tape/bring/carry/consists of/girdle/lead/lead; head/look after; bring up; raise/region/ribbon/show/take; bring; carry/tyre/wear/zone/
队 [dui4] /group/squadron/team/
先 [xian1] /early/first/former/in advance/prior/
力 [li4] /force/power/strength/
完 [wan2] /complete/entire/to be over/to finish/whole/
间 [jian1] /(measure word)/among/between/space/\n[jian4] /interstice/separate/
却 [que4] /but/however/nevertheless/to decline/to go back/to retreat/while/yet/yet; but/
站 [zhan4] /stand/station/stop/to halt/to stand/to stop/
代 [dai4] /[surname]/age/dynasty/era/generation/geological era/historical period/period/replace/substitute/take the place of; act for (or on behalf of) others/
员 [yuan2] /employee/member/person/
机 [ji1] /machine/opportunity/secret/
更 [geng1] /to change/\n[geng4] /even more/further/more/still/still more/
九 [jiu3] /9/nine/
您 [nin2] /you (formal)/you (polite & respect form)/
每 [mei3] /each/every/
风 [feng1] /[surname]/custom/draft/manner/news/news; information/scene; view/style/style; practice; custome/wind/
级 [ji2] /grade/level/rank/step/
跟 [gen1] /and/heel/to follow/to go with/with/
笑 [xiao4] /laugh/smile/
啊 [a1] /(interj.)/ah/\n[a2] /an interjection/to express doubt or to question/to show realization/to stress/\n[a3] /(interj. for surprise)/\n[a4] /oh (interjection)/\n[a5] /(a modal particle showing affirmation, approval, or consent)/
孩 [hai2] /child/
万 [wan4] /(surname)/10,000/a great number/ten thousand/
少 [shao3] /few/lack/little/\n[shao4] /young/
直 [zhi2] /directly/frank/straight/straightly/upright/vertical/
意 [yi4] /desire/idea/meaning/wish/\n[yi1] /clothes/\n[yi4] /gown/to dress/to wear/
夜 [ye4] /night/
比 [bi3] /(particle used for comparison and "-er than")/ratio/to compare/to contrast/to gesture (with hands)/\n[bi4] /associate with/be near/
阶 [jie1] /rank or step/stairs/
连 [lian2] /(surname)/as/even/join/successively/to link/
车 [che1] /a vehicle/car/machine/to shape with a lathe/
重 [zhong4] /heavy/serious/
便 [bian4] /convenient/easy/handy/ordinary/plain/so/then/thus/to relieve oneself/
斗 [dou3] /Chinese peck/\n[dou4] /fight/incite/to battle/to fight/to incite/to struggle/
马 [ma3] /21st of month (tele.)/Ma (a surname)/[surname]/horse/
哪 [na3] /how/which/\n[na5] /(final part. preceded by N)/
化 [hua4] /-ization/to ... -ize/to change into/to make into/to transform/
太 [tai4] /extremely/greatest/highest/too (much)/very/
指 [zhi3] /finger/to direct/to indicate/to point/
变 [bian4] /rebellion/to become different/to change/to transform/to vary/
社 [she4] /group/society/
似 [si4] /like/similar/to appear/to resemble/to seem/
士 [shi4] /knight/scholar/warrior/
者 [zhe3] /-ist, -er (person)/person (who does sth)/
干 [gan1] /dry/shield/to concern/\n[gan4] /manage/stem/to do/to manage/to work/
石 [shi2] /rock/stone/
满 [man3] /Manchurian/filled/packed/to fulfill/to full/
决 [jue2] /breach (a dyke)/to decide/to determine/
百 [bai3] /hundred/
原 [yuan2] /cause/former/level/original/primary/raw/source/
拿 [na2] /to apprehend/to catch/to hold/to seize/to take/
群 [qun2] /MW/crowd/flock/group/
究 [jiu1] /after all/to investigate/to study carefully/
各 [ge4] /each/every/
六 [liu4] /six/
本 [ben3] /(a measure word)/basis/foundation/origin/root/roots or stems of plants/source/the current/this/
思 [si1] /to consider/to think/
解 [jie3] /to break up/to divide/to emancipate/to explain/to loosen/to separate/to untie/\n[jie4] /transport under guard/
立 [li4] /set up/to stand/
河 [he2] /river/
爸 [ba4] /dad/father/pa/papa/
村 [cun1] /village/
八 [ba1] /8/eight/
难 [nan2] /difficult/difficult (to...)/difficulty/not good/problem/\n[nan4] /disaster/distress/to scold/
早 [zao3] /early/morning/
论 [lun4] /by the/discuss/per/theory/to discuss/to talk (about)/
吗 [ma3] /morphine/\n[ma5] /(question tag)/
根 [gen1] /MW (long & thin objects)/basis/cause; origin/radical (chem.)/root/root; foot; base/source; root/
共 [gong4] /all together/common/general/in while/to share/together/
让 [rang4] /have (someone do something)/permit/to allow/to ask/to let/to yield/
相 [xiang1] /each other/mutually/one another/\n[xiang4] /appearance/picture/portrait/
研 [yan2] /grind fine/research/study/
今 [jin1] /current/modern/now/present/this/today/
其 [qi2] /her/his/it (refers to sth preceding it)/its/such/that/theirs/
书 [shu1] /book/letter/
坐 [zuo4] /to sit/to take (a bus, aeroplane etc.)/to take a seat/
接 [jie1] /to connect/to extend/to join/to receive/
应 [ying1] /ought/\n[ying4] /(surname)/to answer/to respond/
关 [guan1] /"shut/(surname)/[surname]"/barrier/close down/customs house/involve/lock up/mountain pass/pass, check/shut; close/to close/to concern/to involve/to shut/to turn off/turn off/
信 [xin4] /[surname]/believe/evidence/letter/message/sign/to believe/true/trust/
觉 [jue2] /awake/aware/feel/find that/thinking/
死 [si3] /inflexible/inpassable/rigid/to die/uncrossable/
步 [bu4] /a pace/a step/march/stages in a process/walk/
反 [fan3] /anti-/wrong side out or up/
处 [chu3] /deal with/get along with/to be in/to be in a position of/to dwell/to live/to reside/to stay/\n[chu4] /a place/bureau/department/location/office/point/respect/spot/
记 [ji4] /mark/sign/to note/to record/to remember/
将 [jiang1] /(will, shall, "future tense")/prepared/ready/to get/to use/\n[jiang4] /a general/
千 [qian1] /a swing/thousand/
找 [zhao3] /find; finding; found/give sb change/search/seek/to call on (sb)/to find/to look for/to return/to seek/to try to find/
争 [zheng1] /fight/struggle/
领 [ling3] /collar/neck/to lead/to receive/
或 [huo4] /maybe/might/or/perhaps/possibly/
师 [shi1] /a division (milit.)/expert/master/model/teacher/
结 [jie1] /bond/knot/sturdy/to bear (fruit)/to bind/to tie/
块 [kuai1] /(measure word for chunks, lumps)/chunk/lump/piece/\n[kuai4] /(a measure word, for cloth, cake, soap)/fast (of a watch)/happy/joyful/quick/rapid/soon/swift/yuan (unit of currency)/
跑 [pao3] /run/to escape/to run/
谁 [shui2] /who/
草 [cao3] /careless/careless; rough; hasty/draft/draft (of a document)/grass/grass; straw/hasty/manuscript/rough/straw/
越 [yue4] /the more ... the more/to climb over/to exceed/to surpass/
字 [zi4] /character/letter/symbol/word/
加 [jia1] /plus/to add/
脚 [jiao3] /a kick/base (of hill etc)/foot/role/
紧 [jin3] /nervous/strict/tight/
爱 [ai4] /affection/affection; love/be apt to/be in the habit of/like/like; be fond of/love/to be fond of/to like/to love/
等 [deng3] /and so on/await/class/equal to/et cetera/grade/rank/same as/wait for/
习 [xi2] /habit/to practice/to study/
阵 [zhen4] /burst/disposition of troops/short period/spate/spell/wave/
怕 [pa4] /to be afraid/to fear/
月 [yue4] /month/moon/
青 [qing1] /9th of month (tele.)/blue-green/
半 [ban4] /(after a number) and a half/half/incomplete/semi-/
火 [huo3] /[surname]/fire/
法 [fa3] /Legalist/law/method/way/
题 [ti2] /subject/to inscribe/to superscribe/topic/
建 [jian4] /to build/to construct/to establish/to found/to set up/
赶 [gan3] /catch up/drive away/hurry/to catch up/to drive away/to hurry/to overtake/to rush/
位 [wei4] /(measure word for persons)/location/place/position/seat/
唱 [chang4] /[surname]/call; cry/sing/to call loudly/to chant/
海 [hai3] /[surname]/ocean/sea/
七 [qi1] /7/seven/
女 [nu:3] /female/woman/
任 [ren4] /office/responsibility/to appoint/to assign/
件 [jian4] /(a measure word for thing/clothes/item/
感 [gan3] /to affect/to feel/to move/to touch/
准 [zhun3] /accurate/standard/to allow/to grant/to permit/
张 [zhang1] /(a measure word)/(a surname)/open up/
团 [tuan2] /circular/dumpling/group/regiment/round/society/
屋 [wu1] /house/room/
爷 [ye2] /etc./grandpa/old gentleman/
离 [li2] /(distant) from/from/to depart/to go away/to leave/
色 [se4] /appearance/color/look/
脸 [lian3] /cheek/countenance/face/
片 [pian1] /disc/sheet/\n[pian4] /a slice/flake/flate/piece/slice/thin/
科 [ke1] /branch/branch of medicine/division/family/field/subject/
倒 [dao3] /bankrupt/change; exchange/collapse; be overthrown; close down/fall(toppled)/fall; topple/to change/to collapse/to fail/to fall/to topple/\n[dao4] /inverted/to go home/to pour/to the contrary/to tip/turn over/upset/
睛 [jing1] /eye/
利 [li4] /advantage/benefit/profit/sharp/
世 [shi4] /age/era/generation/life/lifetime/world/
病 [bing4] /ailment/defect/disease/fall ill/illness/sick/sickness/
刚 [gang1] /barely/exactly/firm/hard/just/strong/
且 [qie3] /further/moreover/
由 [you2] /because of/by/cause/due to/follow/from/it is for...to/reason/to/to leave it (to sb)/
送 [song4] /"deliver/carry/escort"/give as a present/see sb. off, our/send(to deliver)/to carry/to deliver/to give (as a present)/to present (with)/to see off/to send/
切 [qie1] /to cut/to slice/\n[qie4] /close to/
星 [xing1] /satellite/small amount/star/
晚 [wan3] /evening/late/night/
表 [biao3] /a list or table/a meter/a watch/an example/chart/express/exterior/external/surface/to show/to watch/
够 [gou4] /to be enough/to reach/
整 [zheng3] /complete/entire/exactly/in good order/in order/orderly/whole/
认 [ren4] /to admit/to know/to recognize/
响 [xiang3] /(a measure word for sound)/loud/to make a sound/to ring/to sound/
雪 [xue3] /(avenge a wrong)/[surname]/snow/wipe out (a humiliation)/
流 [liu2] /to circulate/to flow/to move/to spread/
未 [wei4] /1-3 p.m./8th earthly branch/did not/have not/not/not yet/
场 [chang3] /(a measure word, used for sport or recreation)/a courtyard/a measure word/field/open space/place/
该 [gai1] /most likely/ought to/owe/should/that/the above-mentioned/to deserve/
并 [bing4] /(not) at all/also/amalgamate/and/combine/furthermore/simultaneously/to combine/to join/to merge/together with/
底 [di3] /background/base/bottom/
深 [shen1] /deep/deeply/depth/profound/
刻 [ke4] /(a measure word)/carve/cutting/engrave/highest degree/moment/oppressive/quarter (hour)/to carve/to cut/to engrave/?/
平 [ping2] /calm/equal/flat/level/peaceful/to draw/to make the same score/to tie/
伟 [wei3] /big/great/large/
忙 [mang2] /busy/
提 [ti2] /(upwards character stroke)/lifting (brush stroke in painting)/to carry/to lift/to mention/to put forward/
确 [que4] /authenticated/firm/real/solid/true/
近 [jin4] /approximately/close (to)/near/
亮 [liang4] /bright/light/
轻 [qing1] /easy/gentle/hydrogen/light/soft/
讲 [jiang3] /speech/to explain/to speak/to talk/to tell/
农 [nong2] /agriculture/
古 [gu3] /ancient/old/
黑 [hei1] /black/dark/
告 [gao4] /to inform/to say/to tell/
界 [jie4] /boundry/circles (ie, a group of people)/
拉 [la1] /to drag/to draw/to play (string instruments)/to pull/
名 [ming2] /(measure word for persons)/MW (persons)/[surname]/fame/famous/name/place (e.g. among winners)/reputation/well-known/
呀 [ya5] /(final part.)/
土 [tu3] /dust/earth/
清 [qing1] /clear/complete/distinct/pure/
阳 [yang2] /positive (electric.)/sun/
照 [zhao4] /according to/in accordance with/photograph/to illuminate/to reflect/to shine/
办 [ban4] /to deal with/to do/to go about/to handle/to manage/to run/to set up/
史 [shi3] /history/
改 [gai3] /to alter/to change/to correct/to transform/
历 [li4] /all/calendar/each/every/to experience/to pass through/to undergo/
转 [zhuan3] /"corner, turn"/to convey/to forward (mail)/to shift/to transfer/to turn/transfer/turn; change/\n[zhuan4] /to circle about/to revolve/to turn/to walk about/
画 [hua4] /draw/painting/picture/
造 [zao4] /educate/invent/make/make(create)/to build/to invent/to make/to manufacture/
嘴 [zui3] /mouth/
此 [ci3] /these/this/
治 [zhi4] /cure/to control/to govern/to harness (a river)/to heal/to manage/to rule/treatment/
北 [bei3] /be defeated/north/
必 [bi4] /certainly/must/necessarily/will/
服 [fu2] /clothes/dress/garment/submit/take (medicine)/
雨 [yu3] /rain/
穿 [chuan1] /pass through/pearce/penetrate/perforate/to bore through/to dress/to put on/to thread/to wear/
父 [fu4] /father/
内 [nei4] /inner/inside/interior/internal/within/
识 [shi2] /knowledge/to know/
验 [yan4] /to check/to examine/to test/\n[yan1] /how/where/
传 [chuan2] /to circulate/to conduct (electricity)/to infect/to pass on/to spread/to transfer/to transmit/
业 [ye4] /[surname]/already/business/course of study/enterprise/estate; property/industry/occupation/profession/study/trade/
菜 [cai4] /dish (type of food)/vegetables/
爬 [pa2] /climb/crawl/
睡 [shui4] /to sleep/
兴 [xing1] /flourish/it is the fashion to/to become popular/\n[xing4] /interest/
形 [xing2] /form/shape/to appear/to look/
量 [liang2] /to measure/\n[liang4] /amount/capacity/quantity/to estimate/
咱 [zan2] /we (incl.)/
观 [guan1] /to behold/to look at/to observe/to watch/
苦 [ku3] /bitter/cause suffering/doing one's utmost/hardship/intensely/miserable/pain/painful/suffer from/suffering/
体 [ti3] /body/form/style/system/
众 [zhong4] /multitude/
通 [tong1] /go through/know well/open/to communicate/to connect/
冲 [chong1] /dash against/highway/public road/to charge/to collide/to dash (against)/to rinse/to rush/to wash out/to water/\n[chong4] /dynamic/forceful/of great force/powerful/strong/to punch/towards/
合 [he2] /Chinese musical note/fit/to join/
破 [po4] /broken/damaged/to break/to split/worn out/
友 [you3] /friend/
度 [du4] /capacity/degree/standard/
术 [shu4] /method/technique/
饭 [fan4] /cooked rice/cuisine/food/meal/
公 [gong1] /common/honorable (designation)/just/public/
旁 [pang2] /beside/one side/other/self/side/
房 [fang2] /house/
南 [nan2] /[surname]/south/
枪 [qiang1] /firearm/gun/rifle/spear/
读 [du2] /to read/to study/
沙 [sha1] /[surname]/granule/hoarse/powder/raspy/sand/
岁 [sui4] /(a measure word)/year/years old/
线 [xian4] /line/string/thread/wire/
野 [ye3] /boundry/field/limit/open space/plain/rude/wild/
坚 [jian1] /firm/resolute/solid/strong/unyielding/
空 [kong1] /air/empty/in vain/sky/\n[kong4] /emptied/leisure/
收 [shou1] /receive/accept/bring to an end/collect/gather in/harvest/put away/restrain (emotion, action)"/take in/take in; received/to accept/to collect/to receive/
算 [suan4] /regard as/to calculate/to compute/to figure/
至 [zhi4] /arrive/most/to/until/
城 [cheng2] /city/city wall; wall/city walls/town/
劳 [lao2] /toil/
钱 [qian2] /(surname)/MW (unit of weight)/[surname]/coin/money/
特 [te4] /extraordinary/special/unusual/
围 [wei2] /to circle/to surround/
弟 [di4] /younger brother/
胜 [sheng1] /able to bear/peptide/\n[sheng4] /victorious/
教 [jiao1] /teach/\n[jiao4] /religion/teaching/
热 [re4] /feverent/heat/hot/hot (of weather)/to heat up/warm up/
展 [zhan3] /to postpone/to spread out/to unfold/to use/
包 [bao1] /bag/bundle/container/package/packet/to contract (to or for)/to cover/to hold/to hold or embrace/to include/to take charge of/to wrap/wrapper/
歌 [ge1] /sing/song/
类 [lei4] /category/class/kind/like/similar/to resemble/type/
渐 [jian1] /imbue/\n[jian4] /gradual (ly)/
强 [qiang2] /better/force/power/powerful/strength/
数 [shu3] /count/list/number; count/to count/\n[shu4] /figure/number/several/to calculate/to count/
乡 [xiang1] /country/village/
呼 [hu1] /to breath out/to call/to cry/to exahle/to shout/
性 [xing4] /characteristic/nature/sex/sex; sexual/suffix corresponding to -ness or -ity/surname/
音 [yin1] /news/noise/sound/
答 [da1] /agree/to answer/\n[da2] /answer/echo/reply/respond/return/
哥 [ge1] /elder brother/\n[ge3] /(surname)/
际 [ji4] /among/between/border/boundary/edge/interval/while/
旧 [jiu4] /former/old (opposite of new)/
座 [zuo4] /to sit/to take a seat/
章 [zhang1] /(surname)/[surname]/chapter/seal/section/
帮 [bang1] /gang/group/party/to assist/to help/to support/
啦 [la1] /(onomat.)/(phonetic)/\n[la5] /(an auxiliary word performing the grammatical functions of mood)/fusion of le + a/
受 [shou4] /(passive marker)/to bear/to endure/to receive/to stand/
系 [xi4] /be/bind/connect/connection/department/faculty/relation/system/tie up/to tie/
令 [ling4] /command/decree/honorable/make or cause to be/order/
跳 [tiao4] /bounce/hop/jump/leap/move up & down/skip (a grade)/skip (over)/to beat/to bounce/to leap/
非 [fei1] /non-/not-/un-/
何 [he2] /carry/how/what/which/why/
牛 [niu2] /[surname]/bull/cattle/cow/ox/
取 [qu3] /to choose/to fetch/to get/to take/
入 [ru4] /to enter/
岸 [an4] /bank/beach/coast/shore/
敢 [gan3] /dare/
掉 [diao4] /to drop/to fall/
忽 [hu1] /suddenly/
种 [zhong3] /kind/race (of people)/seed/type/\n[zhong4] /to grow/to plant/
装 [zhuang1] /adorn/adornment/clothing/costume/dress/
顶 [ding3] /a measure word (use with "hat")/go against/most/peak/to replace/to substitute/top/
急 [ji2] /hurried/worried/
林 [lin2] /forest/woods/
停 [ting2] /to halt/to stop/
息 [xi1] /breath/interest/news/rest/
句 [ju4] /(a measure word, for sentences or lines of verse)/sentence/
娘 [niang2] /mother/troubled/young lady/
区 [qu1] /area/distinguish/districts/region/
衣 [yi4] /desire/idea/meaning/wish/\n[yi1] /clothes/\n[yi4] /gown/to dress/to wear/
般 [ban1] /class/kind/manner/sort/way/
报 [bao4] /announce; declare/bulletin; report/newspaper/periodical; journal/recompense/reply; respond; requite/report/revenge/telegram; cable/to announce/to inform/
叶 [ye4] /(surname)/leaf/page/
压 [ya1] /approach/keep under control; control/press/press; push down; weigh down/shelve/suppress/to keep under (control)/to press/to push down/\n[ya4] /in the first place/to crush/
母 [mu3] /female/mother/
慢 [man4] /slow/
叔 [shu1] /uncle in direct address/
背 [bei1] /carry on one's back/to be burdened/to carry on the back or shoulder/\n[bei4] /learn by heart/the back of the body/
细 [xi4] /fine/minutely/slender/thin/