Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-10-2024
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 74
Poder: 14
aromigaret Va por buen camino
Delay entre un sndPlaySound y otro

Buenas noches,
Desarrolle un sistema de facturación con el ingreso de los artículos a facturar mediante lectura de código de barra. Como no quieren que se ingrese manualmente la cantidad cuando se repiten los ítems, se tiene que escanear uno por uno. Lo que me piden es que el sistema vaya informando por voz, cuantos ítems llevan ingresado. Es decir que ha medida que se escanee, vaya contando, 'uno', 'dos', 'tres' y así sucesivamente. Obviamente no voy a grabar voces desde el uno hasta 2.000, la idea es armar los números como por ejemplo 'diez y' + 'seis' o 'diez y' + 'siete'. Todo eso ya esta grabado, el inconveniente esta en que al hacer el sndPlaySound de 'diez y' tarda unos segundos para ejecutar el sndPlaySound de 'seis' entonces el numero 16, que cortado. Existe alguna forma de quitar ese delay entre un sndPlaySound y otro ? O hay alguna API que no haga ese gap?. Desde ya muchas gracias.
Responder Con Cita
  #2  
Antiguo 14-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
quizas si reproduces con PlaySound

en C++ builder:
Código:
#include <windows.h> 
#include <mmsystem.h>
en Delphi:
Código:
uses
  Windows, MMSystem;
con el parametro SND_ASYNC y reproduces uno detras de otro mejores eso

formato de PlaySound que yo uso:

C++ Builder code:
Código:
PlaySound(L".\\music\\PP_BluNotes.wav", NULL, SND_FILENAME || SND_ASYNC);
Delphi Code:
Código:
PlaySound(PChar('.\music\PP_BluNotes.wav'), 0, SND_FILENAME or SND_ASYNC);

si ves que sale todo solapandose o tal, utiliza alguna clase de timer o con la funcion Sleep() para separarlo un poco con algunos milisegundos entre cada sonido

Última edición por navbuoy fecha: 14-10-2024 a las 12:07:22.
Responder Con Cita
  #3  
Antiguo 14-10-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.874
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿Tal vez digo una tontería, pero y si usas alguno de los SDK especiales para voz, para que te convierta un texto a voz?
Como si quisieras leer un texto escrito, pero con un número; Eso te evitaría tener que ir haciendo play sound de diferentes archivos.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 14-10-2024
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 74
Poder: 14
aromigaret Va por buen camino
navbuoy,
muchas gracias por tu aporte, funciona. Claro parece un robot al decir por ejemplo 16.

Como menciona Neftali, no esta mal buscar algún SDK para pasar de texto a voz. Dependerá el tiempo que tarde en convertir.
Muchas gracias a ambos.
Responder Con Cita
  #5  
Antiguo 14-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
yo creo que el tema de texto a voz es mucho jaleo para lo que quieres hacer

pero algo asi es:

Código:
#include <sapi.h>
Código:
void SpeakText(const String& text) {
    // Inicializar COM
    CoInitialize(NULL);

    // Crear el objeto de voz
    ISpVoice *pVoice = NULL;
    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);

    if (SUCCEEDED(hr)) {
        // Pronunciar el texto
        pVoice->Speak(text.w_str(), 0, NULL);
        pVoice->Release(); // Liberar el objeto
    }

    // Finalizar COM
    CoUninitialize();
}

Enumerar las voces disponibles:

Código:
#include <sapi.h>
#include <sphelper.h>
#include <iostream>
#include <vector>
#pragma hdrstop

void ListVoices() {
    // Inicializar COM
    CoInitialize(NULL);

    // Crear el objeto de voz
    ISpVoice *pVoice = NULL;
    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
    
    if (SUCCEEDED(hr)) {
        ISpObjectTokenEnumerator *pEnum = NULL;
        hr = SpEnumTokens(SPCAT_VOICES, NULL, NULL, &pEnum);

        if (SUCCEEDED(hr)) {
            ISpObjectToken *pToken = NULL;
            while (pEnum->Next(1, &pToken, NULL) == S_OK) {
                LPWSTR pwszId;
                pToken->GetId(&pwszId);
                // Obtener el nombre de la voz
                LPWSTR pwszVoiceName;
                pToken->GetStringValue(L"Name", &pwszVoiceName);
                std::wcout << L"Voice ID: " << pwszId << L", Voice Name: " << pwszVoiceName << std::endl;
                CoTaskMemFree(pwszVoiceName);
                CoTaskMemFree(pwszId);
                pToken->Release();
            }
            pEnum->Release();
        }
        pVoice->Release(); // Liberar el objeto de voz
    }

    // Finalizar COM
    CoUninitialize();
}

Cambiar la Voz:

Código:
void SpeakText(const String& text, const String& voiceId) {
    // Inicializar COM
    CoInitialize(NULL);

    // Crear el objeto de voz
    ISpVoice *pVoice = NULL;
    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
    
    if (SUCCEEDED(hr)) {
        // Seleccionar la voz por ID
        ISpObjectToken *pToken = NULL;
        hr = SpGetTokenFromId(voiceId.w_str(), &pToken);
        if (SUCCEEDED(hr)) {
            pVoice->SetVoice(pToken);
            pToken->Release(); // Liberar el objeto token
        }

        // Pronunciar el texto
        pVoice->Speak(text.w_str(), 0, NULL);
        pVoice->Release(); // Liberar el objeto de voz
    }

    // Finalizar COM
    CoUninitialize();
}

Última edición por navbuoy fecha: 15-10-2024 a las 00:06:01.
Responder Con Cita
  #6  
Antiguo 15-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
ten en cuenta que el TextToSpeech de windows depende de que idioma tengas activado en los Settings de sistema, te lo digo por si lo tienes en ingles y ves que la voz tiene un acento de guiri que asusta.....
Responder Con Cita
  #7  
Antiguo 15-10-2024
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 74
Poder: 14
aromigaret Va por buen camino
navbuoy,
nuevamente gracias por tu aporte.
Justo estoy viendo SAPI. Si no te es molesto, podrías pasarme, por favor, en pascal en vez de C++ lo que me aportaste.?
Responder Con Cita
  #8  
Antiguo 15-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
Text to speech funcion Delphi:

Código:
uses
  ComObj, ActiveX;

procedure SpeakText(const text: string);
var
  Voice: Variant;
begin
  // Inicializar COM
  CoInitialize(nil);
  try
    // Crear el objeto de voz (SAPI.SpVoice)
    Voice := CreateOleObject('SAPI.SpVoice');

    // Pronunciar el texto
    Voice.Speak(text);

  finally
    // Finalizar COM
    CoUninitialize();
  end;
end;

Enumerar las Voces:

Código:
uses
  ComObj, ActiveX, SpeechLib_TLB, Variants;

procedure ListVoices;
var
  SpVoice: ISpeechObjectTokens;
  VoiceToken: ISpeechObjectToken;
  TokenEnum: IEnumVariant;
  VoiceID, VoiceName: OleVariant;
  i: Integer;
begin
  // Inicializar COM
  CoInitialize(nil);
  try
    // Crear el objeto de voz para obtener la enumeración de voces
    SpVoice := CreateOleObject('SAPI.SpVoice') as ISpeechObjectTokens;
    SpVoice := CreateOleObject('SAPI.SpObjectTokenCategory').GetTokens('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices', '', '');

    // Enumerar las voces
    TokenEnum := (SpVoice._NewEnum as IEnumVariant);
    i := 0;
    while TokenEnum.Next(1, VoiceID, nil) = S_OK do
    begin
      VoiceToken := IDispatch(VoiceID) as ISpeechObjectToken;
      VoiceName := VoiceToken.GetDescription(0);
      Writeln('Voz ID: ', i, ', Nombre: ', VoiceName);
      Inc(i);
    end;
  finally
    // Finalizar COM
    CoUninitialize();
  end;
end;
Cambiar la Voz:

Código:
uses
  ComObj, ActiveX, SpeechLib_TLB;

procedure SpeakText(const text, voiceId: string);
var
  Voice: ISpeechVoice;
  Token: ISpeechObjectToken;
  SpObjectTokenCategory: ISpeechObjectTokenCategory;
begin
  // Inicializar COM
  CoInitialize(nil);
  
  try
    // Crear el objeto de voz
    Voice := CoSpVoice.Create;

    // Obtener la categoría de las voces
    SpObjectTokenCategory := CoSpObjectTokenCategory.Create;
    SpObjectTokenCategory.SetId(SPCAT_VOICES, False);

    // Seleccionar la voz por ID
    Token := SpObjectTokenCategory.GetTokenFromId(voiceId);
    if Token <> nil then
      Voice.Voice := Token;

    // Pronunciar el texto
    Voice.Speak(text, 0);
  finally
    // Finalizar COM
    CoUninitialize;
  end;
end;

Última edición por navbuoy fecha: 15-10-2024 a las 17:13:20.
Responder Con Cita
  #9  
Antiguo 16-10-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.874
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por navbuoy Ver Mensaje
Text to speech funcion Delphi

¿Con qué versión y con qué fichero SpeechLib_TLB lo has compilado?
¿Lo acabo de importar con Delphi 12 (la version 5.4) y me da errores al compilar?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 16-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
con rad Studio 11.3 y con Windows 10

a mi si que me funciona.
pero yo uso C++ Builder, yo solo inclui el sapi.h Neftali para la primera funcion de leer texto y lo lee y lo habla.

Última edición por navbuoy fecha: 16-10-2024 a las 14:06:31.
Responder Con Cita
  #11  
Antiguo 16-10-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.874
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿Puedes adjuntar el SpeechLib_TLB que estás utilizando?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #12  
Antiguo 16-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
A ver si esto te sirve Neftali

Cita:
El archivo SpeechLib_TLB.pas se genera automáticamente cuando importas la biblioteca de tipo (Type Library) de Microsoft Speech API (SAPI) en Delphi o C++ Builder. Se utiliza para acceder a las funciones de texto a voz (TTS) y reconocimiento de voz en estas plataformas. Este archivo define las interfaces y clases necesarias para interactuar con las funcionalidades de SAPI.

Pasos para generar SpeechLib_TLB.pas:
Importar la Type Library:

En Delphi o C++ Builder, ve a Component -> Import Component.
Selecciona Import a Type Library.
En la lista, busca Microsoft Speech Object Library o Microsoft Speech API, selecciónalo y haz clic en Siguiente.
Dale un nombre al archivo (generalmente SpeechLib_TLB.pas es el predeterminado) y selecciona el directorio de destino.
Completa el asistente y se generará el archivo SpeechLib_TLB.pas en el proyecto o en la carpeta indicada.
Utilización:

Una vez generado, puedes utilizar SpeechLib_TLB en tu código Delphi o C++ Builder para acceder a los objetos y métodos de SAPI como ISpeechVoice y otros elementos relacionados con el habla.
Si no encuentras la opción o tienes dificultades, asegúrate de tener instalado Microsoft Speech SDK y de que esté correctamente registrado en tu sistema.
Responder Con Cita
  #13  
Antiguo 16-10-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.874
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por navbuoy Ver Mensaje
A ver si esto te sirve Neftali

Si eso ya lo he hecho. Son lospasos estandard para importar una librería.
He generado el fichero SpeechLib_TLB.pas,pero me está dando errors.

No se si por la versión de Delphi con la que he hecho la importación o por algún problema en le importador.
Te estaba pidiendo que me la pasaras si tú la tenías importada y te compilaba.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #14  
Antiguo 16-10-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.874
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Ya está. No es necesario.
he encontrado uno que compila bien aquí:
https://github.com/CHERTS/mspeech/bl...echLib_TLB.pas
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #15  
Antiguo 16-10-2024
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 280
Poder: 2
navbuoy Va por buen camino
es que creo que a mi no me genera ese archivo, al no ser pascal, pero no estoy muy seguro

te funciona ya?
Responder Con Cita
  #16  
Antiguo 17-10-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.874
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por navbuoy Ver Mensaje
es que creo que a mi no me genera ese archivo, al no ser pascal, pero no estoy muy seguro
Es necesario si se desean utilizar los tres códigos que hay más arriba (los 2 útimos concretamente).


Cita:
Empezado por navbuoy Ver Mensaje
te funciona ya?
Si.
Estaba haciendo un par de pruebas de ejemplo y bajando el de github, me ha compilado.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #17  
Antiguo 18-10-2024
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 74
Poder: 14
aromigaret Va por buen camino
Navbuoy,
como te mencioné instalé SAPI 5.4 y generé SpeechLib_TLB, y uso la version 10.3 de Delphi y no logro compilar las funciones que me aportaste.
Tendrá algo que ver la versión de Delphi?

Te muestro las lineas donde da error de compilación:

en ListVoices:
Código Delphi [-]
SpVoice := CreateOleObject('SAPI.SpObjectTokenCategory').GetTokens('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speec  h\Voices', '', '');
No reconoce GetTokens

Código Delphi [-]
while TokenEnum.Next(1, VoiceID, nil) = S_OK do
[dcc32 Error] Unit1.pas(62): E2033 Types of actual and formal var parameters must be identical

en la segunda SpeakText
Código Delphi [-]
SpObjectTokenCategory.SetId(SPCAT_VOICES, False);
[dcc32 Error] Unit1.pas(91): E2003 Undeclared identifier: 'SPCAT_VOICES'

y por ultimo
Código Delphi [-]
Token := SpObjectTokenCategory.GetTokenFromId(voiceId);
[dcc32 Error] Unit1.pas(94): E2003 Undeclared identifier: 'GetTokenFromId'

Justamente es lo que mas me interesa, el poder elegir la voz del speech.

Nuevamente gracias
Saludos

Última edición por aromigaret fecha: 18-10-2024 a las 03:53:31.
Responder Con Cita
  #18  
Antiguo 18-10-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.874
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por aromigaret Ver Mensaje
Navbuoy,
como te mencioné instalé SAPI 5.4 y generé SpeechLib_TLB, y uso la version 10.3 de Delphi y no logro compilar las funciones que me aportaste.
Tendrá algo que ver la versión de Delphi?

Prueba con esta versión de SpeechLib_TLB.pas que te adjunto.
A mi la importada desde Delphi de la v.5.4 también me daba errores.
Archivos Adjuntos
Tipo de Archivo: zip SpeechLib_TLB.zip (48,0 KB, 7 visitas)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #19  
Antiguo 25-10-2024
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 74
Poder: 14
aromigaret Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Prueba con esta versión de SpeechLib_TLB.pas que te adjunto.
A mi la importada desde Delphi de la v.5.4 también me daba errores.

Muchas gracias Neftali, voy a probarla y te comento.
Responder Con Cita
  #20  
Antiguo 25-10-2024
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 74
Poder: 14
aromigaret Va por buen camino
Neftali,
Removí el componente que tenia instalado, instalé el que me pasaste y aun así, me sigue dando exactamente los mismos errores que mencione antes. Hice una búsqueda de las funciones que da error y no las encontré en SpeechLib_TLB.pas que me pasaste. Como pudiste compilar, sino están esas funciones. Estaré haciendo algo mal?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Delay en liveBindings look FireMonkey 0 01-04-2022 20:57:00
Ayuda con funcion Delay Novatin C++ Builder 2 25-06-2013 04:48:50
delay con WinSock chelox Internet 0 24-07-2010 06:46:36
Sleep/delay? nena_yei OOP 6 22-07-2010 16:41:47
Delay de Pascal Esau OOP 4 28-08-2003 21:32:11


La franja horaria es GMT +2. Ahora son las 11:26:19.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi