1 /*************************************************************************/ 2 /* */ 3 /* Cepstral, LLC */ 4 /* Copyright (c) 2001 */ 5 /* All Rights Reserved. */ 6 /* */ 7 /* Permission is hereby granted, free of charge, to use and distribute */ 8 /* this software and its documentation without restriction, including */ 9 /* without limitation the rights to use, copy, modify, merge, publish, */ 10 /* distribute, sublicense, and/or sell copies of this work, and to */ 11 /* permit persons to whom this work is furnished to do so, subject to */ 12 /* the following conditions: */ 13 /* 1. The code must retain the above copyright notice, this list of */ 14 /* conditions and the following disclaimer. */ 15 /* 2. Any modifications must be clearly marked as such. */ 16 /* 3. Original authors' names are not deleted. */ 17 /* 4. The authors' names are not used to endorse or promote products */ 18 /* derived from this software without specific prior written */ 19 /* permission. */ 20 /* */ 21 /* CEPSTRAL, LLC AND THE CONTRIBUTORS TO THIS WORK DISCLAIM ALL */ 22 /* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED */ 23 /* WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL */ 24 /* CEPSTRAL, LLC NOR THE CONTRIBUTORS BE LIABLE FOR ANY SPECIAL, */ 25 /* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER */ 26 /* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION */ 27 /* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR */ 28 /* IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 29 /* */ 30 /*************************************************************************/ 31 /* Author: David Huggins-Daines (dhd@cepstral.com) */ 32 /* Date: December 2001 */ 33 /*************************************************************************/ 34 /* */ 35 /* FliteTTSEngineObj.h: implementation of SAPI interface to Flite */ 36 /* */ 37 /*************************************************************************/ 38 39 #ifndef __FLITETTSENGINEOBJ_H_ 40 #define __FLITETTSENGINEOBJ_H_ 41 42 #include <atlbase.h> 43 extern CComModule _Module; 44 #include <atlcom.h> 45 #include <spddkhlp.h> 46 #include <spcollec.h> 47 #include "flite.h" 48 49 class ATL_NO_VTABLE CFliteTTSEngineObj : 50 public CComObjectRootEx<CComMultiThreadModel>, 51 public ISpTTSEngine, 52 public ISpObjectWithToken 53 { 54 public: CFliteTTSEngineObj()55 CFliteTTSEngineObj() { 56 flite_init(); 57 curr_utt = NULL; 58 curr_vox = NULL; 59 } ~CFliteTTSEngineObj()60 ~CFliteTTSEngineObj() { 61 if (curr_utt) delete_utterance(curr_utt); 62 if (unregfunc && curr_vox) (*unregfunc)(curr_vox); 63 } 64 65 /* ISpObjectWithToken methods */ 66 public: 67 STDMETHODIMP SetObjectToken(ISpObjectToken * pToken); GetObjectToken(ISpObjectToken ** ppToken)68 STDMETHODIMP GetObjectToken(ISpObjectToken** ppToken) 69 { return SpGenericGetObjectToken(ppToken, vox_token); } 70 71 /* ISpTTSEngine methods */ 72 public: 73 STDMETHOD(Speak)(DWORD dwSpeakFlags, 74 REFGUID rguidFormatId, const WAVEFORMATEX * pWaveFormatEx, 75 const SPVTEXTFRAG* pTextFragList, ISpTTSEngineSite* pOutputSite); 76 STDMETHOD(GetOutputFormat)(const GUID * pTargetFormatId, 77 const WAVEFORMATEX * pTargetWaveFormatEx, 78 GUID * pDesiredFormatId, 79 WAVEFORMATEX ** ppCoMemDesiredWaveFormatEx); 80 81 /* Implementation stuff */ 82 protected: 83 /* These get set by a subclass's constructor. That's not the 84 proper C++ way to do this, but I do not care. */ 85 cst_voice *(*regfunc)(const char *); 86 void (*unregfunc)(cst_voice *); 87 int (*phonemefunc)(cst_item *); 88 int (*visemefunc)(cst_item *); 89 int (*featurefunc)(cst_item *); 90 cst_val *(*pronouncefunc)(SPPHONEID *); 91 92 /* SAPI's use of the term "token" is quite unfortunate. */ 93 CComPtr<ISpObjectToken> vox_token; 94 cst_voice *curr_vox; 95 96 /* Synthesis state variables */ 97 cst_utterance *curr_utt; 98 cst_relation *tok_rel; 99 const SPVTEXTFRAG *curr_frag; 100 ISpTTSEngineSite *site; 101 ULONGLONG bcount; 102 int sentence_start; 103 int sentence_skip; 104 int aborted; 105 int volume; 106 107 private: 108 /* These have no earthly business being in a header file, but 109 they need access to the instance data. */ 110 void start_new_utt(); 111 void synth_one_utt(); 112 void send_item_events(); 113 void send_sentence_event(int fpos); 114 void get_actions_and_do_them(); 115 116 int next_viseme(cst_item *s); 117 int viseme_len(cst_item *s); 118 int phoneme_len(cst_item *s); 119 120 void speak_frag(); 121 void spell_frag(); 122 void pronounce_frag(); 123 void silence_frag(); 124 void set_bookmark(); 125 }; 126 127 #endif //__FLITETTSENGINEOBJ_H_ 128