Traducción TEXTO a VOZ en tiempo de ejecución, en FWH

Traducción TEXTO a VOZ en tiempo de ejecución, en FWH

Postby triumvirato » Fri Oct 03, 2008 6:49 am

Pues hace tiempo que curiosee este hilo:

http://forums.fivetechsoft.com/viewtopi ... hlight=voz

y la verdad que me quedé con las ganas de verlo funcionar en castellano. Es bastante sencillo. Tal como decía el compañero BIEL en ese hilo, con:
Code: Select all  Expand view  RUN
LOCAL oVoice := tOleAuto():New( "Sapi.SPVoice" )
oVoice:Speak( "Hello" )


Habremos llamado al SAPI de microsoft y habremos escuchado "Hello". Hasta ahí correcto, nos sale una voz computerizada bastante "fea" en inglés.
Bien para hacerlo funcionar en Castellano, he hecho unas pruebas con voces Loquendo, de la misma empresa (las que llevan los dispositivos GPS TOMTOM). Tan sólo es necesario instalar el SAPI 5.1 (gratuito, ahora ya está la versión 5.3, si alguien quiere la 5.1 que la pida) e igualmente instalar alguna de las voces Loquendo (de pago, con sus derechos de autor, si la instalas sin licencias, cada vez que le mandes leer algo te dirá que esa voz no está registrada para ese ordenador, más que suficiente para probar que funciona). Una vez instaladas estas dos herramientas, hemos de ir (en Windows XP) a Panel de Control, Voz y ahí seleccionar la voz que hemos instalado. Por defecto, viene la voz de Microsoft Sam, esa que hemos escuchado decir "Hello" en inglés. A partir de seleccionar esa voz en el Panel de Control, todo el texto que mandemos al SAPI lo leera con esa voz.
No he buscado voces gratuitas para SAPI porque yo disponía de esa legal, debe haberlas. También hay programas gratuitos de texto a voz, que instalan voces y luego son utilizables, siempre que usen la tecnología SAPI.
La única pega encontrada hasta ahora, es que mientras se reproduce la voz en nuestro programa FW, se detiene la ejecución del mismo. Imagino que por utilizar objetos Ole... si alguien conoce otro medio para hacer hablar y que no se detenga la ejecución...
No he probado con SAPI 5.3... más que nada porque las voces de esa empresa en particular, funcionan con SAPI 5.1, aunque he leido en varios sitios que son compatibles con SAPI 5.3

Espero que os guste y os sirva de utilidad, y si ya había sido tratado, pido disculpas por la repetición. La verdad que como entretimiento también ha sido interesante.

Saludos!
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Postby Antonio Linares » Fri Oct 03, 2008 10:52 am

David,

Muchas gracias por tu aportación, muy interesante! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

mas cositas...

Postby triumvirato » Fri Oct 03, 2008 11:01 am

Antonio,

De nada! siempre he sido fan de poder conseguir un interface "más humano" con los ordenadores y el poder hablar y que la máquina nos hable me parece una de las mejores formas. La intención de este post es animar a la gente a depurar y desarrollar estas técnicas, pues abre un mundo de posibilidades con gente discapacitada, organizaciones de discapacitados, un colectivo con el cual estoy bastante sensibilizado.

Más cosillas:

Para hacer que la salida de la voz quede en un fichero.

Code: Select all  Expand view  RUN
   local oVoice := tOleAuto():New( "Sapi.SPVoice" )
   local oFile := tOleAuto():New( "Sapi.SpFileStream.1" )
   local SSFMCreateForWrite := 3

   oFile:Open( "c:\fivewin\Test.wav" , SSFMCreateForWrite )
   oVoice:AudioOutputStream := oFile
   oVoice:Speak( "Bienvenido a mi aplicación" )


Esto generará un archivo test.wav en el directorio c:\fivewin\ y contendrá el mensaje "Bienvenido a mi aplicación", generado con la voz que hayamos seleccionado en el Panel de Control.

Igualmente, se puede hacer un reconocimiento de comandos por voz... pero eso ya va quedando más fuera de mi alcance por el momento.

Se puede uno documentar y de ahí he extraido los ejemplos en:
http://www.microsoft.com/technet/script ... /sapi.mspx

El mundo de los TTS's y reconocimientos de voz, darán mucho que hablar en los próximos años...

Saludos!
Last edited by triumvirato on Sat Oct 04, 2008 10:44 am, edited 1 time in total.
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Postby karinha » Fri Oct 03, 2008 12:49 pm

triumvirato, como hago para que funcione en PORTUGUÊS?

Gracias.

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7872
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Por favor donde descargo el SAPI 5.1 O si me lo puedes envi

Postby Vladimir Zorrilla » Fri Oct 03, 2008 7:44 pm

Por favor donde descargo el SAPI 5.1 O si me lo puedes enviar
al cps_envios@yahoo.es

GRACIAS
ME INTERESA FW Y XHB POR SER OPEN SOURCE
Vladimir Zorrilla
 
Posts: 225
Joined: Tue Feb 28, 2006 4:25 pm
Location: PERU

Postby triumvirato » Sat Oct 04, 2008 6:38 am

Karinha,

Existen voces de la empresa Loquendo (las más profesionales del mercado), en portugués con acento portugués de Portugal o con acento portugués de Brasil (esta última recibe el nombre de "Gabriela"), el problema es que son de pago y necesitan registro, se puede instalar, pero cuando quieras hacerla hablar, cualquier frase que le digas, recibirás un mensaje que dice (en el idioma de la voz): Esta voz no está registrada para este equipo. Es más que suficiente para saber que lo has hecho funcionar. Si quieres más información, déjame tu correo, también necesitas el SAPI 5.1

Vladimir, enviado a tu correo SAPI 5.1, has de renombrar la extensión .mso y ponerla como .msi ya que hotmail no permite adjuntar archivos con extensión .msi

Saludos!
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Postby triumvirato » Sat Oct 04, 2008 10:34 am

Para los que quieran experimentar con SAPI 5.3 (yo sólo he probado SAPI 5.1), aquí encontrarán bastante información :wink:

http://msdn.microsoft.com/en-us/library/ms723627(VS.85).aspx


Saludos!
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Postby Vladimir Zorrilla » Fri Oct 10, 2008 10:24 pm

Cuando se ejecuta la voz hay alguna forma de pàrarla
por que la aplicacion se paralizar y solo puede detenerla
pulsando CTR AL DEL y luego finalizar tarea


Gracias
ME INTERESA FW Y XHB POR SER OPEN SOURCE
Vladimir Zorrilla
 
Posts: 225
Joined: Tue Feb 28, 2006 4:25 pm
Location: PERU

Postby triumvirato » Sat Oct 11, 2008 8:32 am

Vladimir Zorrilla wrote:Cuando se ejecuta la voz hay alguna forma de pàrarla
por que la aplicacion se paralizar y solo puede detenerla
pulsando CTR AL DEL y luego finalizar tarea


Gracias


Vladimir,

No sé si te refieres a que tu aplicación continúe mientras se escucha la voz. En ese caso, has de declarar una nueva variable así:
Code: Select all  Expand view  RUN
local SVSFlagsAsync := 1

y luego en la ejecución, pásasela a Speak como segundo parámetro:
Code: Select all  Expand view  RUN
oVoice:Speak( "Bienvenido a mi aplicación",  SVSFlagsAsync)

Esto lo que hace es que continúe la ejecución de tu aplicación, mientras se continúa escuchando el mensaje. Es decir, se ejecuta el comando de manera asíncrona.

Saludos!
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Ejemplo:

Postby triumvirato » Sun Oct 12, 2008 11:41 am

Creo que es más sencillo si os dejo un pequeño ejemplo

Archivo PRG

Code: Select all  Expand view  RUN
#include "FiveWin.ch"

static lIsPaused := .F.

function Main()

   local oDlg, oGetText, oBtnPlay, oBtnPause, oBtnStop, oBtnInterroga, oSbrVolume, oSbrTTSVelocity
   local oBtnVolumeUp, oBtnVolumeDown, oBtnVelocityUp, oBtnVelocityDown
   local oSayVolumeLevel, oSayVelocityLevel
   local nVolume := 50
   local nVelocity := 0
   local oVoice := tOleAuto():New( "Sapi.SPVoice" )
   local oVoiceInfo := tOleAuto():New( "Sapi.SPVoice" )

   // SpeechVoiceFlags
   local SVSFlagsAsync := 1
   local SVSFPurgeBeforeSpeak  := 2
   // SpeechVoiceEvents
   local SVEPhoneme := 64

   local cTextToRead := "La Guía de Programación de FiveWin, ofrece una introducción dirigida a técnicas " + ;
                        "de desarrollo de aplicaciones de Windows utilizando (x)Harbour y FiveWin. Esta guía " + ;
                        "explicará los conceptos básicos que usted debe tener para construir correctamente sus " + ;
                        "aplicaciones de Windows."

   oVoice:AlertBoundary := SVEPhoneme
   oVoice:Volume := nVolume
   oVoice:Rate := nVelocity
   
   
   
   DEFINE DIALOG oDlg RESOURCE "sound"

   REDEFINE GET oGetText VAR cTextToRead ID 10 OF oDlg MULTILINE UPDATE
     
   REDEFINE BUTTON oBtnPlay ID 2010 OF oDlg ACTION ( oVoice:Speak( cTextToRead, SVSFlagsAsync ) ) UPDATE
   
   REDEFINE BUTTON oBtnPause ID 2020 OF oDlg ACTION ( PauseResume( oVoice, oDlg, oBtnPause ), oDlg:Update() ) UPDATE
   
   REDEFINE BUTTON oBtnStop ID 2030 OF oDlg ACTION oVoice:Speak( " ",SVSFPurgeBeforeSpeak ) UPDATE
   
   REDEFINE BUTTON oBtnInterroga ID 2040 OF oDlg
   
   REDEFINE SAY oSayVolumeLevel ID 160 OF oDlg UPDATE
   
   oSayVolumeLevel:SetText( Str( nVolume ) )
   
   REDEFINE SAY oSayVelocityLevel ID 170 OF oDlg UPDATE
   
   oSayVelocityLevel:SetText( Str( nVelocity ) )
   
   REDEFINE BUTTON oBtnVolumeUp ID 120 OF oDlg;
            ACTION ( nVolume := nVolume + 10, iif( nVolume > 100, ( nVolume := 100 , MsgInfo( "Máximum Volume" ) ) ,;
            oVoice:Volume := nVolume ), oSayVolumeLevel:SetText( Str( nVolume ) ) ) UPDATE

   REDEFINE BUTTON oBtnVolumeDown ID 130 OF oDlg;
            ACTION ( nVolume := nVolume - 10, iif( nVolume < 0, ( nVolume := 0 , MsgInfo( "Mínimum Volume" ) ),;
            oVoice:Volume := nVolume ), oSayVolumeLevel:SetText( Str( nVolume ) ) ) UPDATE

   REDEFINE BUTTON oBtnVelocityUp ID 140 OF oDlg;
            ACTION ( nVelocity++, iif( nVelocity > 10, ( nVelocity := 10 , MsgInfo( "Máximum Velocity" ) ),;
            oVoice:Rate := nVelocity ), oSayVelocityLevel:SetText( Str( nVelocity ) ) ) UPDATE

   REDEFINE BUTTON oBtnVelocityDown ID 150 OF oDlg;
            ACTION ( nVelocity--, iif( nVelocity < -10, ( nVelocity := -10 , MsgInfo( "Mínimum Velocity" ) ),;
            oVoice:Rate := nVelocity ), oSayVelocityLevel:SetText( Str( nVelocity ) ) ) UPDATE

           
   ACTIVATE DIALOG oDlg CENTERED

return nil

function PauseResume( oVoice, oDlg, oBtnPause )
   
   iif( lIsPaused,;
      ( oVoice:Resume(), lIsPaused := .F., oBtnPause:SetText( "Pause" ) ),;
      ( oVoice:Pause(), lIsPaused := .T., oBtnPause:SetText( "Resume" ) ) )
   
return nil


Archivo .RC
Code: Select all  Expand view  RUN
#ifdef __FLAT__
  1 24 "WindowsXP.Manifest"
#endif

#define DIALOG_10   10
#define DIALOG_8   8
#define DIALOG_7   7
#define DIALOG_6   6
#define DIALOG_4   4
#define DIALOG_3   3
#define DIALOG_2   2
  #define DIALOG_1   1
#define DIALOG_5   5




sound DIALOG 69, 52, 446, 364
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Text To Speech (TTS)"
FONT 8, "MS Sans Serif"
{
PUSHBUTTON "Play", 2010, 75, 341, 63, 14
PUSHBUTTON "Pause", 2020, 139, 341, 55, 14
PUSHBUTTON "Stop", 2030, 195, 341, 63, 14
PUSHBUTTON "?", 2040, 259, 341, 55, 14
LTEXT "Texto a Leer:", -1, 5, 14, 48, 10
EDITTEXT 10, 52, 13, 278, 323, ES_MULTILINE | WS_BORDER | WS_TABSTOP
LTEXT "Volumen:", -1, 364, 72, 40, 10
LTEXT "Velocidad:", -1, 402, 72, 37, 10
PUSHBUTTON "+", 120, 371, 94, 17, 14
PUSHBUTTON "-", 130, 371, 114, 17, 14
PUSHBUTTON "+", 140, 409, 94, 17, 14
PUSHBUTTON "-", 150, 409, 114, 17, 14
LTEXT "Text", 160, 372, 135, 20, 8
LTEXT "Text", 170, 410, 135, 20, 8
LTEXT "Levels:", -1, 335, 135, 35, 10
}


Espero que os guste...

Saludos!
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Postby joseluisysturiz » Mon Nov 03, 2008 7:47 am

Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Más....

Postby triumvirato » Mon Nov 03, 2008 7:55 am

Ahí dejo otro ejemplito... lo siguiente que quiero hacer es poner un meter para que vaya midiendo el volúmen cuando se reproduce un texto, pero para eso necesito manejar "eventos" del objeto tOleAuto, alguien sabe cómo se manejan o si se pueden recibir?
GRACIAS.

Code: Select all  Expand view  RUN
#include "FiveWin.ch"

static lIsPaused := .F.

function Main()
   
   local oDlg, oGetText, oBtnPlay, oBtnPause, oBtnStop, oBtnInterroga, oBrowVoices, cVoice, oCbxOutPut, oCbxVoiceNormal
   local oCbxVoiceAlert, oMeter
   local oBtnVolumeUp, oBtnVolumeDown, oBtnVelocityUp, oBtnVelocityDown
   local oGetVolumeLevel, oGetVelocityLevel
   local cMeter
   local aVoices := {}, aPhoneme := {}, aVoiceForSelect := {}
   local aOutPutStream := { "Voz", "File" }, cSelOutPutStream := "Voz"
   local oFile := tOleAuto():New( "Sapi.SpFileStream" )
   local nVolume := 50
   local nVelocity := 0
   local n := 0, n2 := 0
   local oVoice := tOleAuto():New( "Sapi.SPVoice", "WithEvents" )
   local oVoiceAlert := tOleAuto():New( "Sapi.SPVoice", "WithEvents" )
   local cSelNormalVoice, cSelAlertVoice


   // SpeechVoiceFlags
   local SVSFDefault := 0
   local SVSFlagsAsync := 1
   local SVSFPurgeBeforeSpeak  := 2
   local SVSFIsXML := 8
   // SpeechVoiceEvents
   local SVEStartInputStream := 2
   local SVEEndInputStream := 4
   local SVEVoiceChange := 8
   local SVEBookmark := 16
   local SVEWordBoundary := 32
   local SVEPhoneme := 64
   local SVESentenceBoundary := 128
   local SVEViseme := 256
   local SVEAudioLevel := 512
   local SVEPrivate := 32768
   local SVEAllEvents := 33790
   //SpeechVoicePriority
   local SVPNormal := 0
   local SVPAlert := 1
   local SVPOver := 2
   local cTextToRead := "La Guía de Programación de FiveWin, ofrece una introducción dirigida a técnicas" + CRLF +;
                        "de desarrollo de aplicaciones de Windows utilizando (x)Harbour y FiveWin. Esta" + CRLF +;
                        "guía explicará los conceptos básicos que usted debe tener para construir correctamente" + CRLF +;
                        "sus aplicaciones de Windows."
   local ISpeechObjectTokens := oVoice:GetVoices()

   For n = 0 To Len( oVoice:GetVoices() )
       Aadd( aVoices, { n, ISpeechObjectTokens[n]:GetAttribute( 'Name' ), ISpeechObjectTokens[n]:GetAttribute( 'Gender' ),;
                          ISpeechObjectTokens[n]:GetAttribute( 'Age' ), ISpeechObjectTokens[n]:GetAttribute( 'Language' ),;
                          ISpeechObjectTokens[n]:GetAttribute( 'Vendor' ) } )
       Aadd( aVoiceForSelect, ISpeechObjectTokens[n]:GetAttribute( 'Name' ) )
   Next
   
   cSelNormalVoice := aVoiceForSelect[1]
   cSelAlertVoice := aVoiceForSelect[1]

   oVoiceAlert:Priority() := SVPAlert // Set oVoiceAlert as an 'alert' voice
   oVoiceAlert:Voice() := oVoiceAlert:GetVoices( "Name = " + cSelNormalVoice ):Item( 0 )
   oVoiceAlert:Volume() := 90 // Set the volume of the Alert Voice at 90 to a Maximum of 100

   oVoice:AlertBoundary() := SVEPhoneme // Allow to Stop voice by Another one with Alert priority
   oVoice:EventInterests := SVEAllEvents + SVEAudioLevel

   oVoice:Voice() := oVoice:GetVoices( "Name = " + cSelNormalVoice ):Item( 0 )
   oVoice:Volume() := nVolume
   oVoice:Rate := nVelocity


   DEFINE DIALOG oDlg RESOURCE "sound"

   REDEFINE GET oGetText VAR cTextToRead ID 10 OF oDlg MULTILINE UPDATE
   
   REDEFINE METER oMeter VAR cMeter ID 3000 OF oDlg NOPERCENTAGE UPDATE
   
   REDEFINE BUTTON oBtnPlay ID 2010 OF oDlg ACTION ( oVoice:Speak( cTextToRead, ( SVSFlagsAsync + SVSFIsXML ) ) ) UPDATE
   
   REDEFINE BUTTON oBtnPause ID 2020 OF oDlg ACTION ( PauseResume( oVoice, oDlg, oBtnPause ), oDlg:Update() ) UPDATE
   
   REDEFINE BUTTON oBtnStop ID 2030 OF oDlg ACTION ( iif( lIsPaused, ( lIsPaused := .F., oBtnPause:SetText( "Pause" ) ) , ),;
            oVoice:Speak( " ",SVSFPurgeBeforeSpeak ) ) UPDATE
   
   REDEFINE BUTTON oBtnInterroga ID 2040 OF oDlg ACTION ;
           ( oVoiceAlert:Speak( "This is a Warning Interrupt", SVSFlagsAsync ), MsgInfo( "Esto es una prueba de interrupción de Alerta" ) )
   
   REDEFINE BUTTON oBtnVolumeUp ID 120 OF oDlg;
            ACTION ( nVolume := nVolume + 10, iif( nVolume > 100, ( nVolume := 100 , MsgInfo( "Máximum Volume" ) ) ,;
            oVoice:Volume := nVolume ), oGetVolumeLevel:SetText( AllTrim( Str( nVolume ) ) ) ) UPDATE

   REDEFINE BUTTON oBtnVolumeDown ID 130 OF oDlg;
            ACTION ( nVolume := nVolume - 10, iif( nVolume < 0, ( nVolume := 0 , MsgInfo( "Mínimum Volume" ) ),;
            oVoice:Volume := nVolume ), oGetVolumeLevel:SetText( AllTrim( Str( nVolume ) ) ) ) UPDATE

   REDEFINE BUTTON oBtnVelocityUp ID 140 OF oDlg;
            ACTION ( nVelocity++, iif( nVelocity > 10, ( nVelocity := 10 , MsgInfo( "Máximum Velocity" ) ),;
            oVoice:Rate := nVelocity ), oGetVelocityLevel:SetText( AllTrim( Str( nVelocity ) ) ) ) UPDATE

   REDEFINE BUTTON oBtnVelocityDown ID 150 OF oDlg;
            ACTION ( nVelocity--, iif( nVelocity < -10, ( nVelocity := -10 , MsgInfo( "Mínimum Velocity" ) ),;
            oVoice:Rate := nVelocity ), oGetVelocityLevel:SetText( AllTrim( Str( nVelocity ) ) ) ) UPDATE

   REDEFINE GET oGetVolumeLevel VAR nVolume ID 160 OF oDlg UPDATE
   
   oGetVolumeLevel:SetText( Str( nVolume ) )
   
   REDEFINE GET oGetVelocityLevel VAR nVelocity ID 170 OF oDlg UPDATE
   
   oGetVelocityLevel:SetText( Str( nVelocity ) )

   REDEFINE LISTBOX oBrowVoices FIELDS AllTrim( Str( aVoices[ oBrowVoices:nAt, 1 ] ) ), aVoices[ oBrowVoices:nAt, 2 ],;
            aVoices[ oBrowVoices:nAt, 3 ], aVoices[ oBrowVoices:nAt, 4 ], aVoices[ oBrowVoices:nAt, 5 ], aVoices[ oBrowVoices:nAt, 6 ];
            HEADERS "Item", "Nombre", "_", "Edad", "Idioma ID", "Empresa";
            COLSIZES 31, 77, 72, 42, 58, 64;
            ON DBLCLICK oVoice:Voice := oVoice:GetVoices():Item( aVoices[ oBrowVoices:nAt, 1 ]  );
            ID 200 OF oDlg UPDATE

   oBrowVoices:SetArray( aVoices )
   
   REDEFINE COMBOBOX oCbxOutPut VAR cSelOutPutStream;
                  ITEMS aOutPutStream ID 210 OF oDlg UPDATE ;
            ON CHANGE OutPutStream( cSelOutPutStream, oVoice, oFile )

   REDEFINE COMBOBOX oCbxVoiceNormal VAR cSelNormalVoice;
                  ITEMS aVoiceForSelect ID 220 OF oDlg UPDATE;
            ON CHANGE oVoice:Voice := oVoice:GetVoices( "name = " + cSelNormalVoice ):Item( 0 )
                  

   REDEFINE COMBOBOX oCbxVoiceAlert VAR cSelAlertVoice;
                  ITEMS aVoiceForSelect ID 230 OF oDlg UPDATE;
            ON CHANGE oVoiceAlert:Voice := oVoiceAlert:GetVoices( "name = " + cSelAlertVoice ):Item( 0 )
               

   ACTIVATE DIALOG oDlg CENTERED

return nil

function PauseResume( oVoice, oDlg, oBtnPause )
   
   iif( lIsPaused,;
      ( oVoice:Resume(), lIsPaused := .F., oBtnPause:SetText( "Pause" ) ),;
      ( oVoice:Pause(), lIsPaused := .T., oBtnPause:SetText( "Resume" ) ) )
   
return nil

function OutPutStream( cSelOutPutStream, oVoice, oFile )

   local SSFMCreateForWrite := 3

   if cSelOutPutStream = "File"
      MsgInfo( "OutPut redirected to a File in 'c:\TeechToSpeak.wav'", "Warning!!!" )
      oFile:Open( "c:\TeechToSpeak.wav" , SSFMCreateForWrite )
      oVoice:AudioOutputStream := oFile
   else
      MsgInfo( "OutPut redirected to Speakers", "Warning!!!" )
      oFile:Close()
      oVoice:AudioOutputStream := nil
   endif
     
return nil


ARCHIVO .RC

Code: Select all  Expand view  RUN
#ifdef __FLAT__
  1 24 "WindowsXP.Manifest"
#endif

#define IDC_GROUPBOX1   11
#define DIALOG_10   10
#define DIALOG_8   8
#define DIALOG_7   7
#define DIALOG_6   6
#define DIALOG_4   4
#define DIALOG_3   3
#define DIALOG_2   2
  #define DIALOG_1   1
#define DIALOG_5   5




sound DIALOG 76, 48, 379, 241
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Text To Speech (TTS)"
FONT 8, "MS Sans Serif"
{
PUSHBUTTON "Play", 2010, 312, 98, 55, 14
PUSHBUTTON "Pause", 2020, 312, 115, 55, 14
PUSHBUTTON "Stop", 2030, 312, 132, 55, 14
PUSHBUTTON "Alert!!!", 2040, 312, 149, 55, 14
LTEXT "Text To Speech:", -1, 16, 7, 59, 10
EDITTEXT 10, 16, 17, 278, 74, ES_MULTILINE | ES_READONLY | ES_WANTRETURN | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
LTEXT "Volumen:", -1, 306, 175, 40, 10
LTEXT "Velocity:", -1, 344, 175, 37, 10
PUSHBUTTON "+", 120, 313, 185, 17, 14
PUSHBUTTON "-", 130, 313, 202, 17, 14
PUSHBUTTON "+", 140, 351, 185, 17, 14
PUSHBUTTON "-", 150, 351, 202, 17, 14
CONTROL "", 200, "TWBrowse", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, 16, 141, 278, 88
COMBOBOX 210, 308, 15, 55, 22, CBS_DROPDOWNLIST | WS_TABSTOP
LTEXT "Double Click to Select:", -1, 16, 128, 78, 10
LTEXT "Voice OutPut:", -1, 308, 5, 49, 10
GROUPBOX "", IDC_GROUPBOX1, 304, 91, 70, 77, BS_GROUPBOX
GROUPBOX "", -1, 4, 0, 298, 122, BS_GROUPBOX
GROUPBOX "", -1, 4, 121, 298, 115, BS_GROUPBOX
GROUPBOX "", -1, 304, 0, 70, 33, BS_GROUPBOX
GROUPBOX "", -1, 304, 165, 70, 71, BS_GROUPBOX
EDITTEXT 160, 313, 220, 17, 13, ES_READONLY | WS_BORDER | WS_TABSTOP
EDITTEXT 170, 351, 220, 17, 13, ES_READONLY | WS_BORDER | WS_TABSTOP
CONTROL "TMeter", 3000, "TMeter", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 16, 95, 279, 22
COMBOBOX 220, 308, 46, 61, 33, CBS_DROPDOWNLIST | WS_TABSTOP
LTEXT "Normal Voice:", -1, 308, 36, 49, 10
GROUPBOX "", -1, 304, 31, 70, 33, BS_GROUPBOX
COMBOBOX 230, 308, 76, 61, 33, CBS_DROPDOWNLIST | WS_TABSTOP
LTEXT "Alert Voice:", -1, 308, 66, 49, 10
GROUPBOX "", -1, 304, 61, 70, 33, BS_GROUPBOX
}
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Postby QAZWSX2K » Mon Nov 03, 2008 2:30 pm

aqui salen varias voces, en varios idiomas,(ruso, italiano, aleman, portugues, español, etc)

http://www.msagentring.org/setup.aspx
Software especializado para oficinas contables con grandes volumenes de Informacion
Impresion de todos los formularios del Seniat, Dian

alex_patino74@hotmail.com
whatsapp 57+3214777217
User avatar
QAZWSX2K
 
Posts: 364
Joined: Tue Oct 25, 2005 7:06 pm
Location: Bogota - Caracas

Postby QAZWSX2K » Mon Nov 03, 2008 2:50 pm

y si lo anterior no es suficiente, aqui de alguien que logro que microsoft sam hable en español directamente sin tanto rollo

http://www.lacoctelera.com/adastra/post ... la-espanol
Software especializado para oficinas contables con grandes volumenes de Informacion
Impresion de todos los formularios del Seniat, Dian

alex_patino74@hotmail.com
whatsapp 57+3214777217
User avatar
QAZWSX2K
 
Posts: 364
Joined: Tue Oct 25, 2005 7:06 pm
Location: Bogota - Caracas

Postby triumvirato » Mon Nov 03, 2008 4:47 pm

QAZWSX2K wrote:y si lo anterior no es suficiente, aqui de alguien que logro que microsoft sam hable en español directamente sin tanto rollo

http://www.lacoctelera.com/adastra/post ... la-espanol


:lol: buenísimo!!!!!!!!!! un buen curso de 'Listening & comprension'!
triumvirato
 
Posts: 199
Joined: Tue Apr 22, 2008 9:54 am
Location: Valladolid, Spain.

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 91 guests