Ler texto e repdoduzir

Delphi

25/01/2012

Olá Pessoal.
Tenho essa procedure abaixo que deve reproduir em áudio o conteúdo de um campo Memo .
Esse campo Memo contém um arquivo texto e debe ser lido e reproduzido, linha à linha, até cada ponto final de cada frase.

1º parágrafo lido e reproduzido
2º parágrafo lido e reproduzido
3º parágrafo lido e reproduzido
nº parágrafo lido e reproduzido, e assim por diante.

O que preciso é só quando acabar de reproduzir cada parágrafo, ler o seguinte para repodurir, a não ser que clique a tecla ENTER para parar na última frase lida.

Se clicar ENTER novamente, continua de onde parou, e assim por diante, até o final.
Na verdade fiz isso com a função POS, mas o ruim é que a leitura das linhas é muito mais rápido que a execução do texto, e aí, se clicar ENTER, não adianta porque todo o texto já foi para o campo Memo e reproduz tudo de uma vez.
NB: Essa posição de parada, posso gravar em um Banco de dados e ler a posição em que parou.
Se a posição for=0, lê do início
Se a posição for=287, começa a ler daí e diante, por exemplo.

Já estou quase careca de tanto queimar e não consigo resolver .
Alguma santa alma poderia auxiliar essa careca já desgastada???
QQ ajuda é muito bem vinda (antes que eu saia no braço com o PC)

procedure Tform1.Audio;
begin
if(xvoice=)then
begin
xvoice:=Tecla?. Inválida;
exit;
end;
voice:= CreateOLEObject (SAPI.SpVoice);
voice.volume:=strtoint(vol);
voice.Rate:=strtoint(veloc);
voice.Speak(xvoice, 1);
end;
Alexandre

Alexandre

Curtidas 0

Respostas

Marco Salles

Marco Salles

25/01/2012

Se eu entendi este código talves te seje útil

Coloque um Timer , um Memo e preencha os items do Memo

Coloque o Timer com Enable false e o Form com KeyPreview para True

private
{ Private declarations }
FPosicao:integer;


Programe os Tres eventos

procedure TForm1.FormCreate(Sender: TObject);
begin
FPosicao:=0;
end;


procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if (key = #13)and(ActiveControl = Memo1) then
  begin
     Timer1.Enabled:=not Timer1.Enabled;
     Key:=#0;
  end;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
with Memo1 do
  begin
     if FPosicao <= pred(Lines.Count) then
  begin
     // APARENCIA
     Lines.Strings[Fposicao]:=Lines.Strings[FPosicao];
     SelStart:= SelStart - length(Lines.Strings[Fposicao]);
     SelLength:= length(Lines.Strings[Fposicao]);

     //CODIGO A SER EXECUTADO ***** Aqui meu código é Simples
     self.Caption:=Lines.Strings[FPosicao];

     FPosicao:=FPosicao+1;
     
      //Retardo para melhor Visualização
     Sleep(1000);
     Application.ProcessMessages;
  end
 else
   begin
     FPosicao:=0;
     TTimer(sender).Enabled:=False;
   end;
  end;
end;


Se esta for a idéia *** Acho que pode melhorar o codigo para que seje Orientado a Objeto
Do jeito que esta é so código .. Por exemplo pode ser construido uma classe que faça este
Trablabo e o Timer pose der substituido por um Therad

Mas enfim , foi sisto que entendi...
GOSTEI 0
Alexandre

Alexandre

25/01/2012

Olá Marco Antonio.
Grato pela resposta

É quase isso.

Não é a primeira linha e sim o primeiro parágrafo.
Exemplo: Essa aplicação está me deixando cada vez mais sem cabelos e,
Se continuar assim, vou acabar careca.

Percebe que tem 2 linhas, mas é uma só frase?
Cada frase é delimitada por seu ponto final (.) e isso a rotina vê e guarda essas posições.
(Posso ir salvando essas posições em um banco de dados)
Muito bem...
Leio a primeira linha e reproduzo o áudio com essa procedure

procedure TfrmPrincipal.Audio;
begin
voice:= CreateOLEObject (SAPI.SpVoice);
voice.volume:=strtoint(vol);
voice.Rate:=strtoint(veloc);
voice.Speak(xvoice, x);
end;

Enquanto o áudio não acabar, não lê o próximo paragrafo.
Se usar um timer, com um tempo determinado para todas as frases, não dá porque cada frase, dependendo do seu tamanho, pode demorar mais ou menos para repsoduzir.

Muito bem... o áudio reproduziu o primeiro parágrafo e guardou a posição mo BDE.
Lê o segundo parágrafo e reproduz, e assim por diante.
1- Se deixar, vai até o final do texto.
2- Se clicar ENTER, para a leitura e reroduz o último parágrafo lido
3- Se apertar ENTER novamente, começa de onde parou.

Por que guardar sempre a última posição em um BDE ???

Qdo desligar a aplicação e depois retornar, Dá um ENTER e começa de onde parou.

É isso.

Se puder ajudar, agradeço e muito.

Alexandre
GOSTEI 0
POSTAR