На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD, nsh
  
> text-to-speech на Паскале , проблема получить интерфейс Central
    Кто-нибудь адаптировал 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.
      Если ещё нужно (SAPI под Dlphi):
      Brian Long "Speech Synthesis & Speech Recognition".
      Там в разделе "SAPI 4" даны ссылки на "адаптированные" под Паскаль speech.h и spchtel.h.

      off: Если постишь исходный код, используй тэги CODE.
      Сообщение отредактировано: C300G -
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0196 ]   [ 14 queries used ]   [ Generated: 17.05.24, 01:24 GMT ]