****************************************** * Voice Recognition Demo by Richard Horne * Requires voice.library (V 4.0) in sys:libs ****************************************** INCLUDE "exec/types.i" INCLUDE "intuition/intuition.i" INCLUDE "libraries/dos.i" *********** external references ********** XREF _AbsExecBase XREF _LVOOpenLibrary XREF _LVOCloseLibrary XREF _LVOOpenWindow XREF _LVOCloseWindow XREF _LVOOpenScreen XREF _LVOCloseScreen XREF _LVOSetMenuStrip XREF _LVOClearMenuStrip XREF _LVODisplayBeep XREF _LVOWait XREF _LVOGetMsg XREF _LVOReplyMsg XREF _LVOLoadRGB4 XREF _LVOSetAPen XREF _LVOText XREF _LVOMove XREF _LVOOpen XREF _LVOClose XREF _LVORead XREF _LVOWrite XREF _LVOExecute XDEF _main ******* Voice.library Functions ******** _LVOLearn EQU -30 _LVORecognize EQU -36 _LVOAddVoiceTask EQU -42 _LVORemVoiceTask EQU -48 _LVOGainUp EQU -54 _LVOGainDown EQU -60 _LVORecDataAddress EQU -66 _LVORecMapAddress EQU -72 _LVOWordScore EQU -78 _LVOPickSampler EQU -84 *********** Begin Program ************** _main: movea.l _AbsExecBase,a6 ;Open DOS Llibrary movea.l #DOS_Name,a1 moveq.l #0,d0 jsr _LVOOpenLibrary(a6) move.l d0,DOS_Base beq Close50 movea.l DOS_Base,a6 ;Open NIL move.l #NILFileName,d1 move.l #MODE_NEWFILE,d2 jsr _LVOOpen(a6) move.l d0,NIL_Handle beq Close40 movea.l _AbsExecBase,a6 ;Open Intuition Library movea.l #INTUITION_Name,a1 moveq.l #0,d0 jsr _LVOOpenLibrary(a6) move.l d0,Intuition_Base beq Close30 movea.l #GRAPHICS_Name,a1 ;Open Graphics Library moveq.l #0,d0 jsr _LVOOpenLibrary(a6) move.l d0,Graphics_Base beq Close20 movea.l #VOICE_Name,a1 ;Open Voice Library moveq.l #4,d0 jsr _LVOOpenLibrary(a6) ;Version 4 Only move.l d0,Voice_Base beq Close10 ****** Open Info Screen and Window ******* movea.l #InfoScreen,a0 ;Open Info Screen movea.l Intuition_Base,a6 jsr _LVOOpenScreen(a6) move.l d0,InfoScr beq Close8 add.l #sc_RastPort,d0 move.l d0,InfoRastPort move.l InfoScr,d0 add.l #sc_ViewPort,d0 move.l d0,InfoViewPort movea.l Graphics_Base,a6 ;Set Colors movea.l InfoViewPort,a0 move.l #Colors,a1 move.l #4,d0 jsr _LVOLoadRGB4(a6) movea.l #InfoWindow,a0 ;Open Info Window move.l InfoScr,nw_Screen(a0) movea.l Intuition_Base,a6 jsr _LVOOpenWindow(a6) move.l d0,InfoWdw beq Close4 bsr WriteInfoText ;Write Information movea.l Intuition_Base,a6 movea.l InfoWdw,a0 movea.l #ProjectMenu,a1 jsr _LVOSetMenuStrip(a6) InfoPause: movea.l InfoWdw,a0 movea.l wd_UserPort(a0),a0 move.b MP_SIGBIT(a0),d1 moveq.l #1,d0 lsl.l d1,d0 movea.l _AbsExecBase,a6 jsr _LVOWait(a6) GetInfoMessage: movea.l InfoWdw,a0 movea.l wd_UserPort(a0),a0 movea.l _AbsExecBase,a6 jsr _LVOGetMsg(a6) move.l d0,IDCMPMessage beq InfoPause movea.l d0,a0 ;Get Message Class and Code move.l im_Class(a0),MessageClass move.w im_Code(a0),MessageCode movea.l _AbsExecBase,a6 ;Reply move.l d0,a1 jsr _LVOReplyMsg(a6) cmpi.l #CLOSEWINDOW,MessageClass ;Close and quit? beq Close cmpi.l #MENUPICK,MessageClass ;Menu Selection? bne GetInfoMessage MenuSelect: moveq.l #0,d0 move.w MessageCode,d0 and.w #$1F,d0 move.w d0,MenuNumber moveq.l #0,d0 move.w MessageCode,d0 move.w #5,d1 lsr.w d1,d0 and.w #$3F,d0 move.w d0,ItemNumber cmpi.w #1,MenuNumber ;Learn Menu Chosen? beq LearnRoutine cmpi.w #2,MenuNumber ;Options Chosen? beq GetInfoMessage cmpi.w #0,ItemNumber ;Project Menu Chosen beq SaveFileRoutine cmpi.w #1,ItemNumber beq LoadFileRoutine cmpi.w #2,ItemNumber beq RecognizeRoutine cmpi.w #3,ItemNumber beq Close bra GetInfoMessage SaveFileRoutine: movea.l DOS_Base,a6 move.l #VoiceFileName,d1 move.l #MODE_NEWFILE,d2 jsr _LVOOpen(a6) move.l d0,File_Handle move.l File_Handle,d1 move.l #MapBuffer,d2 move.l #1824,d3 jsr _LVOWrite(a6) move.l File_Handle,d1 jsr _LVOClose(a6) bra GetInfoMessage LoadFileRoutine: movea.l DOS_Base,a6 move.l #VoiceFileName,d1 move.l #MODE_OLDFILE,d2 jsr _LVOOpen(a6) move.l d0,File_Handle beq 1$ moveq.l #0,d0 move.l File_Handle,d1 move.l #MapBuffer,d2 move.l #1824,d3 jsr _LVORead(a6) cmpi.l #-1,d0 bne 2$ 1$ movea.l Intuition_Base,a6 ;Beep if no voice.dat movea.l InfoScr,a0 jsr _LVODisplayBeep(a6) bra 6$ 2$ movea.l #OneLearnItem,a0 ;Erase all checkmarks move.l #5,d7 4$ move.w #ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT,mi_Flags(a0) move.l mi_NextItem(a0),a0 dbra d7,4$ 6$ movea.l DOS_Base,a6 move.l File_Handle,d1 jsr _LVOClose(a6) 8$ bra GetInfoMessage ****************************************** RecognizeRoutine: movea.l #VoiceWindow,a0 ;Open VoiceTask Window move.l InfoScr,nw_Screen(a0) movea.l Intuition_Base,a6 jsr _LVOOpenWindow(a6) move.l d0,VoiceWdw ;Intuition Window beq Close add.l #wd_RPort,d0 move.l d0,a0 move.l (a0),VoiceRastPort movea.l VoiceRastPort,a0 move.l rp_BitMap(a0),VoiceBitMap movea.l VoiceBitMap,a0 move.l bm_Planes(a0),VoiceBitPlane movea.l VoiceWdw,a0 movea.l #RecProjectMenu,a1 jsr _LVOSetMenuStrip(a6) movea.l Voice_Base,a6 bsr ChooseDigitizer movea.l #ResHighSubItem,a0 ;What resolution? move.w mi_Flags(a0),d0 btst #8,d0 bne 2$ move.l #1,Resolution ;Low bra.s 4$ 2$ move.l #0,Resolution ;High 4$ movea.l #MapBuffer,a0 ;User's voice map buffer movea.l VoiceWdw,a1 movea.l wd_UserPort(a1),a1 ;User's message port move.l #6,d0 ;Number words in vocabulary move.l Resolution,d1 ;Resolution jsr _LVOAddVoiceTask(a6) movea.l Intuition_Base,a6 ;Clear Info Menu movea.l InfoWdw,a0 movea.l #ProjectMenu,a1 jsr _LVOClearMenuStrip(a6) VoicePause: movea.l _AbsExecBase,a6 ;Wait IntuiMessages movea.l VoiceWdw,a0 ;or Message from VoiceTask movea.l wd_UserPort(a0),a0 move.b MP_SIGBIT(a0),d1 moveq.l #1,d0 lsl.l d1,d0 jsr _LVOWait(a6) GetVoiceMessage: movea.l _AbsExecBase,a6 movea.l VoiceWdw,a0 movea.l wd_UserPort(a0),a0 jsr _LVOGetMsg(a6) move.l d0,IDCMPMessage beq VoicePause movea.l IDCMPMessage,a0 move.l im_Class(a0),MessageClass move.w im_Code(a0),MessageCode cmp.l #0,MessageClass ;A Reply from VoiceTask? beq ReceiveVoiceMsg movea.l _AbsExecBase,a6 ;Reply if not from VoiceTask movea.l IDCMPMessage,a1 jsr _LVOReplyMsg(a6) cmpi.l #CLOSEWINDOW,MessageClass ;Close and Exit? beq CloseVoiceTask cmpi.l #MENUPICK,MessageClass bne GetVoiceMessage moveq.l #0,d0 ;Menu Selected move.w MessageCode,d0 move.w #5,d1 lsr.w d1,d0 and.w #$3F,d0 move.w d0,ItemNumber cmpi.w #0,ItemNumber ;Volume Up? bne 2$ movea.l Voice_Base,a6 jsr _LVOGainUp(a6) bra GetVoiceMessage 2$ cmpi.w #1,ItemNumber ;Volume Down? bne 4$ movea.l Voice_Base,a6 jsr _LVOGainDown(a6) bra GetVoiceMessage 4$ cmpi.w #2,ItemNumber ;Quit? bne GetVoiceMessage CloseVoiceTask: movea.l Voice_Base,a6 ;Remove Voice Task jsr _LVORemVoiceTask(a6) movea.l Intuition_Base,a6 movea.l VoiceWdw,a0 jsr _LVOCloseWindow(a6) movea.l Intuition_Base,a6 ;Set Info Menu movea.l InfoWdw,a0 movea.l #ProjectMenu,a1 jsr _LVOSetMenuStrip(a6) bra GetInfoMessage ReceiveVoiceMsg: ;Process Message From VoiceTask move.w MessageCode,d7 btst #15,d7 ;Match Error? beq MatchFound movea.l Graphics_Base,a6 movea.l VoiceRastPort,a1 move.l #24,d0 move.l #60,d1 jsr _LVOMove(a6) movea.l VoiceRastPort,a1 move.l #2,d0 jsr _LVOSetAPen(a6) cmpi.w #-1,d7 ;No Matches? bne.s 2$ movea.l Graphics_Base,a6 movea.l VoiceRastPort,a1 movea.l #NegMatchWord,a0 move.l #9,d0 jsr _LVOText(a6) bra EndRec 2$ cmpi.w #-2,d7 ;Clip? bne.s 4$ movea.l Graphics_Base,a6 movea.l VoiceRastPort,a1 movea.l #ClipWord,a0 move.l #9,d0 jsr _LVOText(a6) bra EndRec 4$ cmpi.w #-3,d7 ;Low Volume? bne 6$ movea.l Graphics_Base,a6 movea.l VoiceRastPort,a1 movea.l #LowVolWord,a0 move.l #9,d0 jsr _LVOText(a6) bra EndRec 6$ cmpi.w #-4,d7 ;Noisy? bne GetVoiceMessage movea.l Graphics_Base,a6 movea.l VoiceRastPort,a1 movea.l #NoiseWord,a0 move.l #9,d0 jsr _LVOText(a6) bra EndRec MatchFound: bsr PlotMap ;Plot Word Map movea.l Graphics_Base,a6 movea.l VoiceRastPort,a1 move.l #24,d0 move.l #60,d1 jsr _LVOMove(a6) movea.l VoiceRastPort,a1 move.l #1,d0 jsr _LVOSetAPen(a6) movea.l Graphics_Base,a6 ;Write recognized word movea.l VoiceRastPort,a1 movea.l #MapBuffer,a0 move.w MessageCode,d5 mulu #304,d5 ;304 bytes for each map in sequence adda.l d5,a0 move.l #9,d0 jsr _LVOText(a6) movea.l #SayOnSubItem,a0 ;Say On? move.w mi_Flags(a0),d0 btst #8,d0 beq EndRec movea.l #SayString,a0 ;Load Say String adda.l #18,a0 movea.l #MapBuffer,a1 move.w MessageCode,d0 mulu #304,d0 ;304 bytes for each map in sequence adda.l d0,a1 move.l (a1)+,(a0)+ ;Insert Say String move.l (a1)+,(a0)+ move.l (a1)+,(a0)+ movea.l DOS_Base,a6 ;Say move.l #SayString,d1 moveq.l #0,d2 move.l #NIL_Handle,d3 jsr _LVOExecute(a6) EndRec: movea.l _AbsExecBase,a6 ;Now Reply to VoiceTask movea.l IDCMPMessage,a1 ;in order to listen for jsr _LVOReplyMsg(a6) ;the next word. bra GetVoiceMessage ;Return and wait for message ****************************************** LearnRoutine: movea.l Voice_Base,a6 bsr ChooseDigitizer movea.l #MapBuffer,a0 ;MapBuffer address in a0 movea.l #WordList,a1 ;Start of Word List move.w ItemNumber,d0 ;Sequence Number of Word lsl.w #4,d0 ;16 bytes per word adda.w d0,a1 ;ASCII text string in a1 movea.l InfoScr,a2 ;Screen for Learn Window move.w ItemNumber,d0 ;Sequence Number of Word move.l #130,d1 ;X Position of Learn Window move.l #40,d2 ;Y Position of Learn Window jsr _LVOLearn(a6) cmpi.l #0,d0 ;Intentionally Cancelled? bne GetInfoMessage movea.l #OneLearnItem,a0 ;If Cancelled, erase checkmark move.w ItemNumber,d0 subq.w #1,d0 2$ cmpi.w #-1,d0 beq 4$ move.l mi_NextItem(a0),a0 subq.w #1,d0 bra.s 2$ 4$ move.w #ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT,mi_Flags(a0) bra GetInfoMessage *********** Close and Exit **************** Close: movea.l Intuition_Base,a6 movea.l InfoWdw,a0 jsr _LVOCloseWindow(a6) Close4: movea.l Intuition_Base,a6 movea.l InfoScr,a0 jsr _LVOCloseScreen(a6) Close8: ;Close Libraries movea.l _AbsExecBase,a6 movea.l Voice_Base,a1 jsr _LVOCloseLibrary(a6) Close10: movea.l _AbsExecBase,a6 movea.l Graphics_Base,a1 jsr _LVOCloseLibrary(a6) Close20: movea.l _AbsExecBase,a6 movea.l Intuition_Base,a1 jsr _LVOCloseLibrary(a6) Close30: movea.l DOS_Base,a6 move.l NIL_Handle,d1 jsr _LVOClose(a6) Close40: movea.l _AbsExecBase,a6 movea.l DOS_Base,a1 jsr _LVOCloseLibrary(a6) Close50: rts ************ SubRoutines ***************** ChooseDigitizer: movea.l Voice_Base,a6 movea.l #PS3SubItem,a0 ;What digitizer? move.w mi_Flags(a0),d0 btst #8,d0 beq 2$ moveq.l #0,d0 ;PS3 Chosen bra.s 4$ 2$ moveq.l #1,d0 ;SoundMaster Chosen 4$ jsr _LVOPickSampler(a6) rts **************** Plot Map *************** PlotMap: movem.l d2-d7/a4-a5,-(a7) movea.l Voice_Base,a6 ;Find Map Address jsr _LVORecMapAddress(a6) move.l d0,a5 move.w #20,d0 ;Starting X in d7 movea.l VoiceWdw,a0 add.w wd_LeftEdge(a0),d0 ext.l d0 move.l d0,d7 move.l #71,d5 ;Loop counter (72 frequency Points) PMLoop: move.w #18,d0 ;Starting Y in d6 movea.l VoiceWdw,a0 add.w wd_TopEdge(a0),d0 ext.l d0 move.l d0,d6 move.l (a5)+,d3 ;32 bit word from map move.l d7,d2 divu #8,d2 ;X/8 Bytes move.l #31,d4 ;Loop counter (32 bits per frequency) PFLoop: move.l d6,d0 mulu #80,d0 ;Y*80 Bytes per line add.w d2,d0 ;Byte Position in d0 move.l d2,d1 swap d1 ;7 - (Remainder of X/8) sub.w #7,d1 neg.w d1 ;Bit Position in d1 movea.l VoiceBitPlane,a4 btst d4,d3 beq 10$ bset d1,0(a4,d0.w) bra.s 12$ 10$ bclr d1,0(a4,d0.w) 12$ addq.w #1,d6 dbra d4,PFLoop addq.l #1,d7 dbra d5,PMLoop movem.l (a7)+,d2-d7/a4-a5 rts ************** Info Text ***************** WriteInfoText: movea.l Graphics_Base,a6 movea.l InfoRastPort,a1 move.l #1,d0 jsr _LVOSetAPen(a6) movea.l #InfoText,a5 move.l #22,d7 ;Loop Counter, 23 lines move.l #24,d6 ;Starting X move.l #18,d5 ;Starting Y WILoop: movea.l InfoRastPort,a1 move.l d6,d0 move.l d5,d1 jsr _LVOMove(a6) movea.l InfoRastPort,a1 movea.l a5,a0 move.l #71,d0 jsr _LVOText(a6) adda.l #72,a5 add.l #8,d5 dbra d7,WILoop rts ***************** Data ******************* SECTION data,DATA DOS_Name: dc.b 'dos.library',0 INTUITION_Name: dc.b 'intuition.library',0 GRAPHICS_Name: dc.b 'graphics.library',0,0 VOICE_Name: dc.b 'voice.library',0 VoiceFileName: dc.b 'Voice.dat',0 NILFileName: dc.b 'NIL:',0,0 WordList: ;16 bytes each dc.b 'Peter ',0 dc.b 'Piper ',0 dc.b 'Picked ',0 dc.b 'A Peck Of ',0 dc.b 'Pickled ',0 dc.b 'Peppers ',0 NegMatchWord: dc.b 'No Match ',0 LowVolWord: dc.b 'Low Vol ',0 ClipWord: dc.b 'Clipping ',0 NoiseWord: dc.b 'Noisy ',0 SayString: dc.b 'sys:utilities/Say ',0 InfoScreen: dc.w 0,0,640,200,2 dc.b 0,1 dc.w V_HIRES,CUSTOMSCREEN!NS_EXTENDED dc.l MyFont,0,0,0,ScreenTagList MyFont: dc.l MyFontName ;pointer to font name dc.w 8 ;size dc.w 0 MyFontName: dc.b 'topaz.font',0,0 ScreenTagList: dc.l SA_Pens,MyPenArray dc.l TAG_DONE ScreenTitle: dc.b 'InfoScreen',0,0 MyPenArray: dc.w 0 ;Detail Pen dc.w 1 ;Block Pen dc.w 1 ;Text Pen dc.w 2 ;Shine Pen dc.w 1 ;Shadow Pen dc.w 3 ;Hifill Pen dc.w 1 ;Text over Hifill dc.w 0 ;Background Pen dc.w 1 ;Hilight text Pen ****************************************** InfoWindow: dc.w 0,0,640,200 dc.b 0,1 dc.l CLOSEWINDOW!RAWKEY!MENUPICK,WINDOWCLOSE!WINDOWDEPTH!ACTIVATE dc.l 0,0,InfoWindowTitle,0,0 dc.w 640,200,0,0,CUSTOMSCREEN InfoWindowTitle: dc.b ' VoiceDemo Information',0 cnop 0,2 ****************************************** VoiceWindow: dc.w 160,30,112,65 dc.b 0,1 dc.l CLOSEWINDOW!MENUPICK,WINDOWCLOSE!WINDOWDRAG!ACTIVATE dc.l 0,0,VoiceWindowTitle,0,0 dc.w 160,30,0,0,CUSTOMSCREEN VoiceWindowTitle: dc.b 'VoiceWdw ',0 cnop 0,2 Colors: dc.w $0999,$0000,$0eee,$0679 ;gray, black, white, blue ************ Project Menu **************** ProjectMenu: dc.l LearnMenu dc.w 5,0,70,0,MENUENABLED dc.l ProjectMenuTitle,SaveVoiceFileItem dc.w 0,0,0,0 ProjectMenuTitle: dc.b 'PROJECT',0 SaveVoiceFileItem: dc.l LoadVoiceFileItem dc.w 0,0,120,9,ITEMTEXT!ITEMENABLED!HIGHCOMP dc.l 0,SaveVoiceFileItemText,0,0,0 SaveVoiceFileItemText: dc.b 0,1,RP_JAM1,0 dc.w 0,0 dc.l 0,SaveVoiceFileItemTitle,0 SaveVoiceFileItemTitle: dc.b 'Save Voice File',0 LoadVoiceFileItem: dc.l RecognizeItem dc.w 0,10,120,9,ITEMTEXT!ITEMENABLED!HIGHCOMP dc.l 0,LoadVoiceFileItemText,0,0,0 LoadVoiceFileItemText: dc.b 0,1,RP_JAM1,0 dc.w 0,0 dc.l 0,LoadVoiceFileItemTitle,0 LoadVoiceFileItemTitle: dc.b 'Load Voice File',0 cnop 0,2 RecognizeItem: dc.l QuitItem dc.w 0,20,120,9,ITEMTEXT!ITEMENABLED!HIGHCOMP dc.l 0,RecognizeItemText,0,0,0 RecognizeItemText: dc.b 0,1,RP_JAM1,0 dc.w 0,0 dc.l 0,RecognizeItemTitle,0 RecognizeItemTitle: dc.b 'Recognize Voice',0 QuitItem: dc.l 0 dc.w 0,30,120,9,ITEMTEXT!ITEMENABLED!HIGHCOMP dc.l 0,QuitItemText,0,0,0 QuitItemText: dc.b 0,1,RP_JAM1,0 dc.w 0,0 dc.l 0,QuitItemTitle,0 QuitItemTitle: dc.b 'Quit',0,0 ************ Learn Menu ****************** LearnMenu: dc.l OptionMenu dc.w 120,0,60,0,MENUENABLED dc.l LearnMenuTitle,OneLearnItem dc.w 0,0,0,0 LearnMenuTitle: dc.b 'LEARN',0 OneLearnItem: dc.l TwoLearnItem dc.w 0,0,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT dc.l 0,OneLearnItemText,0,0,0 OneLearnItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,OneLearnItemTitle,0 OneLearnItemTitle: dc.b '"Peter"',0 TwoLearnItem: dc.l ThreeLearnItem dc.w 0,10,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT dc.l 0,TwoLearnItemText,0,0,0 TwoLearnItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,TwoLearnItemTitle,0 TwoLearnItemTitle: dc.b '"Piper"',0 ThreeLearnItem: dc.l FourLearnItem dc.w 0,20,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT dc.l 0,ThreeLearnItemText,0,0,0 ThreeLearnItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,ThreeLearnItemTitle,0 ThreeLearnItemTitle: dc.b '"Picked"',0,0 FourLearnItem: dc.l FiveLearnItem dc.w 0,30,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT dc.l 0,FourLearnItemText,0,0,0 FourLearnItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,FourLearnItemTitle,0 FourLearnItemTitle: dc.b '"A Peck Of"',0 FiveLearnItem: dc.l SixLearnItem dc.w 0,40,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT dc.l 0,FiveLearnItemText,0,0,0 FiveLearnItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,FiveLearnItemTitle,0 FiveLearnItemTitle: dc.b '"Pickeled"',0,0 SixLearnItem: dc.l 0 dc.w 0,50,100+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT dc.l 0,SixLearnItemText,0,0,0 SixLearnItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,SixLearnItemTitle,0 SixLearnItemTitle: dc.b '"Peppers"',0 ************ Option Menu ***************** OptionMenu: dc.l 0 dc.w 240,0,60,0,MENUENABLED dc.l OptionMenuTitle,DigitizerOptionItem dc.w 0,0,0,0 OptionMenuTitle: dc.b 'OPTIONS',0 ************************************* DigitizerOptionItem: dc.l ResOptionItem dc.w 0,0,100,10,ITEMTEXT!ITEMENABLED!HIGHCOMP dc.l 0,DigitizerOptionItemText,0 dc.w 0 dc.l PS3SubItem dc.w 0 DigitizerOptionItemText: dc.b 0,1,RP_JAM1,0 dc.w 0,0 dc.l 0,DigitizerOptionItemTitle,0 DigitizerOptionItemTitle: dc.b 'Digitizer',0 PS3SubItem: dc.l SMSubItem dc.w 98,4,108+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT!CHECKED dc.l 2,PS3SubItemText dc.l 0,0,0 PS3SubItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,PS3SubItemTitle,0 PS3SubItemTitle: dc.b 'PerfectSound3',0 SMSubItem: dc.l 0 dc.w 98,14,108+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT dc.l 1,SMSubItemText dc.l 0,0,0 SMSubItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,SMSubItemTitle,0 SMSubItemTitle: dc.b 'SoundMaster',0 ************************************* ResOptionItem: dc.l SayOptionItem dc.w 0,10,100,10,ITEMTEXT!ITEMENABLED!HIGHCOMP dc.l 0,ResOptionItemText,0 dc.w 0 dc.l ResHighSubItem dc.w 0 ResOptionItemText: dc.b 0,1,RP_JAM1,0 dc.w 0,0 dc.l 0,ResOptionItemTitle,0 ResOptionItemTitle: dc.b 'Resolution',0,0 ResHighSubItem: dc.l ResLowSubItem dc.w 98,4,50+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT dc.l 2,ResHighSubItemText,0,0,0 ResHighSubItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,ResHighSubItemTitle,0 ResHighSubItemTitle: dc.b 'High',0,0 ResLowSubItem: dc.l 0 dc.w 98,14,50+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT!CHECKED dc.l 1,ResLowSubItemText,0,0,0 ResLowSubItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,ResLowSubItemTitle,0 ResLowSubItemTitle: dc.b 'Low',0 ****************************************** SayOptionItem: dc.l 0 dc.w 0,20,100,10,ITEMTEXT!ITEMENABLED!HIGHCOMP dc.l 0,SayOptionItemText,0 dc.w 0 dc.l SayOnSubItem dc.w 0 SayOptionItemText: dc.b 0,1,RP_JAM1,0 dc.w 0,0 dc.l 0,SayOptionItemTitle,0 SayOptionItemTitle: dc.b 'Say',0 SayOnSubItem: dc.l SayOffSubItem dc.w 98,4,50+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT dc.l 2,SayOnSubItemText dc.l 0,0,0 SayOnSubItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,SayOnSubItemTitle,0 SayOnSubItemTitle: dc.b 'On',0,0 SayOffSubItem: dc.l 0 dc.w 98,14,50+CHECKWIDTH,10,ITEMTEXT!ITEMENABLED!HIGHCOMP!CHECKIT!CHECKED dc.l 1,SayOffSubItemText dc.l 0,0,0 SayOffSubItemText: dc.b 0,1,RP_JAM1,0 dc.w CHECKWIDTH,0 dc.l 0,SayOffSubItemTitle,0 SayOffSubItemTitle: dc.b 'Off',0 ******** Recognize Project Menu ********** RecProjectMenu: dc.l 0 dc.w 5,0,70,0,MENUENABLED dc.l RecProjectMenuTitle,VolumeUpItem dc.w 0,0,0,0 RecProjectMenuTitle: dc.b 'PROJECT',0 VolumeUpItem: dc.l VolumeDownItem dc.w 0,0,80,9,ITEMTEXT!ITEMENABLED!HIGHCOMP dc.l 0,VolumeUpItemText,0,0,0 VolumeUpItemText: dc.b 0,1,RP_JAM1,0 dc.w 0,0 dc.l 0,VolumeUpItemTitle,0 VolumeUpItemTitle: dc.b 'Volume Up',0 VolumeDownItem: dc.l RecQuitItem dc.w 0,10,80,9,ITEMTEXT!ITEMENABLED!HIGHCOMP dc.l 0,VolumeDownItemText,0,0,0 VolumeDownItemText: dc.b 0,1,RP_JAM1,0 dc.w 0,0 dc.l 0,VolumeDownItemTitle,0 VolumeDownItemTitle: dc.b 'Volume Dn',0 cnop 0,2 RecQuitItem: dc.l 0 dc.w 0,20,80,9,ITEMTEXT!ITEMENABLED!HIGHCOMP dc.l 0,RecQuitItemText,0,0,0 RecQuitItemText: dc.b 0,1,RP_JAM1,0 dc.w 0,0 dc.l 0,RecQuitItemTitle,0 RecQuitItemTitle: dc.b 'Quit',0 cnop 0,2 *************************** Information Text ************************************ InfoText: dc.b ' This program utilizes the PerfectSound3 or SoundMaster audio ',0 dc.b 'digitizer and the public domain disk-based voice.library to learn and ',0 dc.b 'recognize six simple spoken phrases. The phrases are "Peter ... Piper ',0 dc.b '... Picked ... A Peck Of ... Pickled ... Peppers." ',0 dc.b ' First, the program must learn each phrase. To do this, select ',0 dc.b 'the desired phrase from the "Learn" menu. You will then be prompted to',0 dc.b 'speak this phrase to produce three acceptable digital samples. Choose ',0 dc.b 'the "Sample" gadget to record, and the "Accept" gadget to save each of ',0 dc.b 'the THREE REQUIRED SAMPLES for each phrase. You may need to increase ',0 dc.b 'or decrease volume by moving your microphone or by choosing the ',0 dc.b 'appropriate volume adjustment gadget. Speak each phrase slowly and ',0 dc.b 'forcefully, pronouncing each syllable distinctly. After learning all ',0 dc.b 'six phrases, you may save a complete file of voice data as voice.dat. ',0 dc.b ' After learning is complete, you may proceed to recognize any ',0 dc.b 'phrase at random. Choose "Recognize Voice" from the Project Menu to ',0 dc.b 'start a separate task that listens to the audio digitizer and ',0 dc.b 'recognizes each phrase based on an audio frequency analysis. When a ',0 dc.b 'phrase is recognized, it will be spoken back to you using the Amiga ',0 dc.b 'speach capability. A voice map showing a frequency range of 3200 Hz ',0 dc.b 'versus 3/4 second of time will also be plotted. Digitizer volume may ',0 dc.b 'be changed by menu selection. "Clipping" indicates volume is too high.',0 dc.b '"Low Vol" indicates volume is too low. ',0 dc.b ' ',0 ********************************************************************************** SECTION Memory,BSS DOS_Base: ds.l 1 Intuition_Base: ds.l 1 Graphics_Base: ds.l 1 Voice_Base: ds.l 1 InfoScr: ds.l 1 InfoWdw: ds.l 1 InfoRastPort: ds.l 1 InfoViewPort: ds.l 1 VoiceWdw: ds.l 1 VoiceRastPort: ds.l 1 VoiceBitMap: ds.l 1 VoiceBitPlane: ds.l 1 Resolution: ds.l 1 File_Handle: ds.l 1 NIL_Handle: ds.l 1 MessageClass ds.l 1 MessageCode: ds.w 1 IDCMPMessage: ds.l 1 MenuNumber: ds.w 1 ItemNumber: ds.w 1 MapBuffer: ds.b 1824 ;6 word maps, (72*4 + 16) bytes each END