Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.181.66] |
|
Сообщ.
#1
,
|
|
|
Кто-нибудь адаптировал Speech.h под Паскаль? Вроде, все содрал из SDK, работает до Select, а потом облом. C-шный исходник, с который использовал, прекрасно компилится и работает, так что дело не в SAPI или железе. Может, кто опытный свежим взглядом что увидит?
PROGRAM Text_To_Speech_Test; USES Messages,Windows,ActiveX,Strings,MMSystem,WinServ; {$A+} {$D-} CONST SEVERITY=$80000000; TTSI_NAMELEN=262; TTSI_STYLELEN=262; {SAPI class indentifiers} CLSID_TTSEnumerator: TGUID = '{d67c0280-c743-11cd-80e5-00aa003e4b50}'; CLSID_MMAudioDest: TGUID = '{cb96b400-c743-11cd-80e5-00aa003e4b50}'; IID_IAudioMultiMediaDevice: TGUID = '{b68ad320-c743-11cd-80e5-00aa003e4b50}'; IID_ITTSEnum: TGUID = '{05EB6C6D-DBAB-11CD-B3CA-00AA0047BA4F}'; IID_ITTSCentral: TGUID = '{05EB6C6A-DBAB-11CD-B3CA-00AA0047BA4F}'; TYPE pUnknown=^iUnknown; SDATA = record pData: pointer; dwSize: DWORD; end; TLANGUAGE = record LanguageID: LangID; szDialect: array[0..63] of AnsiChar; end; VOICECHARSET = UINT; QWORD = Int64; TTSMODEINFO = record gEngineID : TGUID; szMfgName : array [0..TTSI_NAMELEN-1] of AnsiChar; szProductName : array [0..TTSI_NAMELEN-1] of AnsiChar; gModeID : TGUID; szModeName : array [0..TTSI_NAMELEN-1] of AnsiChar; Language : TLanguage; szSpeaker : array [0..TTSI_NAMELEN-1] of AnsiChar; szStyle : array [0..TTSI_STYLELEN-1] of AnsiChar; wGender : WORD; wAge : WORD; dwFeatures : DWORD; dwInterfaces : DWORD; dwEngineFeatures : DWORD; end; PTTSMODEINFO = ^TTSMODEINFO; {Audio interface} IAudioMultiMediaDevice = interface(IUnknown) ['{B68AD320-C743-11cd-80E5-00AA003E4B50}'] function CustomMessage(uMsg: UINT; dData: SDATA): HResult; stdcall; function DeviceNumGet(var dwDeviceID: DWORD): HResult; stdcall; function DeviceNumSet(dwDeviceID: DWORD): HResult; stdcall; end; {Central interface} ITTSCentral = interface(IUnknown) ['{05EB6C6A-DBAB-11CD-B3CA-00AA0047BA4F}'] function Inject(pszTag: PAnsiChar): HResult; stdcall; function ModeGet(var ttsInfo: TTSModeInfo): HResult; stdcall; function Phoneme(eCharacterSet: VOICECHARSET; dwFlags: DWORD; dText: SDATA;var dPhoneme: SDATA): HResult; stdcall; function PosnGet(var qwTimeStamp: QWORD): HResult; stdcall; function TextData(eCharacterSet: VOICECHARSET; dwFlags: DWORD; dText: SDATA;pNotifyInterface: Pointer; IIDNotifyInterface: TGUID): HResult; stdcall; function ToFileTime(var qTimeStamp: QWORD; var FT: TFileTime): HResult; stdcall; function AudioPause: HResult; stdcall; function AudioResume: HResult; stdcall; function AudioReset: HResult; stdcall; function Register(pNotifyInterface: Pointer; IIDNotifyInterface: TGUID;var dwKey: DWORD): HResult; stdcall; function UnRegister(dwKey: DWORD): HResult; stdcall; end; {Enumeration interface} ITTSEnum = interface(IUnknown) ['{05EB6C6D-DBAB-11CD-B3CA-00AA0047BA4F}'] function Next(celt: ULONG; var rgelt; pceltFetched: PULONG): HResult; stdcall; function Skip(celt: ULONG): HResult; stdcall; function Reset: HResult; stdcall; function Clone(out enum: ITTSEnum): HResult; stdcall; function Select(gModeID: TGUID; Var Central: ITTSCentral;IUnknownForAudio:iUnknown): HResult; stdcall; end; (* А это я выдернул из SPEECH.H SAPI SDK 4.0 DEFINE_GUID(IID_IAudioMultiMediaDevice, 0xb68ad320, 0xc743, 0x11cd, 0x80, 0xe5, 0x0, 0xaa, 0x0, 0x3e, 0x4b, 0x50); DECLARE_INTERFACE_ (IAudioMultiMediaDevice, IUnknown) { // IUnknown members STDMETHOD (QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // IAudioMultiMediaDevice members STDMETHOD (CustomMessage) (THIS_ UINT, SDATA) PURE; STDMETHOD (DeviceNumGet) (THIS_ DWORD* ) PURE; STDMETHOD (DeviceNumSet) (THIS_ DWORD) PURE; }; DEFINE_GUID(IID_ITTSEnumA, 0x05EB6C6DL, 0xDBAB, 0x11CD, 0xB3, 0xCA, 0x00, 0xAA, 0x00, 0x47, 0xBA, 0x4F); DECLARE_INTERFACE_ (ITTSEnumA, IUnknown) { // IUnknown members STDMETHOD (QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // ITTSEnumA members STDMETHOD (Next) (THIS_ ULONG, PTTSMODEINFOA, ULONG * ) PURE; STDMETHOD (Skip) (THIS_ ULONG) PURE; STDMETHOD (Reset) (THIS) PURE; STDMETHOD (Clone) (THIS_ ITTSEnumA * FAR * ) PURE; STDMETHOD (Select) (THIS_ GUID, PITTSCENTRALA *, LPUNKNOWN) PURE; }; DEFINE_GUID(IID_ITTSCentralA, 0x05EB6C6AL, 0xDBAB, 0x11CD, 0xB3, 0xCA, 0x00, 0xAA, 0x00, 0x47, 0xBA, 0x4F); DECLARE_INTERFACE_ (ITTSCentralA, IUnknown) { // IUnknown members STDMETHOD (QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; // ITTSCentralA members STDMETHOD (Inject) (THIS_ PCSTR) PURE; STDMETHOD (ModeGet) (THIS_ PTTSMODEINFOA) PURE; STDMETHOD (Phoneme) (THIS_ VOICECHARSET, DWORD, SDATA, PSDATA) PURE; STDMETHOD (PosnGet) (THIS_ PQWORD) PURE; STDMETHOD (TextData) (THIS_ VOICECHARSET, DWORD, SDATA, PVOID, IID) PURE; STDMETHOD (ToFileTime) (THIS_ PQWORD, FILETIME * ) PURE; STDMETHOD (AudioPause) (THIS) PURE; STDMETHOD (AudioResume) (THIS) PURE; STDMETHOD (AudioReset) (THIS) PURE; STDMETHOD (Register) (THIS_ PVOID, IID, DWORD* ) PURE; STDMETHOD (UnRegister) (THIS_ DWORD) PURE; }; *) VAR fIAMM:IAudioMultimediaDevice; aTTSEnum:ITTSEnum; ModeInfo:TTSModeInfo; Central:ITTSCentral; SDat:SData; Info:string; I,EngineNumber:dword; EngineCount:longint; Error:hResult; ID:TGUID; N:dword; FUNCTION SysErrorName:string; Var Msg:string; L:byte absolute Msg; begin fillchar(Msg,sizeof(Msg),0); L:=0; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NIL,GetLastError,0,@Msg[1],254,NIL); while (Msg[L+1]<>#0) and (L<254) do inc(L); if Msg[L]=#13 then dec(L); SysErrorName:=Msg end; PROCEDURE Abort(Msg:string); begin CoUninitialize; Msg[byte(Msg[0])]:=#0; MessageBox(0,@Msg[1],'ERROR!',MB_OK); halt end; BEGIN {MAIN} if CoInitialize(nil) and Severity<>0 then Abort(SysErrorName); {Инициализируем COM} if CoCreateInstance(CLSID_MMAudioDest,NIL,CLSCTX_ALL,IID_IAudioMultiMediaDevice, fIAMM)<>S_OK then Abort('MMAudio'#13+SysErrorName); {Получаем аудио интерфейс} if CoCreateInstance(CLSID_TTSEnumerator,NIL,CLSCTX_ALL,IID_ITTSEnum, aTTSEnum)<>S_OK then Abort('Enumerator'#13+SysErrorName); {Получаем интерфейс нумератора} aTTSEnum.Reset; Info:=''; repeat {Получаем все голосовые движки} aTTSEnum.Next(1, ModeInfo, @EngineCount); if EngineCount<>0 then Info:=Info+StrPas(ModeInfo.szModeName)+#13 until EngineCount=0; fIAMM.DeviceNumSet(WAVE_MAPPER); {Устанавливаем режим аудио} aTTSEnum.Reset; aTTSEnum.Next(1, ModeInfo, @EngineCount); {Берем 1-й движок} Error:=aTTSEnum.Select(ModeInfo.gModeID,Central,IUnknown(fIAMM)); {Получаем центральный интерфейс} {И АМБЕЦ - ошибка SAPI 'INVALUD MODE' или даже GENERAL PROTECTION FAULT!} aTTSEnum.Release; {Освободить интерфейсы} fIAMM.Release; CoFreeUnusedLibraries; {Освободить COM} CoUninitialize; Abort(Info+#13+lHex(Central,4)+#13'['+lHex(Error,4)+']') END. |
Сообщ.
#2
,
|
|
|
Если ещё нужно (SAPI под Dlphi):
Brian Long "Speech Synthesis & Speech Recognition". Там в разделе "SAPI 4" даны ссылки на "адаптированные" под Паскаль speech.h и spchtel.h. off: Если постишь исходный код, используй тэги CODE. |