|
|
, FreeBASIC , MS SAPI 4. , FreeBASIC, , MS Windows. COM OLE , ( , ). CreateObject() Visual Basic, Visual Basic for Application VBScript. , , FreeBASIC, , , FreeBASIC Visual Basic. OLE (OLE Automation). MS Speech API 4 (MS SAPI 4) OLE , , , , FreeBASIC. , SAPI 4, , , FreeBASIC, "examples\disphelper\" (SAPI 4 SAPI 5). Visual Basic, VBA ., VBScript CreateObject(), , , OLE-. Visual Basic OLE- "". , (methods) / (properties) . OLE- IDispatch, , Visual Basic. (OLE-) OLE "" - , , , , . Visual Basic , . Visual Basic, FreeBASIC , , OLE . , Disphelper, FreeBASIC. C/C++ Disphelper ( ). , FreeBASIC , -, Disphelper, -, SAPI 4 Disphelper. Visual Basic FreeBASIC, .
' Visual Basic
SET tts = CreateObject("ActiveVoice.ActiveVoice.1")
tts.Speak ("Hello, world!")
' FreeBASIC dhCreateObject ("ActiveVoice.ActiveVoice.1", NULL, @tts) DHCallMethod (tts, ".Speak(%S)", "Hello, world!") , . Disphelper SAPI 4. DisphelperDisphelper IDispatch OLE- . OLE- , printf() C. , printf(), . Disphelper , printf(). , Disphelper ( readme.htm, Disphelper):
Disphelper, .
, . DHCallMethod, DHPutValue DHGetValue. disphelper.bi, FreeBASIC "inc\disphelper\".. DHCallMethod , , . D IDispatch PTR (, Visual Basic, ), , . , . , Method1 Object1, : DHCallMethod (Object1, ".Method1(%d)", 100) DHPutValue? . , Property1 : DHPutValue (Object1, ".Property1=%d", 100) DHGetValue. , , , , :
Dim Value As Integer
DHGetValue ("%d", @Value, Object1, ".Property1")
Disphelper HRESULT, OLE-. . , . (, ), . Direct Speech SynthesisSAPI 4Direct Speech Synthesis - , MS SAPI 4. , . MS Windows 2000, SAPI 4 , , . MS Windows 9x XP SAPI MS SAPI 4 SDK4. SAPI 4 , . : Member: ActiveVoice.ActiveVoice.1 Function: CreateObject Error In: CreateObjectEx Error: Code: 800401f3 Source: Application , , ProgId ( "ActiveVoice.ActiveVoice.1") CLSID, . . Windows XP "activevoice.reg" :
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\ActiveVoice.ActiveVoice.1]
@="Direct Speech Synthesis"
[HKEY_CLASSES_ROOT\ActiveVoice.ActiveVoice.1\Clsid]
@="{EEE78591-FE22-11D0-8BEF-0060081841DE}"
Windows ( Enter) . SAPI 4 . Win32 API, , , , . Direct Speech Synthesis, . , MS SAPI 4 SDK. , Disphelper. :
, :
FreeBASICDisphelper FreeBASIC. -, Disphelper Unicode. : #define UNICODE -, "disphelper.bi", FreeBASIC. : #include "disphelper/disphelper.bi" -, Direct Speech Synthesis . . Windows, . , , . :
sapi4.bas. Disphelper . sapi4.bas. "", "" Disphelper. -, ( ) speech.bas. , MS SAPI 5 FreeBASIC, , sapi4.bas , sapi5.bas. , sapi4.bas , "" . , DISPATCH_OBJ(), ( IDispatch OLE-) , FreeBASIC . : dim SHARED as IDispatch ptr tts = NULL speech.bas
' speech.bas
' SAPI 4
' FreeBASIC
'' : fbc -s gui speech.rc speech.bas sapi4.bas
''
''
option explicit
#define UNICODE
#include once "windows.bi"
#include "disphelper/disphelper.bi"
' SAPI 4
#include "sapi4.bi"
'
#include "resource.bi"
'
DECLARE FUNCTION DlgProc (byval hwnd as HWND, byval umsg as UINT, byval wparam as WPARAM, byval lparam as LPARAM) as BOOL
'
dim SHARED as IDispatch ptr tts = NULL
' Disphelper
dhInitialize( TRUE )
'
dhToggleExceptions( TRUE )
'
DialogBoxParam( GetModuleHandle( NULL ), cptr( LPCSTR, IDD_DLG1 ), NULL, @DlgProc, NULL )
' ,
SAFE_RELEASE( tts)
' Disphelper
dhUninitialize( TRUE )
end
'
'
Function DlgProc (byval hwnd as HWND, byval umsg as UINT, byval wparam as WPARAM, byval lparam as LPARAM) as BOOL
dim as long id, event
select case uMsg
case WM_INITDIALOG
' Direct Speech Synthesis
If TRUE <> SAPI4_Initialize(tts) Then
EndDialog( hwnd, 0 )
Return TRUE
End If
'
SAPI4_GetVoices(tts, GetDlgItem(hWnd, IDC_VOICES_LIST))
'
SAPI4_SelectVoice (tts, 1)
'
SAPI4_SetSpeed (tts, 80)
case WM_CLOSE
EndDialog( hwnd, 0 )
case WM_COMMAND
id = loword( wParam )
event = hiword( wParam )
select case id
case IDOK
'
scope
DIM szBuf AS WSTRING * 1024
GetDlgItemText(hWnd, IDC_TEXT_TO_SPEAK, szBuf, 1024)
SAPI4_Speak (tts, @szBuf)
End Scope
case IDCANCEL
EndDialog( hwnd, 0 )
case IDC_VOICES_LIST:
'
If (event = CBN_SELCHANGE) Then
SAPI4_SelectVoice (tts, SendDlgItemMessage (hWnd, Id, CB_GETCURSEL, 0, 0)+1)
End If
end select
case else
return FALSE
end select
return TRUE
end function
sapi4.bas
' sapi4.bas
' Direct Speech
' Disphelper
option explicit
#define UNICODE
#include once "windows.bi"
#include "disphelper/disphelper.bi"
' SAPI4_Initialize ActiveVoice.ActiveVoice.1 .
' : TRUE, ; FALSE - .
FUNCTION SAPI4_Initialize (byRef Object As IDispatch PTR) As BOOL
Dim As String ProgId = "ActiveVoice.ActiveVoice.1"
IF FAILED(dhCreateObject (ProgId, NULL, @Object) THEN
RETURN FALSE
END IF
dhPutValue(Object, ".Initialized = %u", 1)
RETURN TRUE
END FUNCTION
' SAPI4_GetVoices ,
' , .
SUB SAPI4_GetVoices (byRef object As IDispatch PTR,byval hCtrl as HWND)
Dim MaxVoice AS INTEGER
Dim szBuf AS WSTRING * 1024
Dim szSpeaker AS WSTRING PTR
Dim szProduct AS WSTRING PTR
Dim i AS INTEGER
SendMessage (hCtrl, CB_RESETCONTENT, 0, 0)
DHGetValue("%d", @MaxVoice, Object, ".CountEngines")
FOR i = 1 TO MaxVoice
DHGetValue("%S", @szSpeaker, Object, ".Speaker(%d)", i)
DHGetValue("%S", @szProduct, Object, ".ProductName (%d)", i)
szBuf = *szSpeaker + ": " +*szProduct
SendMessage (hCtrl, CB_ADDSTRING, 0, @szBuf)
NEXT
SendMessage (hCtrl, CB_SETCURSEL, 0, 0)
dhFreeString(szSpeaker)
dhFreeString(szProduct)
END SUB
' SAPI4_SelectVoice
' .
SUB SAPI4_SelectVoice (byRef Object As IDispatch PTR, byVal Index As INTEGER)
Dim MaxVoice AS INTEGER
DHGetValue("%d", @MaxVoice, Object, ".CountEngines")
IF Index > 0 AND Index <= MaxVoice THEN
dhCallMethod(Object, ".Select(%u)", Index)
END IF
END SUB
' SAPI4_SetSpeed .
' .
SUB SAPI4_SetSpeed (byRef Object As IDispatch PTR, byVal Speed As INTEGER)
dhPutValue(Object, ".Speed=%u", Speed)
END SUB
' SAPI4_Speak , .
SUB SAPI4_Speak (byRef Object As IDispatch PTR, byVal Phrase As WString PTR)
dhCallMethod(Object, ".Speak(%S)", Phrase)
END SUB
sapi4.bi' sapi4.bi ' sapi4.bas #ifndef __SAPI4_BI__ #define __SAPI4_BI__ DECLARE FUNCTION SAPI4_Initialize (byRef Object As IDispatch PTR) As BOOL DECLARE SUB SAPI4_GetVoices (byRef Object As IDispatch PTR, byval hCtrl as HWND) DECLARE SUB SAPI4_SelectVoice (byRef Object As IDispatch PTR, byVal Index As Integer) DECLARE SUB SAPI4_SetSpeed (byRef Object As IDispatch PTR, byVal Speed As Integer) DECLARE SUB SAPI4_Speak (byRef Object As IDispatch PTR, byVal Phrase As WString PTR) #endif resource.bi#ifndef IDC_STATIC #define IDC_STATIC -1 #endif #define IDD_DLG1 1000 #define IDC_VOICES_LIST 1001 #define IDC_TEXT_TO_SPEAK 1002 speech.rc#include "resource.bi" IDD_DLG1 DIALOGEX 0,0,200,100 CAPTION "Text-to-speech" FONT 8,"MS Sans Serif" STYLE 0x10CC0000 EXSTYLE 0x00000080 BEGIN LTEXT "Voice:", IDC_STATIC, 5, 5, 40, 9 COMBOBOX IDC_VOICES_LIST, 50, 5, 145, 10, WS_TABSTOP| CBS_DROPDOWNLIST | WS_VSCROLL LTEXT "Text to speak:", IDC_STATIC, 5, 5+11, 100, 10 EDITTEXT IDC_TEXT_TO_SPEAK, 5, 5+22, 190, 10 DEFPUSHBUTTON "Speak", IDOK, 120, 5+44, 35, 10 PUSHBUTTON "", IDCANCEL, 120+37, 5+44, 35, 10 END
|
||
|
| |||