|
|
Microsoft Speech API 4.0 ( . ), Microsoft Speech API 5.1 (MS SAPI 5.1) DispHelper. dhCallMethod, dhGetValue dhPutValue, , SAPI 5.1, dhPutRef FOR_EACH. disphelper.bi. FOR_EACH , : FOR_EACH0, FOR_EACH1, FOR_EACH2,.. FOR_EACH9. , , (, , ). 0.15b FreeBASIC disphelper.bi FOR_EACH , - . , , FOR_EACH) #include "disphelper/disphelper.bi": #ifdef FOR_EACH0 #undef FOR_EACH0 #define FOR_EACH0(objName, pDisp, szMember) _ scope :_ dim as IEnumVARIANT ptr xx_pEnum_xx = NULL :_ DISPATCH_OBJ(objName) :_ if (SUCCEEDED(dhEnumBegin(@xx_pEnum_xx, pDisp, szMember))) then :_ do while(dhEnumNextObject(xx_pEnum_xx, @objName) = NOERROR) #endif , Scope "escope", . FOR_EACH. 0.16b FreeBASIC . , 0.15b 0.16b, , - NOT. , , MyFunc() TRUE FALSE. 0.15b : IF NOT MyFunc() THEN MessageBox (NULL, " FALSE.", "", 0) ELSE MessageBox (NULL, " TRUE.", "", 0) END IF , 0.16b, . MyFunc() TRUE FALSE. : IF FALSE = MyFunc() THEN MessageBox (NULL, " FALSE.", "", 0) ELSE MessageBox (NULL, " TRUE.", "", 0) END IF SpVoiceOLE , MS SAPI 5.1, , MS SAPI SDK 5.1 ( Automation). Visual Basic. MS Speech SDK, Microsoft (. ). , , SpVoice. , DispHelper , IDispatch. , MS SAPI 5.1. DispHelper (methods) (properties) . SpVoice, :
, .GetVoices SpVoice ("" ( "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens"). . , "" , SAPI5- . "" , ( -> ). , . MS SAPI 5.1 FreeBASIC. . , DHCreateObject SpVoice, "Sapi.SpVoice":
DIM object IDispatch ptr
IF FAILED(dhCreateObject ("Sapi.SpVoice", NULL, @Object)) THEN
'...
END IF
' ...
.GetVoices , FOR_EACH0, , , . .
DIM szDescription AS WSTRING PTR
FOR_EACH0(spVoice, Object, ".GetVoices")
'
dhGetValue("%S", @szDescription, spVoice, ".GetDescription")
'
SendMessage (hCtrl, CB_ADDSTRING, 0, szDescription)
NEXT_(spvoice)
dhFreeString(szDescription)
, ( .Voice SpVoice). Index :
DHGetValue ("%o", @spVoices, object, ".GetVoices")
DHGetValue ("%o", @spVoice, spVoices, ".Item(%u)", Index)
dhPutRef(Object, ".Voice = %o", spVoice)
.GetVoices SpVoice , . , , , "Language=419". , FOR_EACH1:
DIM szDescription AS WSTRING PTR
FOR_EACH1(spVoice, Object, ".GetVoices(%s)", "Language=419")
dhGetValue("%S", @szDescription, spVoice, ".GetDescription")
SendMessage (hCtrl, CB_ADDSTRING, 0, szDescription)
NEXT_(spvoice)
dhFreeString(szDescription)
, :
DHGetValue ("%o", @spVoices, object, ".GetVoices(%s)", "Language=419")
DHGetValue ("%o", @spVoice, spVoices, ".Item(%u)", Index)
dhPutRef(Object, ".Voice = %o", spVoice)
-- . .Speak, , . dhCallMethod(Object, ".Speak(%S)", Phrase) Windows, MS SAPI 5.1 . , , . Enter "Speak" . :
speech.bas
' speech.bas - ,
' MS SAPI 5.1 FreeBASIC.
' : fbc.exe" -s gui speech.rc speech.bas sapi5.bas
option explicit
#define UNICODE
#include once "windows.bi"
#include "disphelper/disphelper.bi"
#include "sapi5.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
dhInitialize( TRUE )
dhToggleExceptions( TRUE )
DialogBoxParam( GetModuleHandle( NULL), cptr(LPCSTR, IDD_DLG1), NULL, @DlgProc, NULL )
SAFE_RELEASE( tts)
dhUninitialize( TRUE )
END
' Program 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
IF TRUE <> SAPI5_Initialize(tts) THEN
EndDialog( hwnd, 0 )
Return TRUE
END IF
'
SAPI5_GetVoices(tts, GetDlgItem(hWnd, IDC_VOICES_LIST))
SAPI5_SelectVoice (tts, 0)
SAPI5_SetSpeed (tts, 5)
SAPI5_SetVolume(tts, 100)
'
SAPI5_GetAudioOutputs(tts, GetDlgItem(hWnd, IDC_AUDIOOUTPUTS_LIST))
SAPI5_SelectAudioOutput(tts, 0)
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)
SAPI5_Speak (tts, @szBuf)
END Scope
CASE IDCANCEL
EndDialog( hwnd, 0 )
CASE IDC_VOICES_LIST:
IF CBN_SELCHANGE = event THEN
SAPI5_SelectVoice (tts, SendDlgItemMessage (hWnd, Id, CB_GETCURSEL, 0, 0))
END IF
CASE IDC_AUDIOOUTPUTS_LIST:
IF CBN_SELCHANGE = event THEN
SAPI5_SelectAudioOutput(tts, SendDlgItemMessage (hWnd, Id, CB_GETCURSEL, 0, 0))
End If
END SELECT
CASE ELSE
return FALSE
END SELECT
return TRUE
END FUNCTION
speech.rc#include "resource.bi" IDD_DLG1 DIALOGEX 0,0,200,90 CAPTION "SAPI 5: Text-to-speech Example" 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 "Output:", IDC_STATIC, 5, 5+11, 40, 9 COMBOBOX IDC_AUDIOOUTPUTS_LIST , 50, 5+11, 145, 10, WS_TABSTOP| CBS_DROPDOWNLIST | WS_VSCROLL LTEXT "Text to speak:", IDC_STATIC, 5, 5+22, 100, 10 EDITTEXT IDC_TEXT_TO_SPEAK, 5, 5+33, 190, 10 DEFPUSHBUTTON "Speak", IDOK, 120, 5+55, 35, 10 PUSHBUTTON "Close", IDCANCEL, 120+37, 5+55, 35, 10 END resource.bi#define IDD_DLG1 1000 #define IDC_BTN1 1002 #define IDC_STATIC -1 #define IDC_BTNSPEAK 1001 #define IDC_VOICES_LIST 2001 #define IDC_AUDIOOUTPUTS_LIST 2002 #define IDC_TEXT_TO_SPEAK 2003 #endif sapi5.bas
option explicit
#define UNICODE
#include once "windows.bi"
#include "disphelper/disphelper.bi"
FUNCTION SAPI5_Initialize (byRef Object as IDispatch PTR) as BOOL
DIM as String ProgId = "Sapi.SpVoice"
DIM hr as HRESULT
IF FAILED(dhCreateObject (ProgId, NULL, @Object)) THEN return FALSE
return TRUE
END FUNCTION
SUB SAPI5_GetVoices (byRef object as IDispatch ptr,byval hCtrl as HWND)
DIM szDescription as WString ptr
SendMessage (hCtrl, CB_RESETCONTENT, 0, 0)
FOR_EACH0(spVoice, Object, ".GetVoices")
dhGetValue("%S", @szDescription, spVoice, ".GetDescription")
SendMessage (hCtrl, CB_ADDSTRING, 0, szDescription)
NEXT_(spvoice)
SendMessage (hCtrl, CB_SETCURSEL, 0, 0)
dhFreeString(szDescription)
END SUB
SUB SAPI5_SelectVoice (byRef Object as IDispatch ptr , byVal Index as Integer)
DIM spVoices, spVoice as IDispatch ptr
DHGetValue ("%o", @spVoices, object, ".GetVoices")
DHGetValue ("%o", @spVoice, spVoices, ".Item(%u)", Index)
dhPutRef(Object, ".Voice = %o", spVoice)
END SUB
SUB SAPI5_GetAudioOutputs(byRef object as IDispatch ptr,byval hCtrl as HWND)
DIM szDescription as WString ptr
SendMessage (hCtrl, CB_RESETCONTENT, 0, 0)
FOR_EACH0(spAudioOutput, Object, ".GetAudioOutputs")
dhGetValue("%S", @szDescription, spAudioOutput, ".GetDescription")
SendMessage (hCtrl, CB_ADDSTRING, 0, szDescription)
NEXT_(spAudioOutput)
SendMessage (hCtrl, CB_SETCURSEL, 0, 0)
dhFreeString(szDescription)
END SUB
SUB SAPI5_SelectAudioOutput(byRef Object as IDispatch ptr , byVal Index as Integer)
DIM spAudioOutputs, spAudioOutput as IDispatch ptr
DHGetValue ("%o", @spAudioOutputs, object, ".GetAudioOutputs")
DHGetValue ("%o", @spAudioOutput, spAudioOutputs, ".Item(%u)", Index)
dhPutRef(Object, ".AudioOutput= %o", spAudioOutput)
END SUB
SUB SAPI5_SetSpeed (byRef Object as IDispatch ptr , byVal Speed as Integer)
dhPutValue(Object, ".Rate=%d", Speed)
END SUB
SUB SAPI5_SetVolume(byRef Object as IDispatch ptr , byVal Volume as Integer)
IF Volume > 100 THEN VOLUME = 100
IF Volume < 0 THEN Volume=0
dhPutValue(Object, ".Volume=%u", Volume)
END SUB
SUB SAPI5_Speak (byRef Object as IDispatch ptr , byVal Phrase as WString PTR)
dhCallMethod(Object, ".Speak(%S)", Phrase)
END SUB
sapi5.bi#ifndef _SAPI5_BI #define _SAPI5_BI DECLARE FUNCTION SAPI5_Initialize (byRef Object as IDispatch PTR) as BOOL DECLARE SUB SAPI5_GetVoices (byRef Object as IDispatch ptr, byval hCtrl as HWND) DECLARE SUB SAPI5_SelectVoice (byRef Object as IDispatch ptr, byVal Index as Integer) DECLARE SUB SAPI5_GetAudioOutputs(byRef Object as IDispatch ptr, byval hCtrl as HWND) DECLARE SUB SAPI5_SelectAudioOutput(byRef Object as IDispatch ptr, byVal Index as Integer) DECLARE SUB SAPI5_SetSpeed(byRef Object as IDispatch ptr , byVal Speed as Integer) DECLARE SUB SAPI5_SetVolume(byRef Object as IDispatch ptr , byVal Volume as Integer) DECLARE SUB SAPI5_Speak (byRef Object as IDispatch ptr , byVal Phraseas as WString PTR) #endif
|
||
|
| |||