home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / HORNDRV1.ZIP / TALK.DOC next >
Encoding:
Text File  |  1995-10-23  |  31.2 KB  |  1,083 lines

  1.                                                                  10-Oct-1995
  2.  
  3.     Introduction
  4.     =========================================================================
  5.  
  6.     The device driver was origonally written in 1992 over a three month
  7.     period.
  8.  
  9.     The computer I wrote this driver on was a vintage 1987 "Profound" AT
  10.     clone, clock speed at about 8Mhz. The computer currently resides in bit
  11.     heaven.
  12.  
  13.     The program was written entirely in "C", compiled using Borland's
  14.     Turbo-C++ V3.0 compiler (1992) with an assembly language interface stub
  15.     to the Dos Operating System.
  16.  
  17.     As the Borland environment does not include a standalone assembler I've
  18.     used a public domain assembler used to assemble an 80286 assembly source
  19.     interface stub, and linked together the objects using Borland's project
  20.     file facility.
  21.  
  22.     The software was archived and kept on my bookshelf for two and a half
  23.     years. Recently I began surfing the net and noticed people wanted text
  24.     to speech software so I humbly submit this as yet another example of
  25.     such software. My code is a plagiarists paradise of other peoples
  26.     endevours, ideas and articles all in the public domain. In no way do
  27.     I consider the driver solely my invention, I had scavenged BBS looking
  28.     for appropriate source!
  29.  
  30.     The driver enclosed is a poor mans voice simulation for the ENGLISH
  31.     language. The quality of the output is rather poor, perhaps because I've
  32.     played a bit with the English to Phoneme Translator table. It is a
  33.     general purpose text to speech driver that enables DOS to speak text
  34.     that is presented via the DOS driver interface.
  35.  
  36.     This implementation will only work with the certain loudspeakers generally
  37.     those found in desktop or tower computers with a built in loud speaker.
  38.  
  39.     I made this a general purpose text to speech driver for two reasons.
  40.     Firstly to minimise memory usage and secondly to ignore decisions like,
  41.     "what is the contextual meaning of this sentence"? And how should I
  42.     interpret the token streams in that sentence!
  43.  
  44.     The driver can be customised as I've included a phoneme to speech
  45.     interface. (See the driver switches)
  46.  
  47.     The reason for developing this program was fourfold:
  48.  
  49.     1. This driver adds an extra dimension to the man-machine interface
  50.     2. I wanted a CHEAP means of reproducing speech easily for ANY program
  51.        that I write in the future
  52.     3. It should run with no extra hardware support apart from that found
  53.        on a standard AT-Style non-portable computer.
  54.     4. Practice writing loadable device drivers with some potentially useful
  55.        pratical benefit for other programmers or computer users.
  56.  
  57.  
  58.     Files included in the distribution
  59.     ==================================
  60.  
  61.     talk.doc        31953  23-10-95   1:52   Driver Documentation
  62.     talk.sys        32560  23-10-95   1:10   Talking device Driver
  63.     tstdrv.c         1449  23-19-95   1:46   Test Program source
  64.     tstdrv.com       8912  23-10-95   1:56   Test Program executable
  65.     words            8398  13-10-92   1:03   Test Program data file
  66.  
  67.  
  68.     The driver is made up of two user attachable subsystems. There is
  69.     the English text subsystem that translates english text to phonemes and
  70.     a phoneme subsystem that "speaks" the phonemes to the PC speaker.
  71.     The english subsystem can be reached by opening the file $talk$. The
  72.     phoneme subsystem can be reached by opening the file $phonem$.
  73.  
  74.     Installation
  75.     =========================================================================
  76.  
  77.  
  78.     The minimum hardware to load the driver on is a 80286 8Mhz AT clone PC.
  79.  
  80.     The driver should be included in the CONFIG.SYS file with the DEVICE
  81.     statement.
  82.  
  83.     DEVICE=TALK.SYS {switches}
  84.  
  85.     where the switches are:
  86.  
  87.     -d{num} Set the DMA rate which bits are strobed out (Default: System's)
  88.     -i      Disable Interrupts during speech            (Default: Enabled)
  89.     -t      Programmers trace mode
  90.     -q      Quiet no initialisation messages please     (Default: Not Quiet)
  91.  
  92.     For example is quiet boot:
  93.  
  94.         DEVICE=TALK.SYS -q
  95.  
  96.  
  97.     Once the system is rebooted and the driver is loaded in you should see
  98.     the following message come up on the screen assuming your not in quiet
  99.     mode.
  100.  
  101.                 Text To Speech Device Driver
  102.                 Written by Jon Hornstein
  103.                 Melbourne, Australia
  104.                 Ver 0.5, Oct 16 1995
  105.  
  106.     How to use the Driver
  107.     =========================================================================
  108.     The device works like any Read/Write file stream. If we copy a file to
  109.     the device driver the file is spoken by DOS. Character drivers receive
  110.     data one character at a time from DOS. As the character is receied it
  111.     is coverted to uppercase so the user can consider the data as case
  112.     insensitive.
  113.  
  114.     There are two subsystems set up as filenames on the DOS file system.
  115.     The files are called $TALK$ and $PHONEM$. Sending data to the $TALK$
  116.     subsystem will cause the data to be interpreted as english. To read the
  117.     translations to phonemes READ the data from the $TALK$ subsystem.
  118.     The phoneme subsystem has no feed back except via the speaker.
  119.  
  120.                     echo 123>$talk$
  121.  
  122.                     type $talk$
  123.                     -W-UH-N- -T-OO- -TH-R-EE- - -
  124.  
  125.                     type $phonem$
  126.                     Read error on device $PHONEM$
  127.                     R(etry), I(gnore), F(ail), or A(bort)?
  128.  
  129.  
  130.                     copy {file} $talk$
  131.  
  132.                     type {file} >$talk$
  133.  
  134.                     echo 12345.56 >$talk$
  135.  
  136.               or to the phoneme subsystem
  137.  
  138.                     echo w-uh-n   t-oo   h-eh-l-oh-w>$phonem$
  139.  
  140.               you can do the following but this leads to "infinite" loops of
  141.               talking interruptable only with a <CTRL>C. The "hello there"
  142.               is converted to phonemes which is in turn is typed then
  143.               directed back into the $talk$ read buffer which is in turn
  144.               sent to the phoneme device which in turn is directed back
  145.               into the $talk$ read buffer.
  146.  
  147.                     echo hello there >$talk$
  148.                     type $talk$>$phonem$
  149.  
  150.     Under program control the programmer can open the driver like a normal
  151.     file. The "C" code fragment below illustrates this point.
  152.  
  153.     -----------------------------cut here--------------------------
  154.     #include <stdio.h>
  155.  
  156.     int main(void)
  157.     {
  158.     FILE *pTalkFile;
  159.  
  160.         if((pTalkFile = fopen("$talk$", "r+")) != NULL)
  161.         {
  162.             /*
  163.              * Note the \n or LF character implies end of token
  164.              */
  165.             fprintf(pTalkFile, "Hello there\n");
  166.             fclose(pTalkFile);
  167.         }
  168.         return(pTalkFile == NULL);
  169.     }
  170.     -----------------------------cut here--------------------------
  171.  
  172.  
  173.     Phonemes generated from the phoneme layer of the software is put into a
  174.     128 byte buffer able to be viewed as the output from the driver.
  175.  
  176.              type $talk$
  177.  
  178.              or
  179.  
  180.              copy $talk$ con:
  181.  
  182.     There is a driver exerciser that takes a set of words and speaks them.
  183.  
  184.     To execute the test program type:
  185.  
  186.           tstdrv words
  187.  
  188.     The source for the test program had been included.
  189.  
  190.  
  191.     Some notes about the implementation
  192.     =========================================================================
  193.  
  194.     The driver works independently from the speed of the CPU clock rate.
  195.     The driver stores variable sized data tables called "Phoneme Sound
  196.     Tables" that can reproduce speech by sending the data to the PC speaker.
  197.     Stringing tegether the phonemes produces speech.
  198.  
  199.     To achieve CPU timing independence the phoneme sound table sync's
  200.     each bit to the DMA memory refresh flag on port 0x61 bit 4. Every time
  201.     a DMA memory refresh occurs the driver strobes a bit to the loadspeaker.
  202.  
  203.     The following code fragment can alter the rate at which the DMA memory
  204.     refresh occurs. Faster rate will generate a higher pitch and a lower rate
  205.     will lower the pitch. There is a switch on the DEVICE line that will allow
  206.     the rate to alter.
  207.  
  208.     I've noted that the DMA rate counter is set to 18, hence 18 input to the
  209.     command line for the program below will reproduce acceptable speech.
  210.  
  211.     -----------------------------cut here--------------------------
  212.     #include <dos.h>
  213.     #include <stdlib.h>
  214.  
  215.     void main(int argc, char **argv)
  216.     {
  217.         if(argc == 2)
  218.         {
  219.             outportb(0x43, 0x46);       // Latch the DRAM DMA refresh counter
  220.             outportb(0x41, atoi(argv[1])); // Set the counter
  221.         }
  222.     }
  223.     -----------------------------cut here--------------------------
  224.  
  225.  
  226.     Every time a new "token" is spoken the speech subsystem will turn
  227.     off the speaker oscillations by using the Turbo C "nosound" function.
  228.     Tokens are groups of alpha characters or individual "other" characters
  229.     up to 50 characters long.
  230.  
  231.  
  232.  
  233.     Grammer for a tokens:
  234.  
  235.                  #-----<--------#
  236.                  |              |
  237.            ->----#--[ALPHA]--->-#--#-->
  238.                  |                 |
  239.                  #--[DIGIT]--->----#
  240.                  |                 |
  241.                  #--[OTHER]--------#
  242.  
  243.  
  244.     As well as the existing space characters I insert a pause between each
  245.     token.
  246.  
  247.     Some control characters are not spoken, thats the nature of trying to
  248.     please everyone. Because this is a text -> speech program symbols that
  249.     I didn't consider appropriate text are filtered and not spoken.
  250.  
  251.     In this drivers implementation I kept interrupts enabled. I wanted to
  252.     keep the interference with the rest of the system to a minimum. A switch
  253.     is available to disable interrupts if other tasks are interfering with
  254.     the speech.
  255.  
  256.     I'm sorry for taking up 32 Kbytes.
  257.  
  258.     3  bytes was used for the output phoneme buffer
  259.     128 bytes was used for the output ring buffer for phoneme output
  260.     50 bytes Token size
  261.     200 bytes of stack
  262.  
  263.     The driver is built up of three subsystems:
  264.  
  265.      1. DOS operating system interface
  266.      2. English to Phoneme translator
  267.      3. Phoneme to sound translator
  268.  
  269.  
  270.  
  271.     1. The code for the interface to the DOS Operating System was based upon
  272.        a "C User Journal" articles about writing device drivers, which I may
  273.        further add regarding this publication, I believe it is the most
  274.        important popular journal of it's type on the market for profession
  275.        C coders.
  276.  
  277.        The assembly interface was taken from "Tech Specialist", September
  278.        1991 an article by Larry Weaver, with a little massage to get it to
  279.        work with Turbo-C
  280.  
  281.  
  282.     2. The English to Phoneme Translator tables adapted for my driver was
  283.        taken from the TRAN program which was written by Stephen Neely.
  284.        He states in his documentation:
  285.  
  286.        Most of the speech-to-text rules used in the tran program come
  287.        from an article in an IEEE journal:
  288.  
  289.        Elovitz, H.S., Johnson, R., McHugh, A., and Shore, J.E.  (1976).
  290.        "Letter-to-Sound Rules for Automatic Translation of English Text
  291.        to Phonetics," IEEE Transactions on Acoustics, Speech, and Signal
  292.        Processing, Vol.  ASSP-24(6), 446-458.
  293.  
  294.  
  295.  
  296.     3. The Phoneme to Sound subsystem which is made up of phoneme tables and
  297.        code that transfers the table data to the speaker. The table data
  298.        was converted from N. Spieth's PASCAL source program TSPEECH.
  299.        The relevant code was translated into my preferred language "C" and
  300.        incorporated into initially a Phoneme Device Driver.
  301.  
  302.        The timing for the loudspeaker up to a 30 microsecond resolution was
  303.        accomplished by using the ideas expoused from BYTE magazine Vol. 12,
  304.        No. 12 1987 "Inside the IBM PC's", extra edition the article by
  305.        Cohen & Hanel.
  306.  
  307.  
  308.  
  309.  
  310.     The reason why I submitting the driver at a very primitive stage without
  311.     further investigation into possibilities of further improving the speech
  312.     or the code was frankly I've better thing to do with my time than sit at
  313.     a computer terminal day and night!
  314.  
  315.     In my own opinion the speech is rather primitive compared to sound card
  316.     text to speech reproduction that I've heard. To get a better quality I
  317.     need a different approach to the speech generation. Either superiour
  318.     phoneme tables or one of the many other ways of simulating the human
  319.     voice organs via mathematical simulation.
  320.  
  321.     Currently the version of the driver is 0.5 being that as FREEWARE
  322.     software, I do not guarantee that it is fully bug free and hence always
  323.     in maintenance beta mode. I MAY resubmit this driver again
  324.     if I could obtain a better set of phonemes to work from or the removal
  325.     of any obvious software bugs.
  326.  
  327.     As an aside I wanted to compress the phoneme tables but at this stage
  328.     haven't seen a way to significantly save space with any of the normal
  329.     compression schemes. I only got minor saving of space not warranting
  330.     more large code capsules to be included in the driver.
  331.  
  332.  
  333.  
  334.     Internationalisation
  335.     =========================================================================
  336.  
  337.     As you may have noticed this was written by an australian. We spell
  338.     and talk differently from the rest of the english speaking world. I
  339.     make no apologies the country settings I generally use is 061. ie
  340.     COUNTRY=061.
  341.  
  342.     Our currency is expressed in dollars and our codepages reflect a
  343.     more americana presentation. When I changed English to Phoneme
  344.     Translation Tables I would err on the side that would be pleasant
  345.     and soothing to australian ears.
  346.  
  347.  
  348.     Appendix
  349.     =========================================================================
  350.  
  351.     The following List is the list of available phonemes. Slighly extended
  352.     from Andy McGuire set of phonemens.
  353.  
  354.  
  355.     "A"                       "B"                        "C"
  356.     "D"                       "E"                        "F"
  357.     "G"                       "H"                        "J"
  358.     "K"                       "L"                        "M"
  359.     "N"                       "O"                        "P"
  360.     "R"                       "S"                        "T"
  361.     "U"                       "V"                        "W"
  362.     "Y"                       "Z"
  363.  
  364.     "AW"                      "AH"                       "UH"
  365.     "AE"                      "OH"                       "EH"
  366.     "OO"                      "IH"                       "EE"
  367.     "WH"                      "CH"                       "SH"
  368.     "TZ"                      "TH"                       "ZH"
  369.  
  370.  
  371.     The following string table is the grammer that constitute english to
  372.     phoneme conversion. This is based upon Thom Henderson's TRAN program.
  373.  
  374.   "text found / Text before text found / Text after  text found/ phoneme"
  375.  
  376.  
  377.  
  378.     " /// "
  379.  
  380.     "A// /UH"
  381.     "ARE/ / /AH-R"
  382.     "AR/ /O/UH-R"
  383.     "AR//#/EH-R"
  384.     "AS/ ^/#/AE-A-S"
  385.     "A//WA/UH"
  386.     "AW///AW"
  387.     "ANY/ ://EH-N-EE"
  388.     "A//^+#/AE-A"
  389.     "ALLY/#://UH-L-EE"
  390.     "AL/ /#/UH-L"
  391.     "AGAIN///UH-G-EH-N"
  392.     "AG/#:/E/IH-J"
  393.     "A//^+:#/AE"
  394.     "A/ :/^+/AE-A"
  395.     "ARR/ //UH-R"
  396.     "ARR///AE-R"
  397.     "AR/ ://AH-R"
  398.     "AR// /AE-R"
  399.     "AR///AH-R"
  400.     "AIR///EH-R"
  401.     "AI///AE-A"
  402.     "AY///AE-A"
  403.     "AU///AW"
  404.     "AL/#:/ /UH-L"
  405.     "ALS/#:/ /UH-L-Z"
  406.     "ALK///AW-K"
  407.     "AL//^/AW-L"
  408.     "ABLE/ ://AE-A-B-UH-L"
  409.     "ABLE///UH-B-UH-L"
  410.     "ANG//+/AE-A-N-J"
  411.     "ATHE/ C/ /AE-TH-EE"
  412.     "A//A/AH"
  413.     "A///AE"
  414.  
  415.     "BE/ /^#/B-IH"
  416.     "BEING///B-EE-IH-N"
  417.     "BOTH/ / /B-OH-TH"
  418.     "BUS/ /#/B-IH-Z"
  419.     "BUIL///B-IH-L"
  420.     "B/ / /B-EE"
  421.     "B///B"
  422.  
  423.     "CH/ /^/K"
  424.     "CH/^E//K"
  425.     "CH///CH"
  426.     "CI/ S/#/S-AH-EE"
  427.     "CI//A/SH"
  428.     "CI//O/SH"
  429.     "CI//EN/SH"
  430.     "C//+/S"
  431.     "CK///K"
  432.     "COM//%/K-AH-M"
  433.     "C/ / /S-EE"
  434.     "C///K"
  435.  
  436.     "DED/#:/ /D-IH-D"
  437.     "D/.E/ /D"
  438.     "D/#^:E/ /T"
  439.     "DE/ /^#/D-IH"
  440.     "DO/ / /D-OO"
  441.     "DOES/ //D-UH-Z"
  442.     "DOING/ //D-OO-IH-N"
  443.     "DOW/ //D-OH"
  444.     "DU//A/J-OO"
  445.     "D/ / /D-EE"
  446.     "DOUGH///D-OH"
  447.     "D///D"
  448.  
  449.     "E/#:/ /"
  450.     "E/'^:/ /"
  451.     "E/ :/ /EE"
  452.     "ED/#/ /D"
  453.     "E/#:/D /"
  454.     "ER//EV/EH-V"
  455.     "EVEN/ EL//EH-V-EH-N"
  456.     "EVEN/ S//EH-V-EH-N"
  457.     "E//^%/EE"
  458.     "E//PH%/EE"
  459.     "ERI//#/EE-R-EE"
  460.     "ER/#:/#/AE-R"
  461.     "ER//#/EH-R"
  462.     "ER///AE-R"
  463.     "EVEN/ //EE-V-EH-N"
  464.     "E/#:/W/"
  465.     "EW/@//OO"
  466.     "EW///Y-OO"
  467.     "E//O/EE"
  468.     "ES/#:&/ /IH-Z"
  469.     "E/#:/S /"
  470.     "ELY/#://L-EE"
  471.     "EMENT/#://M-EH-N-T"
  472.     "EFUL///F-U-L"
  473.     "EE///EE"
  474.     "EARN///AE-R-N"
  475.     "EAR/ /^/AE-R"
  476.     "EAD///EH-D"
  477.     "EA/#:/ /EE-UH"
  478.     "EA//SU/EH"
  479.     "EA///EE"
  480.     "EIGH///AE-A"
  481.     "EI///EE"
  482.     "EYE/ //AH-EE"
  483.     "EY///EE"
  484.     "EU///Y-OO"
  485.     "E/ / /EE"
  486.     "E/^/ /"
  487.     "E///EH"
  488.  
  489.     "FUL///F-U-L"
  490.     "F/F//"
  491.     "F/ / /EH-F"
  492.     "F///F"
  493.  
  494.     "GIV///G-IH-V"
  495.     "G/ /I^/G"
  496.     "GE//T/G-EH"
  497.     "GGES/SU//G-J-EH-SS"
  498.     "G/G//"
  499.     "G/ B#//G"
  500.     "G//+/J"
  501.     "GREAT///G-R-AE-A-T"
  502.     "GH/#//"
  503.     "G/ / /G-EE"
  504.     "G///G"
  505.  
  506.     "HAV/ //H-AE-V"
  507.     "HERE/ //H-EE-R"
  508.     "HOUR/ //OH-AE-R"
  509.     "HOW///H-OH"
  510.     "H//#/H"
  511.     "H/ / /H-AE-CH"
  512.     "H///"
  513.  
  514.     "IN/ //IH-N"
  515.     "I/ / /AH-EE"
  516.     "IN//D/IH-N"
  517.     "IER///EE-AE-R"
  518.     "IED/#:R//EE-D"
  519.     "IED// /AH-EE-D"
  520.     "IEN///EE-EH-N"
  521.     "IE//T/AH-EE-EH"
  522.     "I/ :/%/AH-EE"
  523.     "I//%/EE"
  524.     "IE///EE"
  525.     "INE/N//AH-EE-N"
  526.     "IME/T//AH-EE-M"
  527.     "I//^+:#/IH"
  528.     "IR//#/AH-EE-R"
  529.     "IS//%/AH-EE-S"
  530.     "IX//%/IH-K-S"
  531.     "IZ//%/AH-EE-Z"
  532.     "I//D%/AH-EE"
  533.     "I/+^/^+/IH"
  534.     "I//T%/AH-EE"
  535.     "I/#^:/^+/IH"
  536.     "I//^+/AH-EE"
  537.     "IR///AE-R"
  538.     "IGH///AH-EE"
  539.     "ILD///AH-EE-L-D"
  540.     "IGN// /AH-EE-N"
  541.     "IGN//^/AH-EE-N"
  542.     "IGN//%/AH-EE-N"
  543.     "IQUE///EE-K"
  544.     "I///IH"
  545.  
  546.     "J/ / /J-A-EE"
  547.     "J///J"
  548.  
  549.  
  550.     "K//N/"
  551.     "K/ / /K-A-EE"
  552.     "K///K"
  553.  
  554.     "LO//C#/L-OH"
  555.     "L/L//"
  556.     "L/#^:/%/UH-L"
  557.     "LEAD///L-EE-D"
  558.     "L/ / /AE-L"
  559.     "L///L"
  560.  
  561.     "MOV///M-OO-V"
  562.     "M/ / /EH-M"
  563.     "M///M"
  564.  
  565.     "NG/E/+/N-J"
  566.     "NG//R/N"
  567.     "NG//#/N"
  568.     "NGL//%/N-UH-L"
  569.     "NG///N"
  570.     "NK///N-K"
  571.     "NOW/ / /N-OH"
  572.     "N/ / /EH-N"
  573.     "N/N//"
  574.     "N///N"
  575.  
  576.     "OF// /UH-V"
  577.     "OROUGH///AE-R-OH"
  578.     "OR/ F/TY/OH-R"
  579.     "OR/#:/ /AE-R"
  580.     "ORS/#:/ /AE-R-Z"
  581.     "OR///AW-R"
  582.     "ONE/ //W-UH-N"
  583.     "OW//EL/OH"
  584.     "OW///OH"
  585.     "OVER/ //OH-V-AE-R"
  586.     "OV///UH-V"
  587.     "O//^%/OH"
  588.     "O//^EN/OH"
  589.     "O//^I#/OH"
  590.     "OL//D/OH-L"
  591.     "OUGHT///AH-T"
  592.     "OUGH///UH-F"
  593.     "OU/ /^L/UH"
  594.     "OU/ //OH"
  595.     "OU/H/S#/OH"
  596.     "OUS///UH-S"
  597.     "OUR/ F//OH-R"
  598.     "OUR///AW-R"
  599.     "OUD///U-D"
  600.     "OUP///OO-P"
  601.     "OU///OH"
  602.     "OY///AW-EE"
  603.     "OING///OH-IH-N"
  604.     "OI///AW-EE"
  605.     "OOR///OH-R"
  606.     "OOK///U-K"
  607.     "OOD///U-D"
  608.     "OO///OO"
  609.     "O//E/OH"
  610.     "O// /OH"
  611.     "OA// /OH"
  612.     "ONLY/ //OH-N-L-EE"
  613.     "ONCE/ //W-UH-N-S"
  614.     "ON'T// /OH-N-T"
  615.     "O/C/N/AH"
  616.     "O//NG/AH"
  617.     "O/^:/N/UH"
  618.     "ON/I//UH-N"
  619.     "ON/#:/ /UH-N"
  620.     "ON/#^//UH-N"
  621.     "O//ST /OH"
  622.     "OF//^/AW-F"
  623.     "OTHER///UH-TH-AE-R"
  624.     "OSS// /AW-S"
  625.     "OM/#^:/ /UH-M"
  626.     "O///AH"
  627.  
  628.     "PH///F"
  629.     "PEOP///P-EE-P"
  630.     "POW///P-OH"
  631.     "PUT// /P-U-T"
  632.     "P/ / /P-EE"
  633.     "P/P//"
  634.     "P///P"
  635.  
  636.     "QUAR///K-W-AW-R"
  637.     "QU/ //K-W"
  638.     "QU///K"
  639.     "Q/ / /K-OO"
  640.     "Q///K"
  641.  
  642.     "RE/ /^#/R-EE"
  643.     "R/ / /AH"
  644.     "R/R//"
  645.     "R///R"
  646.  
  647.     "SH///SH"
  648.     "SION/#//ZH-UH-N"
  649.     "SOME///S-AH-M"
  650.     "SUR/#/#/ZH-AE-R"
  651.     "SUR//#/SH-AE-R"
  652.     "SU/#/#/ZH-OO"
  653.     "SSU/#/#/SH-OO"
  654.     "SED/#/ /Z-D"
  655.     "S/#/#/Z"
  656.     "SAID///S-EH-D"
  657.     "SION/^//SH-UH-N"
  658.     "S/S//"
  659.     "S/./ /Z"
  660.     "S/#:.E/ /Z"
  661.     "S/#^:##/ /Z"
  662.     "S/#^:#/ /S"
  663.     "S/U/ /S"
  664.     "S/ :#/ /Z"
  665.     "SCH/ //S-K"
  666.     "S//C+/"
  667.     "SM/#//Z-M"
  668.     "SN/#/ /Z-UH-N"
  669.     "S/ / /EH-S"
  670.     "S///S"
  671.  
  672.     "THE/ / /TH-UH"
  673.     "TO// /T-OO"
  674.     "THAT///TH-AE-T"
  675.     "THIS/ / /TH-IH-S"
  676.     "THEY/ //TH-AE-A"
  677.     "THERE/ //TH-EH-R"
  678.     "THER///TH-AE-R"
  679.     "THEIR///TH-EH-EH"
  680.     "THAN/ / /TH-AE-N"
  681.     "THEM/ / /TH-EH-M"
  682.     "THESE// /TH-EE-Z"
  683.     "THEN/ //TH-EH-N"
  684.     "THROUGH///TH-R-OO"
  685.     "THOSE///TH-OH-Z"
  686.     "THOUGH// /TH-OH"
  687.     "THUS/ //TH-UH-S"
  688.     "TH///TH"
  689.     "TED/#:/ /T-IH-D"
  690.     "TI/S/#N/CH"
  691.     "TI//O/SH"
  692.     "TI//A/T"
  693.     "TIEN///SH-UH-N"
  694.     "TUR//#/CH-AE-R"
  695.     "TU//A/CH-OO"
  696.     "TWO/ //T-OO"
  697.     "T/ / /T-EE"
  698.     "T/T//"
  699.     "T///T"
  700.  
  701.     "UN/ /I/Y-OO-N"
  702.     "UN/ //UH-N"
  703.     "UPON/ //UH-P-AW-N"
  704.     "UR/@/#/AE-R"
  705.     "UR//#/Y-AE-R"
  706.     "UR///AE-R"
  707.     "U//^ /UH"
  708.     "U//^^/UH"
  709.     "UY///AH-EE"
  710.     "U/ G/#/"
  711.     "U/G/%/"
  712.     "U/G/#/W"
  713.     "U/#N//Y-OO"
  714.     "UI/@//OO"
  715.     "U/@//UH"
  716.     "U///Y-OO"
  717.  
  718.     "VIEW///V-Y-OO"
  719.     "V/ / /V-EE"
  720.     "V///V"
  721.  
  722.     "WHERE/ //W-AE-R"
  723.     "WA//S/W-AH"
  724.     "WA//T/W-AH"
  725.     "WHERE///WH-EH-R"
  726.     "WHAT///WH-AH-T"
  727.     "WHOL///H-OH-L"
  728.     "WHO///H-OO"
  729.     "WH///WH"
  730.     "WAR///W-AH-R"
  731.     "WOR///W-AE-R"
  732.     "WR///R"
  733.     "W/ / /D-AH-B-L-Y-OO"
  734.     "W///W"
  735.  
  736.     "X//^/EH-K-S"
  737.     "X/ / /EH-K-S"
  738.     "X/ /#/Z-EH"
  739.     "X///K-S"
  740.  
  741.     "YOUNG///Y-UH-N"
  742.     "YOU/ //Y-OO"
  743.     "YES/ //Y-EH-S"
  744.     "Y/ / /WH-UH-Y"
  745.     "Y/ //Y"
  746.     "Y/#^:/ /EE"
  747.     "Y/#^:/I/EE"
  748.     "Y/ :/ /AH-EE"
  749.     "Y/ :/#/AH-EE"
  750.     "Y/ :/^+:#/IH"
  751.     "Y/ :/^#/AH-EE"
  752.     "Y///IH"
  753.  
  754.     "ZZ///T-Z"
  755.     "Z/ / /Z-EH-D"
  756.     "Z///Z"
  757.  
  758.  
  759.  
  760.     The following documentation was borrowed from Thom Henderson's say
  761.     program. It is based on Andy McGuire's "SPEECH" program so I wll save
  762.     my effort by reproducing it in parts here:
  763.  
  764.  
  765. SPEECH supports thirty six phonemes, which are specified as one or two
  766. character codes, as follows:
  767.  
  768.     a       f       n       tz
  769.     ae      g       oh      u
  770.     ah      h       oo      uh
  771.     aw      i       p       v
  772.     b       ih      r       w
  773.     ch      j       s       wh
  774.     d       k       sh      y
  775.     ee      l       t       z
  776.     eh      m       th      zh
  777.  
  778. Phonemes may be given in either upper case or lower case.  Phonemes are
  779. separated with a dash.  Words are separated with a space.  For
  780. example, to say "this is a test", you would type:
  781.  
  782.     say tz-ih-s ih-z ah t-eh-s-t-t
  783.  
  784.  
  785. Some common words are defined below.
  786.  
  787.  
  788. Cardinal numbers:
  789.  
  790.     0                   z-ee-r-oh
  791.     1                   w-uh-n
  792.     2                   t-oo
  793.     3                   th-r-ee
  794.     4                   f-oh-r
  795.     5                   f-i-v
  796.     6                   s-ih-k-s
  797.     7                   s-eh-v-eh-n
  798.     8                   a-a-t
  799.     9                   n-i-n
  800.     10                  t-eh-n
  801.     11                  eh-l-eh-v-uh-n
  802.     12                  t-w-eh-l-v
  803.     13                  th-ih-r-t-ee-n
  804.     14                  f-oh-r-t-ee-n
  805.     15                  f-ih-f-t-ee-n
  806.     16                  s-ih-k-s-t-ee-n
  807.     17                  s-eh-v-eh-n-t-ee-n
  808.     18                  a-a-t-ee-n
  809.     19                  n-i-n-t-ee-n
  810.     20                  t-w-eh-n-t-ee
  811.     30                  th-u-r-t-ee
  812.     40                  f-oh-r-t-ee
  813.     50                  f-ih-f-t-ee
  814.     60                  s-ih-k-s-t-ee
  815.     70                  s-eh-v-eh-n-t-ee
  816.     80                  a-t-ee
  817.     90                  n-ih-n-t-ee
  818.     hundred             h-uh-n-d-r-eh-d
  819.     thousand            th-ah-u-s-eh-n-d
  820.     million             m-ih-l-y-uh-n
  821.  
  822.  
  823. Ordinal numbers:
  824.  
  825.     first               f-u-r-s-t
  826.     second              s-eh-k-u-n-d
  827.     third               th-u-r-d
  828.     fourth              f-oh-r-th
  829.     fifth               f-ih-f-th
  830.     sixth               s-ih-k-s-th
  831.     seventh             s-eh-v-eh-n-th
  832.     eighth              a-a-t-th
  833.     ninth               n-i-n-th
  834.     tenth               t-eh-n-th
  835.  
  836.  
  837. Letters:
  838.  
  839.     A                   a-ee
  840.     B                   b-ee
  841.     C                   s-ee
  842.     D                   d-ee
  843.     E                   ee-ee
  844.     F                   eh-f
  845.     G                   j-ee
  846.     H                   a-ch
  847.     I                   i
  848.     J                   j-a
  849.     K                   k-a
  850.     L                   eh-l
  851.     M                   eh-m
  852.     N                   eh-n
  853.     O                   oh-w
  854.     P                   p-ee
  855.     Q                   k-y-oo
  856.     R                   ah-r
  857.     S                   eh-s
  858.     T                   t-ee
  859.     U                   y-oo
  860.     V                   v-ee
  861.     W                   d-uh-b-l-y-oo
  862.     X                   eh-k-s
  863.     Y                   w-i
  864.     Z                   z-ee
  865.  
  866.  
  867. Words:
  868.  
  869.     a                   uh
  870.     ability             ae-b-ih-l-ih-t-ee
  871.     aboard              uh-b-oh-r-d
  872.     abort               uh-b-oh-r-t
  873.     affirmative         ah-f-eh-r-m-ah-t-ih-v
  874.     all                 aw-l
  875.     alter               ah-l-t-r
  876.     an                  ae-n
  877.     and                 ae-n-d
  878.     Andy                ae-n-d-ee
  879.     any                 eh-n-ee
  880.     anybody             ae-n-ee-b-ah-d-ee
  881.     at                  ae-t
  882.     attacked            uh-t-ae-k-t
  883.  
  884.     backup              b-ah-k-uh-p
  885.     basic               b-a-s-ih-k
  886.     baud                b-aw-d
  887.     be                  b-ee
  888.     begin               b-ee-g-ih-n
  889.     boot                b-oo-t
  890.     boss                b-oh-s
  891.     break               b-r-a-k
  892.     bug                 b-uh-g
  893.     by                  b-i
  894.  
  895.     call                k-aw-l
  896.     calling             k-aw-l-ih-n-g
  897.     capable             k-a-p-uh-b-uh-l
  898.     Charlie             ch-ah-r-l-ee
  899.     city                s-ih-t-ee
  900.     cold                k-oh-l-d
  901.     combinations        k-ah-m-b-ih-n-a-sh-uh-n-s
  902.     comes               k-uh-m-s
  903.     command             k-uh-m-ah-n-d
  904.     consider            k-uh-n-s-ih-d-r
  905.     continue            k-uh-n-t-ih-n-y-oo
  906.     copyright           k-ah-p-ee-r-i-t
  907.     crash               k-r-ah-sh
  908.     create              k-r-ee-a-t
  909.  
  910.     dancing             d-ae-n-s-ih-n-g
  911.     December            d-ee-s-eh-m-b-uh-r
  912.     different           d-ih-f-uh-r-eh-n-t
  913.     disk                d-ih-s-k
  914.     dog                 d-aw-g
  915.     dog                 d-oh-g
  916.     doing               d-oo-ih-n-g
  917.     done                d-uh-n
  918.     DOS                 d-aw-s
  919.     down                d-ah-w-n
  920.     drive               d-r-ae-v
  921.  
  922.     eating              ee-t-ih-n-g
  923.     emergency           ee-m-r-j-eh-n-s-ee
  924.     enter               eh-n-t-r
  925.     error               eh-r-uh-r
  926.     escape              eh-s-k-a-p
  927.     exit                eh-k-s-ih-t
  928.  
  929.     falls               f-ah-l-l-s
  930.     fast                f-ah-s-t
  931.     fatal               f-a-t-l
  932.     fault               f-aw-l-t
  933.     fixed               f-ih-k-s-t
  934.     floppy              f-l-oh-p-ee
  935.     following           f-ah-l-oh-w-ih-n-g
  936.     Foray               f-oh-r-a-ee
  937.  
  938.     gently              j-eh-n-t-l-ee
  939.     gives               g-ih-v-s
  940.  
  941.     hard                h-aw-r-d
  942.     has                 h-ae-s
  943.     hello               h-eh-l-oh-w
  944.     Henderson           h-eh-n-d-r-s-uh-n
  945.     here                h-ee-r
  946.     him                 h-ih-m
  947.     his                 h-ih-s
  948.     hit                 h-ih-t
  949.     hot                 h-ah-t
  950.     how                 h-aw-w
  951.     hundred             h-uh-n-d-r-eh-d
  952.  
  953.     ignore              ih-g-n-oh-r
  954.     in                  ih-n
  955.     insert              ih-n-s-uh-r-t
  956.     interface           ih-n-t-r-f-ah-y-s
  957.     is                  ih-z
  958.     it                  ih-t
  959.  
  960.     just                j-uh-s-t
  961.  
  962.     key                 k-ee
  963.     killer              k-ih-l-r
  964.     kludge              k-l-oo-d-zh
  965.  
  966.     like                l-i-k
  967.     limitless           l-ih-m-ih-t-l-eh-s-s
  968.     look                l-u-k
  969.  
  970.     mail                m-a-uh-l
  971.     man                 m-ae-n
  972.     McGuire             m-ih-k g-w-i-r
  973.     memory              m-eh-m-oh-r-ee
  974.     miss                m-ih-s
  975.     modem               m-oh-d-ih-m
  976.     moon                m-oo-n
  977.     much                m-uh-ch
  978.     my                  m-i
  979.  
  980.     name                n-a-m
  981.     no                  n-oh
  982.  
  983.     of                  uh-f
  984.     on                  ah-n
  985.     or                  aw-r
  986.     out                 ah-w-t
  987.     out                 aw-t
  988.     outside             aw-t-s-ah-y-d
  989.  
  990.     parallel            p-ah-r-uh-l-eh-l
  991.     phone               f-oh-n
  992.     phoneme             f-oh-n-eh-m
  993.     phonemes            f-oh-n-eh-m-s
  994.     plain               p-l-a-ih-n
  995.     port                p-oh-r-t
  996.     press               p-r-eh-s
  997.     printer             p-r-ih-n-t-r
  998.     program             p-r-oh-g-r-ae-m
  999.  
  1000.     rain                r-a-ih-n
  1001.     RAM                 r-ah-m
  1002.     ready               r-eh-d-ee
  1003.     recover             r-ee-k-uh-v-r
  1004.     remote              r-eh-m-oh-t
  1005.     remove              r-ee-m-u-v
  1006.     replace             r-ee-p-l-a-s
  1007.     reproducing         r-ee-p-r-oh-d-oo-s-ih-n-g
  1008.     reserved            r-ee-s-u-r-v-d
  1009.     restore             r-ee-s-t-oh-r
  1010.     retry               r-ee-t-r-i
  1011.     rights              r-i-t-s
  1012.  
  1013.     seadog              s-ee-d-oh-g
  1014.     second              s-eh-k-uh-n-d
  1015.     see                 s-ee
  1016.     seen                s-ee-n
  1017.     sentence            s-eh-n-t-eh-n-s
  1018.     serial              s-ih-r-ee-ah-l
  1019.     service             s-uh-r-v-eh-s
  1020.     shall               sh-ah-l
  1021.     side                s-ah-y-d
  1022.     slow                s-l-oh-w
  1023.     something           s-uh-m-th-ih-n-g
  1024.     sound               s-ah-w-n-d
  1025.     Spain               s-p-a-ih-n
  1026.     speech              s-p-ee-ch
  1027.     start               s-t-ah-r-t
  1028.     starting            s-t-ah-r-t-ih-n-g
  1029.     sysop               s-ih-s-ah-p
  1030.  
  1031.     talk                t-aw-k
  1032.     tape                t-a-p
  1033.     telephone           t-eh-l-uh-f-oh-n
  1034.     test                t-eh-s-t-t
  1035.     the                 tz-uh
  1036.     these               tz-ee-s
  1037.     this                tz-ih-s
  1038.     Thom                t-ah-m
  1039.     to                  t-oo
  1040.     tomato              t-uh-m-a-t-oh
  1041.     too                 t-oo
  1042.     try                 t-r-i
  1043.  
  1044.     unit                y-oo-n-ih-t
  1045.     us                  uh-s
  1046.     user                y-oo-s-r
  1047.     using               y-oo-s-ih-n-g
  1048.     using               y-oo-z-ih-n-g
  1049.  
  1050.     very                v-ae-r-ee
  1051.     vocabulary          v-oh-k-ae-b-y-oo-l-ae-r-ee
  1052.  
  1053.     warm                w-ah-r-m
  1054.     we                  w-ee
  1055.     welcome             w-eh-l-k-uh-m
  1056.     working             w-uh-r-k-ih-n-g
  1057.     would               w-u-d
  1058.  
  1059.     yes                 y-eh-s
  1060.     your                y-oh-r
  1061.  
  1062.  
  1063.  
  1064.     Disclaimer
  1065.     =========================================================================
  1066.  
  1067.     This software was based upon information in the public domain and this
  1068.     driver has been placed in the public domain as FREEWARE! As I'm receiving
  1069.     no royalties for this program I take no responsibility for it's behaviour!
  1070.     If this program causes a problem on your system that's unfortunate.
  1071.     I've tested it to what I feel is a satistacfory standard. I've put this
  1072.     driver into public domain, it should be made freely available with no
  1073.     costs except for media charges. If you wish to include my driver in any
  1074.     subsequent package please acknowledge my contribution by including this
  1075.     documentation in the release.
  1076.  
  1077.  
  1078.  
  1079.     Email any Correspondence or comments to : Jon Hornstein
  1080.                                               Melbourne, Australia
  1081.                                               sultan@connexus.apana.org.au
  1082.  
  1083.