Ir para o conteúdo
Malereis

Ler arquivo texto e gerar áudio a cada linha

Mensagens Recomendadas

Malereis    1
Malereis

Boas pessoal.

Preciso transferir linha por linha de um arquivo texto de Memo1, para Memo2.

Cada linha vai ter sua posição marcada pelo seu ponto final (.) e guardada essa posição em uma base de dados.

A cada linha lida, ela é reproduzida por uma procedure de áudio.

Assim que finalizar o áudio, imediatamente nova frase é lida  e reproduzida.

Esse processo é contínuo, até acabar o texto todo em Memo1.

Somente se em algum tempo  for clicada a tecla enter, a última linha é lida é reproduzida e para tudo.

Quando retornar à aplicação novamente, as linhas são lidas de onde pararam na última posição. (para isso serve a posição no Banco de dados.

O texto pode então ter sua leitura interrompida quantas vezes se desejar, mas deve sempre começar da útima posição lida.

Quando terminar de ler o texto, o valor da base de dados deve voltar a ser ‘0’ ZERO.

Abaixoa procedure de áudio que estou usando.

procedure Tform1.Audio;
var   xvoice: string;
begin
    voice:= CreateOLEObject ('SAPI.SpVoice');
    voice.volume:=100;
    voice.Rate:=-5;
    voice.Speak(xvoice, 1);  
end;

onde xvoice é uma var para ir guardando as linhas do texto.

Tentei o procedimento POS, mas não consegui o resultado desejado.

Não consegui fazer a leitura das frases respeitar o final do áudio e prever o próximo ponto final de cada frase, caso for teclado Enter.

QQ ajuda é bem vinda.

Abraços

Alexandre


EDIT: GeSHi adicionado. thoga31

Edit: Correcção de gralha no título

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
apocsantos    210
apocsantos

    Boa noite,

    Penso que usando 

SpVoice.Pause()

e

SpVoice.Resume()

possas solucionar essa questão uma vez que o SpVoice.Pause para a leitura e o SpVoice.Resume retoma no ponto em que foi interrompida.

Cordiais cumprimentos,

Apocsantos

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nunopicado    1072
nunopicado

Dividindo em partes, precisas:

1. Dividir em frases (terás tantas frases quantos pontos finais, certo?)

2. Uma flag de continuação: quando a tecla enter é detectada, a flag deve passar a false

3. Capturar entradas do teclado, por forma a detectar o enter

Deverá passar a flag a false, e memorizar o índice da proxima frase na DB

4. "Base de Dados" para memorizar o índice, e eventualmente as frases

Que tipo de DB queres usar? Podes ir desde os ficheiros de texto, records, xml, sql...

5. Ciclo de leitura, desde 1* ao indice da ultima frase

Deverá testar no inicio do ciclo se a flag é positiva. Se for, continua o ciclo, lndo a próxima frase. Se for negativa, salta fora do ciclo

Quando o ciclo acabar com a leitura da ultima frase, deverá gravar na DB o índice da primeira frase.

6. Leitura de frase

Esse já tens, embora o xVoice não possa ser uma variavel local, mas sim um parametro do procedimento.

Em que parte(s) tens duvidas?

ApocSantos: Acho que a ideia é terminar mesmo o programa, e quando iniciar, voltar de onde parou... É assim?

*: EDIT:

O programa deverá a começar a ler as frases desde a nº 1, caso não exista nenhum índice gravado na BD.

Se houver um índice, deverá começar a partir deste.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
apocsantos    210
apocsantos

    Bom dia,

    Se for esse o caso a coisa complica-se um bocadito mais, uma vez que o SpVoice.pause() apenas pausa a leitura e o SpVoice.Resume() retoma no ponto em que terminou para um objecto que esteja com "on-focus". Se o programa não fechar, pode usar com o SpVoice.Pause() e SpVoice.Resume(), de contrário não creio que seja possivel.

Cordiais cumprimentos,

Apocsantos

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nunopicado    1072
nunopicado

de contrário não creio que seja possivel.

Possivel é, mas como eu disse, separando as frases e guardando um indice de qual a frase seguinte.

Se o programa terminar, ao voltar a ligar ele pega na frase cujo indice está guardado e começa a ler a partir daí!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
apocsantos    210
apocsantos

    Boa tarde,

    Sim possível é sempre, mas não pelo uso directo daquelas funções da Speach API (SAPI). As implementações possiveis são virtualmente ilimitadas.

Cordiais cumprimentos,

Apocsantos

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nunopicado    1072
nunopicado

As implementações possiveis são virtualmente ilimitadas.

heheheh Especialmente tratando-se de uma linguagem tão "fraca" como o Delphi...

NOTA: Para os menos atentos, estou a ser irónico!  ;):thumbsup:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
I-NOZex    147
I-NOZex

heheheh Especialmente tratando-se de uma linguagem tão "fraca" como o Delphi...

NOTA: Para os menos atentos, estou a ser irónico!  :):cheesygrin:

ainda bem xD Delphi é tudo, menos uma linguagem fraca... infelizmente tenho que apanhar com VB (2010) na escola e para mim aquilo é simplesmente... como dizer de uma forma bonita? hmmm... Uma *****!

Delphi é aquela base  *o* bendito dia em que andava a ler manuais de hacker e falava la de como fazer um trojan em delphi... foi ali que a paixao começou :D

EDIT (nunopicado): Embelezei-te um pouco mais a forma de dizer! :) Estava ainda assim muito explicito!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade