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