|
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.basoption 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
|
||
|