Page 2 of 5
Re: SAPI : change Voice
Posted: Sun Jan 28, 2024 9:58 am
by nageswaragunupudi
I just replaced
\harbour\lib\win\bcc\hbwin.lib
with the new hbwin.lib.
Now it is working for me.
Re: SAPI : change Voice
Posted: Sun Jan 28, 2024 9:14 pm
by Jimmy
hi,
i have try to change hbwin.LIB in my working Environment
but than i got this Errors
Error: Unresolved external '_hb_iswinsp' referenced from C:\HARBOUR\LIB\WIN\BCC\HBWIN.LIB|win_osc
Error: Unresolved external '_HB_FUN_HB_OSISWIN7' referenced from C:\HARBOUR\LIB\WIN\BCC\HBWIN.LIB|win_os
i use FWH 23.07 and harbour 3.2.0 Dev (r1801051438)
where do i get latest harbour Version
Re: SAPI : change Voice
Posted: Mon Jan 29, 2024 1:21 am
by Jimmy
hi Antonio,
have installed harbour Version, which was include in my harbour_win32_bcc_2020_10_19.zip, and override hbwin.LIB
now it work without Error and i can change "Voice" of SpVoice.
thx again for your GREAT help.
Re: SAPI : change Voice
Posted: Mon Jan 29, 2024 5:52 am
by Antonio Linares
Dear Jimmy,
Thanks to you for your great feedback
Re: SAPI : change Voice
Posted: Wed Jan 31, 2024 3:39 pm
by Antonio Linares
Simpler fix thanks to Bruno Cantero:
Code: Select all | Expand
lOleError = HB_VTBL( pDisp )->Invoke( HB_THIS_(pDisp) dispid, HB_ID_REF(IID_NULL),
LOCALE_USER_DEFAULT,
( V_VT( dispparam.rgvarg ) == VT_DISPATCH ) ? DISPATCH_PROPERTYPUTREF : DISPATCH_PROPERTYPUT,
&dispparam, NULL, &excep, &uiArgErr );
Re: SAPI : change Voice
Posted: Thu Feb 01, 2024 6:13 am
by Antonio Linares
Dear Jimmy,
I have reviewed the topic at
https://hmgforum.com/viewtopic.php?t=7505 I have requested to join the forums so maybe we can solve it together.
I have been trying to use the events and it seems as something is missing:
Code: Select all | Expand
function main()
local oVoice := CreateObject( "Sapi.SPVoice", "WithEvents" )
// oVoice:WithEvents = .T.
oVoice:EventInterests = 327679
oVoice:__hSink := __axRegisterHandler( oVoice:__hObj, { | ... | QOut( ... ) } )
// oVoice:voice = oVoice:GetVoices():Item( 0 )
oVoice:Speak( "harbour and xharbour" )
oVoice:Speak( "another" )
return nil
Re: SAPI : change Voice
Posted: Tue Feb 06, 2024 1:42 pm
by Danielmaximiliano
Antonio Linares wrote:Dear Jimmy,
I have reviewed the topic at
https://hmgforum.com/viewtopic.php?t=7505 I have requested to join the forums so maybe we can solve it together.
I have been trying to use the events and it seems as something is missing:
Code: Select all | Expand
function main()
local oVoice := CreateObject( "Sapi.SPVoice", "WithEvents" )
// oVoice:WithEvents = .T.
oVoice:EventInterests = 327679
oVoice:__hSink := __axRegisterHandler( oVoice:__hObj, { | ... | QOut( ... ) } )
// oVoice:voice = oVoice:GetVoices():Item( 0 )
oVoice:Speak( "harbour and xharbour" )
oVoice:Speak( "another" )
return nil
Hola Antonio Linares con su permiso voy a responder en español , no recordaba estar registrado en su sitio y lo abré hecho para leer el foro.
con respecto al bug que encontró en olecore.c todavia no pude corregir el mismo, si tuviera la amabilidad de enviarme el fuente de olecore.c se lo agradeceria muchisimo.
todos los dias leo el changelog.txt en github de harbour para ver si se hiceron las modificaciones pero todavia no sucedió.. le comento que el uso de SapiVoice era una inclusión para un ejemplo de una aplicacion de Bingo en
www.hmgforum.com y noté que habia mas narradores en windows y que se podia elegir pero no llegamos poder utilizarlos por este BUG.
otra cosa mas que vi en SapiVoice es la posibilidad de usar Eventos pero lo iba a usar cuando este funcional el poder elegir los narradores de microsoft
desde ya mucha gracias
Re: SAPI : change Voice
Posted: Tue Feb 06, 2024 2:03 pm
by Antonio Linares
Estimado Daniel,
En harbour/contrib/hbwin/olecore.c busca esta función:
Code: Select all | Expand
HB_FUNC( WIN_OLEAUTO___ONERROR )
{
IDispatch * pDisp;
const char * szMethod;
wchar_t szMethodWide[ HB_SYMBOL_NAME_LEN + 1 ];
OLECHAR * pMemberArray;
DISPID dispid;
DISPPARAMS dispparam;
VARIANTARG variant;
EXCEPINFO excep;
UINT uiArgErr;
HRESULT lOleError;
HB_USHORT uiClass;
int iPCount;
hb_oleInit();
uiClass = hb_objGetClass( hb_stackSelfItem() );
if( uiClass == 0 )
return;
/* Get object handle */
hb_vmPushDynSym( s_pDyns_hObjAccess );
hb_vmPush( hb_stackSelfItem() );
hb_vmSend( 0 );
pDisp = hb_oleParam( -1 );
if( ! pDisp )
return;
iPCount = hb_pcount();
szMethod = hb_itemGetSymbol( hb_stackBaseItem() )->szName;
AnsiToWideBuffer( szMethod, szMethodWide, ( int ) HB_SIZEOFARRAY( szMethodWide ) );
/* Try property put */
if( szMethod[ 0 ] == '_' && iPCount >= 1 )
{
pMemberArray = &szMethodWide[ 1 ];
lOleError = HB_VTBL( pDisp )->GetIDsOfNames( HB_THIS_( pDisp ) HB_ID_REF( IID_NULL ), &pMemberArray,
1, LOCALE_USER_DEFAULT, &dispid );
if( lOleError == S_OK )
{
DISPID lPropPut = DISPID_PROPERTYPUT;
memset( &excep, 0, sizeof( excep ) );
GetParams( &dispparam, 0, HB_FALSE, 0, NULL, NULL );
dispparam.rgdispidNamedArgs = &lPropPut;
dispparam.cNamedArgs = 1;
lOleError = HB_VTBL(pDisp)->Invoke(HB_THIS_(pDisp) dispid, HB_ID_REF(IID_NULL),
LOCALE_USER_DEFAULT,
(V_VT(dispparam.rgvarg) == VT_DISPATCH) ? DISPATCH_PROPERTYPUTREF : DISPATCH_PROPERTYPUT,
&dispparam, NULL, &excep, &uiArgErr);
FreeParams( &dispparam );
Ahi tienes el fix:
Code: Select all | Expand
lOleError = HB_VTBL(pDisp)->Invoke(HB_THIS_(pDisp) dispid, HB_ID_REF(IID_NULL),
LOCALE_USER_DEFAULT,
(V_VT(dispparam.rgvarg) == VT_DISPATCH) ? DISPATCH_PROPERTYPUTREF : DISPATCH_PROPERTYPUT,
&dispparam, NULL, &excep, &uiArgErr);
Re: SAPI : change Voice
Posted: Tue Feb 06, 2024 9:06 pm
by Danielmaximiliano
Hola Antonio Linares:
con su invalorable ayuda pude despues de estudiar y modificar olecore.c el cual me costo entender el fix pude compilar la libreria Contrib de HBWIN que descargue desde el repositio de Harbour en GITHUB mediante el bin HBMK2 y el compilador MinGW.
desde ya quedo muy agradecido como muchos otros de la comunidad HMGForum un saludo y abrazo a la distancia
Re: SAPI : change Voice
Posted: Tue Feb 06, 2024 10:30 pm
by Antonio Linares
Estimado Daniel,
Lo que no hemos conseguido que funcione son los eventos.
A ver si entre todos descubrimos como hacerlo funcionar:
Code: Select all | Expand
function main()
local oVoice := CreateObject( "Sapi.SPVoice", "WithEvents" )
// oVoice:WithEvents = .T.
oVoice:EventInterests = 327679
oVoice:__hSink := __axRegisterHandler( oVoice:__hObj, { | ... | QOut( ... ) } )
// oVoice:voice = oVoice:GetVoices():Item( 0 )
oVoice:Speak( "harbour and xharbour" )
oVoice:Speak( "another" )
return nil
Re: SAPI : change Voice
Posted: Thu Feb 08, 2024 12:11 pm
by Danielmaximiliano
Antonio Linares wrote:Estimado Daniel,
Lo que no hemos conseguido que funcione son los eventos.
A ver si entre todos descubrimos como hacerlo funcionar:
Code: Select all | Expand
function main()
local oVoice := CreateObject( "Sapi.SPVoice", "WithEvents" )
Hola Antonio Linares :
estuve leyendo Voice Events en
https://learn.microsoft.com/en-us/previ ... 2(v=vs.85)
Eventos de voz
A medida que una voz habla texto, puede generar eventos cuando detecta ciertas condiciones en el flujo de entrada. Estos eventos están contenidos en la enumeración SpeechVoiceEvents. Ejemplos de estos eventos son la finalización de fonemas, palabras u oraciones, así como cambios de voz o la presencia de marcadores. La gama de condiciones que SpeechVoiceEvents puede informar es lo suficientemente amplia como para que la mayoría de las aplicaciones utilicen sólo algunas de ellas. Para evitar que el motor TTS genere eventos que la aplicación ignorará, utilice la propiedad EventInterests para especificar los eventos de interés. Sólo se plantearán estos eventos.
El punto en el flujo de texto de entrada en el que se ha completado un evento potencial se denomina límite de evento. En cada límite de evento, el tipo de evento se compara con los EventInterests actuales. Si el tipo de evento es de interés, se genera un evento de ese tipo. Los eventos de voz devuelven el número de flujo de entrada para asociarlos con el flujo apropiado.
voy a ver como hacer un ejemplo en Harbour/HMG que es lo que utilizo, ya que nunca utilize FiveWin que es su producto.
SLDS
Re: SAPI : change Voice
Posted: Thu Feb 08, 2024 12:23 pm
by Antonio Linares
Daniel,
Este ejemplo es Harbour, no usa FWH
Code: Select all | Expand
function main()
local oVoice := TOleAuto():New( "Sapi.SPVoice" )
// oVoice:WithEvents = .T.
oVoice:EventInterests = 327679
oVoice:__hSink := __axRegisterHandler( oVoice:__hObj, { | ... | QOut( ... ) } )
oVoice:Speak( "harbour and xharbour" )
oVoice:Speak( "another" )
return nil
Re: SAPI : change Voice
Posted: Thu Feb 08, 2024 1:15 pm
by Enrico Maria Giordano
I get this error:
Code: Select all | Expand
test.prg(7) Error E0030 Syntax error "syntax error at '...'"
Re: SAPI : change Voice
Posted: Thu Feb 08, 2024 1:23 pm
by Antonio Linares
Dear Enrico,
xHarbour does not support "..." syntax, so such line should be:
oVoice:__hSink := __axRegisterHandler( oVoice:__hObj, { | x, y | QOut( x, y ) } )
but function __axRegisterHandler() is available in Harbour and not in xHarbour, if I am correct
Re: SAPI : change Voice
Posted: Thu Feb 08, 2024 2:03 pm
by Enrico Maria Giordano
I compiled your sample with latest Harbour, not xHarbour.