Skip to content

Commit 38a6591

Browse files
authored
Merge pull request #91 from elimu-ai/89-iterate-letter-sounds
refactor: iterate letter-sounds instead of letters
2 parents 9cda4d5 + d63b369 commit 38a6591

File tree

2 files changed

+60
-42
lines changed

2 files changed

+60
-42
lines changed

app/src/main/java/ai/elimu/maneno/LetterSoundActivity.kt

Lines changed: 57 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import ai.elimu.common.utils.data.model.tts.QueueMode
55
import ai.elimu.common.utils.viewmodel.TextToSpeechViewModel
66
import ai.elimu.common.utils.viewmodel.TextToSpeechViewModelImpl
77
import 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
810
import ai.elimu.model.v2.gson.content.WordGson
911
import android.os.Bundle
1012
import android.util.Log
@@ -16,6 +18,7 @@ import androidx.lifecycle.ViewModelProvider
1618
import dagger.hilt.android.AndroidEntryPoint
1719
import org.json.JSONObject
1820
import java.util.UUID
21+
import java.util.stream.Collectors
1922

2023
@AndroidEntryPoint
2124
class 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?) {

app/src/main/res/layout/activity_letter_sound.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,23 @@
3232
android:animateLayoutChanges="true">
3333

3434
<TextView
35-
android:id="@+id/letter1TextView"
35+
android:id="@+id/letterSound1TextView"
3636
android:layout_width="wrap_content"
3737
android:layout_height="wrap_content"
3838
android:padding="@dimen/activity_horizontal_margin"
3939
tools:text="c"
4040
android:textSize="128sp" />
4141

4242
<TextView
43-
android:id="@+id/letter2TextView"
43+
android:id="@+id/letterSound2TextView"
4444
android:layout_width="wrap_content"
4545
android:layout_height="wrap_content"
4646
android:padding="@dimen/activity_horizontal_margin"
4747
tools:text="a"
4848
android:textSize="128sp" />
4949

5050
<TextView
51-
android:id="@+id/letter3TextView"
51+
android:id="@+id/letterSound3TextView"
5252
android:layout_width="wrap_content"
5353
android:layout_height="wrap_content"
5454
android:padding="@dimen/activity_horizontal_margin"

0 commit comments

Comments
 (0)