修复在线tts朗读失败bug

This commit is contained in:
kunfei
2023-05-13 23:25:08 +08:00
parent a70b0e3aba
commit f4e5eedb37
4 changed files with 51 additions and 28 deletions
@@ -0,0 +1,26 @@
package io.legado.app
import io.legado.app.help.config.AppConfig
import io.legado.app.model.analyzeRule.AnalyzeUrl
import kotlinx.coroutines.runBlocking
import org.junit.Test
class HttpTtsTest {
@Test
fun test() {
val url = """
http://tsn.baidu.com/text2audio,{
"method": "POST",
"body": "tex={{java.encodeURI(java.encodeURI(speakText))}}&spd={{(speakSpeed + 5) / 10 + 4}}&per=4114&cuid=baidu_speech_demo&idx=1&cod=2&lan=zh&ctp=1&pdt=220&vol=5&aue=6&pit=5&_res_tag_=audio"
}
""".trimIndent()
val analyzeUrl =
AnalyzeUrl(url, speakText = "魔神", speakSpeed = AppConfig.speechRatePlay + 5)
runBlocking {
val response = analyzeUrl.getResponseAwait()
response.headers
}
}
}
@@ -59,7 +59,7 @@ object ExoPlayerHelper {
return MediaItem.Builder().setUri(formatUrl).build() return MediaItem.Builder().setUri(formatUrl).build()
} }
fun createExoPlayer(context: Context): ExoPlayer { fun createHttpExoPlayer(context: Context): ExoPlayer {
return ExoPlayer.Builder(context).setLoadControl( return ExoPlayer.Builder(context).setLoadControl(
DefaultLoadControl.Builder().setBufferDurationsMs( DefaultLoadControl.Builder().setBufferDurationsMs(
DefaultLoadControl.DEFAULT_MIN_BUFFER_MS, DefaultLoadControl.DEFAULT_MIN_BUFFER_MS,
@@ -68,12 +68,11 @@ object ExoPlayerHelper {
DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS / 10 DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS / 10
).build() ).build()
) ).setMediaSourceFactory(
.setMediaSourceFactory( DefaultMediaSourceFactory(context)
DefaultMediaSourceFactory(context) .setDataSourceFactory(resolvingDataSource)
.setDataSourceFactory(resolvingDataSource) .setLiveTargetOffsetMs(5000)
.setLiveTargetOffsetMs(5000) ).build()
).build()
} }
/** /**
@@ -107,9 +106,7 @@ object ExoPlayerHelper {
private val resolvingDataSource: ResolvingDataSource.Factory by lazy { private val resolvingDataSource: ResolvingDataSource.Factory by lazy {
ResolvingDataSource.Factory( ResolvingDataSource.Factory(cacheDataSourceFactory) {
cacheDataSourceFactory
) {
var res = it var res = it
if (it.uri.toString().contains(SPLIT_TAG)) { if (it.uri.toString().contains(SPLIT_TAG)) {
@@ -123,8 +120,6 @@ object ExoPlayerHelper {
} }
} }
res res
} }
@@ -74,7 +74,7 @@ class AudioPlayService : BaseService(),
MediaHelp.buildAudioFocusRequestCompat(this) MediaHelp.buildAudioFocusRequestCompat(this)
} }
private val exoPlayer: ExoPlayer by lazy { private val exoPlayer: ExoPlayer by lazy {
ExoPlayerHelper.createExoPlayer(this) ExoPlayerHelper.createHttpExoPlayer(this)
} }
private var mediaSessionCompat: MediaSessionCompat? = null private var mediaSessionCompat: MediaSessionCompat? = null
private var broadcastReceiver: BroadcastReceiver? = null private var broadcastReceiver: BroadcastReceiver? = null
@@ -152,13 +152,6 @@ class AudioPlayService : BaseService(),
chapter = AudioPlay.durChapter, chapter = AudioPlay.durChapter,
headerMapF = AudioPlay.headers(true), headerMapF = AudioPlay.headers(true),
) )
//val uri = Uri.parse(analyzeUrl.url)
//ExoPlayerHelper.preDownload(uri, analyzeUrl.headerMap)
//休息1秒钟,防止403
//delay(1000)
// val mediaSource = ExoPlayerHelper
// .createMediaSource(uri, analyzeUrl.headerMap)
//exoPlayer.setMediaSource(mediaSource)
exoPlayer.setMediaItem(ExoPlayerHelper.createMediaItem(analyzeUrl.url,analyzeUrl.headerMap)) exoPlayer.setMediaItem(ExoPlayerHelper.createMediaItem(analyzeUrl.url,analyzeUrl.headerMap))
exoPlayer.playWhenReady = true exoPlayer.playWhenReady = true
exoPlayer.prepare() exoPlayer.prepare()
@@ -16,13 +16,21 @@ import io.legado.app.exception.ConcurrentException
import io.legado.app.exception.NoStackTraceException import io.legado.app.exception.NoStackTraceException
import io.legado.app.help.config.AppConfig import io.legado.app.help.config.AppConfig
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.help.exoplayer.ExoPlayerHelper
import io.legado.app.model.ReadAloud import io.legado.app.model.ReadAloud
import io.legado.app.model.ReadBook import io.legado.app.model.ReadBook
import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.utils.* import io.legado.app.utils.FileUtils
import kotlinx.coroutines.* import io.legado.app.utils.MD5Utils
import io.legado.app.utils.postEvent
import io.legado.app.utils.printOnDebug
import io.legado.app.utils.servicePendingIntent
import io.legado.app.utils.toastOnUi
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import okhttp3.Response import okhttp3.Response
@@ -39,8 +47,7 @@ class HttpReadAloudService : BaseReadAloudService(),
Player.Listener { Player.Listener {
private val exoPlayer: ExoPlayer by lazy { private val exoPlayer: ExoPlayer by lazy {
//ExoPlayer.Builder(this).build() ExoPlayer.Builder(this).build()
ExoPlayerHelper.createExoPlayer(this)
} }
private val ttsFolderPath: String by lazy { private val ttsFolderPath: String by lazy {
cacheDir.absolutePath + File.separator + "httpTTS" + File.separator cacheDir.absolutePath + File.separator + "httpTTS" + File.separator
@@ -161,9 +168,11 @@ class HttpReadAloudService : BaseReadAloudService(),
if (checkJs?.isNotBlank() == true) { if (checkJs?.isNotBlank() == true) {
response = analyzeUrl.evalJS(checkJs, response) as Response response = analyzeUrl.evalJS(checkJs, response) as Response
} }
val ct = httpTts.contentType response.headers["Content-Type"]?.let { contentType ->
if (ct?.isNotBlank() == true) { val ct = httpTts.contentType
response.headers["Content-Type"]?.let { contentType -> if (contentType == "application/json") {
throw NoStackTraceException(response.body!!.string())
} else if (ct?.isNotBlank() == true) {
if (!contentType.matches(ct.toRegex())) { if (!contentType.matches(ct.toRegex())) {
throw NoStackTraceException("TTS服务器返回错误:" + response.body!!.string()) throw NoStackTraceException("TTS服务器返回错误:" + response.body!!.string())
} }