README 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. Oren Tirosh is no longer maintaining the original version of this project.
  2. Stephen Paul Weber likes it and is making it accessible on GitHub.
  3. These routines implement a method for encoding binary data into a sequence
  4. of words which can be spoken over the phone, for example, and converted
  5. back to data on the other side.
  6. For more information see <http://web.archive.org/web/20101031205747/http://www.tothink.com/mnemonic/>
  7. There are some other somewhat similar systems that seem less satisfactory:
  8. - OTP was designed for easy typing, and for minimizing length, but as
  9. a consequence the word list contains words that are similar ("AD"
  10. and "ADD") that are poor for dictating over the phone
  11. - PGPfone has optimized "maximum phonetic distance" between words,
  12. which resolves the above problem but has some other drawbacks:
  13. - Low efficiency, as it encodes a little less than 1 bit per
  14. character;
  15. - Word quality issues, as some words are somewhat obscure to
  16. non-native speakers of English, or are awkward to use or type.
  17. Mnemonic tries to do better by being more selective about its word
  18. list. Its criteria are thus:
  19. Mandatory Criteria:
  20. - The wordlist contains 1626 words.
  21. - All words are between 4 and 7 letters long.
  22. - No word in the list is a prefix of another word (e.g. visit,
  23. visitor).
  24. - Five letter prefixes of words are sufficient to be unique.
  25. Less Strict Criteria:
  26. - The words should be usable by people all over the world. The list
  27. is far from perfect in that respect. It is heavily biased towards
  28. western culture and English in particular. The international
  29. vocabulary is simply not big enough. One can argue that even words
  30. like "hotel" or "radio" are not truly international. You will find
  31. many English words in the list but I have tried to limit them to
  32. words that are part of a beginner's vocabulary or words that have
  33. close relatives in other european languages. In some cases a word
  34. has a different meaning in another language or is pronounced very
  35. differently but for the purpose of the encoding it is still ok - I
  36. assume that when the encoding is used for spoken communication
  37. both sides speak the same language.
  38. - The words should have more than one syllable. This makes them
  39. easier to recognize when spoken, especially over a phone
  40. line. Again, you will find many exceptions. For one syllable words
  41. I have tried to use words with 3 or more consonants or words with
  42. diphthongs, making for a longer and more distinct
  43. pronounciation. As a result of this requirement the average word
  44. length has increased. I do not consider this to be a problem since
  45. my goal in limiting the word length was not to reduce the average
  46. length of encoded data but to limit the maximum length to fit in
  47. fixed-size fields or a terminal line width.
  48. - No two words on the list should sound too much alike. Soundalikes
  49. such as "sweet" and "suite" are ruled out. One of the two is
  50. chosen and the other should be accepted by the decoder's
  51. soundalike matching code or using explicit aliases for some words.
  52. - No offensive words. The rule was to avoid words that I would not
  53. like to be printed on my business card. I have extended this to
  54. words that by themselves are not offensive but are too likely to
  55. create combinations that someone may find embarrassing or
  56. offensive. This includes words dealing with religion such as
  57. "church" or "jewish" and some words with negative meanings like
  58. "problem" or "fiasco". I am sure that a creative mind (or a random
  59. number generator) can find plenty of embarrasing or offensive word
  60. combinations using only words in the list but I have tried to
  61. avoid the more obvious ones. One of my tools for this was simply a
  62. generator of random word combinations - the problematic ones stick
  63. out like a sore thumb.
  64. - Avoid words with tricky spelling or pronounciation. Even if the
  65. receiver of the message can probably spell the word close enough
  66. for the soundalike matcher to recognize it correctly I prefer
  67. avoiding such words. I believe this will help users feel more
  68. comfortable using the system, increase the level of confidence and
  69. decrease the overall error rate. Most words in the list can be
  70. spelled more or less correctly from hearing, even without knowing
  71. the word.
  72. - The word should feel right for the job. I know, this one is very
  73. subjective but some words would meet all the criteria and still
  74. not feel right for the purpose of mnemonic encoding. The word
  75. should feel like one of the words in the radio phonetic alphabets
  76. (alpha, bravo, charlie, delta etc).
  77. mnemonic.h Header file
  78. mnemonic.c Encoding/decoding and associated routines
  79. mn_wordlist.c The word list itself
  80. mnencode.c Sample program - encode data from stdin to stdout
  81. mndecode.c Sample program - decode data from stdin to stdout
  82. == Other Implementations ==
  83. Elixr: <https://github.com/mwmiller/mnemonex>
  84. Go: <https://bitbucket.org/dchapes/mnemonicode>
  85. JavaScript: <https://github.com/mbrubeck/mnemonic.js>
  86. Python: <https://github.com/bwhmather/python-mnemonicode>
  87. Rust: <https://github.com/mbrubeck/rust-mnemonic>