Fórum Ler texto e repdoduzir #411959
25/01/2012
0
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;
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
Curtir tópico
+ 0
Responder
Posts
26/01/2012
Marco Salles
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
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...
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...
Responder
Gostei + 0
26/01/2012
Alexandre
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
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
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)