![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
quizas si reproduces con PlaySound
en C++ builder: Código:
#include <windows.h> #include <mmsystem.h> Código:
uses Windows, MMSystem; formato de PlaySound que yo uso: C++ Builder code: Código:
PlaySound(L".\\music\\PP_BluNotes.wav", NULL, SND_FILENAME || SND_ASYNC); 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. |
#3
|
||||
|
||||
¿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. |
#4
|
|||
|
|||
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. |
#5
|
|||
|
|||
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. |
#6
|
|||
|
|||
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.....
|
#7
|
|||
|
|||
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.? |
#8
|
|||
|
|||
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; 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. |
#9
|
||||
|
||||
¿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. |
#10
|
|||
|
|||
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. |
#11
|
||||
|
||||
¿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. |
#12
|
|||
|
|||
A ver si esto te sirve Neftali
Cita:
|
#13
|
||||
|
||||
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. |
#14
|
||||
|
||||
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. |
#15
|
|||
|
|||
es que creo que a mi no me genera ese archivo, al no ser pascal, pero no estoy muy seguro
te funciona ya? |
#16
|
||||
|
||||
Cita:
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. |
#17
|
|||
|
|||
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: No reconoce GetTokens [dcc32 Error] Unit1.pas(62): E2033 Types of actual and formal var parameters must be identical en la segunda SpeakText [dcc32 Error] Unit1.pas(91): E2003 Undeclared identifier: 'SPCAT_VOICES' y por ultimo [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. |
#18
|
||||
|
||||
Cita:
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.
__________________
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. |
#19
|
|||
|
|||
Cita:
Muchas gracias Neftali, voy a probarla y te comento. |
#20
|
|||
|
|||
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? |
![]() |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
![]() |
||||
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 |
![]() |
|