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
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
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.
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")
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(..., ...))
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
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)
Forse è meglio se imposti la lingua una volta per tutte (durante l'inizializzazione della classe) con la possibilità di modificarla in seguito, tramite una proprietà.
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).
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
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
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).