Skip to content

Commit

Permalink
feat: use single mediaplayer, add setting in chatgpt to use it for tts.
Browse files Browse the repository at this point in the history
  • Loading branch information
plateaukao committed Dec 10, 2023
1 parent bf11417 commit bd67b21
Show file tree
Hide file tree
Showing 38 changed files with 155 additions and 20 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ android {

defaultConfig {
applicationId "info.plateaukao.einkbro"
minSdkVersion 21
minSdkVersion 26
targetSdkVersion 33
versionCode 10_17_00
versionName "10.17.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ import info.plateaukao.einkbro.viewmodel.RemoteConnViewModel
import info.plateaukao.einkbro.viewmodel.SplitSearchViewModel
import info.plateaukao.einkbro.viewmodel.TRANSLATE_API
import info.plateaukao.einkbro.viewmodel.TranslationViewModel
import info.plateaukao.einkbro.viewmodel.TtsViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -175,6 +176,7 @@ open class BrowserActivity : FragmentActivity(), BrowserController {
private val backupUnit: BackupUnit by lazy { BackupUnit(this) }

private val gptViewModel: GptViewModel by viewModels()
private val ttsViewModel: TtsViewModel by viewModels()
private val translationViewModel: TranslationViewModel by viewModels()

private val splitSearchViewModel: SplitSearchViewModel by viewModels()
Expand Down Expand Up @@ -2329,19 +2331,26 @@ open class BrowserActivity : FragmentActivity(), BrowserController {
}

private fun readArticle() {
if (config.useOpenAiTts && config.gptApiKey.isNotBlank()) {
lifecycleScope.launch {
//ttsViewModel.readText(this@BrowserActivity, ninjaWebView.getRawText());
ttsViewModel.readText(this@BrowserActivity, "one. two. three. four. five. six.")
}
return
}

if (Build.MODEL.startsWith("Pixel 8")) {
lifecycleScope.launch {
IntentUnit.tts(this@BrowserActivity, ninjaWebView.getRawText())
}
return
}


TtsLanguageDialog(this).show { ttsLanguage ->
lifecycleScope.launch {
ttsManager.readText(ttsLanguage, ninjaWebView.getRawText())
delay(2000)
// TODO: use real status to do update
// wait for tts preparation
composeToolbarViewController.updateIcons()

if (ttsManager.isSpeaking()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -758,18 +758,6 @@ class SettingActivity : ComponentActivity(), KoinComponent {
R.drawable.icon_list,
R.string.setting_summary_gpt_action_list,
) { startActivity(GptActionsActivity.createIntent(this)) },
ValueSettingItem(
R.string.setting_title_edit_gpt_system_prompt,
R.drawable.icon_edit,
R.string.setting_summary_edit_gpt_prompt,
config::gptSystemPrompt
),
ValueSettingItem(
R.string.setting_title_edit_gpt_user_prompt_prefix,
R.drawable.icon_edit,
R.string.setting_summary_edit_gpt_user_prompt,
config::gptUserPromptPrefix
),
ValueSettingItem(
R.string.setting_title_gpt_model_name,
R.drawable.ic_chat_gpt,
Expand All @@ -788,6 +776,12 @@ class SettingActivity : ComponentActivity(), KoinComponent {
R.string.setting_summary_search_in_dict,
config::externalSearchWithGpt
),
BooleanSettingItem(
R.string.use_it_on_tts,
R.drawable.ic_tts,
R.string.setting_summary_use_gpt_for_tts,
config::useOpenAiTts
),
BooleanSettingItem(
R.string.setting_title_chat_stream,
R.drawable.ic_chat,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@ class ConfigManager(
sp.edit { putBoolean(K_IS_INCOGNITO_MODE, value) }
}

var useOpenAiTts by BooleanPreference(sp, K_USE_OPENAI_TTS, true)

var pageReservedOffset: Int by IntPreference(sp, "sp_page_turn_left_value", 80)

var fontSize: Int
Expand Down Expand Up @@ -634,6 +636,7 @@ class ConfigManager(
const val K_DUAL_CAPTION_LOCALE = "sp_dual_caption_locale"
const val K_GPT_MODEL = "sp_gp_model"
const val K_SPLIT_SEARCH_STRING = "sp_split_search_prefix"
const val K_USE_OPENAI_TTS = "sp_use_openai_tts"

const val K_SHOW_DEFAULT_ACTION_MENU = "sp_show_default_action_menu"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,11 @@ class OpenAiRepository(

suspend fun tts(text: String): ByteArray? = suspendCoroutine { continuation ->
val request = createTtsRequest(text)

client.newCall(request).execute().use { response ->
if (response.code != 200 || response.body == null) {
return@use continuation.resume(null)
}

try {
continuation.resume(response.body?.bytes())
} catch (e: Exception) {
Expand Down Expand Up @@ -117,7 +117,11 @@ class OpenAiRepository(
): Request = Request.Builder()
.url(ttsEndpoint)
.post(
json.encodeToString(TTSRequest(text))
json.encodeToString(TTSRequest(
text,
if (hd) "tts-1-hd" else "tts-1",
"alloy"
))
.toRequestBody(mediaType)
)
.header("Authorization", "Bearer $apiKey")
Expand Down Expand Up @@ -208,8 +212,8 @@ data class ChatMessage(
@Serializable
data class TTSRequest(
val input: String,
val model: String = "tts-1",
val model: String,
val voice: String,
val speed: Double = 1.0,
val voice: String = "alloy",
val format: String = "mp3"
val format: String = "aac"
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package info.plateaukao.einkbro.viewmodel

import android.content.Context
import android.media.MediaPlayer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import info.plateaukao.einkbro.preference.ConfigManager
import info.plateaukao.einkbro.service.OpenAiRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import java.io.File
import java.io.FileOutputStream
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine


class TtsViewModel : ViewModel(), KoinComponent {
private val config: ConfigManager by inject()
private val mediaPlayer by lazy { MediaPlayer() }

private val openaiRepository: OpenAiRepository
by lazy { OpenAiRepository(config.gptApiKey) }

fun hasApiKey(): Boolean = config.gptApiKey.isNotBlank()

fun readText(context: Context, text: String) {
viewModelScope.launch(Dispatchers.IO) {
val sentences: List<String> = text.split("(?<=\\.)|(?<=。)".toRegex())

for (sentence in sentences) {
val data = openaiRepository.tts(sentence)
if (data != null) {
playAudio(context, data)
}
}
}
}

private suspend fun playAudio(context: Context, data: ByteArray) = suspendCoroutine { cont ->
// Creating a temporary file
val tempFile = File.createTempFile("temp", "aac", context.cacheDir)
tempFile.deleteOnExit()
val fos = FileOutputStream(tempFile)
fos.write(data)
fos.close()

java.io.FileInputStream(tempFile).use { fis ->
mediaPlayer.setDataSource(fis.fd)
mediaPlayer.prepare()
mediaPlayer.start()

mediaPlayer.setOnCompletionListener {
tempFile.delete()
mediaPlayer.reset()
cont.resume(0)
}
}
}
}
2 changes: 2 additions & 0 deletions app/src/main/res/values-af/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-ar/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-ca/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-cs/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-da/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,8 @@ Dies zu deaktivieren ist sicherer, schneller und spart Datenvolumen. Manche Inha
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-el/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@ Si desinstala la aplicación, el mismo será eliminado. Por tanto se recomienda
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-fi/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-fr/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-he/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-hu/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-in/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -430,4 +430,6 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-it/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-ja/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-ko/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-night/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-nl/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-no/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-pl/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-pt/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-ro/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@
<string name="text_select">Select text</string>
<string name="show_context_menu_icons">Show icons on action menus</string>
<string name="setting_summary_show_context_menu_icons">Show/hide icons on action menus to make it simpler.</string>
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
Loading

0 comments on commit bd67b21

Please sign in to comment.