Página 1 de 1

Usando "SAPI.SpVoice" para falar e como interromper?

Enviado: 10 Jul 2025 15:10
por clodoaldomonteiro
A função abaixo fala uma frase passada a ela até acabar ou com um tempo estipulado.
Pergunto, como fazer para parar de falar quando o operador pressionar qualquer tecla?

Código: Selecionar todos

Function FalaTexto( cTexto, nTipo )
   Local oVoice, oVoices, i, cDesc

   oVoice := TOleAuto():New("SAPI.SpVoice")

   oVoices := oVoice:GetVoices()
   For i := 0 To oVoices:Count - 1
      cDesc := oVoices:Item(i):GetDescription()
      IF "Daniel" $ Upper(cDesc) .OR. "Maria" $ Upper(cDesc) .OR. "PORTUGUES" $ Upper(cDesc)
         oVoice:Voice := oVoices:Item(i)
         Exit
      Endif
   Next

   oVoice:Rate := 3
   oVoice:Volume := 100

   If !Empty(oVoice)
      If nTipo <> Nil
         oVoice:Speak(cTexto, nTipo)
         oVoice:WaitUntilDone(8000)   // Espera até 8 segundos para terminar
      Else
         oVoice:Speak(cTexto)
      Endif
   Else
      //? "Erro ao inicializar a SAPI"
   Endif
   
   oVoice := NIL

Return Nil
Desde já agradeço a atenção.

Usando "SAPI.SpVoice" para falar e como interromper?

Enviado: 10 Jul 2025 17:07
por JoséQuintas
Pensei em perguntar pro copilot, a IA do Windows, mas você deve ter ela por aí.

Usando "SAPI.SpVoice" para falar e como interromper?

Enviado: 11 Jul 2025 09:10
por clodoaldomonteiro
Pesquisei com o GPT e nada.

Seria algo para interromper a fala ao teclar ESC ou outra tecla, neste item de acessibilidade que estou colocando no meu sistema de Contabilidade.

Usando "SAPI.SpVoice" para falar e como interromper?

Enviado: 11 Jul 2025 10:55
por JoséQuintas
Sim, tenho isso como opcional no aplicativo, e sei que o troço pode começar a falar sem parar.
Na prática, tem até limite disso.
Cheguei a colocar como multithread, pra aumentar o limite, mas chega uma hora que até erro acontece.
Nunca coloquei em prática.
Também seria uma bagunça, conforme o ambiente de trabalho.

Talvez criar uma rotina intermediária.
Nessa rotina, falar uma parte de cada vez, e ir acumulando em array o que falta.
No caso do ESC, limpar o array causaria não falar mais nada.

Mas quebrar texto em lugar errado poderia causar interpretação errada.