@@ -5,6 +5,8 @@ import ai.elimu.common.utils.data.model.tts.QueueMode
55import ai.elimu.common.utils.viewmodel.TextToSpeechViewModel
66import ai.elimu.common.utils.viewmodel.TextToSpeechViewModelImpl
77import ai.elimu.content_provider.utils.ContentProviderUtil.getAllWordGsons
8+ import ai.elimu.model.v2.gson.content.LetterGson
9+ import ai.elimu.model.v2.gson.content.LetterSoundGson
810import ai.elimu.model.v2.gson.content.WordGson
911import android.os.Bundle
1012import android.util.Log
@@ -16,6 +18,7 @@ import androidx.lifecycle.ViewModelProvider
1618import dagger.hilt.android.AndroidEntryPoint
1719import org.json.JSONObject
1820import java.util.UUID
21+ import java.util.stream.Collectors
1922
2023@AndroidEntryPoint
2124class LetterSoundActivity : AppCompatActivity () {
@@ -25,9 +28,9 @@ class LetterSoundActivity : AppCompatActivity() {
2528
2629 private var wordsSeen: MutableList <WordGson ?>? = null
2730
28- private var letter1TextView : TextView ? = null
29- private var letter2TextView : TextView ? = null
30- private var letter3TextView : TextView ? = null
31+ private var letterSound1TextView : TextView ? = null
32+ private var letterSound2TextView : TextView ? = null
33+ private var letterSound3TextView : TextView ? = null
3134
3235 private var nextButton: ImageButton ? = null
3336 private lateinit var ttsViewModel: TextToSpeechViewModel
@@ -42,9 +45,9 @@ class LetterSoundActivity : AppCompatActivity() {
4245
4346 wordsSeen = ArrayList <WordGson ?>()
4447
45- letter1TextView = findViewById<View ?>(R .id.letter1TextView ) as TextView
46- letter2TextView = findViewById<View ?>(R .id.letter2TextView ) as TextView
47- letter3TextView = findViewById<View ?>(R .id.letter3TextView ) as TextView
48+ letterSound1TextView = findViewById<View ?>(R .id.letterSound1TextView ) as TextView
49+ letterSound2TextView = findViewById<View ?>(R .id.letterSound2TextView ) as TextView
50+ letterSound3TextView = findViewById<View ?>(R .id.letterSound3TextView ) as TextView
4851
4952 nextButton = findViewById<View ?>(R .id.nextButton) as ImageButton
5053 nextButton!! .setOnClickListener(object : View .OnClickListener {
@@ -89,51 +92,57 @@ class LetterSoundActivity : AppCompatActivity() {
8992 return
9093 }
9194
92- letter1TextView !! .visibility = View .INVISIBLE
93- letter2TextView !! .visibility = View .INVISIBLE
94- letter3TextView !! .visibility = View .INVISIBLE
95+ letterSound1TextView !! .visibility = View .INVISIBLE
96+ letterSound2TextView !! .visibility = View .INVISIBLE
97+ letterSound3TextView !! .visibility = View .INVISIBLE
9598 nextButton!! .setVisibility(View .INVISIBLE )
9699
97100 val currentWord = wordsWith3LetterSounds!! [wordsSeen!! .size]
98101 Log .i(TAG , " currentWord: " + currentWord)
99102
100- letter1TextView !! .postDelayed(object : Runnable {
103+ letterSound1TextView !! .postDelayed(object : Runnable {
101104 override fun run () {
102- val letter1 = currentWord.text.substring(0 , 1 )
103- Log .i(TAG , " letter1: $letter1 " )
104- letter1TextView!! .text = " ${letter1} "
105-
106- val letter2 = currentWord.text.substring(1 , 2 )
107- Log .i(TAG , " letter2: $letter2 " )
108- letter2TextView!! .text = " ${letter2} "
109-
110- val letter3 = currentWord.text.substring(2 , 3 )
111- Log .i(TAG , " letter3: $letter3 " )
112- letter3TextView!! .text = " ${letter3} "
113-
114- letter1TextView!! .visibility = View .VISIBLE
115- letter1TextView!! .postDelayed(object : Runnable {
105+ val letterSound1 = currentWord.letterSounds.get(0 )
106+ Log .i(TAG , " letterSound1: $letterSound1 " )
107+ val letterSound1Letters: String = letterSound1.letters.stream().map { obj: LetterGson -> obj.text }.collect(Collectors .joining())
108+ Log .i(this ::class .simpleName, " letterSound1Letters: ${letterSound1Letters} " )
109+ letterSound1TextView!! .text = " ${letterSound1Letters} "
110+
111+ val letterSound2 = currentWord.letterSounds.get(1 )
112+ Log .i(TAG , " letterSound2: $letterSound2 " )
113+ val letterSound2Letters: String = letterSound2.letters.stream().map { obj: LetterGson -> obj.text }.collect(Collectors .joining())
114+ Log .i(this ::class .simpleName, " letterSound2Letters: ${letterSound2Letters} " )
115+ letterSound2TextView!! .text = " ${letterSound2Letters} "
116+
117+ val letterSound3 = currentWord.letterSounds.get(2 )
118+ Log .i(TAG , " letterSound3: $letterSound3 " )
119+ val letterSound3Letters: String = letterSound3.letters.stream().map { obj: LetterGson -> obj.text }.collect(Collectors .joining())
120+ Log .i(this ::class .simpleName, " letterSound3Letters: ${letterSound3Letters} " )
121+ letterSound3TextView!! .text = " ${letterSound3Letters} "
122+
123+ letterSound1TextView!! .visibility = View .VISIBLE
124+ letterSound1TextView!! .postDelayed(object : Runnable {
116125 override fun run () {
117- playLetterSound(letter1 )
126+ playLetterNames(letterSound1 )
118127
119128
120- letter2TextView !! .postDelayed(object : Runnable {
129+ letterSound2TextView !! .postDelayed(object : Runnable {
121130 override fun run () {
122- letter2TextView !! .visibility = View .VISIBLE
123- letter2TextView !! .postDelayed(object : Runnable {
131+ letterSound2TextView !! .visibility = View .VISIBLE
132+ letterSound2TextView !! .postDelayed(object : Runnable {
124133 override fun run () {
125- playLetterSound(letter2 )
134+ playLetterNames(letterSound2 )
126135
127136
128- letter3TextView !! .postDelayed(object : Runnable {
137+ letterSound3TextView !! .postDelayed(object : Runnable {
129138 override fun run () {
130- letter3TextView !! .visibility = View .VISIBLE
131- letter3TextView !! .postDelayed(object : Runnable {
139+ letterSound3TextView !! .visibility = View .VISIBLE
140+ letterSound3TextView !! .postDelayed(object : Runnable {
132141 override fun run () {
133- playLetterSound(letter3 )
142+ playLetterNames(letterSound3 )
134143
135144
136- letter3TextView !! .postDelayed(object :
145+ letterSound3TextView !! .postDelayed(object :
137146 Runnable {
138147 override fun run () {
139148 playWord(currentWord)
@@ -155,11 +164,20 @@ class LetterSoundActivity : AppCompatActivity() {
155164 }, 1000 )
156165 }
157166
158- private fun playLetterSound (letter : String? ) {
159- Log .i(TAG , " playLetterSound: $letter " )
160- letter ? : return
161- ttsViewModel.speak(text = letter,
162- queueMode = QueueMode .FLUSH , utteranceId = UUID .randomUUID().toString())
167+ /* *
168+ * Speaks the names of the letter(s), e.g. /nɔɔ-nǔu/ for "น".
169+ *
170+ * TODO: Skip letters that are diacritics.
171+ *
172+ * TODO: Once the TTS engine gets better support for speaking IPA symbols, switch from playing
173+ * the letter names to playing the actual sounds.
174+ */
175+ private fun playLetterNames (letterSound : LetterSoundGson ) {
176+ Log .i(TAG , " playLetterNames" )
177+ Log .i(this ::class .simpleName, " letterSound.id: ${letterSound.id} " )
178+ val letterSoundLetters: String = letterSound.letters.stream().map { obj: LetterGson -> obj.text }.collect(Collectors .joining())
179+ Log .i(this ::class .simpleName, " letterSoundLetters: ${letterSoundLetters} " )
180+ ttsViewModel.speak(text = letterSoundLetters, queueMode = QueueMode .FLUSH , utteranceId = UUID .randomUUID().toString())
163181 }
164182
165183 private fun playWord (word : WordGson ? ) {
0 commit comments