Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   lector de texto SAPI.SpVoice (https://www.clubdelphi.com/foros/showthread.php?t=86958)

koiji 28-10-2014 00:18:00

lector de texto SAPI.SpVoice
 
buenas tarde lo que estaba investigando es como poder hacer que la voz de SAPI.SpVoice sea en español porque por defecto esta en ingles tendra la opcion de cambiar la voz a español gracias por sus comentarios


Código Delphi [-]
var
  SpVoice: Variant;
begin
   SpVoice := CreateOleObject('SAPI.SpVoice');
  SpVoice.Speak('Hola Mundo', 0);
end;

Neftali [Germán.Estévez] 28-10-2014 09:52:44

Aquí tienes una descripción completa con código de ejemplo del funcionamiento de esta API.
Tal vez esto te sirva, ya que hace referencia a cambiar el idioma.
Y aquí tienes el enlace para descargar algunos idiomas más.

koiji 30-10-2014 00:32:28

Buenas tardes Señor neftali no puede encontrar cambiarle el idioma a español encontre una linea SpVoice.GetVoices('','Language=C0A').Item(0) no dio gracias

Neftali [Germán.Estévez] 30-10-2014 10:33:36

No lo he probado, pero se supone que con esto puedes enumerar todas la "voces" disponibles.

Y en la última parte de esa sección está el evento que hay que programar para cambiarlas.

koiji 30-10-2014 22:50:58

Error en la configuracion del lenguaje Speech
 
Acabo de probar el script aqui pongo

Código Delphi [-]
var
  SOToken: ISpeechObjectToken;
begin
  with lstEngineInfo.Items do
  begin
    Clear;
    SOToken := ISpeechObjectToken(Pointer(
      cbVoices.Items.Objects[cbVoices.ItemIndex]));
    SpVoice.Voice := SOToken;
    Add(Format('Name: %s', [SOToken.GetAttribute('Name')]));   ///////////////// Aqui me manda un error nombre del error abajo
    Add(Format('Vendor: %s', [SOToken.GetAttribute('Vendor')]));
    Add(Format('Age: %s', [SOToken.GetAttribute('Age')]));
    Add(Format('Gender: %s', [SOToken.GetAttribute('Gender')]));
    Add(Format('Language: %s', [SOToken.GetAttribute('Language')]));
    Add(Format('Reg key: %s', [SOToken.Id]));
  end
end;

lo que pasa cuando ejecuto me manda este error yo estoy utilizando delphi 2010

First chance exception at $7592D3CF. Exception class EAccessViolation with message 'Access violation at address 004BA755 in module 'Project3.exe'. Read of address 00000000'. Process Project3.exe (5812)

Neftali [Germán.Estévez] 31-10-2014 10:14:48

Ejecuta paso a paso y al llegar a esa línea revisa que todo esté asignado correctamente.
Normalmente estos errores son por acceder a un elemento que apunta a nil.

koiji 31-10-2014 14:48:38

Revise el codigo varias veces y no encontre ningun error simplemente al compilar me manda el error " Access violatio at address 004BA755 in module 'Project3.exe'. Read of address 00000000. " el codigo completo de lo que estoy haciendo es este talves puede ser porque estar utilizando delphi 2010 porque vi que esta compilado en delphi2007

Código Delphi [-]

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleServer, SpeechLib_TLB, ActiveX, ComObj, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    cbVoices: TComboBox;
    lstEngineInfo: TListBox;
    Button2: TButton;
    reText: TEdit;
    SpVoice: TSpVoice;
    tbRate: TTrackBar;
    lblRate: TLabel;
    tbVolume: TTrackBar;
    lblVolume: TLabel;
    lstProgress: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure cbVoicesChange(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var BeenPaused : Boolean;
begin
  if not BeenPaused then
    SpVoice.Speak(reText.Text, SVSFlagsAsync)
  else
  begin
    SpVoice.Resume;
    BeenPaused := False
  end
end;

procedure TForm1.cbVoicesChange(Sender: TObject);
var
  SOToken: ISpeechObjectToken;
begin
  with lstEngineInfo.Items do
  begin
    Clear;
    SOToken := ISpeechObjectToken(Pointer(
      cbVoices.Items.Objects[cbVoices.ItemIndex]));
    SpVoice.Voice := SOToken;
    Add(Format('Name: %s', [SOToken.GetAttribute('Name')]));
    Add(Format('Vendor: %s', [SOToken.GetAttribute('Vendor')]));
    Add(Format('Age: %s', [SOToken.GetAttribute('Age')]));
    Add(Format('Gender: %s', [SOToken.GetAttribute('Gender')]));
    Add(Format('Language: %s', [SOToken.GetAttribute('Language')]));
    Add(Format('Reg key: %s', [SOToken.Id]));
  end
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  SOToken: ISpeechObjectToken;
  SOTokens: ISpeechObjectTokens;
begin
  SendMessage(lstProgress.Handle, LB_SETHORIZONTALEXTENT, Width, 0);
  //Ensure all events fire
  SpVoice.EventInterests := SVEAllEvents;
  //Log('About to enumerate voices');
  SOTokens := SpVoice.GetVoices('', '');
  for I := 0 to SOTokens.Count - 1 do
  begin
    //For each voice, store the descriptor in the TStrings list
    SOToken := SOTokens.Item(I);
    cbVoices.Items.AddObject(SOToken.GetDescription(0), TObject(SOToken));
    //Increment descriptor reference count to ensure it's not destroyed
    SOToken._AddRef;
  end;
  if cbVoices.Items.Count > 0 then
  begin
    cbVoices.ItemIndex := 0; //Select 1st voice
    cbVoices.OnChange(cbVoices); //& ensure OnChange triggers
  end;
  //Log('Enumerated voices');
  //Log('About to check attributes');
  tbRate.Position := SpVoice.Rate;
  lblRate.Caption := IntToStr(tbRate.Position);
  tbVolume.Position := SpVoice.Volume;
  lblVolume.Caption := IntToStr(tbVolume.Position);
  //Log('Checked attributes');
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  I: Integer;
begin
  //Release all the voice descriptors
  for I := 0 to cbVoices.Items.Count - 1 do
    ISpeechObjectToken(Pointer(cbVoices.Items.Objects[i]))._Release;
end;


end.

Neftali [Germán.Estévez] 31-10-2014 15:51:13

Cita:

Empezado por koiji (Mensaje 484072)
Revise el codigo varias veces y no encontre ningun error simplemente al compilar me manda el error " Access violatio at address 004BA755 in module 'Project3.exe'. Read of address 00000000. "

¿Al compilar o al ejecutar?
:confused::confused:

koiji 31-10-2014 16:10:08

Cita:

Empezado por Neftali (Mensaje 484073)
¿Al compilar o al ejecutar?
:confused::confused:

al compilar y al ejecutar cualquiera de los 2 eso es muy raro porque error de codigo no visualizo tengo instalado el componente speech

1.- al compilar me manda a la linea de codigo

Código Delphi [-]
Add(Format('Name: %s', [SOToken.GetAttribute('Name')]));

2.- al ejecutar solo el error pero me muestra el listbox con las voces pero cuando selecciono alguno tambien me manda el mismo error en ejecución

koiji 06-11-2014 20:33:39

Cita:

Empezado por koiji (Mensaje 484074)
al compilar y al ejecutar cualquiera de los 2 eso es muy raro porque error de codigo no visualizo tengo instalado el componente speech

1.- al compilar me manda a la linea de codigo

Código Delphi [-]
Add(Format('Name: %s', [SOToken.GetAttribute('Name')]));

2.- al ejecutar solo el error pero me muestra el listbox con las voces pero cuando selecciono alguno tambien me manda el mismo error en ejecución


Neftali usted me podra colaborar con este error que no e podido solucionar de cambio de voces

Código Delphi [-]
Add(Format('Name: %s', [SOToken.GetAttribute('Name')]));

Neftali [Germán.Estévez] 07-11-2014 11:45:04

Cita:

Empezado por koiji (Mensaje 484074)
al compilar y al ejecutar cualquiera de los 2 eso es muy raro porque error de codigo no visualizo tengo instalado el componente speech

1.- al compilar me manda a la linea de codigo

Código Delphi [-]
Add(Format('Name: %s', [SOToken.GetAttribute('Name')]));

2.- al ejecutar solo el error pero me muestra el listbox con las voces pero cuando selecciono alguno tambien me manda el mismo error en ejecución

¿Qué error te devuelve al compilar?
No entiendo que puedas ejecutarlo si no consigues compilarlo. Debes estar ejecutando algo anterior.
Hay que centrarse en el punto 1.


La franja horaria es GMT +2. Ahora son las 04:54:54.

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