Italian [RISOLTO] TTS errore se in Activity_Create

Roberto Tsolakis

Member
Licensed User
Longtime User
Da un altro modulo passo i parametri con

B4X:
CallSubDelayed3 (ModuloTTS, Parla , "Hello" , "it")

Questo il codice:

B4X:
Sub Parla (Testo As String ,Lingua As String)
     If Lingua.Length > 0 Then
        TTS1.SetLanguage(Lingua,Lingua)
        Else
          ToastMessageShow("Lingua non settata",5)
            Return
        End If
   If Testo.Length > 0 Then
           TTS1.Speak(Testo, True)
          Else
            ToastMessageShow("Nulla da dire",5)
        End If
End Sub

ma l'emulatore rimane bloccato sulla linea:

B4X:
           TTS1.Speak(Testo, True)


Dove sbaglio ?
 

Roberto Tsolakis

Member
Licensed User
Longtime User
Grazie per la risposta, purtroppo stesso errore!

Ho anche testato con un toastmessageshow per vedere se i parametri vengono passati ... ed è corretto.
Per me non si inizializza il modulo ...
Esiste qualche altra libreria per il TTS ?


Avviando la libreria dal modulo main non ci sono problemi ... ma nei moduli figli ... si blocca
 

LucaMs

Expert
Licensed User
Longtime User
E' probabile che quando imposti la lingua serva un po' di tempo affinche il TTS sia pronto e quindi inviando subito dopo il comando Speak questo non funzioni.

Dovresti mettere il comando Speak all'interno della routine evento TTS1_Ready (se vuoi dare la possibilità di impostare la lingua in quel modo) e per fare questo penso sia necessario usare una variabile globale per il testo da pronunciare...


mi sono fermato...

ma stai usando un modulo di codice (ModuloTTS)? I moduli non supportano gli eventi.

Usa una classe.
 

Roberto Tsolakis

Member
Licensed User
Longtime User
Ho provato con un Modulo di Classe

B4A version: 5.02
Parsing code. Error
Error parsing program.
Error description: Undeclared variable 'c_tts' is used before it was assigned any value.
Occurred on line: 34
C_TTS.parla("Hello","it")
 

LucaMs

Expert
Licensed User
Longtime User
C_TTS è un'istanza (oggetto) di una classe che hai creato?

Cioè dovresti fare qualcosa come:

1) creare una classe (puoi chiamarla ad esempio cTTS, io uso clsTTS)
2) dichiarare un oggetto di tipo cTTS (Private objTTS As cTTS)
3) inizializzare l'oggetto (objTTS.Initialize)

nella classe cTTS scrivi le routine pubbliche come Parla e le richiami usando l'oggetto objTTS (objTTS.Parla(..., ...))
 

Roberto Tsolakis

Member
Licensed User
Longtime User
C_TTS era il nome del modulo classe ... ma va bene ho capito il concetto.
Immaigno che tutta questa trafila derivi dal Java ... in VB era molto più semplice :)
 

Roberto Tsolakis

Member
Licensed User
Longtime User
Altra domanda ....
Voi guru della programmazione dimenticate sempre di dire dove vanno fatte queste operazioni!
No, non in B4A quello è ovvio ... in quale MODULO e/o in quale SUB!

cTTS (Private objTTS As cTTS) lo devo dichiarare in MAIN o nel modulo classe ?

Allego il file ...
Se riesci (quando puoi a darci un occhiata) ...

Sarà sicuramente utile anche a qualche altro centinaio di incapaci come me, di esempi ce ne sono, ma sono troppo sporchi di cose inutili.
(Senza offesa per nessuno)
 

Attachments

  • Prova.zip
    7.4 KB · Views: 240

LucaMs

Expert
Licensed User
Longtime User
Beh, allego il tuo progetto modificato. Così com'è non è che sia utilissimo, nel senso che si poteva utilizzare direttamente tutti i comandi-eventi di TTS nella Main, senza la necessità della classe, che in pratica replica i metodi di TTS (e nemmeno tutti).

Però può farti capire la faccenda classi.
 

Attachments

  • lm Parla.zip
    7.8 KB · Views: 234

LucaMs

Expert
Licensed User
Longtime User
Ah, ho scritto quella classe in fretta e "con i piedi". E' molto meglio (direi quasi obbligatorio) mettere dei commenti alle routine, su ciò che fanno e sulla descrizione dei parametri; in questo modo, oltre che più chiaro per il programmatore che legge la classe, li vedrai anche utilizzando la classe nella Main.

Cioè vedi il commento quando scrivi il punto:
----------
faccio prima a farlo e ripubblicare il progetto che a spiegarmi :D

upload_2016-2-2_11-42-39.png
 

Attachments

  • lm Parla 2.zip
    8 KB · Views: 241

Roberto Tsolakis

Member
Licensed User
Longtime User
Praticamente tu hai inizializato il TTS sul main e poi sei passato ad usare la classe Parla se non ho capito male.
Cmq me lo studio ... e poi lo applico al mio progetto.
Lo so che si poteva fare tutto in MAIN, ma almeno cosi ho imparato anche ad utilizzare le classi su B4A :)
 

LucaMs

Expert
Licensed User
Longtime User
Il TTS è inizializzato nella classe.

Nel Main avrei fatto meglio a chiamare l'oggetto mTTS: mobjTTS (m lo metto per modulo).

mTTS non è un oggetto TTS ma un oggetto C_TTS, cioè un oggetto creato dalla tua classe (spiegato male; meglio: un oggetto di tipo C_TTS, che è una tua classe).
 
Top